diff --git a/devNotes/tests/diffProxyTest.js b/devNotes/tests/diffProxyTest.js
new file mode 100644
index 0000000000000000000000000000000000000000..39fa429ac39725a13974370ca00c00c9da7789f9
--- /dev/null
+++ b/devNotes/tests/diffProxyTest.js
@@ -0,0 +1,82 @@
+function tests() {
+	const getProxy = App.Utils.Diff.getProxy;
+
+	function orig() {
+		return {
+			a: 1,
+			b: [1, 2],
+			c: {a: 1}
+		};
+	}
+
+	function log(name, p) {
+		console.log(name);
+		const original = p.diffOriginal;
+		const diff = p.diffChange;
+		console.log("Original:", _.cloneDeep(original));
+		console.log("Diff:    ", diff);
+		App.Utils.Diff.applyDiff(original, diff);
+		console.log("Apply:   ", original);
+	}
+
+	log("Proxy", getProxy(orig()));
+
+	let o = getProxy(orig());
+	o.a = 2;
+	log(1, o);
+
+	o = getProxy(orig());
+	delete o.a;
+	log(2, o);
+
+	o = getProxy(orig());
+	o.c.a = 2;
+	log(3, o);
+
+	o = getProxy(orig());
+	delete o.c.a;
+	log(4, o);
+
+	o = getProxy(orig());
+	delete o.c;
+	log(5, o);
+
+	o = getProxy(orig());
+	o.b[1] = 5;
+	log(6, o);
+
+	o = getProxy(orig());
+	o.b.push(5);
+	log(7, o);
+
+	o = getProxy(orig());
+	o.b.push(5);
+	console.log("EXPECT: 5, IS: ", o.b[2]);
+	log(8, o);
+
+	o = getProxy(orig());
+	console.log("POP 1:", o.b.pop());
+	log(9, o);
+
+	o = getProxy(orig());
+	o.d = 7;
+	log(10, o);
+
+	o = getProxy(orig());
+	o.d = {a: 5};
+	console.log("Expect 5:", o.d.a);
+	log(11, o);
+	o = getProxy(orig());
+
+	o.d = {a: [5]};
+	o.d.a.unshift(9);
+	log(12, o);
+
+	let slaveDummy = getProxy({eye: new App.Entity.EyeState()});
+	eyeSurgery(slaveDummy, "left", "remove");
+	log(20, slaveDummy);
+
+	slaveDummy = getProxy({eye: new App.Entity.EyeState()});
+	eyeSurgery(slaveDummy, "both", "remove");
+	log(20, slaveDummy);
+}
diff --git a/devTools/types/FC/facilities.d.ts b/devTools/types/FC/facilities.d.ts
index ac7eb1e90a3a22c2bfabef8730f28138a5421b19..628dca392e2d0b768627f240bca0890b75dd1782 100644
--- a/devTools/types/FC/facilities.d.ts
+++ b/devTools/types/FC/facilities.d.ts
@@ -11,15 +11,19 @@ declare namespace FC {
 	}
 
 	interface IUpgradeTier {
-		/** The value to set `property` to upon purchase. */
+		/** The value `property` must be set to in order to display this tier. */
 		value: any;
+		/** The value to set `property` to upon purchase of the upgrade, if any. */
+		upgraded?: any;
 		/** The link text. */
 		link?: string;
-		/** The text to display when the upgrade is available to purchase. */
-		base?: string;
-		/** The text to display when the upgrade has been purchased and no additional upgrades are available. */
-		upgraded?: string;
-		/** How much the upgrade costs. */
+		/** The text to display for the current tier of the upgrade. */
+		text: string;
+		/**
+		 * How much the upgrade costs.
+		 *
+		 * If one is not provided, the upgrade will be free.
+		 */
 		cost?: number;
 		/** Any handler to run upon purchase. */
 		handler?: () => void;
diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index f32b02b508f5100a6cdddc7dddc5bc2ea7c68c40..4037fdb6bf69ae510f614a2dd30413eba51910dd 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -93,6 +93,7 @@ declare namespace FC {
 		enunciate?: Enunciation;
 		sortQuickList?: string;
 		slaveAfterRA?: SlaveState;
+		/** @deprecated */
 		returnTo: string;
 
 		slavesToImportMax?: number;
diff --git a/devTools/types/FC/util.d.ts b/devTools/types/FC/util.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5dd8757958ccef4ca9823b5f3c38adaa4c9c415c
--- /dev/null
+++ b/devTools/types/FC/util.d.ts
@@ -0,0 +1,16 @@
+declare namespace FC {
+    namespace Util {
+        interface DiffBase<T> {
+            /**
+             * The original object
+             */
+            diffOriginal: T
+            /**
+             * The changes applied to the object
+             */
+            diffChange: Partial<T>
+        }
+
+        type DiffRecorder<T> = T & DiffBase<T>
+    }
+}
diff --git a/js/004-base/SurgeryEffect.js b/js/004-base/SurgeryEffect.js
index 12d03d71e9a9d665ef219bebc6489fc5685ea1e8..e0f299b9ba84bd71983fad36ac4970c473e8756f 100644
--- a/js/004-base/SurgeryEffect.js
+++ b/js/004-base/SurgeryEffect.js
@@ -27,8 +27,9 @@ App.Medicine.Surgery.SimpleReaction = class {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
+	 * @param {Partial<App.Entity.SlaveState>} diff
 	 */
-	intro(slave) {
+	intro(slave, diff) {
 		const {he, his, himself} = getPronouns(slave);
 		const r = [];
 
@@ -73,18 +74,20 @@ App.Medicine.Surgery.SimpleReaction = class {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
+	 * @param {Partial<App.Entity.SlaveState>} diff
 	 * @returns {reactionResult}
 	 */
-	reaction(slave) {
+	reaction(slave, diff) {
 		return this._createReactionResult();
 	}
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
+	 * @param {Partial<App.Entity.SlaveState>} diff
 	 * @param {reactionResult} previousReaction
 	 * @returns {reactionResult}
 	 */
-	outro(slave, previousReaction) {
+	outro(slave, diff, previousReaction) {
 		const reaction = this._createReactionResult();
 		if (V.PC.skill.medicine < 100) {
 			return reaction;
diff --git a/js/004-base/SurgeryProcedure.js b/js/004-base/SurgeryProcedure.js
index 60f146ccabc081749c39f84f191f7f2de504c913..efbbdfc478f0ca894960420ab5f6d24a8fed5ae5 100644
--- a/js/004-base/SurgeryProcedure.js
+++ b/js/004-base/SurgeryProcedure.js
@@ -3,7 +3,15 @@ App.Medicine.Surgery.Procedure = class {
 	 * @param {App.Entity.SlaveState} slave
 	 */
 	constructor(slave) {
-		this.slave = slave;
+		/**
+		 * @type {FC.Util.DiffRecorder<App.Entity.SlaveState>}
+		 * @protected
+		 */
+		this._slave = App.Utils.Diff.getProxy(slave);
+	}
+
+	get originalSlave() {
+		return this._slave.diffOriginal;
 	}
 
 	// eslint-disable-next-line jsdoc/require-returns-check
@@ -33,7 +41,18 @@ App.Medicine.Surgery.Procedure = class {
 	// eslint-disable-next-line jsdoc/require-returns-check
 	/**
 	 * @param {boolean} cheat
-	 * @returns {App.Medicine.Surgery.SimpleReaction}
+	 * @returns {[Partial<App.Entity.SlaveState>, App.Medicine.Surgery.SimpleReaction]}
 	 */
 	apply(cheat) { throw new Error("Method 'apply()' must be implemented."); }
+
+	/**
+	 * Convenience function to prepare the return value for apply()
+	 *
+	 * @param {App.Medicine.Surgery.SimpleReaction} reaction
+	 * @returns {[Partial<App.Entity.SlaveState>, App.Medicine.Surgery.SimpleReaction]}
+	 * @protected
+	 */
+	_assemble(reaction) {
+		return [this._slave.diffChange, reaction];
+	}
 };
diff --git a/js/diff.js b/js/diff.js
new file mode 100644
index 0000000000000000000000000000000000000000..b5c00efc77c80ed15a9a3cdd2767b00f3141d2a6
--- /dev/null
+++ b/js/diff.js
@@ -0,0 +1,189 @@
+/**
+ * The diff proxy records all changes to the original object without changing the original object while emulating the
+ * changes for access from outside. The resulting diff object can then be applied on the original. The resulting object
+ * is the same as if the changes were applied directly to the original object.
+ */
+App.Utils.Diff = (function() {
+	const deletedSymbol = Symbol("deleted property");
+
+	/**
+	 * @template {object} T
+	 * @param {T} base
+	 * @returns {FC.Util.DiffRecorder<T>}
+	 */
+	function getProxy(base) {
+		const diff = {};
+
+		/**
+		 * @typedef {Array<string|symbol>} path
+		 * Can only point to objects or arrays, never to primitives
+		 */
+
+		/**
+		 * @param {path} path
+		 * @returns {any}
+		 */
+		function localDiff(path) {
+			let value = diff;
+			for (const key of path) {
+				if (key in value) {
+					value = value[key];
+				} else {
+					return {};
+				}
+			}
+			return value;
+		}
+
+		/**
+		 * @param {path} path
+		 * @param {string|symbol} prop
+		 * @param {any} value
+		 */
+		function setDiff(path, prop, value) {
+			let localDiff = diff;
+			/**
+			 * @type {object}
+			 */
+			let original = base;
+			let originalLost = false; // True, if the original object does not have this path
+			for (const key of path) {
+				if (key in original) {
+					original = original[key];
+				} else {
+					originalLost = true;
+				}
+				if (!(key in localDiff)) {
+					if (originalLost) {
+						// Should not happen
+						throw new TypeError("Neither original nor diff have this property: " + path);
+					}
+
+					if (_.isArray(original)) {
+						// clone arrays to make sure push, pop, etc. operations don't mess anything up later
+						// Deep copy in case array entries get modified later
+						localDiff[key] = _.cloneDeep(original);
+					} else if (_.isObject(original)) {
+						localDiff[key] = {};
+					}
+				}
+				localDiff = localDiff[key];
+			}
+			localDiff[prop] = value;
+		}
+
+		/**
+		 * @template {object} T
+		 * @param {T} target
+		 * @param {path} path
+		 * @returns {FC.Util.DiffRecorder<T>|T}
+		 */
+		function makeProxy(target, path) {
+			if (target == null) { // intentionally ==
+				return target;
+			}
+
+			if (_.isArray(target)) {
+				return new Proxy(target, {
+					get: function(o, prop) {
+						if (prop === "diffOriginal") {
+							return o;
+						} else if (prop === "diffChange") {
+							return localDiff(path);
+						}
+
+						const value = prop in localDiff(path) ? localDiff(path)[prop] : o[prop];
+						if (typeof value === "function") {
+							if (prop in localDiff(path)) {
+								return value.bind(localDiff(path));
+							}
+							if (["push", "pop", "shift", "unshift", "splice", "fill", "reverse"].includes(prop)) {
+								// Deep copy in case array entries get modified later
+								const diffArray = _.cloneDeep(o);
+								setDiff(path.slice(0, -1), path.last(), diffArray);
+								return value.bind(diffArray);
+							}
+							return value.bind(o);
+						}
+						if (value === deletedSymbol) {
+							return undefined;
+						}
+						return makeProxy(value, [...path, prop]);
+					},
+					set: function(o, prop, value) {
+						setDiff(path, prop, value);
+						return true;
+					},
+					deleteProperty: function(o, prop) {
+						setDiff(path, prop, deletedSymbol);
+						return true;
+					}
+				});
+			}
+
+			if (_.isObject(target)) {
+				return new Proxy(target, {
+					get: function(o, prop) {
+						if (prop === "diffOriginal") {
+							return o;
+						} else if (prop === "diffChange") {
+							return localDiff(path);
+						}
+
+						if (prop in localDiff(path)) {
+							if (localDiff(path)[prop] === deletedSymbol) {
+								return undefined;
+							}
+							return makeProxy(localDiff(path)[prop], [...path, prop]);
+						}
+						return makeProxy(o[prop], [...path, prop]);
+					},
+					set: function(o, prop, value) {
+						setDiff(path, prop, value);
+						return true;
+					},
+					deleteProperty: function(o, prop) {
+						setDiff(path, prop, deletedSymbol);
+						return true;
+					}
+				});
+			}
+
+			return target;
+		}
+
+		// base is an object, therefore makeProxy() returns FC.Util.DiffRecorder
+		// @ts-ignore
+		return makeProxy(base, []);
+	}
+
+	/**
+	 * @template {object} T
+	 * @param {T} base
+	 * @param {Partial<T>} diff
+	 */
+	function applyDiff(base, diff) {
+		for (const key in diff) {
+			const value = diff[key];
+			// @ts-ignore
+			if (value === deletedSymbol) {
+				delete base[key];
+			} else if (!_.isObject(value)) {
+				base[key] = value;
+			} else if (_.isArray(value)) {
+				base[key] = value;
+			} else {
+				if (base[key] !== undefined) {
+					applyDiff(base[key], value);
+				} else {
+					base[key] = value;
+				}
+			}
+		}
+	}
+
+	return {
+		getProxy: getProxy,
+		applyDiff: applyDiff,
+	};
+})();
diff --git a/js/medicine/surgery/eye/blind.js b/js/medicine/surgery/eye/blind.js
index 0b02a9ff706e16ab515f90861a13117e1d66d76f..cc5f35337e08ff61e5e421dceefbf1f6e9aadeba 100644
--- a/js/medicine/surgery/eye/blind.js
+++ b/js/medicine/surgery/eye/blind.js
@@ -1,8 +1,8 @@
 App.Medicine.Surgery.Reactions.Blind = class extends App.Medicine.Surgery.SimpleReaction {
 	get removeJob() { return true; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his} = getPronouns(slave);
 		const r = [];
 		r.push(`The laser eye surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this darkness is ${his} new reality.`);
@@ -38,7 +38,7 @@ App.Medicine.Surgery.Procedures.Blind = class extends App.Medicine.Surgery.Proce
 	get healthCost() { return 5; }
 
 	apply(cheat) {
-		eyeSurgery(this.slave, this.side, "blind");
-		return new App.Medicine.Surgery.Reactions.Blind();
+		eyeSurgery(this._slave, this.side, "blind");
+		return this._assemble(new App.Medicine.Surgery.Reactions.Blind());
 	}
 };
diff --git a/js/medicine/surgery/eye/eyeBlur.js b/js/medicine/surgery/eye/eyeBlur.js
index 12d4b8f004cb409c3c6fa2a3b6018853550069d4..84260238f43f54d1ddee8eabfc5a7c2cc886b366 100644
--- a/js/medicine/surgery/eye/eyeBlur.js
+++ b/js/medicine/surgery/eye/eyeBlur.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.EyeBlur = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his} = getPronouns(slave);
 		const r = [];
 
@@ -38,7 +38,7 @@ App.Medicine.Surgery.Procedures.EyeBlur = class extends App.Medicine.Surgery.Pro
 	get healthCost() { return 5; }
 
 	apply(cheat) {
-		eyeSurgery(this.slave, this.side, "blur");
-		return new App.Medicine.Surgery.Reactions.EyeBlur();
+		eyeSurgery(this._slave, this.side, "blur");
+		return this._assemble(new App.Medicine.Surgery.Reactions.EyeBlur());
 	}
 };
diff --git a/js/medicine/surgery/eye/eyeFix.js b/js/medicine/surgery/eye/eyeFix.js
index f54b27c7245b1ba0d5bd529d46042e492c45fbd5..756904fa35a399ffe431a2ab4bf31ee77bd5a2b7 100644
--- a/js/medicine/surgery/eye/eyeFix.js
+++ b/js/medicine/surgery/eye/eyeFix.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.EyeFix = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -37,7 +37,7 @@ App.Medicine.Surgery.Procedures.EyeFix = class extends App.Medicine.Surgery.Proc
 	get healthCost() { return 5; }
 
 	apply(cheat) {
-		eyeSurgery(this.slave, this.side, "fix");
-		return new App.Medicine.Surgery.Reactions.EyeFix();
+		eyeSurgery(this._slave, this.side, "fix");
+		return this._assemble(new App.Medicine.Surgery.Reactions.EyeFix());
 	}
 };
diff --git a/js/medicine/surgery/eye/removeEyes.js b/js/medicine/surgery/eye/removeEyes.js
index c363c8ce1348f04a48f27955ab318607b1aeff35..065c19b55dfd0eddb56f72a663df12ba92bd1bdc 100644
--- a/js/medicine/surgery/eye/removeEyes.js
+++ b/js/medicine/surgery/eye/removeEyes.js
@@ -1,8 +1,8 @@
 App.Medicine.Surgery.Reactions.RemoveEyes = class extends App.Medicine.Surgery.SimpleReaction {
 	get removeJob() { return true; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his} = getPronouns(slave);
 		const r = [];
 		r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`);
@@ -24,8 +24,8 @@ App.Medicine.Surgery.Reactions.RemoveEyes = class extends App.Medicine.Surgery.S
 };
 
 App.Medicine.Surgery.Reactions.RemoveBlindEyes = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {he, His, his} = getPronouns(slave);
 		const r = [];
 		r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`);
@@ -58,10 +58,10 @@ App.Medicine.Surgery.Procedures.RemoveEyes = class extends App.Medicine.Surgery.
 	get healthCost() { return 5; }
 
 	apply(cheat) {
-		const reaction = getBestVision(this.slave) > 0 ?
+		const reaction = getBestVision(this._slave) > 0 ?
 			new App.Medicine.Surgery.Reactions.RemoveEyes() :
 			new App.Medicine.Surgery.Reactions.RemoveBlindEyes();
-		eyeSurgery(this.slave, this.side, "remove");
-		return reaction;
+		eyeSurgery(this._slave, this.side, "remove");
+		return this._assemble(reaction);
 	}
 };
diff --git a/js/medicine/surgery/face/age.js b/js/medicine/surgery/face/age.js
index 72a06948f3cc9f5d55744bc7033ec9478656e063..44f9af6ccdcd118ac5cac9c80fa768941862fd4b 100644
--- a/js/medicine/surgery/face/age.js
+++ b/js/medicine/surgery/face/age.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.Age = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -46,8 +46,8 @@ App.Medicine.Surgery.Procedures.AgeLift = class extends App.Medicine.Surgery.Pro
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		applyAgeImplant(this.slave);
-		this.slave.faceImplant = Math.clamp(this.slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
-		return new App.Medicine.Surgery.Reactions.Age();
+		applyAgeImplant(this._slave);
+		this._slave.faceImplant = Math.clamp(this._slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
+		return this._assemble(new App.Medicine.Surgery.Reactions.Age());
 	}
 };
diff --git a/js/medicine/surgery/face/face.js b/js/medicine/surgery/face/face.js
index cfbbae7aa30625280b94e44859a778a05648e7f8..b255e1bb88839119e7b5ec15b31b9e41fbc3d858 100644
--- a/js/medicine/surgery/face/face.js
+++ b/js/medicine/surgery/face/face.js
@@ -1,18 +1,10 @@
 App.Medicine.Surgery.Reactions.Face = class extends App.Medicine.Surgery.SimpleReaction {
-	/**
-	 * @param {number} oldFace
-	 */
-	constructor(oldFace) {
-		super();
-		this.oldFace = oldFace;
-	}
-
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him, himself} = getPronouns(slave);
 		const r = [];
 
-		r.push(faceIncreaseDesc(slave, this.oldFace));
+		r.push(faceIncreaseDesc(slave, diff.face));
 		if (slave.fetish === "mindbroken") {
 			r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 		} else if (slave.devotion > 50) {
@@ -61,7 +53,7 @@ App.Medicine.Surgery.Procedures.FaceShape = class extends App.Medicine.Surgery.P
 	}
 
 	get name() {
-		if (this.targetShape === "androgynous" && this.slave.faceShape === "masculine") {
+		if (this.targetShape === "androgynous" && this._slave.faceShape === "masculine") {
 			return `Soften to androgynous`;
 		} else if (this.targetShape === "normal") {
 			return `Make conventionally feminine`;
@@ -73,11 +65,11 @@ App.Medicine.Surgery.Procedures.FaceShape = class extends App.Medicine.Surgery.P
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		const oldFace = this.slave.face;
-		this.slave.faceShape = this.targetShape;
-		faceIncreaseAction(this.slave, 20);
-		this.slave.faceImplant = Math.clamp(this.slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
-		return new App.Medicine.Surgery.Reactions.Face(oldFace);
+		this._slave.faceShape = this.targetShape;
+		faceIncreaseAction(this._slave, 20);
+		this._slave.faceImplant = Math.clamp(this._slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
+		return this._assemble(new App.Medicine.Surgery.Reactions.Face());
+
 	}
 };
 
@@ -87,9 +79,8 @@ App.Medicine.Surgery.Procedures.FaceAttractiveness = class extends App.Medicine.
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		const oldFace = this.slave.face;
-		faceIncreaseAction(this.slave, 20);
-		this.slave.faceImplant = Math.clamp(this.slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
-		return new App.Medicine.Surgery.Reactions.Face(oldFace);
+		faceIncreaseAction(this._slave, 20);
+		this._slave.faceImplant = Math.clamp(this._slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
+		return this._assemble(new App.Medicine.Surgery.Reactions.Face());
 	}
 };
diff --git a/js/medicine/surgery/hair/bodyHairRemoval.js b/js/medicine/surgery/hair/bodyHairRemoval.js
index f61c65dbaffaae0eb7ad5f4af8cbf56021489bc0..f752c63b7e066d628ecac618c80deb0b81a83960 100644
--- a/js/medicine/surgery/hair/bodyHairRemoval.js
+++ b/js/medicine/surgery/hair/bodyHairRemoval.js
@@ -1,9 +1,8 @@
 App.Medicine.Surgery.Reactions.BodyHairRemoval = class extends App.Medicine.Surgery.SimpleReaction {
-
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -48,19 +47,19 @@ App.Medicine.Surgery.Reactions.BodyHairRemoval = class extends App.Medicine.Surg
 
 App.Medicine.Surgery.Procedures.BodyHairRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow body hair`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		if (this.slave.underArmHStyle !== "hairless") {
-			this.slave.underArmHStyle = "bald";
+		if (this._slave.underArmHStyle !== "hairless") {
+			this._slave.underArmHStyle = "bald";
 		}
-		if (this.slave.pubicHStyle !== "hairless") {
-			this.slave.pubicHStyle = "bald";
+		if (this._slave.pubicHStyle !== "hairless") {
+			this._slave.pubicHStyle = "bald";
 		}
-		return new App.Medicine.Surgery.Reactions.BodyHairRemoval();
+		return this._assemble(new App.Medicine.Surgery.Reactions.BodyHairRemoval());
 	}
 };
diff --git a/js/medicine/surgery/hair/eyebrowRemoval.js b/js/medicine/surgery/hair/eyebrowRemoval.js
index 0bc21f7e570521089ba294581c846cee491136a6..30e98125c06fb607616eb1b47194cad5eb3483cb 100644
--- a/js/medicine/surgery/hair/eyebrowRemoval.js
+++ b/js/medicine/surgery/hair/eyebrowRemoval.js
@@ -1,9 +1,8 @@
 App.Medicine.Surgery.Reactions.EyebrowRemoval = class extends App.Medicine.Surgery.SimpleReaction {
-
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -44,15 +43,15 @@ App.Medicine.Surgery.Reactions.EyebrowRemoval = class extends App.Medicine.Surge
 
 App.Medicine.Surgery.Procedures.EyebrowRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow eyebrows`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		this.slave.eyebrowHStyle = "bald";
-		return new App.Medicine.Surgery.Reactions.EyebrowRemoval();
+		this._slave.eyebrowHStyle = "bald";
+		return this._assemble(new App.Medicine.Surgery.Reactions.EyebrowRemoval());
 	}
 };
 
diff --git a/js/medicine/surgery/hair/hairRemoval.js b/js/medicine/surgery/hair/hairRemoval.js
index e53a6719db61c9b5f704f239e824a0b7a058aef7..316ba4e633871d0a5601a4048d3900a2936073b9 100644
--- a/js/medicine/surgery/hair/hairRemoval.js
+++ b/js/medicine/surgery/hair/hairRemoval.js
@@ -1,8 +1,8 @@
 App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.SimpleReaction {
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -53,16 +53,16 @@ App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.
 
 App.Medicine.Surgery.Procedures.HairRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow hair`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		this.slave.bald = 1;
-		this.slave.hStyle = "bald";
-		this.slave.eyebrowHStyle = "bald";
-		return new App.Medicine.Surgery.Reactions.HairRemoval();
+		this._slave.bald = 1;
+		this._slave.hStyle = "bald";
+		this._slave.eyebrowHStyle = "bald";
+		return this._assemble(new App.Medicine.Surgery.Reactions.HairRemoval());
 	}
 };
diff --git a/js/medicine/surgery/reaction/addAnimalBalls.js b/js/medicine/surgery/reaction/addAnimalBalls.js
index 2299fd284f27a454b13083640592162606a908d0..31267edc883870861ebe84fee72ce39f61a1f40a 100644
--- a/js/medicine/surgery/reaction/addAnimalBalls.js
+++ b/js/medicine/surgery/reaction/addAnimalBalls.js
@@ -2,8 +2,8 @@
 	class AddAnimalBalls extends App.Medicine.Surgery.Reaction {
 		get key() { return "addAnimalBalls"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addAnimalOvaries.js b/js/medicine/surgery/reaction/addAnimalOvaries.js
index ed4563ea5be43120cae2071c9ae2943c6e92d852..01d38eab7e326bc61a14bc81ffe880af8ecd0e39 100644
--- a/js/medicine/surgery/reaction/addAnimalOvaries.js
+++ b/js/medicine/surgery/reaction/addAnimalOvaries.js
@@ -2,8 +2,8 @@
 	class AddAnimalOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "addAnimalOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addBalls.js b/js/medicine/surgery/reaction/addBalls.js
index 4fe6d0339c678922f266f90e9ecd433a79ffa5f0..df5f74a6f39f15accfe04b6b58c54491c75cf95b 100644
--- a/js/medicine/surgery/reaction/addBalls.js
+++ b/js/medicine/surgery/reaction/addBalls.js
@@ -2,8 +2,8 @@
 	class AddBalls extends App.Medicine.Surgery.Reaction {
 		get key() { return "addBalls"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addDick.js b/js/medicine/surgery/reaction/addDick.js
index b09f5315eaee53ada0ddbf6e06593fec00b0ca5b..33ca8ad74537ea0bd444520220c7e043d85fef79 100644
--- a/js/medicine/surgery/reaction/addDick.js
+++ b/js/medicine/surgery/reaction/addDick.js
@@ -2,8 +2,8 @@
 	class AddDick extends App.Medicine.Surgery.Reaction {
 		get key() { return "addDick"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addForeskin.js b/js/medicine/surgery/reaction/addForeskin.js
index 359bd6bd4e9c7677a7bd81c775197be4c1ef16e1..ed2275e3936791c53019f913f26fe3cacf56c798 100644
--- a/js/medicine/surgery/reaction/addForeskin.js
+++ b/js/medicine/surgery/reaction/addForeskin.js
@@ -2,8 +2,8 @@
 	class AddForeskin extends App.Medicine.Surgery.Reaction {
 		get key() { return "addForeskin"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addOvaries.js b/js/medicine/surgery/reaction/addOvaries.js
index a899fe3060dc903d0fb34bf9ff8ff88c5c15bb30..1898640f95cdc7ab9a35e44cd6763dec705847b1 100644
--- a/js/medicine/surgery/reaction/addOvaries.js
+++ b/js/medicine/surgery/reaction/addOvaries.js
@@ -2,8 +2,8 @@
 	class AddOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "addOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addProstate.js b/js/medicine/surgery/reaction/addProstate.js
index 6a2bdcc91db3f37622190ee41f4ad37e1e3eb02a..ea6f0f7a4982f5f97dadde41a8f10bcac6036118 100644
--- a/js/medicine/surgery/reaction/addProstate.js
+++ b/js/medicine/surgery/reaction/addProstate.js
@@ -2,8 +2,8 @@
 	class AddProstate extends App.Medicine.Surgery.Reaction {
 		get key() { return "addProstate"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addScrotum.js b/js/medicine/surgery/reaction/addScrotum.js
index bb04c2a7a24f1f76bf3a61aea5a89bf4bad5951a..50994ee2f6c2fa47bb1bd4957cee2511fe60d472 100644
--- a/js/medicine/surgery/reaction/addScrotum.js
+++ b/js/medicine/surgery/reaction/addScrotum.js
@@ -2,8 +2,8 @@
 	class AddScrotum extends App.Medicine.Surgery.Reaction {
 		get key() { return "addScrotum"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addTesticles.js b/js/medicine/surgery/reaction/addTesticles.js
index 467bc2c7c8a6865e50360b25e51e84cde2f86074..26b04a06fafca552ad91af7d31ffd9a5db72459f 100644
--- a/js/medicine/surgery/reaction/addTesticles.js
+++ b/js/medicine/surgery/reaction/addTesticles.js
@@ -2,8 +2,8 @@
 	class AddTesticles extends App.Medicine.Surgery.Reaction {
 		get key() { return "addTesticles"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/amp.js b/js/medicine/surgery/reaction/amp.js
index d0be8c29e1b656f965829a04d6cbde1e89c95a73..867e5449a4e5654bace773258e51a49f3d568bc0 100644
--- a/js/medicine/surgery/reaction/amp.js
+++ b/js/medicine/surgery/reaction/amp.js
@@ -2,8 +2,8 @@
 	class Amp extends App.Medicine.Surgery.Reaction {
 		get key() { return "amp"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const r = [];
 
 			V.nextButton = " ";
diff --git a/js/medicine/surgery/reaction/anus.js b/js/medicine/surgery/reaction/anus.js
index f0208d733943f0c71a6ff07b82e14b3a1537fe38..db50699466df30a114afe1f8689b14545ee5a041 100644
--- a/js/medicine/surgery/reaction/anus.js
+++ b/js/medicine/surgery/reaction/anus.js
@@ -2,8 +2,8 @@
 	class Anus extends App.Medicine.Surgery.Reaction {
 		get key() { return "anus"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/areolae.js b/js/medicine/surgery/reaction/areolae.js
index 3a28554f1039574744bb50aa0f0aebd41338b2aa..41209b94a9b18b9b3fb0edfe49a362c2422a8d0e 100644
--- a/js/medicine/surgery/reaction/areolae.js
+++ b/js/medicine/surgery/reaction/areolae.js
@@ -2,8 +2,8 @@
 	class Areolae extends App.Medicine.Surgery.Reaction {
 		get key() { return "areolae"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/asexualReproOvaries.js b/js/medicine/surgery/reaction/asexualReproOvaries.js
index f9b079591043eb4e255179376a3fd0b33e8ea4aa..73ee4768d649e420ba09aa959406c3c3d512d635 100644
--- a/js/medicine/surgery/reaction/asexualReproOvaries.js
+++ b/js/medicine/surgery/reaction/asexualReproOvaries.js
@@ -2,8 +2,8 @@
 	class AsexualReproOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "asexualReproOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, girl} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/bellyDown.js b/js/medicine/surgery/reaction/bellyDown.js
index 0684142ae2b59ec0da38852d75db8dba5a3bd6df..0945756c41c347d848664e757d8485bd7fe26b25 100644
--- a/js/medicine/surgery/reaction/bellyDown.js
+++ b/js/medicine/surgery/reaction/bellyDown.js
@@ -2,8 +2,8 @@
 	class BellyDown extends App.Medicine.Surgery.Reaction {
 		get key() { return "bellyDown"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/bellyIn.js b/js/medicine/surgery/reaction/bellyIn.js
index 83a78f5d658cb001fd158438d8b09495fe757d16..4f9f66c442f82e1b2f5ef0e3c04abf8aecb24236 100644
--- a/js/medicine/surgery/reaction/bellyIn.js
+++ b/js/medicine/surgery/reaction/bellyIn.js
@@ -2,8 +2,8 @@
 	class BellyIn extends App.Medicine.Surgery.Reaction {
 		get key() { return "bellyIn"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/bellyInMale.js b/js/medicine/surgery/reaction/bellyInMale.js
index 37f239899d38125311eab9c1aacc9b57ffe9b2a6..0a1e2023739af5bdcedba3f01c7d9ddcf57c06fd 100644
--- a/js/medicine/surgery/reaction/bellyInMale.js
+++ b/js/medicine/surgery/reaction/bellyInMale.js
@@ -2,8 +2,8 @@
 	class BellyInMale extends App.Medicine.Surgery.Reaction {
 		get key() { return "bellyInMale"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/bellyOut.js b/js/medicine/surgery/reaction/bellyOut.js
index b0877d960b48ce0ca28bafbd1ad40abf9a7f2c9e..48145aad5cf0d488f4f0e2bb524b29e42058b794 100644
--- a/js/medicine/surgery/reaction/bellyOut.js
+++ b/js/medicine/surgery/reaction/bellyOut.js
@@ -2,8 +2,8 @@
 	class BellyOut extends App.Medicine.Surgery.Reaction {
 		get key() { return "bellyOut"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/bellyUp.js b/js/medicine/surgery/reaction/bellyUp.js
index c180352f6274965fd995caef4f5c5bba9d8c6cf5..c8b0a2f01829361727ce81d4f1d8b87af8ac4ab7 100644
--- a/js/medicine/surgery/reaction/bellyUp.js
+++ b/js/medicine/surgery/reaction/bellyUp.js
@@ -2,8 +2,8 @@
 	class BellyUp extends App.Medicine.Surgery.Reaction {
 		get key() { return "bellyUp"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const heGlaresDaggers = canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`;
 			const r = [];
diff --git a/js/medicine/surgery/reaction/boobs.js b/js/medicine/surgery/reaction/boobs.js
index b14c453838c995a36b83c21de9137e0d286409f8..1f156b867f1c8ac4fcb67f795e8f2f7ff28b67fa 100644
--- a/js/medicine/surgery/reaction/boobs.js
+++ b/js/medicine/surgery/reaction/boobs.js
@@ -2,8 +2,8 @@
 	class Boobs extends App.Medicine.Surgery.Reaction {
 		get key() { return "boobs"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const heGlaresDaggers = canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`;
 			const r = [];
diff --git a/js/medicine/surgery/reaction/boobsLoss.js b/js/medicine/surgery/reaction/boobsLoss.js
index d5f3ba5b67a8ac23443d35e3a05d3568ec27cbb8..6cc0e677df868a82bf0863bbd02a2f4fe4130d82 100644
--- a/js/medicine/surgery/reaction/boobsLoss.js
+++ b/js/medicine/surgery/reaction/boobsLoss.js
@@ -2,8 +2,8 @@
 	class BoobsLoss extends App.Medicine.Surgery.Reaction {
 		get key() { return "boobsLoss"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/braces.js b/js/medicine/surgery/reaction/braces.js
index beca381a2edc38cef1bf2ea4a12e2907b54f1dbf..975ee42bad7448f146d84b8e7c9e92f83930d978 100644
--- a/js/medicine/surgery/reaction/braces.js
+++ b/js/medicine/surgery/reaction/braces.js
@@ -6,8 +6,8 @@
 
 		get permanentChanges() { return false; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/breastLift.js b/js/medicine/surgery/reaction/breastLift.js
index 385226a0521b249558e5259de598883abe9b16b6..a5ef5705736e1be44bedcdefee82b4c913806f40 100644
--- a/js/medicine/surgery/reaction/breastLift.js
+++ b/js/medicine/surgery/reaction/breastLift.js
@@ -2,8 +2,8 @@
 	class BreastLift extends App.Medicine.Surgery.Reaction {
 		get key() { return "breastLift"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/breastReconstruction.js b/js/medicine/surgery/reaction/breastReconstruction.js
index 4053e22b25c126dd77d409ec613f75a4de7f3b22..c594971c4d27b6bb8d99790900684e65e75bf44a 100644
--- a/js/medicine/surgery/reaction/breastReconstruction.js
+++ b/js/medicine/surgery/reaction/breastReconstruction.js
@@ -2,8 +2,8 @@
 	class BreastReconstruction extends App.Medicine.Surgery.Reaction {
 		get key() { return "breastReconstruction"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/breastShapePreservation.js b/js/medicine/surgery/reaction/breastShapePreservation.js
index b3c127357f7ef81953dbcef03e738119b707784f..8ba6a60628dadfe433ce17f8e54591e0634b31d6 100644
--- a/js/medicine/surgery/reaction/breastShapePreservation.js
+++ b/js/medicine/surgery/reaction/breastShapePreservation.js
@@ -2,8 +2,8 @@
 	class BreastShapePreservation extends App.Medicine.Surgery.Reaction {
 		get key() { return "breastShapePreservation"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/breastShapePreservationFailure.js b/js/medicine/surgery/reaction/breastShapePreservationFailure.js
index 137ae4f9a153d969abab23aa4b6136674f7bac3d..e467cd5b95a30b8326de23b4a46913018d7b09eb 100644
--- a/js/medicine/surgery/reaction/breastShapePreservationFailure.js
+++ b/js/medicine/surgery/reaction/breastShapePreservationFailure.js
@@ -6,8 +6,8 @@
 			return [];
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 			const heGlaresDaggers = (canSee(slave)) ? `${he} glares daggers` : `${his} face contorts with distaste`;
diff --git a/js/medicine/surgery/reaction/butt.js b/js/medicine/surgery/reaction/butt.js
index 3981c66c95f6b0168d1c460745ed97cb38707456..56b2ce1bdefa7c86bfc231f9b44ea0d3707b777c 100644
--- a/js/medicine/surgery/reaction/butt.js
+++ b/js/medicine/surgery/reaction/butt.js
@@ -2,8 +2,8 @@
 	class Butt extends App.Medicine.Surgery.Reaction {
 		get key() { return "butt"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/buttLoss.js b/js/medicine/surgery/reaction/buttLoss.js
index 2d8dcd134f9c38209f4325a0081941c271c2636b..98c27ad2df08f62c49824b8013c1f02f7aa03cd0 100644
--- a/js/medicine/surgery/reaction/buttLoss.js
+++ b/js/medicine/surgery/reaction/buttLoss.js
@@ -2,8 +2,8 @@
 	class ButtLoss extends App.Medicine.Surgery.Reaction {
 		get key() { return "buttLoss"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/cervixPump.js b/js/medicine/surgery/reaction/cervixPump.js
index d89699cb777232ad338a4239e58d7e03aecc47bb..7a721b2abfc4030925cdbaf9314b682d5b862d82 100644
--- a/js/medicine/surgery/reaction/cervixPump.js
+++ b/js/medicine/surgery/reaction/cervixPump.js
@@ -2,8 +2,8 @@
 	class CervixPump extends App.Medicine.Surgery.Reaction {
 		get key() { return "cervixPump"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/cervixPumpAnus.js b/js/medicine/surgery/reaction/cervixPumpAnus.js
index 958d80018116138d9679e2002edf614c03b87b60..baa39da746ee69e75b19e2ea66b4f92a84912a74 100644
--- a/js/medicine/surgery/reaction/cervixPumpAnus.js
+++ b/js/medicine/surgery/reaction/cervixPumpAnus.js
@@ -2,8 +2,8 @@
 	class CervixPumpAnus extends App.Medicine.Surgery.Reaction {
 		get key() { return "cervixPumpA"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/chemCastrate.js b/js/medicine/surgery/reaction/chemCastrate.js
index 731a0720a74fb3679bcf916707233a1b09b8042d..f78044f2bb3d5bec1a76637d34f509a7badb3b9e 100644
--- a/js/medicine/surgery/reaction/chemCastrate.js
+++ b/js/medicine/surgery/reaction/chemCastrate.js
@@ -4,8 +4,8 @@
 
 		get invasive() { return false; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/chop.js b/js/medicine/surgery/reaction/chop.js
index e8281dff3df3d605281d05579d316964c1cdb354..9087341b223d9ad6e665efe8cb86f1be7aafc785 100644
--- a/js/medicine/surgery/reaction/chop.js
+++ b/js/medicine/surgery/reaction/chop.js
@@ -2,8 +2,8 @@
 	class Chop extends App.Medicine.Surgery.Reaction {
 		get key() { return "chop"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/circumcision.js b/js/medicine/surgery/reaction/circumcision.js
index 26ee4d4f2be5142731602f418dd945dfd0986c1c..f8e9eeda5962d527dfc127a192bff67b2605f0a4 100644
--- a/js/medicine/surgery/reaction/circumcision.js
+++ b/js/medicine/surgery/reaction/circumcision.js
@@ -2,8 +2,8 @@
 	class Circumcision extends App.Medicine.Surgery.Reaction {
 		get key() { return "circumcision"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/clitoralEnlargement.js b/js/medicine/surgery/reaction/clitoralEnlargement.js
index 2e2b494dd6e30bdefc775d6ca4ab93e549613522..85c7fb6c0dd77cb6ceaf5e227cf3f7fa2e5da408 100644
--- a/js/medicine/surgery/reaction/clitoralEnlargement.js
+++ b/js/medicine/surgery/reaction/clitoralEnlargement.js
@@ -2,8 +2,8 @@
 	class ClitoralEnlargement extends App.Medicine.Surgery.Reaction {
 		get key() { return "clitoral enlargement"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/clitoralReduction.js b/js/medicine/surgery/reaction/clitoralReduction.js
index 83c4d85ed965180ff46545e0c81ed7dd61c5f9af..8baeb65dce39403c30417992fca93ff3157a94e4 100644
--- a/js/medicine/surgery/reaction/clitoralReduction.js
+++ b/js/medicine/surgery/reaction/clitoralReduction.js
@@ -2,8 +2,8 @@
 	class ClitoralReduction extends App.Medicine.Surgery.Reaction {
 		get key() { return "clitoral reduction"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/cochlearImplant.js b/js/medicine/surgery/reaction/cochlearImplant.js
index 00dd3831fa2485a466ae1d042f4d4fa4c95200f4..d602e9331e7917c1a8809bfbece2faff1b16338c 100644
--- a/js/medicine/surgery/reaction/cochlearImplant.js
+++ b/js/medicine/surgery/reaction/cochlearImplant.js
@@ -2,8 +2,8 @@
 	class CochlearImplant extends App.Medicine.Surgery.Reaction {
 		get key() { return "cochlear implant"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/deafen.js b/js/medicine/surgery/reaction/deafen.js
index f4340c7ab5f5a72e24c0d51bd6011cd97e15ee8f..b9aa9178b3f254971c47f47d5285f20df49662fe 100644
--- a/js/medicine/surgery/reaction/deafen.js
+++ b/js/medicine/surgery/reaction/deafen.js
@@ -2,8 +2,8 @@
 	class Deafen extends App.Medicine.Surgery.Reaction {
 		get key() { return "deafen"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/desmell.js b/js/medicine/surgery/reaction/desmell.js
index 812e314f443b8ef40173043b4bfc5234133ea0f4..812fbec2c856b35f6967e7a7752559314459e174 100644
--- a/js/medicine/surgery/reaction/desmell.js
+++ b/js/medicine/surgery/reaction/desmell.js
@@ -2,8 +2,8 @@
 	class Desmell extends App.Medicine.Surgery.Reaction {
 		get key() { return "desmell"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/detaste.js b/js/medicine/surgery/reaction/detaste.js
index 920b0d0c852496a3a1b5d4841b87118dcbf83ad9..5c8e5e3bfdc05b32bfbdc4e749e525df64f9b580 100644
--- a/js/medicine/surgery/reaction/detaste.js
+++ b/js/medicine/surgery/reaction/detaste.js
@@ -2,8 +2,8 @@
 	class Detaste extends App.Medicine.Surgery.Reaction {
 		get key() { return "detaste"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earFix.js b/js/medicine/surgery/reaction/earFix.js
index bd2854ed52e6a47318aa815b56f52f6c0ff4497a..96e1a816958b237d2913a7005ae34b95d60ed1d2 100644
--- a/js/medicine/surgery/reaction/earFix.js
+++ b/js/medicine/surgery/reaction/earFix.js
@@ -2,8 +2,8 @@
 	class EarFix extends App.Medicine.Surgery.Reaction {
 		get key() { return "earFix"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earGone.js b/js/medicine/surgery/reaction/earGone.js
index 20b2a344deb44807262190c059bc1683ef20eea3..eca7400bae70d6717e349b2c462d27660f93c0b4 100644
--- a/js/medicine/surgery/reaction/earGone.js
+++ b/js/medicine/surgery/reaction/earGone.js
@@ -2,8 +2,8 @@
 	class EarGone extends App.Medicine.Surgery.Reaction {
 		get key() { return "earGone"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earMajor.js b/js/medicine/surgery/reaction/earMajor.js
index 1c28a90029b5b7cd89b2c0eba97608ef24a8180d..ba0ce0e6b18761e8cfa41b118a90a83c1a74f092 100644
--- a/js/medicine/surgery/reaction/earMajor.js
+++ b/js/medicine/surgery/reaction/earMajor.js
@@ -2,8 +2,8 @@
 	class EarMajor extends App.Medicine.Surgery.Reaction {
 		get key() { return "earMajor"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earMinor.js b/js/medicine/surgery/reaction/earMinor.js
index 3be3fb381464e3d1d05b0b3aa2dfd47f69f394bd..a480f7d78c44b678f6d71033cc23addb943a23cb 100644
--- a/js/medicine/surgery/reaction/earMinor.js
+++ b/js/medicine/surgery/reaction/earMinor.js
@@ -2,8 +2,8 @@
 	class EarMinor extends App.Medicine.Surgery.Reaction {
 		get key() { return "earMinor"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earMuffle.js b/js/medicine/surgery/reaction/earMuffle.js
index f751392a7c5d91d04cd9bba0db5a801133fe4925..cfbf772e9cc817d526ab413386410dac42d4280d 100644
--- a/js/medicine/surgery/reaction/earMuffle.js
+++ b/js/medicine/surgery/reaction/earMuffle.js
@@ -2,8 +2,8 @@
 	class EarMuffle extends App.Medicine.Surgery.Reaction {
 		get key() { return "earMuffle"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/earRestore.js b/js/medicine/surgery/reaction/earRestore.js
index 08593020029d96b42062c9331966e8707f170496..8ff076bfa2bfd8078d3dc031c35d6ecf2ff1fe3e 100644
--- a/js/medicine/surgery/reaction/earRestore.js
+++ b/js/medicine/surgery/reaction/earRestore.js
@@ -2,8 +2,8 @@
 	class EarRestore extends App.Medicine.Surgery.Reaction {
 		get key() { return "earRestore"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/ejaculation.js b/js/medicine/surgery/reaction/ejaculation.js
index 9725306a590e51e5e8d254fc8eb8d701a6fef954..545b5d2358b10adfa2be9e842492079fd2046387 100644
--- a/js/medicine/surgery/reaction/ejaculation.js
+++ b/js/medicine/surgery/reaction/ejaculation.js
@@ -2,8 +2,8 @@
 	class Ejaculation extends App.Medicine.Surgery.Reaction {
 		get key() { return "ejaculation"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/electrolarynx.js b/js/medicine/surgery/reaction/electrolarynx.js
index da09e237e2f2d61ad045f4ae1dfd9b45b23c008b..15e0f76159241510c2e13375b494e32fc0b41785 100644
--- a/js/medicine/surgery/reaction/electrolarynx.js
+++ b/js/medicine/surgery/reaction/electrolarynx.js
@@ -2,8 +2,8 @@
 	class Electrolarynx extends App.Medicine.Surgery.Reaction {
 		get key() { return "electrolarynx"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/endEjaculation.js b/js/medicine/surgery/reaction/endEjaculation.js
index fed430448b1eba4d0a45062e38964e00981423e2..ea4d1c620d45e15781682a783438e5a53d5b836b 100644
--- a/js/medicine/surgery/reaction/endEjaculation.js
+++ b/js/medicine/surgery/reaction/endEjaculation.js
@@ -2,8 +2,8 @@
 	class EndEjaculation extends App.Medicine.Surgery.Reaction {
 		get key() { return "endejac"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/endLactation.js b/js/medicine/surgery/reaction/endLactation.js
index a649b8e24d71917560dc2a1f56149d5a0c3d58c5..0d6f0ea8afb4c2d08526634c0a01914ba7f51573 100644
--- a/js/medicine/surgery/reaction/endLactation.js
+++ b/js/medicine/surgery/reaction/endLactation.js
@@ -2,8 +2,8 @@
 	class EndLactation extends App.Medicine.Surgery.Reaction {
 		get key() { return "endlac"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/endPrecum.js b/js/medicine/surgery/reaction/endPrecum.js
index 407ca25b31125aa5ddb08ea02ef08ecd1ee2a77b..4cc7471bea60e11b4cafd77d7d6e18642fd00bb3 100644
--- a/js/medicine/surgery/reaction/endPrecum.js
+++ b/js/medicine/surgery/reaction/endPrecum.js
@@ -2,8 +2,8 @@
 	class EndPrecum extends App.Medicine.Surgery.Reaction {
 		get key() { return "endprecum"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/fang.js b/js/medicine/surgery/reaction/fang.js
index a77912ca1bff0043ed9a32700c1fce877c4ca051..ce228c3974bed19249810ef9e15fe4b36c92e94c 100644
--- a/js/medicine/surgery/reaction/fang.js
+++ b/js/medicine/surgery/reaction/fang.js
@@ -2,8 +2,8 @@
 	class Fang extends App.Medicine.Surgery.Reaction {
 		get key() { return "fang"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/fangs.js b/js/medicine/surgery/reaction/fangs.js
index 38eaaa1a7ce6e59a65b12ba71a6a16d4cad8c3bd..f7ecf2abadc93470f8a2856175d65043f51cc418 100644
--- a/js/medicine/surgery/reaction/fangs.js
+++ b/js/medicine/surgery/reaction/fangs.js
@@ -2,8 +2,8 @@
 	class Fangs extends App.Medicine.Surgery.Reaction {
 		get key() { return "fangs"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/fatGraft.js b/js/medicine/surgery/reaction/fatGraft.js
index 2415c49e37adb85f346b91167eadcdf984288371..d2e598556871de579241d451dc4c14b296b302a1 100644
--- a/js/medicine/surgery/reaction/fatGraft.js
+++ b/js/medicine/surgery/reaction/fatGraft.js
@@ -2,8 +2,8 @@
 	class FatGraft extends App.Medicine.Surgery.Reaction {
 		get key() { return "fat graft"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/fertility.js b/js/medicine/surgery/reaction/fertility.js
index 891b9c8ddc9277d916259b313ec22f64fede3545..9463965e55924d52a7ce9b16566d2a153bcecc95 100644
--- a/js/medicine/surgery/reaction/fertility.js
+++ b/js/medicine/surgery/reaction/fertility.js
@@ -2,8 +2,8 @@
 	class Fertility extends App.Medicine.Surgery.Reaction {
 		get key() { return "fert"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/foreskinTuck.js b/js/medicine/surgery/reaction/foreskinTuck.js
index fc2bbbcca3ba28bd11aff6a5bdaa7d45487fc080..21e4bb858c45b74995b3aa647c3818d57d2a49b8 100644
--- a/js/medicine/surgery/reaction/foreskinTuck.js
+++ b/js/medicine/surgery/reaction/foreskinTuck.js
@@ -2,8 +2,8 @@
 	class ForeskinTuck extends App.Medicine.Surgery.Reaction {
 		get key() { return "foreskinTuck"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/freshOvaries.js b/js/medicine/surgery/reaction/freshOvaries.js
index 9bc9f5a47165e5495d90389ca5f9dbb7ebfe0c03..72a223c966aca8546c666235ac10c38f4a8313c6 100644
--- a/js/medicine/surgery/reaction/freshOvaries.js
+++ b/js/medicine/surgery/reaction/freshOvaries.js
@@ -2,8 +2,8 @@
 	class FreshOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "freshOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/fuckdoll.js b/js/medicine/surgery/reaction/fuckdoll.js
index 3e37ba1027add70a760ecbfc96e5628c8fcb7d78..2eae08d38d639e4dbd912093663f75c2225d5d24 100644
--- a/js/medicine/surgery/reaction/fuckdoll.js
+++ b/js/medicine/surgery/reaction/fuckdoll.js
@@ -21,8 +21,8 @@
 			return r;
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, sister, wife} = getPronouns(slave);
 			const relations = V.slaves.filter((s) => areRelated(s, slave) && (s.ID !== slave.relationshipTarget));
 			let r = [];
diff --git a/js/medicine/surgery/reaction/fuckdollExtraction.js b/js/medicine/surgery/reaction/fuckdollExtraction.js
index 9ec9c26d6fbbf81effd8e8220274a1ea810ce167..f782591a350680e82f7bb364a2b9c67de6360a08 100644
--- a/js/medicine/surgery/reaction/fuckdollExtraction.js
+++ b/js/medicine/surgery/reaction/fuckdollExtraction.js
@@ -16,8 +16,8 @@
 			return r;
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 			r.push(`If you were expecting a great return to humanity after extracting ${him} from ${his} Fuckdoll suit, you're to be disappointed.`);
diff --git a/js/medicine/surgery/reaction/geld.js b/js/medicine/surgery/reaction/geld.js
index df1a0d50361daabbb8b96d7c1c1b732485571b39..4beca584b6933a70e932abb4f627074b7b6168e4 100644
--- a/js/medicine/surgery/reaction/geld.js
+++ b/js/medicine/surgery/reaction/geld.js
@@ -2,8 +2,8 @@
 	class Geld extends App.Medicine.Surgery.Reaction {
 		get key() { return "geld"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/herm.js b/js/medicine/surgery/reaction/herm.js
index 33618c5a373d75823056b0ecf025c53ffb48e2ad..87000a768384a050e20201b175c4575f16f052e7 100644
--- a/js/medicine/surgery/reaction/herm.js
+++ b/js/medicine/surgery/reaction/herm.js
@@ -2,8 +2,8 @@
 	class Herm extends App.Medicine.Surgery.Reaction {
 		get key() { return "herm"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const {he: heP} = getPronouns(V.PC);
 			const r = [];
diff --git a/js/medicine/surgery/reaction/horn.js b/js/medicine/surgery/reaction/horn.js
index 31e3c22070b9d63cee673ede1d0d127fabe3b227..0b0c91b7279b8697cbf470ee8bcd450897aa324f 100644
--- a/js/medicine/surgery/reaction/horn.js
+++ b/js/medicine/surgery/reaction/horn.js
@@ -2,8 +2,8 @@
 	class Horn extends App.Medicine.Surgery.Reaction {
 		get key() { return "horn"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/hornGone.js b/js/medicine/surgery/reaction/hornGone.js
index 96d62f480104f783baefc0e861eb1a456b146949..7127c8b0f9da2821f633005fa9e6363388f84d16 100644
--- a/js/medicine/surgery/reaction/hornGone.js
+++ b/js/medicine/surgery/reaction/hornGone.js
@@ -2,8 +2,8 @@
 	class HornGone extends App.Medicine.Surgery.Reaction {
 		get key() { return "hornGone"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/insemination.js b/js/medicine/surgery/reaction/insemination.js
index d8ea79990593b2fe8040a60fb170cb4da081404a..7a35cdb6828c02c4657da5b7d25876ed50bbe25e 100644
--- a/js/medicine/surgery/reaction/insemination.js
+++ b/js/medicine/surgery/reaction/insemination.js
@@ -6,8 +6,8 @@
 
 		get permanentChanges() { return false; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/labiaplasty.js b/js/medicine/surgery/reaction/labiaplasty.js
index 87a8f5a5d75fae34669c7bbce3235b65792b5203..a4480fe5d39d6f2f5cda4222004e23f960f8fee8 100644
--- a/js/medicine/surgery/reaction/labiaplasty.js
+++ b/js/medicine/surgery/reaction/labiaplasty.js
@@ -2,8 +2,8 @@
 	class Labiaplasty extends App.Medicine.Surgery.Reaction {
 		get key() { return "labiaplasty"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/lactation.js b/js/medicine/surgery/reaction/lactation.js
index f19997830ea860e0e825aff15606155d7d5ed8ad..c6e99eac5e82f370581ba78e9d20f583b6a320c5 100644
--- a/js/medicine/surgery/reaction/lactation.js
+++ b/js/medicine/surgery/reaction/lactation.js
@@ -2,8 +2,8 @@
 	class Lactation extends App.Medicine.Surgery.Reaction {
 		get key() { return "lactation"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/lipo.js b/js/medicine/surgery/reaction/lipo.js
index 4d15e32d08cd9ad894764bcf3f1763c82a9e1e34..535413ef1ba0fd2a129a5635b21c86f253382725 100644
--- a/js/medicine/surgery/reaction/lipo.js
+++ b/js/medicine/surgery/reaction/lipo.js
@@ -2,8 +2,8 @@
 	class Lipo extends App.Medicine.Surgery.Reaction {
 		get key() { return "lipo"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/liposuction.js b/js/medicine/surgery/reaction/liposuction.js
index 5b1829e0bccffcde0283f65b001abed0ee3f49c8..6e7cd41e9cfb65f75d524a36bb67924d66e32648 100644
--- a/js/medicine/surgery/reaction/liposuction.js
+++ b/js/medicine/surgery/reaction/liposuction.js
@@ -2,8 +2,8 @@
 	class Liposuction extends App.Medicine.Surgery.Reaction {
 		get key() { return "liposuction"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/lips.js b/js/medicine/surgery/reaction/lips.js
index 801dc62b813965a68ebb7b84f650c41722c381e9..d790a1be1bcefb83f9d91db15fd1c5fdf26058e8 100644
--- a/js/medicine/surgery/reaction/lips.js
+++ b/js/medicine/surgery/reaction/lips.js
@@ -2,8 +2,8 @@
 	class Lips extends App.Medicine.Surgery.Reaction {
 		get key() { return "lips"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/maleToFemale.js b/js/medicine/surgery/reaction/maleToFemale.js
index 0f187848e9514814b8d81767940edb85c485c2df..48b2aaa24946ffdccc802dd9c3716855527cfe43 100644
--- a/js/medicine/surgery/reaction/maleToFemale.js
+++ b/js/medicine/surgery/reaction/maleToFemale.js
@@ -2,8 +2,8 @@
 	class MaletoFemale extends App.Medicine.Surgery.Reaction {
 		get key() { return "mtf"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mastectomy.js b/js/medicine/surgery/reaction/mastectomy.js
index 91c897c3b09934d2510647f2737dc6d00ad9dddb..f0acf350dc175157a9e8aeee4a5b3e7430257a0a 100644
--- a/js/medicine/surgery/reaction/mastectomy.js
+++ b/js/medicine/surgery/reaction/mastectomy.js
@@ -2,8 +2,8 @@
 	class Mastectomy extends App.Medicine.Surgery.Reaction {
 		get key() { return "mastectomy"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mastectomyPlus.js b/js/medicine/surgery/reaction/mastectomyPlus.js
index 94f54aaad50ae21b4c4058a3ed33c4c619d2d92e..e1223d403c76d7ae86650c5c43c79b215297a96d 100644
--- a/js/medicine/surgery/reaction/mastectomyPlus.js
+++ b/js/medicine/surgery/reaction/mastectomyPlus.js
@@ -2,8 +2,8 @@
 	class MastectomyPlus extends App.Medicine.Surgery.Reaction {
 		get key() { return "mastectomy+"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mindbreak.js b/js/medicine/surgery/reaction/mindbreak.js
index 5a8af13da0e5cfa172fe9cf9cff257f295cfd8cf..c3a63cc8d3610f88ce62350d6a0921c27120127b 100644
--- a/js/medicine/surgery/reaction/mindbreak.js
+++ b/js/medicine/surgery/reaction/mindbreak.js
@@ -4,8 +4,8 @@
 
 		get removeJob() { return true; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mpreg.js b/js/medicine/surgery/reaction/mpreg.js
index 4ef887f510a33a9a15bec49cf3dc67aa5562447e..7152eda77f2e2fb8cc5a4021ccabbf9f4e552e25 100644
--- a/js/medicine/surgery/reaction/mpreg.js
+++ b/js/medicine/surgery/reaction/mpreg.js
@@ -2,8 +2,8 @@
 	class MPreg extends App.Medicine.Surgery.Reaction {
 		get key() { return "mpreg"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mpregRemoved.js b/js/medicine/surgery/reaction/mpregRemoved.js
index f646617d009f6bd252cc01b6dac2a28c6526bd56..5b22f1d9629bb94619edb04fc74af4028489d875 100644
--- a/js/medicine/surgery/reaction/mpregRemoved.js
+++ b/js/medicine/surgery/reaction/mpregRemoved.js
@@ -2,8 +2,8 @@
 	class MPregRemoved extends App.Medicine.Surgery.Reaction {
 		get key() { return "mpreg removed"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/mute.js b/js/medicine/surgery/reaction/mute.js
index 8874edca4fb2e9969f7a1f4eff8f361a3d278983..9bc41e03476ab1f30fb78b11af9dfd6cc688e4fc 100644
--- a/js/medicine/surgery/reaction/mute.js
+++ b/js/medicine/surgery/reaction/mute.js
@@ -2,8 +2,8 @@
 	class Mute extends App.Medicine.Surgery.Reaction {
 		get key() { return "mute"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/newEars.js b/js/medicine/surgery/reaction/newEars.js
index b4cb684f1c89370c15e985c8a2d9a2fcf84a4a02..0eb0d39613121145b39c51378d02d3c4d7e1d1b2 100644
--- a/js/medicine/surgery/reaction/newEars.js
+++ b/js/medicine/surgery/reaction/newEars.js
@@ -2,8 +2,8 @@
 	class NewEars extends App.Medicine.Surgery.Reaction {
 		get key() { return "newEars"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/newEyes.js b/js/medicine/surgery/reaction/newEyes.js
index c8d37f82f442a24a19b1df29e2704dae5d55d6cf..b9213bfd677acc61a337f0476968add2caad12ad 100644
--- a/js/medicine/surgery/reaction/newEyes.js
+++ b/js/medicine/surgery/reaction/newEyes.js
@@ -2,8 +2,8 @@
 	class NewEyes extends App.Medicine.Surgery.Reaction {
 		get key() { return "newEyes"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/newVoice.js b/js/medicine/surgery/reaction/newVoice.js
index dce1e1b7f3a69f47f3e77445cc6a24a48a0d033b..711e47b36a7acdd2db43a7609bcc043ab850ea3e 100644
--- a/js/medicine/surgery/reaction/newVoice.js
+++ b/js/medicine/surgery/reaction/newVoice.js
@@ -2,8 +2,8 @@
 	class NewVoice extends App.Medicine.Surgery.Reaction {
 		get key() { return "newVoice"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/nippleCunts.js b/js/medicine/surgery/reaction/nippleCunts.js
index 453de0b60632acbffdc508db6de6e167c971fc46..838471ca4429331e78b7ace257a9ccd1552f764c 100644
--- a/js/medicine/surgery/reaction/nippleCunts.js
+++ b/js/medicine/surgery/reaction/nippleCunts.js
@@ -2,8 +2,8 @@
 	class NippleCunts extends App.Medicine.Surgery.Reaction {
 		get key() { return "nippleCunts"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/noneToFemale.js b/js/medicine/surgery/reaction/noneToFemale.js
index e1ba89f0878c9af81ab1630ded6459e40f2d1872..5ba77dba98376993c3b0c433652d58aaad055277 100644
--- a/js/medicine/surgery/reaction/noneToFemale.js
+++ b/js/medicine/surgery/reaction/noneToFemale.js
@@ -2,8 +2,8 @@
 	class NoneToFemale extends App.Medicine.Surgery.Reaction {
 		get key() { return "ntf"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself, hers} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/ocularImplant.js b/js/medicine/surgery/reaction/ocularImplant.js
index b87247a9e7e35b43f844cd5467b3b98a645b7b9d..c477c4af3dcbdca05a2c2b808040e3c4d808893e 100644
--- a/js/medicine/surgery/reaction/ocularImplant.js
+++ b/js/medicine/surgery/reaction/ocularImplant.js
@@ -2,8 +2,8 @@
 	class OcularImplant extends App.Medicine.Surgery.Reaction {
 		get key() { return "ocular implant"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/ocularImplantForBlind.js b/js/medicine/surgery/reaction/ocularImplantForBlind.js
index 44fe5fb1861e495826b194fffa7c693daedd243c..1b78e510901a2ce08cb3eaa3d62d58dd499c9911 100644
--- a/js/medicine/surgery/reaction/ocularImplantForBlind.js
+++ b/js/medicine/surgery/reaction/ocularImplantForBlind.js
@@ -2,8 +2,8 @@
 	class OcularImplantForBlind extends App.Medicine.Surgery.Reaction {
 		get key() { return "ocular implant for blind"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 			r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${his} new eyes deliver nearly overwhelming amount of visual information. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`);
diff --git a/js/medicine/surgery/reaction/oral.js b/js/medicine/surgery/reaction/oral.js
index 082f818b0524677d687ce3084d2e29bf9dc1326e..13cc9de8abfa3ef02a109d04d5db441077ad251d 100644
--- a/js/medicine/surgery/reaction/oral.js
+++ b/js/medicine/surgery/reaction/oral.js
@@ -2,8 +2,8 @@
 	class Oral extends App.Medicine.Surgery.Reaction {
 		get key() { return "oral"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/ovaImplantChanged.js b/js/medicine/surgery/reaction/ovaImplantChanged.js
index 1b41538b9a15bb28794d915794a3f70265dfa532..6943d9fc3e944d573b324c522f93c21f59ef20fb 100644
--- a/js/medicine/surgery/reaction/ovaImplantChanged.js
+++ b/js/medicine/surgery/reaction/ovaImplantChanged.js
@@ -2,8 +2,8 @@
 	class OvaImplantChanged extends App.Medicine.Surgery.Reaction {
 		get key() { return "ovaImplant changed"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/pLimbInterface.js b/js/medicine/surgery/reaction/pLimbInterface.js
index 4b1e1a909ba1aad242d25cd3234b26cc960e7259..20038351b0cfb5688c3a393ff68cbeeb75251d70 100644
--- a/js/medicine/surgery/reaction/pLimbInterface.js
+++ b/js/medicine/surgery/reaction/pLimbInterface.js
@@ -2,8 +2,8 @@
 	class PLimbInterface extends App.Medicine.Surgery.Reaction {
 		get key() { return "PLimb interface"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const r = [];
 
 			V.nextButton = " ";
diff --git a/js/medicine/surgery/reaction/pLimbInterface1.js b/js/medicine/surgery/reaction/pLimbInterface1.js
index 16020fdff6a3598880fca27afa181b4b4b9cd479..d694c871280286cb7bfe2ab86d747be54dad0a23 100644
--- a/js/medicine/surgery/reaction/pLimbInterface1.js
+++ b/js/medicine/surgery/reaction/pLimbInterface1.js
@@ -2,8 +2,8 @@
 	class PLimbInterface1 extends App.Medicine.Surgery.Reaction {
 		get key() { return "PLimb interface1"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, hers} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/pLimbInterface2.js b/js/medicine/surgery/reaction/pLimbInterface2.js
index f7756b3c1682db934d82860f5692c4b8557faea8..57d26f7859228de88e23e9cc9de8b168d6b08146 100644
--- a/js/medicine/surgery/reaction/pLimbInterface2.js
+++ b/js/medicine/surgery/reaction/pLimbInterface2.js
@@ -2,8 +2,8 @@
 	class PLimbInterface2 extends App.Medicine.Surgery.Reaction {
 		get key() { return "PLimb interface2"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, hers} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/pLimbInterface3.js b/js/medicine/surgery/reaction/pLimbInterface3.js
index 475ac751248a1475aa2e3a820578570c5ba5ab86..3d7bbb1430323bfb1b6487cfb92ecb9607572f78 100644
--- a/js/medicine/surgery/reaction/pLimbInterface3.js
+++ b/js/medicine/surgery/reaction/pLimbInterface3.js
@@ -2,8 +2,8 @@
 	class PLimbInterface3 extends App.Medicine.Surgery.Reaction {
 		get key() { return "PLimb interface3"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, hers, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/precum.js b/js/medicine/surgery/reaction/precum.js
index 07f4a0464b603ea6833464371299d7ccba7db6bc..8c330a430f73f3af0e013f890dad0f585a7a6b26 100644
--- a/js/medicine/surgery/reaction/precum.js
+++ b/js/medicine/surgery/reaction/precum.js
@@ -2,8 +2,8 @@
 	class Precum extends App.Medicine.Surgery.Reaction {
 		get key() { return "precum"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/preg.js b/js/medicine/surgery/reaction/preg.js
index 3ff922700a1d6f8a324c7967d205a2329b29071f..15ab52579bf4a17602010159dd3ca79fc2326387 100644
--- a/js/medicine/surgery/reaction/preg.js
+++ b/js/medicine/surgery/reaction/preg.js
@@ -2,8 +2,8 @@
 	class Preg extends App.Medicine.Surgery.Reaction {
 		get key() { return "preg"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			let r = [];
 
diff --git a/js/medicine/surgery/reaction/preg1hack.js b/js/medicine/surgery/reaction/preg1hack.js
index 8d69e51fa9503cce997de5682a37a19d052f8813..fef10868dd85b7136d43bf5394d4bcabde4356e3 100644
--- a/js/medicine/surgery/reaction/preg1hack.js
+++ b/js/medicine/surgery/reaction/preg1hack.js
@@ -2,15 +2,15 @@
 	class Preg1Hack extends App.Medicine.Surgery.Reaction {
 		get key() { return "preg1hack"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
 			r.push(`The hacking process is brief, being little more than inserting the actuator into ${his} vagina, and leaves ${him} with <span class="health dec">nothing more than minor health effects</span> from the altered implant functions. ${He} leaves the surgery without any specific feeling, but ${he} knows that something has been done to ${his} implant.`);
 
 			// My testing shows that 2 or 3 relatively safe for generic adult slave with effective curatives or clinic, 4 - high risk of bursting. So there is a catch with it.
-			slave.broodmotherFetuses = either(2, 2, 2, 2, 3, 3, 4);
+			slave.broodmotherFetuses = [2, 2, 2, 2, 3, 3, 4].random();
 
 			if (slave.fetish === "mindbroken") {
 				/* nothing*/
diff --git a/js/medicine/surgery/reaction/pregRemove.js b/js/medicine/surgery/reaction/pregRemove.js
index 7c5529c747b8b9cb37e508064200f38e9960fccb..89e0b099b4a0c6d37f4035cf7da2e991e62555a8 100644
--- a/js/medicine/surgery/reaction/pregRemove.js
+++ b/js/medicine/surgery/reaction/pregRemove.js
@@ -2,8 +2,8 @@
 	class PregRemove extends App.Medicine.Surgery.Reaction {
 		get key() { return "pregRemove"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/prostate.js b/js/medicine/surgery/reaction/prostate.js
index 32f06d7d03894c153e110b928f35b73512624ccb..664c7b532dbdf54822a64290d655f1a13a27f667 100644
--- a/js/medicine/surgery/reaction/prostate.js
+++ b/js/medicine/surgery/reaction/prostate.js
@@ -2,8 +2,8 @@
 	class Prostate extends App.Medicine.Surgery.Reaction {
 		get key() { return "prostate"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/race.js b/js/medicine/surgery/reaction/race.js
index 238ff4e3663fe261b929222242a7f476f3c74b24..af852fa640e30641c9f0e56e2b1b52c6294cf731 100644
--- a/js/medicine/surgery/reaction/race.js
+++ b/js/medicine/surgery/reaction/race.js
@@ -2,8 +2,8 @@
 	class Race extends App.Medicine.Surgery.Reaction {
 		get key() { return "race"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/relocate.js b/js/medicine/surgery/reaction/relocate.js
index 27d75ed661eb6645e1d3c73832ac28b6c67dea80..e8dc27bb9e24e9d6090fcdc6458af27f3d2a7eb6 100644
--- a/js/medicine/surgery/reaction/relocate.js
+++ b/js/medicine/surgery/reaction/relocate.js
@@ -2,8 +2,8 @@
 	class Relocate extends App.Medicine.Surgery.Reaction {
 		get key() { return "relocate"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/removeBraces.js b/js/medicine/surgery/reaction/removeBraces.js
index 5b35aa2c9c73e8dc45c6fc4b2cc56d021379223f..81afca27be3671fa1adeae4bb471763d29124352 100644
--- a/js/medicine/surgery/reaction/removeBraces.js
+++ b/js/medicine/surgery/reaction/removeBraces.js
@@ -6,8 +6,8 @@
 
 		get permanentChanges() { return false; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/removeCosmeticBraces.js b/js/medicine/surgery/reaction/removeCosmeticBraces.js
index 29276eda4d4e292e91e8f243f60d25935fe859de..979b9c66528f864d726f047b32e5227037ffb005 100644
--- a/js/medicine/surgery/reaction/removeCosmeticBraces.js
+++ b/js/medicine/surgery/reaction/removeCosmeticBraces.js
@@ -6,8 +6,8 @@
 
 		get permanentChanges() { return false; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/resmell.js b/js/medicine/surgery/reaction/resmell.js
index 6924d60d5097a5559a70e41ae80484c73aff1a37..53d8485fed73f328d397a016c92a759b2393e656 100644
--- a/js/medicine/surgery/reaction/resmell.js
+++ b/js/medicine/surgery/reaction/resmell.js
@@ -2,8 +2,8 @@
 	class Resmell extends App.Medicine.Surgery.Reaction {
 		get key() { return "resmell"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/restoreHairBrow.js b/js/medicine/surgery/reaction/restoreHairBrow.js
index 73af6f18f374fde6877609abed308b8ab0f81e1a..8c28dca9110b8ed1b2461bd99992162f4b317646 100644
--- a/js/medicine/surgery/reaction/restoreHairBrow.js
+++ b/js/medicine/surgery/reaction/restoreHairBrow.js
@@ -7,8 +7,8 @@
 			return [`As the remote surgery's long recovery cycle completes, ${slave.slaveName} begins to stir.`];
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/restoreHairHead.js b/js/medicine/surgery/reaction/restoreHairHead.js
index f68528a327a3491bbad29a2329ee07861395d2db..2f685824921a291f3d203faa129955f4616b3939 100644
--- a/js/medicine/surgery/reaction/restoreHairHead.js
+++ b/js/medicine/surgery/reaction/restoreHairHead.js
@@ -7,8 +7,8 @@
 			return [`As the remote surgery's long recovery cycle completes, ${slave.slaveName} begins to stir.`];
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/restoreHairPits.js b/js/medicine/surgery/reaction/restoreHairPits.js
index 018b1970fcaa8a9894ba019442ad322905fe1c03..f844dd361cffcc84e0d9023a5040092482fed404 100644
--- a/js/medicine/surgery/reaction/restoreHairPits.js
+++ b/js/medicine/surgery/reaction/restoreHairPits.js
@@ -7,8 +7,8 @@
 			return [`As the remote surgery's long recovery cycle completes, ${slave.slaveName} begins to stir.`];
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 			const r = [];
diff --git a/js/medicine/surgery/reaction/restoreHairPubes.js b/js/medicine/surgery/reaction/restoreHairPubes.js
index cf9b95450332646ea3980887f1031f9964f34ea2..48491a9ca32d46e1406696ee5abfa92e32ab14b1 100644
--- a/js/medicine/surgery/reaction/restoreHairPubes.js
+++ b/js/medicine/surgery/reaction/restoreHairPubes.js
@@ -7,8 +7,8 @@
 			return [`As the remote surgery's long recovery cycle completes, ${slave.slaveName} begins to stir.`];
 		}
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 			const r = [];
diff --git a/js/medicine/surgery/reaction/restoreVoice.js b/js/medicine/surgery/reaction/restoreVoice.js
index 149e95d55befcc206f2180cf7249cee04e23971d..3ad5537d80d07dac9c71452dc2aa9c9360ac7797 100644
--- a/js/medicine/surgery/reaction/restoreVoice.js
+++ b/js/medicine/surgery/reaction/restoreVoice.js
@@ -2,8 +2,8 @@
 	class RestoreVoice extends App.Medicine.Surgery.Reaction {
 		get key() { return "restoreVoice"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/retaste.js b/js/medicine/surgery/reaction/retaste.js
index a4129427a0c1cefd974bf0c714f45a49bca2d6a7..df86d09cbf40115bfad7535912c52eeedb7cd783 100644
--- a/js/medicine/surgery/reaction/retaste.js
+++ b/js/medicine/surgery/reaction/retaste.js
@@ -2,8 +2,8 @@
 	class Retaste extends App.Medicine.Surgery.Reaction {
 		get key() { return "retaste"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/retrogradeVirusInjectionNCS.js b/js/medicine/surgery/reaction/retrogradeVirusInjectionNCS.js
index 25a58e095776d71e97cff7922322393bdb288f1e..79290c761710ec10ddfb80ad5020b1622829dbe4 100644
--- a/js/medicine/surgery/reaction/retrogradeVirusInjectionNCS.js
+++ b/js/medicine/surgery/reaction/retrogradeVirusInjectionNCS.js
@@ -2,8 +2,8 @@
 	class RetrogradeVirusInjectionNCS extends App.Medicine.Surgery.Reaction {
 		get key() { return "retrograde virus injection NCS"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 			const genitalChanges = [];
@@ -89,7 +89,7 @@
 				slave.boobs -= Math.round(slave.boobs * .1);
 			}
 			if ((slave.shoulders - Math.abs(slave.shouldersImplant) > -1) && (slave.hips - Math.abs(slave.hipsImplant) > -1)) {
-				physicalChanges.push(`'both ${his} hips and shoulders are <span class="orange">less wide,</span>`);
+				physicalChanges.push(`both ${his} hips and shoulders are <span class="orange">less wide,</span>`);
 				slave.hips -= 1;
 				slave.shoulders -= 1;
 			} else if (slave.shoulders - Math.abs(slave.shouldersImplant) > -1) {
@@ -191,7 +191,7 @@
 						r.push(`also`);
 					}
 					r.push(`${sense} that ${his} body has some physical changes, it seems to ${him} that ${toSentence(physicalChanges)}`);
-					const reaction = either('comes as a bit of a surprise', 'comes as quite a shock', `confirms ${his} suspicions`, `doesn't seem to phase ${him}`, `${he} finds interesting`, `${he} can't get over`) + '.';
+					const reaction = ['comes as a bit of a surprise', 'comes as quite a shock', `confirms ${his} suspicions`, `doesn't seem to phase ${him}`, `${he} finds interesting`, `${he} can't get over`].random() + '.';
 					r.push(`which ${reaction}`);
 				}
 				if (statusChanges.length > 0) {
diff --git a/js/medicine/surgery/reaction/ribs.js b/js/medicine/surgery/reaction/ribs.js
index 397c64cf0fada24cee9d889fea539b8e4848c9db..bc4aaabbbcd03bdd6f30f624edd5ad0fe4e89b31 100644
--- a/js/medicine/surgery/reaction/ribs.js
+++ b/js/medicine/surgery/reaction/ribs.js
@@ -2,8 +2,8 @@
 	class Ribs extends App.Medicine.Surgery.Reaction {
 		get key() { return "ribs"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/scrotalTuck.js b/js/medicine/surgery/reaction/scrotalTuck.js
index c108746d120afd1a9b01bd4657a81886b56ebf66..c6dd71d3de6518c1c1514da40eb623d186c51138 100644
--- a/js/medicine/surgery/reaction/scrotalTuck.js
+++ b/js/medicine/surgery/reaction/scrotalTuck.js
@@ -2,8 +2,8 @@
 	class ScrotalTuck extends App.Medicine.Surgery.Reaction {
 		get key() { return "scrotalTuck"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/sharp.js b/js/medicine/surgery/reaction/sharp.js
index 6e4cf8a167fa6633435b7f5057159de4867f5219..213349656ada96660049199b08a7da16b30b00ad 100644
--- a/js/medicine/surgery/reaction/sharp.js
+++ b/js/medicine/surgery/reaction/sharp.js
@@ -2,8 +2,8 @@
 	class Sharp extends App.Medicine.Surgery.Reaction {
 		get key() { return "sharp"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/sterilize.js b/js/medicine/surgery/reaction/sterilize.js
index e5c089faac52c98bb3637402f774f01abc9a9d79..475c43a3e84153353233e2971a42ded0e519689d 100644
--- a/js/medicine/surgery/reaction/sterilize.js
+++ b/js/medicine/surgery/reaction/sterilize.js
@@ -2,8 +2,8 @@
 	class Sterilize extends App.Medicine.Surgery.Reaction {
 		get key() { return "ster"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/tailInterface.js b/js/medicine/surgery/reaction/tailInterface.js
index 42a5c303c1bae1a8152694b7502da99b07b326fe..591047ec685946624caf4d43f3ad33c79679c9fb 100644
--- a/js/medicine/surgery/reaction/tailInterface.js
+++ b/js/medicine/surgery/reaction/tailInterface.js
@@ -2,8 +2,8 @@
 	class TailInterface extends App.Medicine.Surgery.Reaction {
 		get key() { return "tailInterface"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/teeth.js b/js/medicine/surgery/reaction/teeth.js
index 0e89280c6363f521880b1dd2448ae172143f7e02..40d1c81b5a9eb14a1c8b1a27718ee2d5cd2bf50f 100644
--- a/js/medicine/surgery/reaction/teeth.js
+++ b/js/medicine/surgery/reaction/teeth.js
@@ -2,8 +2,8 @@
 	class Teeth extends App.Medicine.Surgery.Reaction {
 		get key() { return "teeth"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/treatment.js b/js/medicine/surgery/reaction/treatment.js
index a169bf8f17629755e0848b0f9d9dc5b25227142c..fac094c49e32c7e5211458ffe57119cbbbc08699 100644
--- a/js/medicine/surgery/reaction/treatment.js
+++ b/js/medicine/surgery/reaction/treatment.js
@@ -3,8 +3,8 @@
 		// unifies "elasticity treatment", "immortality treatment" and "gene treatment"
 		get key() { return "gene treatment"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/tummyTuck.js b/js/medicine/surgery/reaction/tummyTuck.js
index fe658950dec84b9bbca8d0735ec863370aa2f906..3ea39e57162b278a90e9ed8563a95dd0870d5a85 100644
--- a/js/medicine/surgery/reaction/tummyTuck.js
+++ b/js/medicine/surgery/reaction/tummyTuck.js
@@ -2,8 +2,8 @@
 	class TummyTuck extends App.Medicine.Surgery.Reaction {
 		get key() { return "tummyTuck"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/unblind.js b/js/medicine/surgery/reaction/unblind.js
index 4ef399825c45ede7821ea337ea4d0f45a3924606..b4d911f4adf72349a5b379302bf4c275d5afc064 100644
--- a/js/medicine/surgery/reaction/unblind.js
+++ b/js/medicine/surgery/reaction/unblind.js
@@ -2,8 +2,8 @@
 	class Unblind extends App.Medicine.Surgery.Reaction {
 		get key() { return "unblind"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 			r.push(`The eye surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} new vision. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`);
diff --git a/js/medicine/surgery/reaction/undeafen.js b/js/medicine/surgery/reaction/undeafen.js
index 842aa16cf3e3e860ad2bdc99ee32ab5e3fefd209..9ace8a302d59230cd856843d756d4065af4a6705 100644
--- a/js/medicine/surgery/reaction/undeafen.js
+++ b/js/medicine/surgery/reaction/undeafen.js
@@ -2,8 +2,8 @@
 	class Undeafen extends App.Medicine.Surgery.Reaction {
 		get key() { return "undeafen"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 			r.push(`The inner ear surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes ${his} new hearing. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`);
diff --git a/js/medicine/surgery/reaction/vagina.js b/js/medicine/surgery/reaction/vagina.js
index cd5087e75255f40870bc0410f189c6c3df769e14..618caf6670724af6e9d5cb2c41f90664fa917bf8 100644
--- a/js/medicine/surgery/reaction/vagina.js
+++ b/js/medicine/surgery/reaction/vagina.js
@@ -2,8 +2,8 @@
 	class Vagina extends App.Medicine.Surgery.Reaction {
 		get key() { return "vagina"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/vaginalRemoval.js b/js/medicine/surgery/reaction/vaginalRemoval.js
index dd78d84a4055d98c86501ae4e42cc8be0f47a93d..d4b6537d73a953d8e46b0a4c445aa9b6d56399c4 100644
--- a/js/medicine/surgery/reaction/vaginalRemoval.js
+++ b/js/medicine/surgery/reaction/vaginalRemoval.js
@@ -2,8 +2,8 @@
 	class VaginaRemoval extends App.Medicine.Surgery.Reaction {
 		get key() { return "vaginaRemoval"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/vasectomy.js b/js/medicine/surgery/reaction/vasectomy.js
index db71e80a7a2df59e50c89e0b20811ed7d4d5c7a9..8b3d5086a13de22e4e34b15209329eb54c7e2025 100644
--- a/js/medicine/surgery/reaction/vasectomy.js
+++ b/js/medicine/surgery/reaction/vasectomy.js
@@ -2,8 +2,8 @@
 	class Vasectomy extends App.Medicine.Surgery.Reaction {
 		get key() { return "vasectomy"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/vasectomyUndo.js b/js/medicine/surgery/reaction/vasectomyUndo.js
index 6a1248601caca3012cfbfe3e1ce5ca1d12ae937e..714145dd43c09f67f26f7422f1158b4011cc83fd 100644
--- a/js/medicine/surgery/reaction/vasectomyUndo.js
+++ b/js/medicine/surgery/reaction/vasectomyUndo.js
@@ -2,8 +2,8 @@
 	class VasectomyUndo extends App.Medicine.Surgery.Reaction {
 		get key() { return "vasectomy undo"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/voiceLower.js b/js/medicine/surgery/reaction/voiceLower.js
index 6c681158656cdb89337bde79d861010da74637bb..af789d351f37d78323fcf5fceaf3efd5bf66daa6 100644
--- a/js/medicine/surgery/reaction/voiceLower.js
+++ b/js/medicine/surgery/reaction/voiceLower.js
@@ -2,8 +2,8 @@
 	class VoiceLower extends App.Medicine.Surgery.Reaction {
 		get key() { return "voice2"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself, hers} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/voiceRaise.js b/js/medicine/surgery/reaction/voiceRaise.js
index 3c06e2c7eb5659bd23cbc9d8b9ad1102239504e4..14a4666387002fcc12e60aa659adfbd67c63163f 100644
--- a/js/medicine/surgery/reaction/voiceRaise.js
+++ b/js/medicine/surgery/reaction/voiceRaise.js
@@ -2,8 +2,8 @@
 	class VoiceRaise extends App.Medicine.Surgery.Reaction {
 		get key() { return "voice"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself, hers} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/womb.js b/js/medicine/surgery/reaction/womb.js
index 5a40a650f43692b8f63afb143eba4146f44a4b8f..3970231e394509f07608d824447a0284ba6f56e4 100644
--- a/js/medicine/surgery/reaction/womb.js
+++ b/js/medicine/surgery/reaction/womb.js
@@ -2,8 +2,8 @@
 	class Womb extends App.Medicine.Surgery.Reaction {
 		get key() { return "womb"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/structural/heels.js b/js/medicine/surgery/structural/heels.js
index 924b170407dce8671b77df09ba20886bb359c207..32dc4cc9e5a70debe9384cc11aeb4de992e93022 100644
--- a/js/medicine/surgery/structural/heels.js
+++ b/js/medicine/surgery/structural/heels.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.ShortenTendons = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -41,8 +41,8 @@ App.Medicine.Surgery.Reactions.ShortenTendons = class extends App.Medicine.Surge
 };
 
 App.Medicine.Surgery.Reactions.ReplaceTendons = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -65,16 +65,16 @@ App.Medicine.Surgery.Procedures.ShortenTendons = class extends App.Medicine.Surg
 	get name() { return "Shorten tendons"; }
 
 	get description() {
-		const {him} = getPronouns(this.slave);
+		const {him} = getPronouns(this._slave);
 		return `Prevents ${him} from walking in anything but very high heels`;
 	}
 
 	get healthCost() { return 20; }
 
 	apply(cheat) {
-		this.slave.heels = 1;
-		this.slave.shoes = "heels";
-		return new App.Medicine.Surgery.Reactions.ShortenTendons();
+		this._slave.heels = 1;
+		this._slave.shoes = "heels";
+		return this._assemble(new App.Medicine.Surgery.Reactions.ShortenTendons());
 	}
 };
 
@@ -85,8 +85,8 @@ App.Medicine.Surgery.Procedures.ReplaceTendons = class extends App.Medicine.Surg
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		this.slave.heels = 0;
-		this.slave.shoes = "none";
-		return new App.Medicine.Surgery.Reactions.ReplaceTendons();
+		this._slave.heels = 0;
+		this._slave.shoes = "none";
+		return this._assemble(new App.Medicine.Surgery.Reactions.ReplaceTendons());
 	}
 };
diff --git a/js/medicine/surgery/structural/height.js b/js/medicine/surgery/structural/height.js
index 0ca2bc438f38cbe117f1158fa6c89a71f6aa3096..ec9af2f59533488545342c527d709ddbc04b440d 100644
--- a/js/medicine/surgery/structural/height.js
+++ b/js/medicine/surgery/structural/height.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.Height = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -25,11 +25,11 @@ App.Medicine.Surgery.Reactions.Height = class extends App.Medicine.Surgery.Simpl
 
 App.Medicine.Surgery.Procedures.IncreaseHeight = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		if (this.slave.heightImplant === 0) {
+		if (this._slave.heightImplant === 0) {
 			return "Lengthen major bones";
-		} else if (this.slave.heightImplant >= 1) {
+		} else if (this._slave.heightImplant >= 1) {
 			return "Advanced height gain surgery";
-		} else if (this.slave.heightImplant === -1) {
+		} else if (this._slave.heightImplant === -1) {
 			return "Reverse existing height surgery";
 		} else {
 			return "Revert a stage of existing height surgery";
@@ -39,20 +39,20 @@ App.Medicine.Surgery.Procedures.IncreaseHeight = class extends App.Medicine.Surg
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.heightImplant += 1;
-		this.slave.height += 10;
-		return new App.Medicine.Surgery.Reactions.ShortenTendons();
+		this._slave.heightImplant += 1;
+		this._slave.height += 10;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ShortenTendons());
 	}
 };
 
 
 App.Medicine.Surgery.Procedures.DecreaseHeight = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		if (this.slave.heightImplant === 0) {
+		if (this._slave.heightImplant === 0) {
 			return "Shorten major bones";
-		} else if (this.slave.heightImplant <= -1) {
+		} else if (this._slave.heightImplant <= -1) {
 			return "Advanced height reduction surgery";
-		} else if (this.slave.heightImplant === 1) {
+		} else if (this._slave.heightImplant === 1) {
 			return "Reverse existing height surgery";
 		} else {
 			return "Revert a stage of existing height surgery";
@@ -62,8 +62,8 @@ App.Medicine.Surgery.Procedures.DecreaseHeight = class extends App.Medicine.Surg
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.heightImplant -= 1;
-		this.slave.height -= 10;
-		return new App.Medicine.Surgery.Reactions.ShortenTendons();
+		this._slave.heightImplant -= 1;
+		this._slave.height -= 10;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ShortenTendons());
 	}
 };
diff --git a/js/medicine/surgery/structural/hips.js b/js/medicine/surgery/structural/hips.js
index 47b0eaee477dab002c3b2d1fa90896dc478f4006..be184d8e1d433c46531cfb77ff6aef73b81415a3 100644
--- a/js/medicine/surgery/structural/hips.js
+++ b/js/medicine/surgery/structural/hips.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.Hips = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -23,26 +23,26 @@ App.Medicine.Surgery.Reactions.Hips = class extends App.Medicine.Surgery.SimpleR
 };
 
 App.Medicine.Surgery.Procedures.BroadenPelvis = class extends App.Medicine.Surgery.Procedure {
-	get name() { return this.slave.shouldersImplant === 0 ? "Broaden pelvis" : "Advanced pelvis broadening"; }
+	get name() { return this._slave.shouldersImplant === 0 ? "Broaden pelvis" : "Advanced pelvis broadening"; }
 
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.hipsImplant++;
-		this.slave.hips++;
-		return new App.Medicine.Surgery.Reactions.Hips();
+		this._slave.hipsImplant++;
+		this._slave.hips++;
+		return this._assemble(new App.Medicine.Surgery.Reactions.Hips());
 	}
 };
 
 
 App.Medicine.Surgery.Procedures.NarrowPelvis = class extends App.Medicine.Surgery.Procedure {
-	get name() { return this.slave.shouldersImplant === 0 ? "Narrow pelvis" : "Advanced pelvis narrowing"; }
+	get name() { return this._slave.shouldersImplant === 0 ? "Narrow pelvis" : "Advanced pelvis narrowing"; }
 
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.hipsImplant--;
-		this.slave.hips--;
-		return new App.Medicine.Surgery.Reactions.Hips();
+		this._slave.hipsImplant--;
+		this._slave.hips--;
+		return this._assemble(new App.Medicine.Surgery.Reactions.Hips());
 	}
 };
diff --git a/js/medicine/surgery/structural/shoulders.js b/js/medicine/surgery/structural/shoulders.js
index 587971e0095b7a023878a9cdac6b52b9a7152e40..4ebd4d154cfbd101f34af7d542f85141f92a0020 100644
--- a/js/medicine/surgery/structural/shoulders.js
+++ b/js/medicine/surgery/structural/shoulders.js
@@ -1,6 +1,6 @@
 App.Medicine.Surgery.Reactions.Shoulders = class extends App.Medicine.Surgery.SimpleReaction {
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		const r = [];
 
@@ -24,25 +24,25 @@ App.Medicine.Surgery.Reactions.Shoulders = class extends App.Medicine.Surgery.Si
 
 
 App.Medicine.Surgery.Procedures.BroadenShoulders = class extends App.Medicine.Surgery.Procedure {
-	get name() { return this.slave.shouldersImplant === 0 ? "Restructure shoulders more broadly" : "Advanced shoulder broadening surgery"; }
+	get name() { return this._slave.shouldersImplant === 0 ? "Restructure shoulders more broadly" : "Advanced shoulder broadening surgery"; }
 
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.shouldersImplant++;
-		this.slave.shoulders++;
-		return new App.Medicine.Surgery.Reactions.Shoulders();
+		this._slave.shouldersImplant++;
+		this._slave.shoulders++;
+		return this._assemble(new App.Medicine.Surgery.Reactions.Shoulders());
 	}
 };
 
 App.Medicine.Surgery.Procedures.NarrowShoulders = class extends App.Medicine.Surgery.Procedure {
-	get name() { return this.slave.shouldersImplant === 0 ? "Restructure shoulders more narrowly" : "Advanced shoulder narrowing surgery"; }
+	get name() { return this._slave.shouldersImplant === 0 ? "Restructure shoulders more narrowly" : "Advanced shoulder narrowing surgery"; }
 
 	get healthCost() { return 40; }
 
 	apply(cheat) {
-		this.slave.shouldersImplant--;
-		this.slave.shoulders--;
-		return new App.Medicine.Surgery.Reactions.Shoulders();
+		this._slave.shouldersImplant--;
+		this._slave.shoulders--;
+		return this._assemble(new App.Medicine.Surgery.Reactions.Shoulders());
 	}
 };
diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index 88bfdfd9995aec1a24f071f8a298b5ae6194e67d..8115de9bd59fc03fb2981624c467c1bdb808b0bc 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -13,11 +13,11 @@ App.Facilities.Facility = class {
 
 		/** @private */
 		this._div = document.createElement("div");
-		/** @protected @type {Array<function():HTMLDivElement>} */
+		/** @private @type {Array<function():HTMLDivElement>} */
 		this._sections = [];
-		/** @protected @type {FC.IUpgrade[]} */
+		/** @private @type {FC.IUpgrade[]} */
 		this._upgrades = [];
-		/** @protected @type {FC.Facilities.Rule[]} */
+		/** @private @type {FC.Facilities.Rule[]} */
 		this._rules = [];
 
 		this._addUpgrades(...this.upgrades);
diff --git a/src/005-passages/eventsPassages.js b/src/005-passages/eventsPassages.js
index 6bc374dc415b27dacea64b6c5523ce2e5d1fe7c7..70acfbf7389facef50bf29bb6b555255a2e81c49 100644
--- a/src/005-passages/eventsPassages.js
+++ b/src/005-passages/eventsPassages.js
@@ -6,14 +6,12 @@ new App.DomPassage("Nonrandom Event",
 	}
 );
 
-new App.DomPassage("attackReport",
+new App.DomPassage("conflictReport",
 	() => {
-		return App.Events.attackReport();
-	}
-);
-new App.DomPassage("rebellionReport",
-	() => {
-		return App.Events.rebellionReport();
+		V.nextButton = "Continue";
+		V.nextLink = "Scheduled Event";
+		V.encyclopedia = "Battles";
+		return App.Events.conflictReport();
 	}
 );
 new App.DomPassage("conflictHandler",
diff --git a/src/005-passages/interactPassages.js b/src/005-passages/interactPassages.js
index ee72969f078b63f03c434747cda6d1ad9f07e991..9126eb9360d86e2978b087afc6a28b5c591d1dda 100644
--- a/src/005-passages/interactPassages.js
+++ b/src/005-passages/interactPassages.js
@@ -22,8 +22,8 @@ new App.DomPassage("KillSlave", () => App.UI.SlaveInteract.killSlave(getSlave(V.
 
 new App.DomPassage("Fat Grafting",
 	() => {
-		V.nextButton = "Finalize fat transfer";
-		V.nextLink = "Surgery Degradation";
+		V.nextButton = "Back";
+		V.nextLink = "Remote Surgery";
 
 		return App.UI.SlaveInteract.fatGraft(getSlave(V.AS));
 	}
diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js
index 4b1f337a91da65339e6f1caec9157be6e9f748e2..fc46819fda7140f504062e96f86e6750659e7584 100644
--- a/src/005-passages/managePassages.js
+++ b/src/005-passages/managePassages.js
@@ -203,3 +203,11 @@ new App.DomPassage("editSF",
 		return App.UI.editSF();
 	}
 );
+
+new App.DomPassage("edicts",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Main";
+		return App.SecExp.edicts();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
diff --git a/src/Mods/SecExp/edicts.tw b/src/Mods/SecExp/edicts.tw
deleted file mode 100644
index 41fcdf1a6dab1f8ac2ff745f4722786233eb6f8d..0000000000000000000000000000000000000000
--- a/src/Mods/SecExp/edicts.tw
+++ /dev/null
@@ -1,664 +0,0 @@
-:: edicts [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back", $nextLink = "Main">>
-
-//Passing any edict will cost <<print cashFormat(5000)>> and some authority. More edicts will become available as the arcology develops.//
-<<run App.UI.tabBar.handlePreSelectedTab($tabChoice.edicts)>>
-<br>
-<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Society')" id="tab Society">Society</button>
-<<if $SecExp.battles.victories + $SecExp.battles.losses > 0 || $SecExp.rebellions.victories + $SecExp.rebellions.losses > 0 || $mercenaries > 0>>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Military')" id="tab Military">Military</button>
-<</if>>
-<<set $SecExp.core.authority = Math.clamp($SecExp.core.authority, 0, 20000)>>
-
-<div id="Society" class="tab-content">
-	<div class="content">
-	<<if $SecExp.edicts.alternativeRents == 1>>
-		<br>''Alternative rent payment:'' you are allowing citizens to pay for their rents in menial slaves rather than cash.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.alternativeRents = 0]]</span>
-	<<else>>
-		<br>''Alternative rent payment:'' allow citizens to pay for their rents in menial slaves rather than cash, if so they wish.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.alternativeRents = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will decrease rents, but will supply a small amount of menial slaves each week.//
-	<</if>>
-
-	<<if $SecExp.edicts.enslavementRights == 1>>
-		<br>''Enslavement rights:'' you are the only authority able to declare a person enslaved or not.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.enslavementRights = 0]]</span>
-	<<else>>
-		<br>''Enslavement rights:'' the arcology owner will be the only authority able to declare a person enslaved or not.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.enslavementRights = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will provide cash each week. The higher the flux of citizens to slaves the higher the income. Will cost a small amount of authority each week.//
-	<</if>>
-
-	<<if $SecExp.buildings.secHub>>
-		<<set _secUpgrades = $SecExp.buildings.secHub.upgrades>>
-		<<if $SecExp.edicts.sellData === 1>>
-			<br>''Private Data marketization:'' you are selling private citizens' data to the best bidder.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.sellData = 0]]</span>
-		<<elseif $SecExp.edicts.sellData === 0 && Object.values(_secUpgrades.security).reduce((a, b) => a + b) > 0 || Object.values(_secUpgrades.crime).reduce((a, b) => a + b) > 0 || Object.values(_secUpgrades.intel).reduce((a, b) => a + b) > 0>>
-			<br>''Private Data marketization:'' allow the selling of private citizens' data.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.sellData = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will generate income dependent on the amount of upgrades installed in the security HQ, but will cost a small amount of authority each week.//
-		<</if>>
-	<</if>>
-	<<if $SecExp.buildings.propHub>>
-		<<if $SecExp.edicts.propCampaignBoost == 1>>
-			<br>''Obligatory educational material:'' you are forcing residents to read curated educational material about the arcology.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.propCampaignBoost = 0]]</span>
-		<<else>>
-			<br>''Obligatory educational material:'' force residents to read curated educational material about the arcology.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.propCampaignBoost = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase the effectiveness of propaganda campaigns, but will incur upkeep costs.//
-		<</if>>
-	<</if>>
-	<<if $SecExp.buildings.transportHub>>
-		<<if $SecExp.edicts.tradeLegalAid == 1>>
-			<br>''Legal aid for new businesses:'' New businesses can rely on your help for legal expenses and issues.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.tradeLegalAid = 0]]</span>
-		<<else>>
-			<br>''Legal aid for new businesses:'' Support new businesses in the arcology by helping them cover legal costs and issues.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.tradeLegalAid = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase trade, but will incur upkeep costs.//
-		<</if>>
-		<<if $SecExp.edicts.taxTrade == 1>>
-			<br>''Trade tariffs:'' all goods transitioning in your arcology have to pay a transition fee.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.taxTrade = 0]]</span>
-		<<else>>
-			<br>''Trade tariffs:'' all goods transitioning in your arcology will have to pay a transition fee.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.taxTrade = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will provide income based on trade level, but will negatively affect trade.//
-		<</if>>
-	<</if>>
-
-	<<if $arcologies[0].FSPaternalist != "unset">>
-		<<if $SecExp.edicts.slaveWatch == 1>>
-			<br>''@@.lime;Slave mistreatment watch:@@'' slaves are able access a special security service in case of mistreatment.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.slaveWatch = 0]]</span>
-		<<else>>
-			<br>''@@.lime;Slave mistreatment watch:@@'' slaves will be able access a special security service in case of mistreatment.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.slaveWatch = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will help advance paternalism, but will incur upkeep costs.//
-		<</if>>
-	<</if>>
-
-	<<if $arcologies[0].FSChattelReligionist >= 40>>
-		<<if $SecExp.edicts.subsidyChurch == 1>>
-			<br>''@@.lime;Religious activities subsidy:@@'' you are providing economic support to religious activities following the official dogma.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.subsidyChurch = 0]]</span>
-		<<else>>
-			<br>''@@.lime;Religious activities subsidy:@@'' will provide economic support to religious activities following the official dogma.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.subsidyChurch = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will provide authority each week, but will incur upkeep costs.//
-		<</if>>
-	<</if>>
-
-	<br><br>__Immigration:__
-	<<if $SecExp.edicts.limitImmigration == 1>>
-		<br>''Immigration limits:'' you put strict limits to the amount of people the arcology can accept each week.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.limitImmigration = 0]]</span>
-	<<else>>
-		<br>''Immigration limits:'' institute limits to the amount of people the arcology will accept each week.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.openBorders = 0, $SecExp.edicts.limitImmigration = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of people immigrating into the arcology and enhance security.//
-	<</if>>
-
-	<<if $SecExp.edicts.openBorders == 1>>
-		<br>''Open borders:'' you have lowered considerably the requirements to become citizens.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.openBorders = 0]]</span>
-	<<else>>
-		<br>''Open borders:'' considerably lower requirements to become citizens.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.openBorders = 1, $SecExp.edicts.limitImmigration = 0, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase immigration to the arcology, but will increase crime.//
-	<</if>>
-
-	<br><br>__Weapons:__
-	<<if $SecExp.edicts.weaponsLaw == 0>>
-		<br>''Forbid weapons inside the arcology:'' residents are forbidden to buy, sell and keep weaponry while within the arcology.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.weaponsLaw = 3]]</span>
-	<<elseif $SecExp.edicts.weaponsLaw == 2>>
-		<br>''Heavy weaponry forbidden:'' residents are allowed to buy, sell and keep weapons within the arcology as long as they are non-heavy, non-explosive.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.weaponsLaw = 3]]</span>
-	<<elseif $SecExp.edicts.weaponsLaw == 1>>
-		<br>''Heavily restricted weaponry:'' residents are allowed to buy, sell and keep weapons within the arcology as long as they are non-automatic, non-high caliber.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.weaponsLaw = 3]]</span>
-	<<else>>
-		<br>''All weapons allowed:'' residents are allowed to buy, sell and keep all kind of weapons in the arcology.
-	<</if>>
-
-	<<if $SecExp.edicts.weaponsLaw == 3>>
-		<br>''Heavy weaponry forbidden:'' set the range of weapons allowed within the arcology to non-heavy, non-explosive.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 2, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly increase prosperity, but will cost a small amount of authority each week and will leave rebellions decently armed.//
-	<<elseif $SecExp.edicts.weaponsLaw == 2>>
-		<br>''All weapons allowed:'' allow residents of the arcology to buy, sell and keep weaponry of any kind within the arcology.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 3, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly increase prosperity and provide a small weekly amount of reputation, but rebellions will be very well armed.//
-		<br>''Heavily restricted weaponry:'' set the range of weapons allowed within the arcology to non-automatic, non-high caliber.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will cost some authority each week, but rebellions will be poorly armed.//
-	<<elseif $SecExp.edicts.weaponsLaw == 1>>
-		<br>''Heavy weaponry forbidden:'' set the range of weapons allowed within the arcology to non-heavy, non-explosive.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 2, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly increase prosperity, but will cost a small amount of authority each week and will leave rebellions decently armed.//
-		<br>''Forbid weapons inside the arcology:'' forbid residents to buy, sell and keep weaponry while within the arcology.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 0, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will cost a moderate amount of authority each week, but rebellions will be very poorly armed.//
-	<<elseif $SecExp.edicts.weaponsLaw == 0>>
-		<br>''Heavily restricted weaponry:'' set the range of weapons allowed within the arcology to non-automatic, non-high caliber.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.weaponsLaw = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will cost some authority each week, but rebellions will be poorly armed.//
-	<</if>>
-
-	<<if $FSAnnounced>>
-		<br><br>__Future Societies:__
-		<<if $SecExp.edicts.defense.legionTradition === 1>>
-			<br>''@@.lime;Legionaries traditions:@@'' you are funding specialized training for your recruits following the Roman tradition of professional armies.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.legionTradition = 0]]</span>
-		<</if>>
-		<<if $SecExp.edicts.defense.imperialTradition === 1>>
-			<br>''@@.lime;Neo-Imperial traditions:@@'' you are funding specialized training for your recruits to inculcate them into a professional Imperial army, led by highly trained and hand-picked $mercenariesTitle.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.imperialTradition = 0]]</span>
-		<</if>>
-		<<if $SecExp.edicts.defense.pharaonTradition === 1>>
-			<br>''@@.lime;Pharaonic traditions:@@'' you are funding specialized training for your recruits to turn them into an army worthy of a pharaon.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.pharaonTradition = 0]]</span>
-		<</if>>
-		<<if $SecExp.edicts.defense.militia >= 1>>
-			<<if $arcologies[0].FSRomanRevivalist >= 40>>
-				<<if $SecExp.edicts.defense.legionTradition === 0>>
-					<br>''@@.lime;Legionaries traditions:@@'' Fund specialized training for your recruits to turn them into the professional of Roman tradition.
-					<<if $SecExp.core.authority >= 1000>>
-						<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.legionTradition = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-					<<else>>
-						<br>//Not enough Authority.//
-					<</if>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase defense, morale and hp of militia units, but will incur upkeep costs.//
-				<</if>>
-			<</if>>
-			<<if $arcologies[0].FSEgyptianRevivalist >= 40>>
-				<<if $SecExp.edicts.defense.pharaonTradition === 0>>
-					<br>''@@.lime;Pharaonic traditions:@@'' Fund specialized training for your recruits to turn them into an army worthy of a pharaoh.
-					<<if $SecExp.core.authority >= 1000>>
-						<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.pharaonTradition = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-					<<else>>
-						<br>//Not enough Authority.//
-					<</if>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase attack, defense and morale of militia units, but will incur upkeep costs.//
-				<</if>>
-			<</if>>
-			<<if $arcologies[0].FSNeoImperialist >= 40>>
-				<<if $SecExp.edicts.defense.imperialTradition === 0>>
-					<br>''@@.lime;Neo-Imperial traditions:@@'' Fund specialized training for your recruits to turn them into a professional Imperial army, led by your handpicked Imperial Knights.
-					<<if $SecExp.core.authority >= 1000>>
-						<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.imperialTradition = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-					<<else>>
-						<br>//Not enough Authority.//
-					<</if>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will moderately increase defense, hp, and morale of your militia units and increase attack, defense and morale of your mercenaries, but will incur upkeep costs.//
-				<</if>>
-			<</if>>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.eagleWarriors === 1>>
-			<br>''@@.lime;Eagle warriors traditions:@@'' you are funding specialized training for your mercenaries following the Aztec tradition of elite warriors.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.eagleWarriors = 0]]</span>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.ronin === 1>>
-			<br>''@@.lime;Ronin traditions:@@'' you are funding specialized training for your mercenaries following the Japanese tradition of elite errant samurai.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.ronin = 0]]</span>
-		<</if>>
-		<<if $mercenaries > 0>>
-			<<if $arcologies[0].FSAztecRevivalist >= 40>>
-				<<if $SecExp.edicts.defense.eagleWarriors === 0>>
-					<br>''@@.lime;Eagle warriors traditions:@@'' Fund specialized training for your mercenaries to turn them into the elite units of Aztec tradition.
-					<<if $SecExp.core.authority >= 1000>>
-						<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.eagleWarriors = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-					<<else>>
-						<br>//Not enough Authority.//
-					<</if>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will give a high increase in attack and morale, but will lower defense of mercenary units and will incur upkeep costs.//
-				<</if>>
-			<</if>>
-			<<if $arcologies[0].FSEdoRevivalist >= 40>>
-				<<if $SecExp.edicts.defense.ronin === 0>>
-					<br>''@@.lime;Ronin traditions:@@'' Fund specialized training for your mercenaries to turn them into the errant samurai of Japanese tradition.
-					<<if $SecExp.core.authority >= 1000>>
-						<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.ronin = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-					<<else>>
-						<br>//Not enough Authority.//
-					<</if>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase attack, defense and morale of mercenary units, but will incur upkeep costs.//
-				<</if>>
-			<</if>>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.mamluks === 1>>
-			<br>''@@.lime;Mamluks traditions:@@'' you are funding specialized training for your slaves following the Arabian tradition of mamluks slave soldiers.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.mamluks = 0]]</span>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.sunTzu === 1>>
-			<br>''@@.lime;Sun Tzu Teachings:@@'' you are funding specialized training for your units and officers to follow the teachings of the "Art of War".
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.sunTzu = 0]]</span>
-		<</if>>
-		<<if $arcologies[0].FSArabianRevivalist >= 40>>
-			<<if $SecExp.edicts.defense.mamluks === 0>>
-				<br>''@@.lime;Mamluks traditions:@@'' Fund specialized training for your slaves to turn them into the mamluks slave soldiers of Arabian tradition.
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.mamluks = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase attack, morale and hp of slave units, but will incur upkeep costs.//
-			<</if>>
-		<</if>>
-		<<if $arcologies[0].FSChineseRevivalist >= 40>>
-			<<if $SecExp.edicts.defense.sunTzu === 0>>
-				<br>''@@.lime;Sun Tzu Teachings:@@'' Fund specialized training for your units and officers to conform your army to the teachings of the "Art of War".
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.sunTzu = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly increase attack, defense and morale of all units, but will incur upkeep costs.//
-			<</if>>
-		<</if>>
-	<</if>>
-	</div>
-</div>
-
-<div id="Military" class="tab-content">
-	<div class="content">
-	<<if $SecExp.edicts.defense.soldierWages === 0>>
-		<br>''Low wages for soldiers:'' wages for soldiers are set to a low level compared to market standards.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.soldierWages = 1]]</span>
-	<<elseif $SecExp.edicts.defense.soldierWages === 1>>
-		<br>''Average wages for soldiers:'' wages for soldiers are set to the market standards.
-	<<else>>
-		<br>''High wages for soldiers:'' wages for soldiers are set to a high level compared to market standards.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.soldierWages = 1]]</span>
-	<</if>>
-
-	<<if $SecExp.edicts.defense.soldierWages === 0>>
-		<br>''Average wages for soldiers:'' will set the wages paid to the soldiers of the arcology to an average amount.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.soldierWages += 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will raise all units upkeep and push loyalty to average levels.//
-	<<elseif $SecExp.edicts.defense.soldierWages === 1>>
-		<br>''Low wages for soldiers:'' will set the wages paid to the soldiers of the arcology to a low amount.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.soldierWages -= 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower all units upkeep and push loyalty to low levels.//
-		<br>''High wages for soldiers:'' will set the wages paid to the soldiers of the arcology to a high amount.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.soldierWages += 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will raise all units upkeep and push loyalty to high levels.//
-	<<else>>
-		<br>''Average wages for soldiers:'' will set the wages paid to the soldiers of the arcology to an average amount.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.soldierWages -= 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower all units upkeep and push loyalty to average levels.//
-	<</if>>
-
-	<<if $SecExp.edicts.defense.slavesOfficers === 1>>
-		<br>''Slave Officers:'' your trusted slaves are allowed to lead the defense forces of the arcology.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.slavesOfficers = 0]]</span>
-	<<else>>
-		<br>''Slave Officers:'' allow your trusted slaves to lead the defense forces of the arcology.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.slavesOfficers = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will allow your bodyguard and Head Girl to lead troops into battle, but will cost a small amount of authority each week.//
-	<</if>>
-
-	<<if $mercenaries > 0>>
-		<<if $SecExp.edicts.defense.discountMercenaries === 1>>
-			<br>''Mercenary subsidy:'' mercenaries willing to immigrate in your arcology will be offered a discount on rent.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.discountMercenaries = 0]]</span>
-		<<else>>
-			<br>''Mercenary subsidy:'' mercenaries willing to immigrate in your arcology will be offered a discount on rent.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.discountMercenaries = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly lower rent, but will increase the amount of available mercenaries.//
-		<</if>>
-	<</if>>
-
-	<<if $SecExp.edicts.defense.militia === 0>>
-		<br>''Found the militia:'' lay the groundwork for the formation of the arcology's citizens' army.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militia = 2, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will allow for the recruitment and training of citizens.//
-	<<else>>
-		<<if $SecExp.edicts.defense.militia === 1>>
-			<br>''Volunteers' militia:'' only volunteers will be accepted in the militia.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militia = 2, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will replenish militia manpower slowly and will cap at <<= num(App.SecExp.militiaCap(2)*100)>>% of the total citizens population.//
-		<</if>>
-
-		<<if $SecExp.edicts.defense.militia === 3>>
-			<br>''Conscription:'' every citizen is required to train in the militia and serve the arcology for a limited amount of time.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.militia = 2]]</span>
-		<<else>>
-			<br>''Conscription:'' every citizen is required to train in the militia and serve the arcology if the need arises.
-			<<if $SecExp.core.authority >= 4000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militia = 3, cashX(-5000, "edicts"), $SecExp.core.authority -= 4000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will replenish militia manpower moderately fast and will cap at <<= num(App.SecExp.militiaCap(3)*100)>>% of the total citizens population, but has a high authority cost//
-		<</if>>
-		<<if $SecExp.edicts.defense.militia === 4>>
-			<br>''Obligatory military service:'' every citizen is required to register and serve under the militia.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.militia = 2]]</span>
-		<<else>>
-			<br>''Obligatory military service:'' every citizen is required to register and serve under the militia.
-			<<if $SecExp.core.authority >= 6000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militia = 4, cashX(-5000, "edicts"), $SecExp.core.authority -= 6000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will quickly replenish militia manpower and will cap at <<= num(App.SecExp.militiaCap(4)*100)>>% of the total citizens population, but has a very high authority cost//
-		<</if>>
-		<<if $SecExp.edicts.defense.militia === 5>>
-			<br>''Militarized Society:'' every adult citizen is required to train and actively participate in the military of the arcology.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.militia = 2]]</span>
-		<<else>>
-			<br>''Militarized Society:'' every adult citizen is required to train and participate in the defense of the arcology.
-			<<if $SecExp.core.authority >= 8000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militia = 5, cashX(-5000, "edicts"), $SecExp.core.authority -= 8000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will very quickly replenish militia manpower and will cap at <<= num(App.SecExp.militiaCap(5)*100)>>% of the total citizens population, but has an extremely high authority cost//
-		<</if>>
-
-
-		<<if $SecExp.edicts.defense.militaryExemption === 1>>
-				<br>''Military exemption:'' you allow citizens to avoid military duty by paying a weekly fee.
-				<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.militaryExemption = 0]]</span>
-		<</if>>
-		<<if $SecExp.edicts.defense.militia >= 3>>
-			<<if $SecExp.edicts.defense.militaryExemption === 0>>
-				<br>''Military exemption:'' allow citizens to avoid military duty by paying a weekly fee.
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.militaryExemption = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slow down the replenishment of manpower, but will supply cash each week. More profitable with stricter recruitment laws.//
-			<</if>>
-		<</if>>
-
-
-		<<if $SecExp.edicts.defense.lowerRequirements == 1>>
-			<br>''@@.lime;Revised minimum requirements:@@'' you allow citizens outside the normally accepted range to join the militia.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.lowerRequirements = 0]]</span>
-		<</if>>
-		<<if $arcologies[0].FSHedonisticDecadence >= 40>>
-			<<if $SecExp.edicts.defense.lowerRequirements == 0>>
-				<br>''@@.lime;Revised minimum requirements:@@'' will allow citizens outside the normally accepted range to join the militia.
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.lowerRequirements = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly lower defense and hp of militia units, but will increase the manpower replenishment rate.//
-			<</if>>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.noSubhumansInArmy == 1>>
-			<br>''@@.lime;No subhumans in the militia:@@'' it is forbidden for subhumans to join the militia.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.noSubhumansInArmy = 0]]</span>
-		<</if>>
-		<<if $arcologies[0].FSSubjugationist >= 40>>
-			<<if $SecExp.edicts.defense.noSubhumansInArmy == 0>>
-				<br>''@@.lime;No subhumans in the militia:@@'' prevent subhumans from joining the militia.
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.noSubhumansInArmy = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will help advance racial Subjugation, but will slow down slightly manpower replenishment.//
-			<</if>>
-		<</if>>
-
-		<<if $SecExp.edicts.defense.pregExemption == 1>>
-			<br>''@@.lime;Military exemption for pregnancies:@@'' pregnant citizens are allowed, and encouraged, to avoid military service.
-			<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.pregExemption = 0]]</span>
-		<</if>>
-		<<if $arcologies[0].FSRepopulationFocus >= 40 && $SecExp.edicts.defense.militia >= 3>>
-			<<if $SecExp.edicts.defense.pregExemption == 0>>
-				<br>''@@.lime;Military exemption for pregnancies:@@'' pregnant citizens will be allowed, and encouraged, to avoid military service.
-				<<if $SecExp.core.authority >= 1000>>
-					<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.pregExemption = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-				<<else>>
-					<br>//Not enough Authority.//
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will help advance repopulation focus, but will slow down slightly manpower replenishment.//
-			<</if>>
-		<</if>>
-	<</if>>
-
-	<<if $SecExp.edicts.defense.privilege.militiaSoldier === 1>>
-		<br>''Special militia privileges:'' citizens joining the militia are exempt from rent payment.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.privilege.militiaSoldier = 0]]</span>
-	<</if>>
-	<<if $SecExp.edicts.defense.privilege.militiaSoldier === 0 && $SecExp.edicts.defense.militia >= 1>>
-		<br>''Special militia privileges'' will allow citizens joining the militia to avoid paying rent.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.privilege.militiaSoldier = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase the loyalty of militia units, but will decrease rents.//
-	<</if>>
-
-	<<if $SecExp.edicts.defense.privilege.slaveSoldier === 1>>
-		<br>''Special slaves privileges:'' Slaves into the army are allowed to have material possessions.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.privilege.slaveSoldier = 0]]</span>
-	<</if>>
-	<<if $SecExp.edicts.defense.privilege.slaveSoldier === 0>>
-		<br>''Special slaves privileges'' will allow slaves drafted into the army to be able to have material possessions.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.privilege.slaveSoldier = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase the loyalty of slave units, but will cost authority each week.//
-	<</if>>
-
-	<<if $SecExp.edicts.defense.privilege.mercSoldier === 1>>
-		<br>''Special mercenary privileges:'' Mercenaries under contract can claim part of the loot gained from battles.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.privilege.mercSoldier = 0]]</span>
-	<</if>>
-	<<if $SecExp.edicts.defense.privilege.mercSoldier === 0 && $mercenaries > 0>>
-		<br>''Special mercenary privileges'' will allow mercenaries under contract to claim part of the loot gained from battles.
-		<<if $SecExp.core.authority >= 1000>>
-			<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.privilege.mercSoldier = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-		<<else>>
-			<br>//Not enough Authority.//
-		<</if>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will increase the loyalty of mercenary units, but will reduce cash and menial slaves gained from battles.//
-	<</if>>
-
-	<<if $SecExp.edicts.defense.martialSchool === 1>>
-		<br>''@@.lime;Slave martial schools:@@'' specialized schools are training slaves in martial arts and bodyguarding.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.martialSchool = 0]]</span>
-	<</if>>
-	<<if $arcologies[0].FSPhysicalIdealist >= 40>>
-		<<if $SecExp.edicts.defense.martialSchool === 0>>
-			<br>''@@.lime;Slave martial schools:@@'' specialized schools will be set up to train slaves in martial arts and bodyguarding.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.martialSchool = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will slightly increase morale of slave units, but will incur upkeep costs.//
-		<</if>>
-	<</if>>
-
-	<<if $SecExp.edicts.defense.eliteOfficers === 1>>
-		<br>''@@.lime;Elite officers:@@'' officers are exclusively recruited from the elite of society.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.eliteOfficers = 0]]</span>
-	<</if>>
-	<<if $arcologies[0].FSRestart >= 40>>
-		<<if $SecExp.edicts.defense.eliteOfficers === 0>>
-			<br>''@@.lime;Elite officers:@@'' officers will be exclusively recruited from the elite of society.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.eliteOfficers = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will help advance eugenics and provide a small morale boost to militia units, but will give a small morale malus to slave units.//
-		<</if>>
-	<</if>>
-
-	<<if $SecExp.edicts.defense.liveTargets === 1>>
-		<br>''@@.lime;Live targets drills:@@'' disobedient slaves are used as live targets at shooting ranges.
-		<span class ='yellow'>[[Repeal|edicts][$SecExp.edicts.defense.liveTargets = 0]]</span>
-	<</if>>
-	<<if $arcologies[0].FSDegradationist >= 40>>
-		<<if $SecExp.edicts.defense.liveTargets === 0>>
-			<br>''@@.lime;Live targets drills:@@'' disobedient slaves will be used as live targets at shooting ranges.
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.defense.liveTargets = 1, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will help advance degradationism and provide a small amount of exp to units, but will make the slave population slowly decline.//
-		<</if>>
-	<</if>>
-
-	<<if $SF.Toggle && $SF.Active >= 1>>
-		<br><br>__Special Force:__
-		<<set _capSF = capFirstChar($SF.Lower || "the special force")>>
-		<<if $SecExp.edicts.SFSupportLevel > 0>>
-			<<if $SecExp.edicts.SFSupportLevel === 1>>
-				<br>''Equipment provision:'' _capSF is providing the security HQ with advanced equipment, boosting its efficiency.
-			<<elseif $SecExp.edicts.SFSupportLevel === 2>>
-				<br>''Personnel training:'' _capSF is currently providing advanced equipment and training to security HQ personnel.
-			<<elseif $SecExp.edicts.SFSupportLevel === 3>>
-				<br>''Troops detachment:'' _capSF has currently transferred troops to the security department HQ in addition to providing advanced equipment and training to security HQ personnel.
-			<<elseif $SecExp.edicts.SFSupportLevel === 4>>
-				<br>''Full support:'' _capSF is currently providing its full support to the security department, while transferring troops to the security department HQ in addition to providing advanced equipment and training to security HQ personnel.
-			<<elseif $SecExp.edicts.SFSupportLevel === 5>>
-				<br>''Network assistance:'' _capSF is currently assisting with a local install of its custom network full support and has transferred troops to the security department HQ in addition to providing advanced equipment and training to security HQ personnel.
-			<</if>>
-			<span class='yellow'>[[Repeal|edicts][$SecExp.edicts.SFSupportLevel--]]</span>
-		<</if>>
-		<<if $SecExp.edicts.SFSupportLevel < 5>>
-			<<if $SecExp.edicts.SFSupportLevel === 0 && App.SecExp.Check.reqMenials() > 5>>
-				<br>''Equipment provision:'' _capSF will provide the security HQ with advanced equipment.
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of personnel necessary to man the security HQ by 5, but will incur upkeep costs.//
-			<<elseif $SecExp.edicts.SFSupportLevel === 1 && $SF.Squad.Firebase >= 4 && App.SecExp.Check.reqMenials() > 5>>
-				<br>''Personnel training:'' _capSF will provide the security HQ personnel with advanced training.
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs.//
-			<<elseif $SecExp.edicts.SFSupportLevel === 2 && $SF.Squad.Firebase >= 6 && App.SecExp.Check.reqMenials() > 5>>
-				<br>''Troops detachment:'' _capSF will provide troops to the security department.
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs.//
-			<<elseif $SecExp.edicts.SFSupportLevel === 3 && $SF.Squad.Firebase >= 6 && App.SecExp.Check.reqMenials() > 5>>
-				<br>''Full Support:'' _capSF will give the security department its full support.
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs.//
-			<<elseif $SecExp.edicts.SFSupportLevel === 4 && $SF.Squad.Firebase === 10 && App.SecExp.Check.reqMenials() > 5>>
-				<br>''Network assistance:'' _capSF will assist the security department with installing a local version of their custom network.
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;//Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs.//
-			<</if>>
-			<<if $SecExp.core.authority >= 1000>>
-				<span class='green'>[[Implement|edicts][$SecExp.edicts.SFSupportLevel++, cashX(-5000, "edicts"), $SecExp.core.authority -= 1000]]</span>
-			<<else>>
-				<br>//Not enough Authority.//
-			<</if>>
-		<</if>>
-	<</if>>
-	</div>
-</div>
diff --git a/src/Mods/SecExp/events/attackReport.js b/src/Mods/SecExp/events/attackReport.js
deleted file mode 100644
index 74ca53f5bc81fe02175912409986ad2bbf056835..0000000000000000000000000000000000000000
--- a/src/Mods/SecExp/events/attackReport.js
+++ /dev/null
@@ -1,1051 +0,0 @@
-App.Events.attackReport = function() {
-	V.nextButton = "Continue";
-	V.nextLink = "Scheduled Event";
-	V.encyclopedia = "Battles";
-	const casualtiesReport = function(type, loss, squad=null) {
-		const isSpecial = squad && App.SecExp.unit.list().slice(1).includes(type);
-		let r = [];
-		if (loss <= 0) {
-			r.push(`No`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.2) : 10)) {
-			r.push(`Light`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.4) : 30)) {
-			r.push(`Moderate`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.6) : 60)) {
-			r.push(`Heavy`);
-		} else {
-			r.push(`Catastrophic`);
-		}
-		r.push(`casualties suffered.`);
-		if (App.SecExp.unit.list().includes(type)) {
-			if (squad.troops <= 0) {
-				squad.active = 0;
-				r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit.`);
-				if (type === "bots") {
-					r.push(`It will take quite the investment to rebuild them.`);
-				} else {
-					r.push(`The remnants will be sent home honored as veterans or reorganized in a new unit.`);
-				}
-			} else if (squad.troops <= 10) {
-				r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`);
-			}
-		}
-		return r.join(" ");
-	};
-	function loopThroughUnits(units, type) {
-		for (const unit of units) {
-			if (App.SecExp.unit.isDeployed(unit)) {
-				if (V.SecExp.war.losses > 0) {
-					loss = lossesList.pluck();
-					loss = Math.clamp(loss, 0, unit.troops);
-				}
-
-				const r = [`${type !== "bots" ? `${unit.platoonName}` : `Security drones`}: ${casualtiesReport(type, loss, unit)}`];
-				if (type !== "bots") {
-					unit.battlesFought++;
-					if (loss > 0) {
-						const med = Math.round(Math.clamp(loss * unit.medics * 0.25, 1, loss));
-						if (unit.medics === 1) {
-							r.push(`Some men were saved by their medics.`);
-						}
-						unit.troops -= Math.trunc(Math.clamp(loss - med, 0, unit.maxTroops));
-						V.SecExp.units[type].dead += Math.trunc(loss - med);
-					}
-					if (unit.training < 100 && random(1, 100) > 60) {
-						r.push(`Experience has increased.`);
-						unit.training += random(5, 15) + (majorBattle ? 1 : 0) * random(5, 15);
-					}
-				} else if (type === "bots" && loss > 0) {
-					unit.troops -= loss;
-				}
-				App.Events.addNode(node, r, "div");
-			}
-		}
-	}
-
-	const node = new DocumentFragment();
-	let r = [];
-
-	V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses);
-	if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) {
-		V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops;
-	}
-	V.SecExp.core.totalKills += V.SecExp.war.attacker.losses;
-	V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses);
-	let loot = 0;
-	let loss = 0;
-	let captives;
-	const lossesList = [];
-
-	// result
-	const majorBattle = V.SecExp.war.type.includes("Major");
-	const majorBattleMod = !majorBattle ? 1 : 2;
-	if (majorBattle) {
-		V.SecExp.battles.major++;
-	}
-	if (V.SecExp.war.result === 3) {
-		App.UI.DOM.makeElement("h1", `Victory!`, "strong");
-		V.SecExp.battles.lossStreak = 0;
-		V.SecExp.battles.victoryStreak += 1;
-		V.SecExp.battles.victories++;
-	} else if (V.SecExp.war.result === -3) {
-		App.UI.DOM.makeElement("h1", `Defeat!`, "strong");
-		V.SecExp.battles.lossStreak += 1;
-		V.SecExp.battles.victoryStreak = 0;
-		V.SecExp.battles.losses++;
-	} else if (V.SecExp.war.result === 2) {
-		App.UI.DOM.makeElement("h1", `Partial victory!`, "strong");
-		V.SecExp.battles.victories++;
-	} else if (V.SecExp.war.result === -2) {
-		App.UI.DOM.makeElement("h1", `Partial defeat!`, "strong");
-		V.SecExp.battles.losses++;
-	} else if (V.SecExp.war.result === -1) {
-		App.UI.DOM.makeElement("h1", `We surrendered`, "strong");
-		V.SecExp.battles.losses++;
-	} else if (V.SecExp.war.result === 0) {
-		App.UI.DOM.makeElement("h1", `Failed bribery!`, "strong");
-		V.SecExp.battles.losses++;
-	} else if (V.SecExp.war.result === 1) {
-		App.UI.DOM.makeElement("h1", `Successful bribery!`, "strong");
-		V.SecExp.battles.victories++;
-	}
-	let end = (V.SecExp.battles.victoryStreak >= 2 || V.SecExp.battles.lossStreak >= 2) ? `,` : `.`;
-
-	r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was attacked by`);
-	if (V.SecExp.war.attacker.type === "raiders") {
-		r.push(`a band of wild raiders,`);
-	} else if (V.SecExp.war.attacker.type === "free city") {
-		r.push(`a contingent of mercenaries hired by a competing free city,`);
-	} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-		r.push(`a group of freedom fighters bent on the destruction of the institution of slavery,`);
-	} else if (V.SecExp.war.attacker.type === "old world") {
-		r.push(`an old world nation boasting a misplaced sense of superiority,`);
-	}
-
-	r.push(`${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`);
-	if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) {
-		r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong, clashed with them`);
-		if (V.SecExp.war.terrain === "urban") {
-			r.push(`in the streets of`);
-			if (V.SecExp.war.terrain === "urban") {
-				r.push(`the old world city surrounding the arcology,`);
-			} else {
-				r.push(`of the free city,`);
-			}
-		} else if (V.SecExp.war.terrain === "rural") {
-			r.push(`in the rural land surrounding the free city,`);
-		} else if (V.SecExp.war.terrain === "hills") {
-			r.push(`on the hills around the free city,`);
-		} else if (V.SecExp.war.terrain === "coast") {
-			r.push(`along the coast just outside the free city,`);
-		} else if (V.SecExp.war.terrain === "outskirts") {
-			r.push(`just against the walls of the arcology,`);
-		} else if (V.SecExp.war.terrain === "mountains") {
-			r.push(`in the mountains overlooking the arcology,`);
-		} else if (V.SecExp.war.terrain === "wasteland") {
-			r.push(`in the wastelands outside the free city territory,`);
-		} else if (V.SecExp.war.terrain === "international waters") {
-			r.push(`in the water surrounding the free city,`);
-		} else if (["a sunken ship", "an underwater cave"].includes(V.SecExp.war.terrain)) {
-			r.push(`in <strong>${V.SecExp.war.terrain}</strong> near the free city`);
-		}
-		if (V.SecExp.war.attacker.losses !== V.SecExp.war.attacker.troops) {
-			r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`);
-			if (V.SecExp.war.losses > 1) {
-				r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`);
-			} else if (V.SecExp.war.losses > 0) {
-				r.push(`a casualty`);
-			} else {
-				r.push(`zero`);
-			}
-			r.push(`themselves.`);
-		} else {
-			r.push(`completely annihilating their troops, while sustaining`);
-			if (V.SecExp.war.losses > 1) {
-				r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties.`);
-			} else if (V.SecExp.war.losses > 0) {
-				r.push(`a casualty.`);
-			} else {
-				r.push(`zero casualties.`);
-			}
-		}
-	}
-	if (V.SecExp.war.result === 3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided, our men easily stopped the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`disorganized horde's futile attempt at raiding your arcology${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`mercenaries dead in their tracks${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`freedom fighters dead in their tracks${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`old world soldiers dead in their tracks${end}`);
-			}
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard, but in the end our men stopped the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`disorganized horde attempt at raiding your arcology${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`slavers attempt at weakening your arcology${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`fighters attack${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`soldiers of the old world${end}`);
-			}
-		} else {
-			r.push(`The fight was long and hard, but our men managed to stop the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`horde raiding party${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`free city mercenaries${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`freedom fighters${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`old world soldiers${end}`);
-			}
-		}
-		if (V.SecExp.battles.victoryStreak >= 2) {
-			r.push(`adding another victory to the growing list of our military's successes.`);
-		} else if (V.SecExp.battles.lossStreak >= 2) {
-			r.push(`finally putting an end to a series of unfortunate defeats.`);
-		}
-	} else if (V.SecExp.war.result === -3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided, our men were easily crushed by the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`barbaric horde of raiders${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`consumed mercenary veterans sent against us${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`fanatical fury of the freedom fighters${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`discipline of the old world armies${end}`);
-			}
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard and in the end the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`bandits proved too much to handle for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`slavers proved too much to handle for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`freedom fighters proved too much to handle for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`old world proved too much to handle for our men${end}`);
-			}
-		} else {
-			r.push(`The fight was long and hard, but despite their bravery the`);
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`horde proved too much for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`mercenary slavers proved too much for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`freedom fighters fury proved too much for our men${end}`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`old world troops proved too much for our men${end}`);
-			}
-		}
-		if (V.SecExp.battles.victoryStreak >= 2) {
-			r.push(`so interrupting a long series of military successes.`);
-		} else if (V.SecExp.battles.lossStreak >= 2) {
-			r.push(`confirming the long list of recent failures our armed forces collected.`);
-		}
-	} else if (V.SecExp.war.result === 2) {
-		r.push(`The fight was long and hard, but in the end our men managed to repel the`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			r.push(`raiders, though not without difficulty.`);
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			r.push(`mercenaries, though not without difficulty.`);
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			r.push(`freedom fighters, though not without difficulty.`);
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			r.push(`old world soldiers, though not without difficulty.`);
-		}
-	} else if (V.SecExp.war.result === -2) {
-		r.push(`The fight was long and hard. Our men in the end had to yield to the`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			r.push(`horde raiders, which was fortunately unable to capitalize on their victory.`);
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			r.push(`slavers, which were fortunately unable to capitalize on their victory.`);
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			r.push(`freedom fighters, which were fortunately unable to capitalize on their victory.`);
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			r.push(`old world soldiers, which were fortunately unable to capitalize on their victory.`);
-		}
-	} else if (V.SecExp.war.result === -1) {
-		r.push(`You gave your troops the order to surrender, obediently they stand down.`);
-	} else if (V.SecExp.war.result === 0) {
-		r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`);
-	} else if (V.SecExp.war.result === 1) {
-		r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`);
-	}
-
-	App.Events.addParagraph(node, r);
-	r = [];
-	// calculates effects on the city
-	if (V.SecExp.war.result === 3) {
-		r.push(`Thanks to your victory, your <span class="green">reputation</span> and <span class="darkviolet">authority</span> increased. You were also able to capture`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(4000 * majorBattleMod, "war");
-			V.SecExp.core.authority += 800 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(6000 * majorBattleMod, "war");
-			V.SecExp.core.authority += 1200 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(7500 * majorBattleMod, "war");
-			V.SecExp.core.authority += 1500 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(8000 * majorBattleMod, "war");
-			V.SecExp.core.authority += 1600 * majorBattleMod;
-		}
-		if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 50) {
-			r.push(`a small amount of attackers,`);
-			captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
-		} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 100) {
-			r.push(`an healthy group of attackers,`);
-			captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
-		} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 150) {
-			r.push(`a big group of attackers,`);
-			captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
-		} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 200) {
-			r.push(`a huge group of attackers,`);
-			captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
-		} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses > 200) {
-			r.push(`a great amount of attackers,`);
-			captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
-		}
-		r.push(`and some of their equipment, which once sold produced`);
-		if (V.SecExp.war.attacker.equip === 0) {
-			r.push(`<span class="yellowgreen">a small amount of cash.</span>`);
-			loot += 1000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 1) {
-			r.push(`<span class="yellowgreen">a moderate amount of cash.</span>`);
-			loot += 5000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 2) {
-			r.push(`<span class="yellowgreen">a good amount of cash.</span>`);
-			loot += 10000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 3) {
-			r.push(`<span class="yellowgreen">a great amount of cash.</span>`);
-			loot += 15000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 4) {
-			r.push(`<span class="yellowgreen">wealth worthy of the mightiest warlord.</span>`);
-			loot += 20000 * majorBattleMod;
-		}
-		if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) {
-			r.push(`Part of the loot is distributed to your mercenaries.`);
-			captives = Math.trunc(captives * 0.6);
-			loot = Math.trunc(loot * 0.6);
-		}
-		cashX(loot, "war");
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`Damage to the infrastructure was <span class="yellow">virtually non-existent,</span> costing only pocket cash to bring the structure back to normal. The inhabitants as well reported little to no injuries, because of this the prosperity of the arcology did not suffer.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(forceNeg(1000 * majorBattleMod), "war");
-		if (V.SecExp.battles.victoryStreak >= 3) {
-			r.push(`It seems your victories over the constant threats directed your way is having <span class="green">a positive effect on the prosperity of the arcology,</span> due to the security your leadership affords.`);
-			V.arcologies[0].prosperity += 5 * majorBattleMod;
-		}
-	} else if (V.SecExp.war.result === -3) {
-		r.push(`Due to your defeat, your <span class="red">reputation</span> and <span class="red">authority</span> decreased. Obviously your troops were not able to capture anyone or anything.`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(forceNeg(400 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 400 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(forceNeg(600 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 600 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(forceNeg(750 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 750 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(forceNeg(800 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 800 * majorBattleMod;
-		}
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`In the raiding following the battle <span class="red">the arcology sustained heavy damage,</span> which will cost quite the amount of cash to fix. Reports of <span class="red">citizens or slaves killed or missing</span> flood your office for a few days following the defeat.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(forceNeg(5000 * majorBattleMod), "war");
-		if (V.week <= 30) {
-			V.lowerClass -= random(100) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(150) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(5) * majorBattleMod;
-		} else if (V.week <= 60) {
-			V.lowerClass -= random(120) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(170) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(10) * majorBattleMod;
-		} else if (V.week <= 90) {
-			V.lowerClass -= random(140) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(190) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(15) * majorBattleMod;
-		} else if (V.week <= 120) {
-			V.lowerClass -= random(160) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(210) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(20) * majorBattleMod;
-		} else {
-			V.lowerClass -= random(180) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(230) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(25) * majorBattleMod;
-		}
-		if (V.SecExp.battles.lossStreak >= 3) {
-			r.push(`This only confirms the fears of many, <span class="red">your arcology is not safe</span> and it is clear their business will be better somewhere else.`);
-			V.arcologies[0].prosperity -= 5 * majorBattleMod;
-		}
-	} else if (V.SecExp.war.result === 2) {
-		r.push(`Thanks to your victory, your <span class="green">reputation</span> and <span class="darkviolet">authority</span> slightly increased. Our men were not able to capture any combatants, however some equipment was seized during the enemy's hasty retreat,`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(1000 * majorBattleMod, "war");
-			V.SecExp.core.authority += 200 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(1500 * majorBattleMod, "war");
-			V.SecExp.core.authority += 300 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(2000 * majorBattleMod, "war");
-			V.SecExp.core.authority += 450 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(2100 * majorBattleMod, "war");
-			V.SecExp.core.authority += 500 * majorBattleMod;
-		}
-		r.push(`which once sold produced`);
-		if (V.SecExp.war.attacker.equip === 0) {
-			r.push(`<span class="yellowgreen">a bit of cash.</span>`);
-			loot += 500 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 1) {
-			r.push(`<span class="yellowgreen">a small amount of cash.</span>`);
-			loot += 2500 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 2) {
-			r.push(`<span class="yellowgreen">a moderate amount of cash.</span>`);
-			loot += 5000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 3) {
-			r.push(`<span class="yellowgreen">a good amount of cash.</span>`);
-			loot += 7500 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.equip === 4) {
-			r.push(`<span class="yellowgreen">a great amount of cash.</span>`);
-			loot += 10000 * majorBattleMod;
-		}
-		if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) {
-			r.push(`Part of the loot is distributed to your mercenaries.`);
-			loot = Math.trunc(loot * 0.6);
-		}
-		cashX(loot, "war");
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`Damage to the city was <span class="red">limited,</span> it won't take much to rebuild. Very few citizens or slaves were involved in the fight and even fewer met their end, safeguarding the prosperity of the arcology.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(forceNeg(2000 * majorBattleMod), "war");
-		V.lowerClass -= random(10) * majorBattleMod;
-		App.SecExp.slavesDamaged(random(20) * majorBattleMod);
-	} else if (V.SecExp.war.result === -2) {
-		r.push(`It was a close defeat, but nonetheless your <span class="red">reputation</span> and <span class="red">authority</span> slightly decreased. Your troops were not able to capture anyone or anything.`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(forceNeg(40 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 40 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(forceNeg(60 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 60 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(forceNeg(75 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 75 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(forceNeg(80 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 80 * majorBattleMod;
-		}
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`The enemy did not have the strength to raid the arcology for long, still <span class="red">the arcology sustained some damage,</span> which will cost a moderate amount of cash to fix. Some citizens and slaves found themselves on the wrong end of a gun and met their demise.`);
-		r.push(`Some business sustained heavy damage, slightly impacting the arcology's prosperity.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(forceNeg(3000 * majorBattleMod), "war");
-		if (V.week <= 30) {
-			V.lowerClass -= random(50) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(75) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(2) * majorBattleMod;
-		} else if (V.week <= 60) {
-			V.lowerClass -= random(60) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(85) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(5) * majorBattleMod;
-		} else if (V.week <= 90) {
-			V.lowerClass -= random(70) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(95) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(7) * majorBattleMod;
-		} else if (V.week <= 120) {
-			V.lowerClass -= random(80) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(105) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(10) * majorBattleMod;
-		} else {
-			V.lowerClass -= random(90) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(115) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(12) * majorBattleMod;
-		}
-	} else if (V.SecExp.war.result === -1) {
-		r.push(`Rather than waste the lives of your men you decided to surrender, hoping your enemy will cause less damage if you indulge them, this is however a big hit to your status. Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(forceNeg(600 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 600 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(forceNeg(800 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 800 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(forceNeg(1000 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 1000 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(forceNeg(1200 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 1200 * majorBattleMod;
-		}
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`The surrender allows the arcology to survive <span class="red">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(forceNeg(1000 * majorBattleMod), "war");
-		if (V.week <= 30) {
-			V.lowerClass -= random(80) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(120) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(5) * majorBattleMod;
-		} else if (V.week <= 60) {
-			V.lowerClass -= random(100) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(140) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(10) * majorBattleMod;
-		} else if (V.week <= 90) {
-			V.lowerClass -= random(120) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(160) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(15) * majorBattleMod;
-		} else if (V.week <= 120) {
-			V.lowerClass -= random(140) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(180) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(20) * majorBattleMod;
-		} else {
-			V.lowerClass -= random(160) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(200) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(25) * majorBattleMod;
-		}
-	} else if (V.SecExp.war.result === 0) {
-		r.push(`Unfortunately your adversary did not accept your money.`);
-		if (V.SecExp.war.attacker.type === "freedom fighters") {
-			r.push(`Their ideological crusade would not allow such thing.`);
-		} else {
-			r.push(`They saw your attempt as nothing more than admission of weakness.`);
-		}
-		r.push(`There was no time to organize a defense and so the enemy walked into the arcology as it was his. Your reputation and authority suffer a hit.`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(forceNeg(400 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 400 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(forceNeg(600 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 600 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(forceNeg(750 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 750 * majorBattleMod;
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(forceNeg(800 * majorBattleMod), "war");
-			V.SecExp.core.authority -= 800 * majorBattleMod;
-		}
-		V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
-		App.Events.addParagraph(node, r);
-		r = [];
-		r.push(`Fortunately the arcology survives <span class="yellow">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
-		r.push(`${IncreasePCSkills('engineering', 0.1)}`);
-		cashX(-1000, "war");
-		if (V.week <= 30) {
-			V.lowerClass -= random(80) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(120) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(5) * majorBattleMod;
-		} else if (V.week <= 60) {
-			V.lowerClass -= random(100) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(140) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(10) * majorBattleMod;
-		} else if (V.week <= 90) {
-			V.lowerClass -= random(120) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(160) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(15) * majorBattleMod;
-		} else if (V.week <= 120) {
-			V.lowerClass -= random(140) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(180) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(20) * majorBattleMod;
-		} else {
-			V.lowerClass -= random(160) * majorBattleMod;
-			App.SecExp.slavesDamaged(random(200) * majorBattleMod);
-			V.arcologies[0].prosperity -= random(25) * majorBattleMod;
-		}
-		App.Events.addParagraph(node, r);
-		r = [];
-	} else if (V.SecExp.war.result === 1) {
-		r.push(`The attackers wisely take the money offered them to leave your territory without further issues. The strength of the Free Cities was never in their guns but in their dollars, and today's events are the perfect demonstration of such strength.`);
-		r.push(`Your <span class="green">reputation slightly increases.</span>`);
-		if (V.SecExp.war.attacker.type === "raiders") {
-			repX(500 * majorBattleMod, "war");
-		} else if (V.SecExp.war.attacker.type === "free city") {
-			repX(750 * majorBattleMod, "war");
-		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-			repX(1000 * majorBattleMod, "war");
-		} else if (V.SecExp.war.attacker.type === "old world") {
-			repX(1250 * majorBattleMod, "war");
-		}
-		cashX(forceNeg(App.SecExp.battle.bribeCost()), "war");
-	}
-	if (!Number.isInteger(V.lowerClass)) {
-		if (isNaN(V.lowerClass)) {
-			r.push(App.UI.DOM.makeElement("div", `Error: lowerClass is NaN, please report this issue`, "red"));
-		} else if (V.lowerClass > 0) {
-			V.lowerClass = Math.trunc(V.lowerClass);
-		} else {
-			V.lowerClass = 0;
-		}
-	}
-	if (!Number.isInteger(V.NPCSlaves)) {
-		if (isNaN(V.NPCSlaves)) {
-			r.push(App.UI.DOM.makeElement("div", `Error: NPCSlaves is NaN, please report this issue`, "red"));
-		} else if (V.NPCSlaves > 0) {
-			V.NPCSlaves = Math.trunc(V.NPCSlaves);
-		} else {
-			V.NPCSlaves = 0;
-		}
-	}
-
-	App.Events.addParagraph(node, r);
-	r = [];
-	if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) {
-		App.Events.addParagraph(node, App.SecExp.commanderEffectiveness("report"));
-		r = [];
-
-		// tactics
-		if (V.SecExp.war.commander === "PC") {
-			r.push(`You`);
-		} else {
-			r.push(`Your commander`);
-		}
-		if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-			r.push(`chose to employ "bait and bleed" tactics or relying on quick attacks and harassment to tire and wound the enemy until their surrender.`);
-		} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-			r.push(`chose to employ "guerrilla" tactics or relying on stealth, terrain knowledge and subterfuge to undermine and ultimately destroy the enemy.`);
-		} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-			r.push(`chose to employ "choke points" tactics or the extensive use of fortified or highly defensive positions to slow down and eventually stop the enemy.`);
-		} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-			r.push(`chose to employ "interior lines" tactics or exploiting the defender's shorter front to quickly disengage and concentrate troops when and where needed.`);
-		} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-			r.push(`chose to employ "pincer maneuver" tactics or attempting to encircle the enemy by faking a collapsing center front.`);
-		} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-			r.push(`chose to employ "defense in depth" tactics or relying on mobility to disengage and exploit overextended enemy troops by attacking their freshly exposed flanks.`);
-		} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-			r.push(`chose to employ "blitzkrieg" tactics or shattering the enemy's front-line with a violent, concentrated armored assault.`);
-		} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-			r.push(`chose to employ "human wave" tactics or overwhelming the enemy's army with a massive infantry assault.`);
-		}
-		if (V.SecExp.war.terrain === "urban") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`The urban terrain synergized well with bait and bleed tactics, slowly chipping away at the enemy's forces from the safety of the narrow streets and empty buildings.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The urban terrain synergized well with guerrilla tactics, eroding your enemy's determination from the safety of the narrow streets and empty buildings.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The urban environment offers many opportunities to hunker down and stop the momentum of the enemy's assault while keeping your soldiers in relative safety.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`While the urban environment offers many highly defensive position, it does restrict movement and with it the advantages of exploiting interior lines.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The urban terrain does not allow for wide maneuvers, the attempts of your forces to encircle the attackers are mostly unsuccessful.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`While the urban environment offers many defensive positions, it limits mobility, limiting the advantages of using a defense in depth tactic.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The urban terrain is difficult to traverse, making your troops attempt at a lightning strike unsuccessful.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The urban terrain offers great advantages to the defender, your men find themselves in great disadvantage while mass assaulting the enemy's position.`);
-			}
-		} else if (V.SecExp.war.terrain === "rural") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`The open terrain of rural lands does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The open terrain of rural lands does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The open terrain of rural lands does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
-			}
-		} else if (V.SecExp.war.terrain === "hills") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`While the hills offer some protection, they also make it harder to maneuver; bait and bleed tactics will not be 100% effective here.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The hills offer protection to both your troops and your enemy's, making it harder for your men to accomplish guerrilla attacks effectively.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`While not as defensible as mountains, hills offer numerous opportunities to funnel the enemy towards highly defensible choke points.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The limited mobility on hills hampers the capability of your troops to exploit the defender's greater mobility afforded by interior lines.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`Limited mobility due to the hills is a double edged sword, affording your men a decent shot at encirclement.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The limited mobility on hills hampers the capability of your troops to use elastic defense tactics.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The limited mobility on hills hampers the capability of your troops to organize lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The defensibility of hills makes it harder to accomplish victory through mass assaults.`);
-			}
-		} else if (V.SecExp.war.terrain === "coast") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`On the coast there's little space and protection to effectively employ bait and bleed tactics.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`On the coast there's little space and protection to effectively employ guerrilla tactics.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`Amphibious attacks are difficult in the best of situations; the defender has a very easy time funneling the enemy towards their key defensive positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`While in an amphibious landing mobility is not the defender's best weapon, exploiting interior lines still affords your troops some advantages.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`Attempting to encircle a landing party is not the best course of action, but not the worst either.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`In an amphibious assault it's very easy for the enemy to overextend, making defense in depth tactics quite effective.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The rough, restricted terrain does not lend itself well to lightning strikes, but the precarious position of the enemy still gives your mobile troops tactical superiority.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The rough, restricted terrain does not lend itself well to mass assaults, but the precarious position of the enemy still gives your troops tactical superiority.`);
-			}
-		} else if (V.SecExp.war.terrain === "outskirts") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops bait and bleed tactics would require.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops guerrilla tactics would require.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The imposing structure of the arcology itself provides plenty of opportunities to create fortified choke points from which to shatter the enemy assault.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering overall effectiveness of interior lines tactics.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering the chances of making an effective encirclement.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`Having the arcology near the battlefield means there are limited available maneuvers to your troops, who still needs to defend the structure, making defense in depth tactics not as effective.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`While an assault may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the lightning strike.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`While an attack may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the mass assault.`);
-			}
-		} else if (V.SecExp.war.terrain === "mountains") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`While the mountains offer great protection, they also limit maneuverability; bait and bleed tactics will not be quite as effective here.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The mountains offer many excellent hiding spots and defensive positions, making guerrilla tactics very effective.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The mountains offer plenty of opportunity to build strong defensive positions from which to shatter the enemy's assault.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`While the rough terrain complicates maneuvers, the defensive advantages offered by the mountains offsets its negative impact.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective encirclement in this environment.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`While mobility is limited, defensive positions are plentiful; your men are not able to fully exploit overextended assaults, but are able to better resist them.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective lightning strike in this environment.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective mass assault in this environment.`);
-			}
-		} else if (V.SecExp.war.terrain === "wasteland") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make bait and bleed tactics work well enough.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make guerrilla tactics work well enough.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The wastelands are mostly open terrain; your men have a difficult time setting up effective fortified positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The wastelands, while rough, are mostly open terrain, where your men can exploit to the maximum the superior mobility of the defender.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The wastelands, while rough, are mostly open terrain; your men can set up an effective encirclement here.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The wastelands, while rough, are mostly open terrain, allowing your men to liberally maneuver to exploit overextended enemies.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective mass assaults.`);
-			}
-		} else if (V.SecExp.war.terrain === "international waters") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`The open terrain of international waters does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The open terrain of international waters does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The open terrain of international waters does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
-			}
-		} else if (V.SecExp.war.terrain === "an underwater cave") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`The tight terrain of an underwater cave does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The tight terrain of an underwater cave does offers many hiding spots, making it easier for your men to perform guerrilla actions effectively.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The tight terrain of an underwater cave offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The tight terrain makes it hard for your men to easily exploit the superior mobility of the defender.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The tight terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The tight terrain hinders the mobility of your army, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The tight terrain hinders the mobility of your army, making it easier to accomplish concentrated lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The tight terrain hinders the mobility of your army, making it easier to overwhelm the enemy with mass assaults.`);
-			}
-		} else if (V.SecExp.war.terrain === "a sunken ship") {
-			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-				r.push(`The tight terrain of a sunken ship lends itself well to bait and bleed tactics, making it easier for your men to achieve tactical superiority.`);
-			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-				r.push(`The tight terrain of a sunken ship offers many hiding spots, making it easy for your men to perform guerrilla actions effectively.`);
-			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-				r.push(`The tight terrain of a sunken ship offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
-			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-				r.push(`The tight terrain does not allow your men to easily exploit the superior mobility of the defender.`);
-			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-				r.push(`The open terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
-			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-				r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
-			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-				r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
-			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-				r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
-			}
-		}
-
-		if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, bait and bleed tactics are not effective against them.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`The modern armies hired by Free Cities are decently mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, guerrilla tactics are not effective against them.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`The modern armies hired by Free Cities are highly mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Choke Points") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`Raiders lack heavy weaponry or armor, so making use of fortified positions is an excellent way to dissipate the otherwise powerful momentum of their assault.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`The high tech equipment Free Cities can afford to give their guns for hire means there's no defensive position strong enough to stop them, still the relatively low numbers means they will have to take a careful approach, slowing them down.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`Old world armies have both the manpower and the equipment to conquer any defensive position, making use of strong fortifications will only bring you this far against them.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`The lack of specialized weaponry means freedom fighters have a rather hard time overcoming tough defensive positions, unfortunately they have also a lot of experience in avoiding them.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`The highly mobile horde of raiders will not give much room for your troops to maneuver, lowering their tactical superiority.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`While decently mobile, Free Cities forces are not in high enough numbers to risk maintaining prolonged contact, allowing your troops to quickly disengage and redeploy where it hurts.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`Old world armies are not famous for the mobility, which makes them highly susceptible to any tactic that exploits maneuverability and speed.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`While not the best equipped army, the experience and mobility typical of freedom fighters groups make them tough targets for an army that relies itself on mobility.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`While numerous, the undisciplined masses of raiders are easy prey for encirclements.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`While decently mobile, the low number of Free Cities expedition forces make them good candidates for encirclements.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`The discipline and numbers of old world armies make them quite difficult to encircle.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`While not particularly mobile, freedom fighters are used to fight against overwhelming odds, diminishing the effectiveness of the encirclement.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`While their low discipline makes them prime candidates for an elastic defense type of strategy, their high numbers limit your troops maneuverability.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`With their low numbers Free Cities mercenaries are quite susceptible to this type of tactic, despite their mobility.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`With their low mobility old world armies are very susceptible to this type of strategy.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`Low mobility and not particularly high numbers mean freedom fighters can be defeated by employing elastic defense tactics.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`With their low discipline and lack of heavy equipment, lightning strikes are very effective against raider hordes.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`Having good equipment and discipline on their side, Free Cities expeditions are capable of responding to even strong lightning strikes.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`While disciplined, old world armies low mobility makes them highly susceptible to lightning strikes.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`While not well equipped, freedom fighters have plenty of experience fighting small, mobile attacks, making them difficult to defeat with lightning strikes.`);
-			}
-		} else if (V.SecExp.war.chosenTactic === "Human Wave") {
-			if (V.SecExp.war.attacker.type === "raiders") {
-				r.push(`The hordes of raiders are much more experienced than your soldiers in executing mass assaults and they also have a lot more bodies to throw in the grinder.`);
-			} else if (V.SecExp.war.attacker.type === "free city") {
-				r.push(`The good equipment and mobility of Free Cities mercenaries cannot save them from an organized mass assault.`);
-			} else if (V.SecExp.war.attacker.type === "old world") {
-				r.push(`Unfortunately the discipline and good equipment of old world armies allow them to respond well against a mass assault.`);
-			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
-				r.push(`The relative low numbers and not great equipment typical of freedom fighters make them susceptible to being overwhelmed by an organized mass assault.`);
-			}
-		}
-		r.push(`In the end`);
-		if (V.SecExp.war.commander === "PC") {
-			r.push(`you were`);
-		} else {
-			r.push(`your commander was`);
-		}
-		if (V.SecExp.war.tacticsSuccessful) {
-			r.push(`<span class="green">able to successfully employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly enhancing`);
-		} else {
-			r.push(`<span class="red">not able to effectively employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly affecting`);
-		}
-		r.push(`the efficiency of your army.`);
-		App.Events.addParagraph(node, r);
-		r = [];
-		node.append(unitsBattleReport());
-
-		if (
-			V.SF.Toggle && V.SF.Active >= 1 &&
-			(V.SF.Squad.Firebase >= 7 || V.SF.Squad.GunS >= 1 || V.SF.Squad.Satellite >= 5 || V.SF.Squad.GiantRobot >= 6 || V.SF.Squad.MissileSilo >= 1)
-		) {
-			// SF upgrades effects
-			App.Events.addParagraph(node, r);
-			r = [];
-			if (V.SF.Squad.Firebase >= 7) {
-				r.push(`The artillery pieces installed around ${V.SF.Lower}'s firebase provided vital fire support to the troops in the field.`);
-			}
-			if (V.SF.Squad.GunS >= 1) {
-				r.push(`The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support.`);
-			}
-			if (V.SF.Squad.Satellite >= 5 && V.SF.SatLaunched > 0) {
-				r.push(`The devastating power of ${V.SF.Lower}'s satellite was employed with great efficiency against the enemy.`);
-			}
-			if (V.SF.Squad.GiantRobot >= 6) {
-				r.push(`The giant robot of ${V.SF.Lower} proved to be a great boon to our troops, shielding many from the worst the enemy had to offer.`);
-			}
-			if (V.SF.Squad.MissileSilo >= 1) {
-				r.push(`The missile silo exterminated many enemy soldiers even before the battle would begin.`);
-			}
-		}
-	}// closes check for surrender and bribery
-
-	App.Events.addParagraph(node, r);
-	r = [];
-
-	let menialPrice = Math.trunc((V.slaveCostFactor * 1000) / 100) * 100;
-	menialPrice = Math.clamp(menialPrice, 500, 1500);
-
-	captives = Math.trunc(captives);
-	if (captives > 0) {
-		let candidates = 0;
-		r.push(`During the battle ${captives} attackers were captured.`);
-		if (random(1, 100) <= 25) {
-			candidates = Math.min(captives, random(1, 3));
-			r.push(`${capFirstChar(num(candidates, true))} of them have the potential to be sex slaves.`);
-		}
-
-		const sell = function() {
-			cashX((menialPrice * captives), "menialTransfer");
-			return `Captives sold`;
-		};
-
-		const keep = function() {
-			V.menials += (captives - candidates);
-			for (let i = 0; i < candidates; i++) {
-				const generateFemale = random(0, 99) < V.seeDicks;
-				let slave = GenerateNewSlave((generateFemale ? "XY" : "XX"), {minAge: 16, maxAge: 32, disableDisability: 1});
-				slave.weight = (generateFemale ? random(-20, 30) : random(0, 30));
-				slave.muscles = (generateFemale ? random(15, 80) : random(25, 80));
-				slave.waist = (generateFemale ? random(10, 80) : random(-20, 20));
-				slave.skill.combat = 1;
-				slave.origin = `$He is an enslaved ${V.SecExp.war.attacker.type} soldier captured during a battle.`;
-				newSlave(slave); // skip New Slave Intro
-			}
-			return `Captives primarily added as menial slaves.`;
-		};
-
-		App.Events.addResponses(node, [
-			new App.Events.Result(`sell them all immediately`, sell),
-			new App.Events.Result(`keep them as primarily menial slaves`, keep),
-		]);
-	}
-
-	// resets variables
-	V.SecExp.units.bots.isDeployed = 0;
-	for (const squad of App.SecExp.unit.humanSquads()) {
-		squad.isDeployed = 0;
-	}
-	App.Events.addParagraph(node, r);
-	return node;
-
-	function unitsBattleReport() {
-		const el = document.createElement("div");
-		if (V.SecExp.war.losses >= 0) {
-			if (V.SecExp.war.losses > 0) {
-				// if the losses are more than zero
-				// generates a list of randomized losses, from which each unit picks one at random
-				let losses = V.SecExp.war.losses;
-				const averageLosses = Math.trunc(losses / App.SecExp.battle.deployedUnits());
-				let assignedLosses;
-				for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) {
-					assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100));
-					if (assignedLosses > losses) {
-						assignedLosses = losses;
-						losses = 0;
-					} else {
-						losses -= assignedLosses;
-					}
-					lossesList.push(assignedLosses);
-				}
-				if (losses > 0) {
-					lossesList[random(lossesList.length - 1)] += losses;
-				}
-				lossesList.shuffle();
-
-				// sanity check for losses
-				let count = 0;
-				for (let i = 0; i < lossesList.length; i++) {
-					if (!Number.isInteger(lossesList[i])) {
-						lossesList[i] = 0;
-					}
-					count += lossesList[i];
-				}
-				if (count < V.SecExp.war.losses) {
-					const rand = random(lossesList.length - 1);
-					lossesList[rand] += V.SecExp.war.losses - count;
-				} else if (count > V.SecExp.war.losses) {
-					const diff = count - V.SecExp.war.losses;
-					const rand = random(lossesList.length - 1);
-					lossesList[rand] = Math.clamp(lossesList[rand] - diff, 0, 100);
-				}
-			}
-
-			if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) {
-				if (V.SecExp.war.losses > 0) {
-					loss = lossesList.pluck();
-					loss = Math.clamp(loss, 0, V.SF.ArmySize);
-					V.SF.ArmySize -= loss;
-				}
-				App.UI.DOM.appendNewElement("div", el, `${num(V.SF.ArmySize)} soldiers from ${V.SF.Lower} joined the battle: casualtiesReport(type, loss)`);
-			}
-			for (const unitClass of App.SecExp.unit.list()) {
-				if (App.SecExp.battle.deployedUnits(unitClass) >= 1) {
-					if (unitClass !== 'bots') {
-						loopThroughUnits(V.SecExp.units[unitClass].squads, unitClass);
-					} else {
-						loopThroughUnits([V.SecExp.units.bots], unitClass);
-					}
-				}
-			}
-		} else {
-			App.UI.DOM.appendNewElement("div", el, `Error: losses are a negative number or NaN`, "red");
-		}// closes check for more than zero casualties
-
-		return el;
-	}
-};
diff --git a/src/Mods/SecExp/events/conflictHandler.js b/src/Mods/SecExp/events/conflictHandler.js
index 1a69bfaa256623919dee1597eb903cd0e9ce22cb..a630d7fd314f9d6ae63dfc2edc441ffba18e3585 100644
--- a/src/Mods/SecExp/events/conflictHandler.js
+++ b/src/Mods/SecExp/events/conflictHandler.js
@@ -544,7 +544,7 @@ App.Events.conflictHandler = function() {
 		V.gameover = `${isMajorBattle ? "major battle" : "Rebellion"} defeat`;
 		atEnd("Gameover");
 	} else {
-		atEnd(inBattle ? "attackReport" : "rebellionReport");
+		atEnd("conflictReport");
 	}
 	return node;
 };
diff --git a/src/Mods/SecExp/events/conflictReport.js b/src/Mods/SecExp/events/conflictReport.js
new file mode 100644
index 0000000000000000000000000000000000000000..70f4f6547dbe63ef19b2fa9e42850a848f1b006f
--- /dev/null
+++ b/src/Mods/SecExp/events/conflictReport.js
@@ -0,0 +1,1468 @@
+App.Events.conflictReport = function() {
+	/**
+	 * @param {string} [type]
+	 * @param {number} [loss]
+	 * @param {Object} [squad=null]
+	 * @returns {string}
+	 */
+	 const casualtiesReport = function(type, loss, squad=null) {
+		const isSpecial = squad && App.SecExp.unit.list().slice(1).includes(type);
+		let r = [];
+		if (loss <= 0) {
+			r.push(`No`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.2) : 10)) {
+			r.push(`Light`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.4) : 30)) {
+			r.push(`Moderate`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.6) : 60)) {
+			r.push(`Heavy`);
+		} else {
+			r.push(`Catastrophic`);
+		}
+		r.push(`casualties suffered.`);
+		if (App.SecExp.unit.list().includes(type)) {
+			if (squad.troops <= 0) {
+				squad.active = 0;
+				r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit.`);
+				if (type === "bots") {
+					r.push(`It will take quite the investment to rebuild them.`);
+				} else {
+					r.push(`The remnants will be sent home honored as veterans or reorganized in a new unit.`);
+				}
+			} else if (squad.troops <= 10) {
+				r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`);
+			}
+		}
+		return r.join(" ");
+	};
+	let r = [];
+	const allKilled = V.SecExp.war.attacker.losses === V.SecExp.war.attacker.troops;
+	const result = V.SecExp.war.result;
+	const hasLosses = V.SecExp.war.losses > 0;
+
+	const inBattle = V.SecExp.war.type.includes("Attack");
+	const isMajorBattle = inBattle && V.SecExp.war.type.includes("Major");
+	const majorBattleMod = !isMajorBattle ? 1 : 2;
+
+	const inRebellion = V.SecExp.war.type.includes("Rebellion");
+	const slaveRebellion = V.SecExp.war.type.includes("Slave");
+	const type = inBattle ? "battles" : "rebellions";
+
+	// Battles
+	let loot = 0;
+	let captives;
+	const end = (V.SecExp.battles.victoryStreak >= 2 || V.SecExp.battles.lossStreak >= 2) ? `,` : `.`;
+	/**
+	 * Does the target become wounded?
+	 * @param {string} [target]
+	 * @returns {string}
+	 */
+	 const checkWoundStatus = function(target) {
+		let conditions;
+		let slave;
+		let woundChance = 0;
+		const r = [];
+		if (target === "PC") {
+			if (V.PC.career === "mercenary" || V.PC.career === "gang") {
+				woundChance -= 5;
+			} else if (V.PC.skill.warfare >= 75) {
+				woundChance -= 3;
+			}
+			if (V.personalArms >= 1) {
+				woundChance -= 5;
+			}
+			if (V.PC.balls >= 20) {
+				woundChance += random(5, 10);
+			} else if (V.PC.balls >= 9) {
+				woundChance += random(1, 5);
+			}
+			conditions = [
+				V.PC.physicalAge >= 60,
+				V.PC.belly > 5000,
+				V.PC.boobs >= 1000,
+				V.PC.butt >= 4,
+				V.PC.preg >= 30
+			];
+		} else {
+			if (target === "Concubine") {
+				slave = S.Concubine;
+			} else if (target === "Bodyguard") {
+				slave = S.Bodyguard;
+			}
+
+			if (!slave) {
+				return ``;
+			}
+
+			if (slave.skill.combat === 1) {
+				woundChance -= 2;
+			}
+			woundChance -= 0.25 * (getLimbCount(slave, 105));
+			if (slave.health.condition >= 50) {
+				woundChance -= 1;
+			}
+			conditions = [
+				slave.weight > 130,
+				slave.muscles < -30,
+				getBestVision(slave) === 0,
+				slave.heels === 1,
+				slave.boobs >= 1400,
+				slave.butt >= 6,
+				slave.belly >= 10000,
+				slave.dick >= 8,
+				slave.balls >= 8,
+				slave.intelligence + slave.intelligenceImplant < -95
+			];
+		}
+		for (const cond of conditions) {
+			if (cond) {
+				woundChance += (target === "PC" ? random(1, 5) : 1);
+			}
+		}
+		woundChance *= (target === "PC" ? random(1, 2) : random(2, 4));
+
+		if (random(1, 100) <= woundChance) {
+			if (target === "PC") {
+				healthDamage(V.PC, 60);
+				r.push(`A lucky shot managed to find its way to you, leaving a painful, but thankfully not lethal, wound.`);
+			} else {
+				const woundType = App.SecExp.inflictBattleWound(slave);
+				const {his, him} = getPronouns(slave);
+				if (target === "Concubine") {
+					r.push(`Your Concubine was unfortunately caught in the crossfire.`);
+				} else {
+					r.push(`During one of the assaults your Bodyguard was hit.`);
+				}
+				if (woundType === "voice") {
+					r.push(`A splinter pierced ${his} throat, severing ${his} vocal cords.`);
+				} else if (woundType === "eyes") {
+					r.push(`A splinter hit ${his} face, severely damaging ${his} eyes.`);
+				} else if (woundType === "legs") {
+					r.push(`An explosion near ${him} caused the loss of both of ${his} legs.`);
+				} else if (woundType === "arm") {
+					r.push(`An explosion near ${him} caused the loss of one of ${his} arms.`);
+				} else if (woundType === "flesh") {
+					r.push(`A stray shot severely wounded ${him}.`);
+				}
+			}
+		} else if (target === "PC") {
+			r.push(`Fortunately you managed to avoid injury.`);
+		}
+		return r.join(" ");
+	};
+
+	// Rebellions
+	let lostSlaves;
+	/**
+	 * @param {string} [target]
+	 * @param {number} [value]
+	 * @param {number} [cost=2000]
+	 */
+	const setRepairTime = function(target, value, cost=2000) {
+		V.SecExp.rebellions.repairTime[target] = 3 + random(1) - value;
+		cashX(-cost, "war");
+		return IncreasePCSkills('engineering', 0.1);
+	};
+
+	/**
+	 * @param {number} [lowerClass]
+	 * @param {number} [slaves]
+	 * @param {number} [prosperity]
+	 * @returns {void}
+	 */
+	const arcologyEffects = function(lowerClass, slaves, prosperity) {
+		V.lowerClass -= random(lowerClass);
+		App.SecExp.slavesDamaged(random(slaves));
+		V.arcologies[0].prosperity -= random(prosperity);
+	};
+	
+	/**
+	 * @param {FC.SecExp.PlayerHumanUnitType} [unit]
+	 * @param {number} [averageLosses]
+	 */
+	const rebellingUnitsFate = function(unit, averageLosses) {
+		let manpower = 0;
+		const node = new DocumentFragment();
+		const r = [];
+		const rebels = {ID: [], names: []};
+
+		const Dissolve = function() {
+			App.SecExp.unit.unitFree(unit).add(manpower);
+			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+				u.loyalty = Math.clamp(u.loyalty - random(10, 40), 0, 100);
+			}
+			return `Units dissolved.`;
+		};
+		const Purge = function() {
+			App.SecExp.unit.unitFree(unit).add(manpower * 0.5);
+			return `Dissidents purged and units dissolved.`;
+		};
+		const Execute = function() {
+			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+				u.loyalty = Math.clamp(u.loyalty + random(10, 40), 0, 100);
+			}
+			return `Units executed. Dissent will not be tolerated.`;
+		};
+
+		App.UI.DOM.appendNewElement("div", node);
+		for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+			if (V.SecExp.war.rebellingID.contains(u.ID)) {
+				rebels.names.push(u.platoonName);
+				rebels.ID.push(u.ID);
+				manpower += Math.clamp(u.troops - random(averageLosses), 0, u.troops);
+			}
+		}
+
+		if (rebels.ID.length > 0) {
+			V.SecExp.units[unit].squads.deleteWith((u) => rebels.ID.contains(u.ID));
+			V.SecExp.battles.lastSelection.deleteWith((u) => rebels.ID.contains(u.ID));
+			if (unit === "slaves") {
+				r.push(`${toSentence(rebels.names)} decided in their blind arrogance to betray you.`);
+			} else if (unit === "militia") {
+				r.push(`${toSentence(rebels.names)} had the gall to betray you and join your enemies.`);
+			} else if (unit === "mercs") {
+				r.push(`${toSentence(rebels.names)} made the grave mistake of betraying you.`);
+			}
+			if (V.SecExp.war.result < 2) { // rebellion loss
+				r.push(`They participated in the looting following the battle, then vanished in the wastes.`);
+				cashX(forceNeg(1000 * rebels.ID.length), "war");
+			} else { // rebellion win
+				App.Events.addResponses(node, [
+					new App.Events.Result(
+						`Dissolve the units`,
+						Dissolve,
+						`Manpower will be refunded, but will negatively influence the loyalty of the other units`
+					),
+					new App.Events.Result(
+						`Purge the dissidents and dissolve the units`,
+						Purge,
+						`Will not influence the loyalty of the other units, but half the manpower will be refunded.`
+					),
+					new App.Events.Result(
+						`Execute them all`,
+						Execute,
+						`Will positively influence the loyalty of the other units, but manpower will not be refunded.`
+					),
+				]);
+			}
+			App.Events.addNode(node, r, "div");
+		}
+		return node;
+	};
+
+	V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses);
+	if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) {
+		V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops;
+	}
+	V.SecExp.core.totalKills += V.SecExp.war.attacker.losses;
+	V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses);
+	if (isMajorBattle) {
+		V.SecExp.battles.major++;
+	}
+
+	const node = new DocumentFragment();
+	if (result === 3 || result === 2) {
+		App.UI.DOM.appendNewElement("h1", node, `${result === 2 ? 'Partial ' : ''}Victory!`, "strong");
+		V.SecExp[type].victories++;
+		if (inBattle && result === 3) {
+			V.SecExp.battles.lossStreak = 0;
+			V.SecExp.battles.victoryStreak++;
+		}
+	} else if (result === -3 || result === -2) {
+		App.UI.DOM.appendNewElement("h1", node, `${result === -2 ? 'Partial ' : ''}Defeat!`, "strong");
+		V.SecExp[type].losses++;
+		if (inBattle && result === -3) {
+			V.SecExp.battles.lossStreak++;
+			V.SecExp.battles.victoryStreak = 0;
+		}
+	} else if (result === -1) {
+		App.UI.DOM.appendNewElement("h1", node, `We surrendered`, "strong");
+		V.SecExp[type].losses++;
+	} else if (V.SecExp.war.result === 0) { // Battles only
+		App.UI.DOM.makeElement("h1", `Failed bribery!`, "strong");
+		V.SecExp.battles.losses++;
+	} else if (V.SecExp.war.result === 1) { // Battles only
+		App.UI.DOM.makeElement("h1", `Successful bribery!`, "strong");
+		V.SecExp.battles.victories++;
+	}
+	App.UI.DOM.appendNewElement("hr", node);
+
+	r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was`);
+	if (inBattle) {
+		r.push(`attacked by`);
+		if (V.SecExp.war.attacker.type === "raiders") {
+			r.push(`a band of wild raiders,`);
+		} else if (V.SecExp.war.attacker.type === "free city") {
+			r.push(`a contingent of mercenaries hired by a competing free city,`);
+		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+			r.push(`a group of freedom fighters bent on the destruction of the institution of slavery,`);
+		} else if (V.SecExp.war.attacker.type === "old world") {
+			r.push(`an old world nation boasting a misplaced sense of superiority,`);
+		}
+		r.push(`${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`);
+	} else {
+		r.push(`inflamed by the fires of rebellion. ${num(Math.trunc(V.SecExp.war.attacker.troops))} rebels from all over the structure dared rise up`);
+		if (slaveRebellion) {
+			r.push(`against their owners and conquer their freedom through blood.`);
+		} else {
+			r.push(`to dethrone their arcology owner.`);
+		}
+	}
+
+	if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) {
+		r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong,`);
+		if (inBattle) {
+			r.push(`clashed with them`);
+			if (V.SecExp.war.terrain === "urban") {
+				r.push(`in the streets of the old world city surrounding the arcology,`);
+			} else if (V.SecExp.war.terrain === "rural") {
+				r.push(`in the rural land surrounding the free city,`);
+			} else if (V.SecExp.war.terrain === "hills") {
+				r.push(`on the hills around the free city,`);
+			} else if (V.SecExp.war.terrain === "coast") {
+				r.push(`along the coast just outside the free city,`);
+			} else if (V.SecExp.war.terrain === "outskirts") {
+				r.push(`just against the walls of the arcology,`);
+			} else if (V.SecExp.war.terrain === "mountains") {
+				r.push(`in the mountains overlooking the arcology,`);
+			} else if (V.SecExp.war.terrain === "wasteland") {
+				r.push(`in the wastelands outside the free city territory,`);
+			} else if (V.SecExp.war.terrain === "international waters") {
+				r.push(`in the water surrounding the free city,`);
+			} else if (["a sunken ship", "an underwater cave"].includes(V.SecExp.war.terrain)) {
+				r.push(`in <strong>${V.SecExp.war.terrain}</strong> near the free city`);
+			}
+		} else {
+			r.push(`fought with them street by street`);
+		}
+
+		if (allKilled) {
+			r.push(`completely annihilating their troops, while sustaining`);
+		} else {
+			r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`);
+		}
+		if (V.SecExp.war.losses > 1) {
+			r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`);
+		} else if (V.SecExp.war.losses > 0) {
+			r.push(`a casualty`);
+		} else {
+			r.push(`zero casualties`);
+		}
+		r.push(`${allKilled ? '' : 'themselves'}.`);
+		if (inRebellion) {
+			App.SecExp.slavesDamaged(V.SecExp.war.attacker.losses);
+		}
+
+		if (V.SecExp.war.result === 3) {
+			if (V.SecExp.war.turns <= 5) {
+				r.push(`The fight was quick and one sided, our men easily stopped the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`disorganized horde's futile attempt at raiding your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`mercenaries dead in their tracks${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters dead in their tracks${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world soldiers dead in their tracks${end}`);
+					}
+				} else {
+					r.push(`disorganized revolt in a few well aimed assaults.`);
+				}
+			} else if (V.SecExp.war.turns <= 7) {
+				r.push(`The fight was hard, but in the end our men stopped the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`disorganized horde attempt at raiding your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`slavers attempt at weakening your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`fighters attack${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`soldiers of the old world${end}`);
+					}
+				} else {
+					r.push(`disorganized revolt with several well aimed assaults.`);
+				}
+			} else {
+				r.push(`The fight was long and hard, but our men managed to stop the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`horde raiding party${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`free city mercenaries${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world soldiers${end}`);
+					}
+				} else {
+					r.push(`revolt before it could accumulate momentum.`);
+				}
+			}
+			if (inBattle && V.SecExp.battles.victoryStreak >= 2) {
+				r.push(`adding another victory to the growing list of our military's successes.`);
+			} else if (inBattle && V.SecExp.battles.lossStreak >= 2) {
+				r.push(`finally putting an end to a series of unfortunate defeats.`);
+			}
+		} else if (V.SecExp.war.result === -3) {
+			if (V.SecExp.war.turns <= 5) {
+				r.push(`The fight was quick and one sided, our men were easily crushed by the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`barbaric horde of raiders${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`consumed mercenary veterans sent against us${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`fanatical fury of the freedom fighters${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`discipline of the old world armies${end}`);
+					}
+				} else {
+					r.push(`furious charge of the rebels.`);
+				}
+			} else if (V.SecExp.war.turns <= 7) {
+				r.push(`The fight was hard and in the end the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`bandits proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`slavers proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world proved too much to handle for our men${end}`);
+					}
+				} else {
+					r.push(`rebels proved too much to handle for our men.`);
+				}
+			} else {
+				r.push(`The fight was long and hard, but despite their bravery the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`horde proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`mercenary slavers proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters fury proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world troops proved too much for our men${end}`);
+					}
+				} else {
+					r.push(`rebels proved too much for our men.`);
+				}
+			}
+			if (inBattle && V.SecExp.battles.victoryStreak >= 2) {
+				r.push(`so interrupting a long series of military successes.`);
+			} else if (inBattle && V.SecExp.battles.lossStreak >= 2) {
+				r.push(`confirming the long list of recent failures our armed forces collected.`);
+			}
+		} else if (V.SecExp.war.result === 2) {
+			r.push(`The fight was long and hard, but in the end our men managed to`);
+			if (inBattle) {
+				r.push(`repel the`);
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`raiders, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`mercenaries, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`freedom fighters, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`old world soldiers, though not without difficulty.`);
+				}
+			} else {
+				r.push(`stop the revolt, though not without difficulty.`);
+			}
+		} else if (V.SecExp.war.result === -2) {
+			r.push(`The fight was long and hard. Our men in the end had to yield to the`);
+			if (inBattle) {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`horde of raiders, which was fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`slavers, which were fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`freedom fighters, which were fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`old world soldiers, which were fortunately unable to capitalize on their victory.`);
+				}
+			} else {
+				r.push(`rebels, which were fortunately unable to capitalize on their victory.`);
+			}
+		}
+
+		if (inRebellion && V.SecExp.rebellions.sfArmor) {
+			r.push(`More units were able to survive thanks to wearing ${V.SF.Lower}'s combat armor suits.`);
+		}
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		// Effects
+		if (result === 3 || result === 2) {
+			r.push(` Thanks to your victory, your `, App.UI.DOM.makeElement("span", `reputation`, "green"), ` and `, App.UI.DOM.makeElement("span", `authority`, "darkviolet"), `${result === 2 ? 'slightly' : ''} increased.`);
+			if (inRebellion) {
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `Many of the rebelling slaves were recaptured and punished.`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `Many of the rebelling citizens were captured and punished, many others enslaved.`);
+				}
+				App.UI.DOM.appendNewElement("div", node, `The instigators were executed one after another in a public trial that lasted for almost three days.`);
+				if (slaveRebellion) {
+					V.NPCSlaves -= random(10, 30);
+				} else {
+					V.lowerClass -= random(10, 30);
+				}
+				repX((result === 3 ? random(800, 1000) : random(600, 180)), "war");
+				V.SecExp.core.authority += (result === 3 ? random(800, 1000) : random(600, 800));
+			} else {
+				if (result === 3) {
+					r.push("You were also able to capture");
+					if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 50) {
+						r.push(`a small amount of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 100) {
+						r.push(`an healthy group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 150) {
+						r.push(`a big group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 200) {
+						r.push(`a huge group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses > 200) {
+						r.push(`a great amount of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					}
+					r.push(`and some of their equipment,`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, " Our men were not able to capture any combatants, however some equipment was seized during the enemy's hasty retreat,");
+				}
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX((result === 3 ? 4000 : 1000) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 800 : 200) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX((result === 3 ? 6000 : 1500) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1200 : 300) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX((result === 3 ? 7500 : 2000) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1500 : 450) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX((result === 3 ? 8000 : 2100) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1600 : 500) * majorBattleMod;
+				}
+				r.push(`which once sold produced`);
+				if (V.SecExp.war.attacker.equip === 0) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'small amount' : 'bit'} of cash.</span>`);
+					loot += (result === 3 ? 1000 : 500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 1) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'moderate' : 'small'} amount of cash.</span>`);
+					loot += (result === 3 ? 5000 : 2500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 2) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'good' : 'moderate'} amount of cash.</span>`);
+					loot += (result === 3 ? 10000 : 5000) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 3) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'great' : 'good'} amount of cash.</span>`);
+					loot += (result === 3 ? 15000 : 7500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 4) {
+					r.push(`<span class="yellowgreen">${result === 3 ? 'wealth worthy of the mightiest warlord' : 'a great amount of cash'}.</span>`);
+					loot += (result === 3 ? 20000 : 10000) * majorBattleMod;
+				}
+				if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) {
+					r.push(`Part of the loot is distributed to your mercenaries.`);
+					if (result === 3) {
+						captives = Math.trunc(captives * 0.6);
+					}
+					loot = Math.trunc(loot * 0.6);
+				}
+				cashX(loot, "war");
+				App.Events.addParagraph(node, r);
+				r = [];
+				if (result === 3) {
+					r.push(`Damage to the city was <span class="red">limited,</span> it won't take much to rebuild. Very few citizens or slaves were involved in the fight and even fewer met their end, safeguarding the prosperity of the arcology.`);
+				} else {
+					r.push(`Damage to the infrastructure was <span class="yellow">virtually non-existent,</span> costing only pocket cash to bring the structure back to normal. The inhabitants as well reported little to no injuries, because of this the prosperity of the arcology did not suffer.`);
+				}
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				cashX(forceNeg((result === 3 ? 1000 : 2000) * majorBattleMod), "war");
+				if (result === 3) {
+					if (V.SecExp.battles.victoryStreak >= 3) {
+						r.push(`It seems your victories over the constant threats directed your way is having <span class="green">a positive effect on the prosperity of the arcology,</span> due to the security your leadership affords.`);
+						V.arcologies[0].prosperity += 5 * majorBattleMod;
+					}
+				} else {
+					V.lowerClass -= random(10) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(20) * majorBattleMod);
+				}
+				App.Events.addParagraph(node, r);
+				r = [];
+			}
+		} else if (result === -3 || result === -2) {
+			r.push(` Thanks to your defeat, your `, App.UI.DOM.makeElement("span", `reputation`, "red"), ` and `, App.UI.DOM.makeElement("span", `authority`, "red"), ` decreased.`);
+			if (inRebellion) {
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
+					V.lowerClass -= (result === -3 ? random(50, 100) : random(40, 80));
+					lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
+					App.SecExp.slavesDamaged(lostSlaves);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
+					V.lowerClass -= Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.6);
+				}
+				repX((result === -3 ? random(-800, -1000) : random(-600, -800)), "war");
+				V.SecExp.core.authority -= (result === -3 ? random(800, 1000) : random(600, 800));
+			} else {
+				if (result === -3) {
+					App.UI.DOM.appendNewElement("div", node, " Obviously your troops were not able to capture anyone or anything.");
+
+					r = [];
+					r.push(`In the raiding following the battle <span class="red">the arcology sustained heavy damage,</span> which will cost quite the amount of cash to fix. Reports of <span class="red">citizens or slaves killed or missing</span> flood your office for a few days following the defeat.`);
+					if (V.SecExp.battles.lossStreak >= 3) {
+						r.push(`This only confirms the fears of many, <span class="red">your arcology is not safe</span> and it is clear their business will be better somewhere else.`);
+						V.arcologies[0].prosperity -= 5 * majorBattleMod;
+					}
+				} else {
+					r.push(`It was a close defeat, but nonetheless your <span class="red">reputation</span> and <span class="red">authority</span> slightly decreased.`);
+					r.push("Your troops were not able to capture anyone or anything.");
+					r = [];
+					r.push(`The enemy did not have the strength to raid the arcology for long, still <span class="red">the arcology sustained some damage,</span> which will cost a moderate amount of cash to fix. Some citizens and slaves found themselves on the wrong end of a gun and met their demise.`);
+					r.push(`Some business sustained heavy damage, slightly impacting the arcology's prosperity.`);
+				}
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				App.Events.addParagraph(node, r);
+				r = [];
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX(forceNeg((result === -3 ? 400 : 40) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 400 : 40) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX(forceNeg((result === -3 ? 600 : 60) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 600 : 60) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX(forceNeg((result === -3 ? 750 : 75) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 750 : 75) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX(forceNeg((result === -3 ? 800 : 80) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 800 : 80) * majorBattleMod;
+				}
+				
+				cashX(forceNeg((result === -3 ? 5000 : 3000) * majorBattleMod), "war");
+				if (V.week <= 30) {
+					V.lowerClass -= random(result === -3 ? 100 : 50) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 150 : 75) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 5 : 2) * majorBattleMod;
+				} else if (V.week <= 60) {
+					V.lowerClass -= random(result === -3 ? 120 : 60) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 170 : 85) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 10 : 5) * majorBattleMod;
+				} else if (V.week <= 90) {
+					V.lowerClass -= random(result === -3 ? 140 : 70) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 190 : 95) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 15 : 7) * majorBattleMod;
+				} else if (V.week <= 120) {
+					V.lowerClass -= random(result === -3 ? 160 : 80) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 210 : 105) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 20 : 10) * majorBattleMod;
+				} else {
+					V.lowerClass -= random(result === -3 ? 180 : 90) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 230 : 115) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 25 : 12) * majorBattleMod;
+				}
+			}
+		}
+
+		if (inRebellion) {
+			V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
+			if (V.SecExp.war.engageRule === 0) {
+				r.push(`Since you ordered your troops to limit their weaponry to low caliber or nonlethal, the arcology reported only`);
+				r.push(`<span class="red">minor damage.</span>`);
+				r.push(`Most citizens and non involved slaves remained unharmed, though some casualties between the civilians were inevitable.`);
+				r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
+				r.push(setRepairTime("arc", 3, 1500));
+				if (V.week <= 30) {
+					arcologyEffects(40, 65, 2);
+				} else if (V.week <= 60) {
+					arcologyEffects(50, 75, 5);
+				} else if (V.week <= 90) {
+					arcologyEffects(60, 85, 7);
+				} else if (V.week <= 120) {
+					arcologyEffects(70, 95, 10);
+				} else {
+					arcologyEffects(80, 105, 12);
+				}
+			} else if (V.SecExp.war.engageRule === 1) {
+				r.push(`You ordered your troops to limit their weaponry to non-heavy, non-explosive, because of this the arcology reported`);
+				r.push(`<span class="red">moderate damage.</span>`);
+				r.push(`Most citizens and non involved slaves remained unharmed or only lightly wounded, but many others did not make it. Unfortunately casualties between the civilians were inevitable.`);
+				r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
+				r.push(setRepairTime("arc", 5, 2000));
+				if (V.week <= 30) {
+					arcologyEffects(60, 85, 4);
+				} else if (V.week <= 60) {
+					arcologyEffects(70, 95, 7);
+				} else if (V.week <= 90) {
+					arcologyEffects(80, 105, 9);
+				} else if (V.week <= 120) {
+					arcologyEffects(90, 115, 12);
+				} else {
+					arcologyEffects(100, 125, 14);
+				}
+			} else if (V.SecExp.war.engageRule === 2) {
+				r.push(`Since you did not apply any restriction on the weapons your forces should use, the arcology reported`);
+				r.push(`<span class="red">heavy damage.</span>`);
+				r.push(`Many citizens and uninvolved slaves are reported killed or missing. Casualties between the civilians were inevitable.`);
+				r.push(`Many businesses were damaged during the battle either by the fight itself, by fires which spread unchecked for hours or by looters.`);
+				r.push(setRepairTime("arc", 7, 3000));
+				if (V.week <= 30) {
+					arcologyEffects(100, 150, 5);
+				} else if (V.week <= 60) {
+					arcologyEffects(120, 170, 10);
+				} else if (V.week <= 90) {
+					arcologyEffects(140, 190, 15);
+				} else if (V.week <= 120) {
+					arcologyEffects(160, 210, 20);
+				} else {
+					arcologyEffects(180, 230, 25);
+				}
+			} else {
+				r.push(`Thanks to the advance riot control weaponry developed by your experts, the rebels were mostly subdued or killed with`);
+				r.push(`<span class="yellow">little to no collateral damage to the arcology</span> and its inhabitants.`);
+				r.push(`A few businesses were looted, but the damage was very limited.`);
+				r.push(setRepairTime("arc", 2, 1000));
+				if (V.week <= 30) {
+					arcologyEffects(20, 45, 2);
+				} else if (V.week <= 60) {
+					arcologyEffects(30, 55, 4);
+				} else if (V.week <= 90) {
+					arcologyEffects(40, 65, 6);
+				} else if (V.week <= 120) {
+					arcologyEffects(50, 75, 8);
+				} else {
+					arcologyEffects(60, 85, 10);
+				}
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			if (!V.SecExp.war.reactorDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the reactor complex and sabotaged it, causing massive power fluctuations and blackouts.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("reactor", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0)));
+				} else {
+					r.push(`While the reactor was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the reactor protected it from the multiple sabotage attempts carried out by the rebels.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (!V.SecExp.war.waterwayDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the water management complex and sabotaged it, causing huge water leaks throughout the arcology and severely limiting the water supply.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("waterway", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0)));
+				} else {
+					r.push(`While the water management complex was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the water management complex protected it from the sabotage attempt of the rebels.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (!V.SecExp.war.assistantDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the facility housing ${V.assistant.name}'s mainframe and sabotaged it. Without its AI, the arcology will be next to impossible to manage.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("assistant", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0)));
+				} else {
+					r.push(`While the ${V.assistant.name}'s mainframe was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the facility housing ${V.assistant.name}'s mainframe prevented any sabotage attempt.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (V.SecExp.war.penthouseDefense && V.BodyguardID !== 0) {
+				r.push(`The garrison assigned to the penthouse together with your loyal Bodyguard stopped all assaults against your penthouse with ease.`);
+			} else {
+				if (random(1, 100) <= 75) {
+					r.push(`During the fighting a group of slaves assaulted the penthouse.`);
+					if (S.Bodyguard) {
+						r.push(`Your Bodyguard, ${S.Bodyguard.slaveName}, stood strong against the furious attack.`);
+					} else if (V.SecExp.war.penthouseDefense) {
+						r.push(`The garrison stood strong against the furious attack.`);
+					} else {
+						r.push(`Isolated and alone, you stood strong against the furious attack.`);
+					}
+					["PC", "Concubine", "Bodyguard"].forEach(c => r.push(checkWoundStatus(c)));
+					r.push(`<span class="red">The damage to the structure will be</span> costly to repair.`);
+					r.push(IncreasePCSkills('engineering', 0.1));
+					cashX(-2000, "war");
+				} else {
+					if (!V.SecExp.war.penthouseDefense) {
+						r.push(`While the penthouse was left without a sizable garrison, there was no dangerous assault against it. Let's hope we'll always be this lucky.`);
+					} else {
+						r.push(`There was no sizable assault against the penthouse. Let's hope we'll always be this lucky.`);
+					}
+				}
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+		}
+		V.lowerClass = Math.max(V.lowerClass, 0);
+		V.NPCSlaves = Math.max(V.NPCSlaves, 0);
+
+		if (inBattle) { // tactics
+			App.Events.addParagraph(node, App.SecExp.commanderEffectiveness("report"));
+			r = [];
+
+			r.push(`${V.SecExp.war.commander === "PC" ? 'You' : 'Your commander'}`);
+			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+				r.push(`chose to employ "bait and bleed" tactics or relying on quick attacks and harassment to tire and wound the enemy until their surrender.`);
+			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+				r.push(`chose to employ "guerrilla" tactics or relying on stealth, terrain knowledge and subterfuge to undermine and ultimately destroy the enemy.`);
+			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+				r.push(`chose to employ "choke points" tactics or the extensive use of fortified or highly defensive positions to slow down and eventually stop the enemy.`);
+			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+				r.push(`chose to employ "interior lines" tactics or exploiting the defender's shorter front to quickly disengage and concentrate troops when and where needed.`);
+			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+				r.push(`chose to employ "pincer maneuver" tactics or attempting to encircle the enemy by faking a collapsing center front.`);
+			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+				r.push(`chose to employ "defense in depth" tactics or relying on mobility to disengage and exploit overextended enemy troops by attacking their freshly exposed flanks.`);
+			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+				r.push(`chose to employ "blitzkrieg" tactics or shattering the enemy's front-line with a violent, concentrated armored assault.`);
+			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+				r.push(`chose to employ "human wave" tactics or overwhelming the enemy's army with a massive infantry assault.`);
+			}
+			if (V.SecExp.war.terrain === "urban") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The urban terrain synergized well with bait and bleed tactics, slowly chipping away at the enemy's forces from the safety of the narrow streets and empty buildings.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The urban terrain synergized well with guerrilla tactics, eroding your enemy's determination from the safety of the narrow streets and empty buildings.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The urban environment offers many opportunities to hunker down and stop the momentum of the enemy's assault while keeping your soldiers in relative safety.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the urban environment offers many highly defensive position, it does restrict movement and with it the advantages of exploiting interior lines.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The urban terrain does not allow for wide maneuvers, the attempts of your forces to encircle the attackers are mostly unsuccessful.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`While the urban environment offers many defensive positions, it limits mobility, limiting the advantages of using a defense in depth tactic.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The urban terrain is difficult to traverse, making your troops attempt at a lightning strike unsuccessful.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The urban terrain offers great advantages to the defender, your men find themselves in great disadvantage while mass assaulting the enemy's position.`);
+				}
+			} else if (V.SecExp.war.terrain === "rural") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The open terrain of rural lands does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The open terrain of rural lands does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The open terrain of rural lands does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "hills") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the hills offer some protection, they also make it harder to maneuver; bait and bleed tactics will not be 100% effective here.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The hills offer protection to both your troops and your enemy's, making it harder for your men to accomplish guerrilla attacks effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`While not as defensible as mountains, hills offer numerous opportunities to funnel the enemy towards highly defensible choke points.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to exploit the defender's greater mobility afforded by interior lines.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`Limited mobility due to the hills is a double edged sword, affording your men a decent shot at encirclement.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to use elastic defense tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to organize lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The defensibility of hills makes it harder to accomplish victory through mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "coast") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`On the coast there's little space and protection to effectively employ bait and bleed tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`On the coast there's little space and protection to effectively employ guerrilla tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`Amphibious attacks are difficult in the best of situations; the defender has a very easy time funneling the enemy towards their key defensive positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While in an amphibious landing mobility is not the defender's best weapon, exploiting interior lines still affords your troops some advantages.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`Attempting to encircle a landing party is not the best course of action, but not the worst either.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`In an amphibious assault it's very easy for the enemy to overextend, making defense in depth tactics quite effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The rough, restricted terrain does not lend itself well to lightning strikes, but the precarious position of the enemy still gives your mobile troops tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The rough, restricted terrain does not lend itself well to mass assaults, but the precarious position of the enemy still gives your troops tactical superiority.`);
+				}
+			} else if (V.SecExp.war.terrain === "outskirts") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops bait and bleed tactics would require.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops guerrilla tactics would require.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The imposing structure of the arcology itself provides plenty of opportunities to create fortified choke points from which to shatter the enemy assault.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering overall effectiveness of interior lines tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering the chances of making an effective encirclement.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`Having the arcology near the battlefield means there are limited available maneuvers to your troops, who still needs to defend the structure, making defense in depth tactics not as effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`While an assault may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the lightning strike.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`While an attack may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the mass assault.`);
+				}
+			} else if (V.SecExp.war.terrain === "mountains") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the mountains offer great protection, they also limit maneuverability; bait and bleed tactics will not be quite as effective here.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The mountains offer many excellent hiding spots and defensive positions, making guerrilla tactics very effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The mountains offer plenty of opportunity to build strong defensive positions from which to shatter the enemy's assault.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the rough terrain complicates maneuvers, the defensive advantages offered by the mountains offsets its negative impact.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective encirclement in this environment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`While mobility is limited, defensive positions are plentiful; your men are not able to fully exploit overextended assaults, but are able to better resist them.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective lightning strike in this environment.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective mass assault in this environment.`);
+				}
+			} else if (V.SecExp.war.terrain === "wasteland") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make bait and bleed tactics work well enough.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make guerrilla tactics work well enough.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The wastelands are mostly open terrain; your men have a difficult time setting up effective fortified positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men can exploit to the maximum the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The wastelands, while rough, are mostly open terrain; your men can set up an effective encirclement here.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The wastelands, while rough, are mostly open terrain, allowing your men to liberally maneuver to exploit overextended enemies.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "international waters") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The open terrain of international waters does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The open terrain of international waters does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The open terrain of international waters does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "an underwater cave") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The tight terrain of an underwater cave does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The tight terrain of an underwater cave does offers many hiding spots, making it easier for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The tight terrain of an underwater cave offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The tight terrain makes it hard for your men to easily exploit the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The tight terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The tight terrain hinders the mobility of your army, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The tight terrain hinders the mobility of your army, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The tight terrain hinders the mobility of your army, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "a sunken ship") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The tight terrain of a sunken ship lends itself well to bait and bleed tactics, making it easier for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The tight terrain of a sunken ship offers many hiding spots, making it easy for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The tight terrain of a sunken ship offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The tight terrain does not allow your men to easily exploit the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			}
+
+			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, bait and bleed tactics are not effective against them.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The modern armies hired by Free Cities are decently mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, guerrilla tactics are not effective against them.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The modern armies hired by Free Cities are highly mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Raiders lack heavy weaponry or armor, so making use of fortified positions is an excellent way to dissipate the otherwise powerful momentum of their assault.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The high tech equipment Free Cities can afford to give their guns for hire means there's no defensive position strong enough to stop them, still the relatively low numbers means they will have to take a careful approach, slowing them down.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Old world armies have both the manpower and the equipment to conquer any defensive position, making use of strong fortifications will only bring you this far against them.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`The lack of specialized weaponry means freedom fighters have a rather hard time overcoming tough defensive positions, unfortunately they have also a lot of experience in avoiding them.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`The highly mobile horde of raiders will not give much room for your troops to maneuver, lowering their tactical superiority.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`While decently mobile, Free Cities forces are not in high enough numbers to risk maintaining prolonged contact, allowing your troops to quickly disengage and redeploy where it hurts.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Old world armies are not famous for the mobility, which makes them highly susceptible to any tactic that exploits maneuverability and speed.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not the best equipped army, the experience and mobility typical of freedom fighters groups make them tough targets for an army that relies itself on mobility.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`While numerous, the undisciplined masses of raiders are easy prey for encirclements.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`While decently mobile, the low number of Free Cities expedition forces make them good candidates for encirclements.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`The discipline and numbers of old world armies make them quite difficult to encircle.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not particularly mobile, freedom fighters are used to fight against overwhelming odds, diminishing the effectiveness of the encirclement.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`While their low discipline makes them prime candidates for an elastic defense type of strategy, their high numbers limit your troops maneuverability.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`With their low numbers Free Cities mercenaries are quite susceptible to this type of tactic, despite their mobility.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`With their low mobility old world armies are very susceptible to this type of strategy.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Low mobility and not particularly high numbers mean freedom fighters can be defeated by employing elastic defense tactics.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`With their low discipline and lack of heavy equipment, lightning strikes are very effective against raider hordes.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`Having good equipment and discipline on their side, Free Cities expeditions are capable of responding to even strong lightning strikes.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While disciplined, old world armies low mobility makes them highly susceptible to lightning strikes.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not well equipped, freedom fighters have plenty of experience fighting small, mobile attacks, making them difficult to defeat with lightning strikes.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`The hordes of raiders are much more experienced than your soldiers in executing mass assaults and they also have a lot more bodies to throw in the grinder.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The good equipment and mobility of Free Cities mercenaries cannot save them from an organized mass assault.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Unfortunately the discipline and good equipment of old world armies allow them to respond well against a mass assault.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`The relative low numbers and not great equipment typical of freedom fighters make them susceptible to being overwhelmed by an organized mass assault.`);
+				}
+			}
+			r.push(`In the end`);
+			if (V.SecExp.war.commander === "PC") {
+				r.push(`you were`);
+			} else {
+				r.push(`your commander was`);
+			}
+			if (V.SecExp.war.tacticsSuccessful) {
+				r.push(`<span class="green">able to successfully employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly enhancing`);
+			} else {
+				r.push(`<span class="red">not able to effectively employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly affecting`);
+			}
+			r.push(`the efficiency of your army.`);
+			App.Events.addParagraph(node, r);
+			r = [];
+		}
+
+		let rand;
+		let count = 0;
+		let averageLosses = 0;
+		let loss = 0;
+		const lossesList = [];
+		if (hasLosses || V.SecExp.war.losses === 0) {
+			if (hasLosses) { // Generates a list of randomized losses, from which each unit picks one at random
+				averageLosses = Math.trunc(V.SecExp.war.losses / App.SecExp.battle.deployedUnits());
+				for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) {
+					let assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100));
+					if (assignedLosses > V.SecExp.war.losses) {
+						assignedLosses = V.SecExp.war.losses;
+						V.SecExp.war.losses = 0;
+					} else {
+						V.SecExp.war.losses -= assignedLosses;
+					}
+					lossesList.push(assignedLosses);
+				}
+				if (V.SecExp.war.losses > 0) {
+					lossesList[random(lossesList.length - 1)] += V.SecExp.war.losses;
+				}
+				lossesList.shuffle();
+
+				// Sanity check for losses
+				for (let l of lossesList) {
+					if (!Number.isInteger(l)) {
+						l = 0;
+					}
+					count += l;
+				}
+				if (count < V.SecExp.war.losses) {
+					rand = random(lossesList.length - 1);
+					lossesList[rand] += V.SecExp.war.losses - count;
+				} else if (count > V.SecExp.war.losses) {
+					const diff = count - V.SecExp.war.losses;
+					rand = random(lossesList.length - 1);
+					lossesList[rand] = Math.clamp(lossesList[rand]-diff, 0, 100);
+				}
+			}
+		} else {
+			throw Error(`Losses are ${V.SecExp.war.losses}.`);
+		}
+
+		if (inRebellion && V.SecExp.war.irregulars > 0) {
+			if (hasLosses) {
+				loss = lossesList.pluck();
+				if (loss > V.ACitizens * 0.95) { // This is unlikely to happen, but might as well be safe
+					loss = Math.trunc(V.ACitizens * 0.95);
+				}
+			}
+			App.UI.DOM.appendNewElement("div", node, `The volunteering citizens were quickly organized into an irregular militia unit and deployed in the arcology: ${casualtiesReport('irregulars', loss)}`);
+			if (hasLosses) {
+				if (loss > V.lowerClass * 0.95) { // I suspect only lower class ever get to fight/die, but being safe
+					V.lowerClass = Math.trunc(V.lowerClass * 0.05);
+					loss -= Math.trunc(V.lowerClass * 0.95);
+					if (loss > V.middleClass * 0.95) {
+						V.middleClass = Math.trunc(V.middleClass * 0.05);
+						loss -= Math.trunc(V.middleClass *0.95);
+						if (loss > V.upperClass * 0.95) {
+							V.upperClass = Math.trunc(V.upperClass * 0.05);
+							loss -= Math.trunc(V.upperClass * 0.95);
+							if (loss > V.topClass * 0.95) {
+								V.topClass = Math.trunc(V.topClass * 0.05);
+							} else {
+								V.topClass -= loss;
+							}
+						} else {
+							V.upperClass -= loss;
+						}
+					} else {
+						V.middleClass -= loss;
+					}
+				} else {
+					V.lowerClass -= loss;
+				}
+			}
+		}
+		if (V.SF.Toggle && V.SF.Active >= 1 && (inRebellion || inBattle && V.SecExp.war.deploySF)) {
+			if (hasLosses) {
+				loss = lossesList.pluck();
+				loss = Math.clamp(loss, 0, V.SF.ArmySize);
+				V.SF.ArmySize -= loss;
+			}
+			App.UI.DOM.appendNewElement("div", node, `${capFirstChar(V.SF.Lower)}, ${num(V.SF.ArmySize)} strong, is called to arms: ${casualtiesReport('SF', loss)}`);
+		}
+		for (const type of App.SecExp.unit.list()) {
+			if (App.SecExp.battle.deployedUnits(type) >= 1) {
+				let units;
+				if (type !== 'bots') {
+					units = V.SecExp.units[type].squads;
+				} else {
+					units = [V.SecExp.units.bots];
+				}
+				for (const unit of units) {
+					if (App.SecExp.unit.isDeployed(unit)) {
+						let r = [];
+						if (hasLosses) {
+							loss = lossesList.pluck();
+							loss = Math.clamp(loss, 0, unit.troops);
+						}
+
+						if (inRebellion) {
+							if (type === "bots") {
+								r.push(`Security drones: ${casualtiesReport(type, loss, unit)}`);
+							} else {
+								r.push(`${unit.platoonName} participated in the battle. They remained loyal to you. ${casualtiesReport(type, loss, unit)}`);
+							}
+						} else {
+							r.push(`${type !== "bots" ? `${unit.platoonName}` : "Security drones"}: ${casualtiesReport(type, loss, unit)}`);
+						}
+						if (type !== "bots") {
+							unit.battlesFought++;
+							if (loss > 0) {
+								const med = Math.round(Math.clamp(loss * unit.medics * 0.25, 1, loss));
+								if (unit.medics === 1) {
+									r.push(`Some men were saved by their medics.`);
+								}
+								unit.troops -= Math.trunc(Math.clamp(loss - med, 0, unit.maxTroops));
+								V.SecExp.units[type].dead += Math.trunc(loss - med);
+							}
+							if (unit.training < 100 && random(1, 100) > 60) {
+								r.push(`Experience has increased.`);
+								unit.training += random(5, 15) + (isMajorBattle ? 1 : 0) * random(5, 15);
+							}
+						} else if (type === "bots" && loss > 0) {
+							unit.troops -= loss;
+						}
+						App.Events.addNode(node, r, "div");
+					}
+				}
+			}
+		}
+
+		if (inRebellion) {
+			for (const unit of App.SecExp.unit.list().slice(1)) {
+				App.UI.DOM.appendNewElement("p", node, rebellingUnitsFate(unit, averageLosses));
+			}
+		} else {
+			if (
+				V.SF.Toggle && V.SF.Active >= 1 &&
+				(V.SF.Squad.Firebase >= 7 || V.SF.Squad.GunS >= 1 || V.SF.Squad.Satellite >= 5 || V.SF.Squad.GiantRobot >= 6 || V.SF.Squad.MissileSilo >= 1)
+			) {
+				// SF upgrades effects
+				r = [];
+				if (V.SF.Squad.Firebase >= 7) {
+					r.push(`The artillery pieces installed around ${V.SF.Lower}'s firebase provided vital fire support to the troops in the field.`);
+				}
+				if (V.SF.Squad.GunS >= 1) {
+					r.push(`The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support.`);
+				}
+				if (V.SF.Squad.Satellite >= 5 && V.SF.SatLaunched > 0) {
+					r.push(`The devastating power of ${V.SF.Lower}'s satellite was employed with great efficiency against the enemy.`);
+				}
+				if (V.SF.Squad.GiantRobot >= 6) {
+					r.push(`The giant robot of ${V.SF.Lower} proved to be a great boon to our troops, shielding many from the worst the enemy had to offer.`);
+				}
+				if (V.SF.Squad.MissileSilo >= 1) {
+					r.push(`The missile silo exterminated many enemy soldiers even before the battle would begin.`);
+				}
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			let menialPrice = Math.trunc((V.slaveCostFactor * 1000) / 100) * 100;
+			menialPrice = Math.clamp(menialPrice, 500, 1500);
+			captives = Math.trunc(captives);
+			if (captives > 0) {
+				let candidates = 0;
+				r.push(`During the battle ${captives} attackers were captured.`);
+				if (random(1, 100) <= 25) {
+					candidates = Math.min(captives, random(1, 3));
+					r.push(`${capFirstChar(num(candidates, true))} of them have the potential to be sex slaves.`);
+				}
+
+				const sell = function() {
+					cashX((menialPrice * captives), "menialTransfer");
+					return `Captives sold`;
+				};
+				const keep = function() {
+					V.menials += (captives - candidates);
+					for (let i = 0; i < candidates; i++) {
+						const generateFemale = random(0, 99) < V.seeDicks;
+						let slave = GenerateNewSlave((generateFemale ? "XY" : "XX"), {minAge: 16, maxAge: 32, disableDisability: 1});
+						slave.weight = (generateFemale ? random(-20, 30) : random(0, 30));
+						slave.muscles = (generateFemale ? random(15, 80) : random(25, 80));
+						slave.waist = (generateFemale ? random(10, 80) : random(-20, 20));
+						slave.skill.combat = 1;
+						slave.origin = `$He is an enslaved ${V.SecExp.war.attacker.type} soldier captured during a battle.`;
+						newSlave(slave); // skip New Slave Intro
+					}
+					return `Captives primarily added as menial slaves.`;
+				};
+
+				App.Events.addResponses(node, [
+					new App.Events.Result(`sell them all immediately`, sell),
+					new App.Events.Result(`keep them as primarily menial slaves`, keep),
+				]);
+			}
+		}
+	} else {
+		if (result === -1) {
+			if (inRebellion) {
+				r.push(`Rather than waste the lives of your men you decided to surrender, hoping the rebels will cause less damage if you indulge them, this is however a big hit to your status.`);
+				r.push(`Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
+				r.push(`The surrender allows the arcology to survive <span class="yellow">mostly intact</span>`);
+				r.push(`however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+				App.Events.addParagraph(node, r);
+				r = [];
+
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
+				}
+				cashX(-1000, "war");
+				repX(random(-1000, -1200), "war");
+				V.SecExp.core.authority -= random(1000, 1200);
+				if (V.week <= 30) {
+					arcologyEffects(100, 150, 5);
+				} else if (V.week <= 60) {
+					arcologyEffects(120, 170, 10);
+				} else if (V.week <= 90) {
+					arcologyEffects(140, 190, 15);
+				} else if (V.week <= 120) {
+					arcologyEffects(160, 210, 20);
+				} else {
+					arcologyEffects(180, 230, 25);
+				}
+				V.lowerClass -= random(50, 100);
+				lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
+				App.SecExp.slavesDamaged(lostSlaves);
+			} else {
+				r.push(`Rather than waste the lives of your men you decided to surrender, hoping your enemy will cause less damage if you indulge them, this is however a big hit to your status. Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX(forceNeg(600 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 600 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX(forceNeg(800 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 800 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX(forceNeg(1000 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 1000 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX(forceNeg(1200 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 1200 * majorBattleMod;
+				}
+				App.Events.addParagraph(node, r);
+				r = [];
+				r.push(`The surrender allows the arcology to survive <span class="red">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				cashX(forceNeg(1000 * majorBattleMod), "war");
+				if (V.week <= 30) {
+					V.lowerClass -= random(80) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(120) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(5) * majorBattleMod;
+				} else if (V.week <= 60) {
+					V.lowerClass -= random(100) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(140) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(10) * majorBattleMod;
+				} else if (V.week <= 90) {
+					V.lowerClass -= random(120) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(160) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(15) * majorBattleMod;
+				} else if (V.week <= 120) {
+					V.lowerClass -= random(140) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(180) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(20) * majorBattleMod;
+				} else {
+					V.lowerClass -= random(160) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(200) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(25) * majorBattleMod;
+				}
+			}
+		} else if (result === 0) { // Battles only
+			r.push(`Unfortunately your adversary did not accept your money.`);
+			if (V.SecExp.war.attacker.type === "freedom fighters") {
+				r.push(`Their ideological crusade would not allow such thing.`);
+			} else {
+				r.push(`They saw your attempt as nothing more than admission of weakness.`);
+			}
+			r.push(`There was no time to organize a defense and so the enemy walked into the arcology as it was his. Your reputation and authority suffer a hit.`);
+			if (V.SecExp.war.attacker.type === "raiders") {
+				repX(forceNeg(400 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 400 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "free city") {
+				repX(forceNeg(600 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 600 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+				repX(forceNeg(750 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 750 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "old world") {
+				repX(forceNeg(800 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 800 * majorBattleMod;
+			}
+			V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`Fortunately the arcology survives <span class="yellow">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+			r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+			cashX(-1000, "war");
+			if (V.week <= 30) {
+				V.lowerClass -= random(80) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(120) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(5) * majorBattleMod;
+			} else if (V.week <= 60) {
+				V.lowerClass -= random(100) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(140) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(10) * majorBattleMod;
+			} else if (V.week <= 90) {
+				V.lowerClass -= random(120) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(160) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(15) * majorBattleMod;
+			} else if (V.week <= 120) {
+				V.lowerClass -= random(140) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(180) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(20) * majorBattleMod;
+			} else {
+				V.lowerClass -= random(160) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(200) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(25) * majorBattleMod;
+			}
+		} else if (result === 1) { // Battles only
+			r.push(`The attackers wisely take the money offered them to leave your territory without further issues. The strength of the Free Cities was never in their guns but in their dollars, and today's events are the perfect demonstration of such strength.`);
+			r.push(`Your <span class="green">reputation slightly increases.</span>`);
+			if (V.SecExp.war.attacker.type === "raiders") {
+				repX(500 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "free city") {
+				repX(750 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+				repX(1000 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "old world") {
+				repX(1250 * majorBattleMod, "war");
+			}
+			cashX(forceNeg(App.SecExp.battle.bribeCost()), "war");
+		}
+	}
+
+	App.Events.addParagraph(node, r);
+	if (inBattle) {
+		V.SecExp.units.bots.isDeployed = 0;
+		App.SecExp.unit.humanSquads().forEach(s => s.isDeployed = 0);
+	} else {
+		V.SecExp.rebellions[V.SecExp.war.type.toLowerCase().replace(' rebellion', '') + 'Progress'] = 0;
+		V.SecExp.rebellions.tension = Math.clamp(V.SecExp.rebellions.tension - random(50, 100), 0, 100);
+		if (slaveRebellion) {
+			V.SecExp.rebellions.citizenProgress = Math.clamp(V.SecExp.rebellions.citizenProgress - random(50, 100), 0, 100);
+		} else {
+			V.SecExp.rebellions.slaveProgress = Math.clamp(V.SecExp.rebellions.slaveProgress - random(50, 100), 0, 100);
+		}
+	}
+	return node;
+};
diff --git a/src/Mods/SecExp/events/rebellionReport.js b/src/Mods/SecExp/events/rebellionReport.js
deleted file mode 100644
index 32d940507acc4a118479eaa512fcc173d408a05c..0000000000000000000000000000000000000000
--- a/src/Mods/SecExp/events/rebellionReport.js
+++ /dev/null
@@ -1,683 +0,0 @@
-App.Events.rebellionReport = function() {
-	V.nextButton = "Continue";
-	V.nextLink = "Scheduled Event";
-	V.encyclopedia = "Battles";
-
-	let lostSlaves;
-	let r = [];
-	const node = new DocumentFragment();
-	const slaveRebellion = V.SecExp.war.type.includes("Slave");
-	const allKilled = V.SecExp.war.attacker.losses === V.SecExp.war.attacker.troops;
-	const result = V.SecExp.war.result;
-
-	/**
-	 * @param {string} [target]
-	 * @param {number} [value]
-	 */
-	const setRepairTime = function(target, value, cost=2000) {
-		V.SecExp.rebellions.repairTime[target] = 3 + random(1) - value;
-		cashX(-cost, "war");
-		return IncreasePCSkills('engineering', 0.1);
-	};
-
-	/**
-	 * @param {string} [type]
-	 * @param {number} [loss]
-	 */
-	const casualtiesReport = function(type, loss, squad=null) {
-		const isSpecial = squad && App.SecExp.unit.list().slice(1).includes(type);
-		let r = [];
-		if (loss <= 0) {
-			r.push(`No`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.2) : 10)) {
-			r.push(`Light`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.4) : 30)) {
-			r.push(`Moderate`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.6) : 60)) {
-			r.push(`Heavy`);
-		} else {
-			r.push(`Catastrophic`);
-		}
-		r.push(`casualties suffered.`);
-		if (App.SecExp.unit.list().includes(type)) {
-			if (squad.troops <= 0) {
-				squad.active = 0;
-				r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit.`);
-				if (type === "bots") {
-					r.push(`It will take quite the investment to rebuild them.`);
-				} else {
-					r.push(`The remnants will be sent home honored as veterans or reorganized in a new unit.`);
-				}
-			} else if (squad.troops <= 10) {
-				r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`);
-			}
-		}
-		return r.join(" ");
-	};
-
-	/**
-	 * @param {number} [lowerClass]
-	 * @param {number} [slaves]
-	 * @param {number} [prosperity]
-	 */
-	const arcologyEffects = function(lowerClass, slaves, prosperity) {
-		V.lowerClass -= random(lowerClass);
-		App.SecExp.slavesDamaged(random(slaves));
-		V.arcologies[0].prosperity -= random(prosperity);
-	};
-
-	/**
-	 * Does the target become wounded?
-	 * @param {string} [target]
-	 * @returns {string}
-	 */
-	const checkWoundStatus = function(target) {
-		let slave;
-		let woundChance = 0;
-		const r = [];
-		if (target === "PC") {
-			if (V.PC.career === "mercenary" || V.PC.career === "gang") {
-				woundChance -= 5;
-			} else if (V.PC.skill.warfare >= 75) {
-				woundChance -= 3;
-			}
-			if (V.personalArms >= 1) {
-				woundChance -= 5;
-			}
-			if (V.PC.physicalAge >= 60) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.belly > 5000) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.boobs >= 1000) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.butt >= 4) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.preg >= 30) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.balls >= 20) {
-				woundChance += random(5, 10);
-			}
-			if (V.PC.balls >= 9) {
-				woundChance += random(1, 5);
-			}
-			woundChance *= random(1, 2);
-		} else {
-			if (target === "Concubine") {
-				slave = S.Concubine;
-			} else if (target === "Bodyguard") {
-				slave = S.Bodyguard;
-			}
-
-			if (!slave) {
-				return ``;
-			}
-
-			if (slave.skill.combat === 1) {
-				woundChance -= 2;
-			}
-			woundChance -= 0.25 * (getLimbCount(slave, 105));
-			if (slave.health.condition >= 50) {
-				woundChance -= 1;
-			}
-			if (slave.weight > 130) {
-				woundChance += 1;
-			}
-			if (slave.muscles < -30) {
-				woundChance += 1;
-			}
-			if (getBestVision(slave) === 0) {
-				woundChance += 1;
-			}
-			if (slave.heels === 1) {
-				woundChance += 1;
-			}
-			if (slave.boobs >= 1400) {
-				woundChance += 1;
-			}
-			if (slave.butt >= 6) {
-				woundChance += 1;
-			}
-			if (slave.belly >= 10000) {
-				woundChance += 1;
-			}
-			if (slave.dick >= 8) {
-				woundChance += 1;
-			}
-			if (slave.balls >= 8) {
-				woundChance += 1;
-			}
-			if (slave.intelligence + slave.intelligenceImplant < -95) {
-				woundChance += 1;
-			}
-			woundChance *= random(2, 4);
-		}
-
-		if (random(1, 100) <= woundChance) {
-			if (target === "PC") {
-				healthDamage(V.PC, 60);
-				r.push(`A lucky shot managed to find its way to you, leaving a painful, but thankfully not lethal, wound.`);
-			} else {
-				const woundType = App.SecExp.inflictBattleWound(slave);
-				const {his, him} = getPronouns(slave);
-				if (target === "Concubine") {
-					r.push(`Your Concubine was unfortunately caught in the crossfire.`);
-				} else {
-					r.push(`During one of the assaults your Bodyguard was hit.`);
-				}
-				if (woundType === "voice") {
-					r.push(`A splinter pierced ${his} throat, severing ${his} vocal cords.`);
-				} else if (woundType === "eyes") {
-					r.push(`A splinter hit ${his} face, severely damaging ${his} eyes.`);
-				} else if (woundType === "legs") {
-					r.push(`An explosion near ${him} caused the loss of both of ${his} legs.`);
-				} else if (woundType === "arm") {
-					r.push(`An explosion near ${him} caused the loss of one of ${his} arms.`);
-				} else if (woundType === "flesh") {
-					r.push(`A stray shot severely wounded ${him}.`);
-				}
-			}
-		} else if (target === "PC") {
-			r.push(`Fortunately you managed to avoid injury.`);
-		}
-		return r.join(" ");
-	};
-
-	/**
-	 * @param {FC.SecExp.PlayerHumanUnitType} [unit]
-	 * @param {number} [averageLosses]
-	 */
-	const rebellingUnitsFate = function(unit, averageLosses) {
-		let manpower = 0;
-		const node = new DocumentFragment();
-		const r = [];
-		const rebels = {ID: [], names: []};
-
-		const Dissolve = function() {
-			App.SecExp.unit.unitFree(unit).add(manpower);
-			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-				u.loyalty = Math.clamp(u.loyalty - random(10, 40), 0, 100);
-			}
-			return `Units dissolved.`;
-		};
-		const Purge = function() {
-			App.SecExp.unit.unitFree(unit).add(manpower * 0.5);
-			return `Dissidents purged and units dissolved.`;
-		};
-		const Execute = function() {
-			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-				u.loyalty = Math.clamp(u.loyalty + random(10, 40), 0, 100);
-			}
-			return `Units executed. Dissent will not be tolerated.`;
-		};
-
-		App.UI.DOM.appendNewElement("div", node);
-		for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-			if (V.SecExp.war.rebellingID.contains(u.ID)) {
-				rebels.names.push(`${u.platoonName}`);
-				rebels.ID.push(u.ID);
-				manpower += Math.clamp(u.troops - random(averageLosses), 0, u.troops);
-			}
-		}
-
-		if (rebels.ID.length > 0) {
-			V.SecExp.units[unit].squads.deleteWith((u) => rebels.ID.contains(u.ID));
-			V.SecExp.battles.lastSelection.deleteWith((u) => rebels.ID.contains(u.ID));
-			if (unit === "slaves") {
-				r.push(`${toSentence(rebels.names)} decided in their blind arrogance to betray you.`);
-			} else if (unit === "militia") {
-				r.push(`${toSentence(rebels.names)} had the gall to betray you and join your enemies.`);
-			} else if (unit === "mercs") {
-				r.push(`${toSentence(rebels.names)} made the grave mistake of betraying you.`);
-			}
-			if (V.SecExp.war.result < 2) { // rebellion loss
-				r.push(`They participated in the looting following the battle, then vanished in the wastes.`);
-				cashX(forceNeg(1000 * rebels.ID.length), "war");
-			} else { // rebellion win
-				App.Events.addResponses(node, [
-					new App.Events.Result(
-						`Dissolve the units`,
-						Dissolve,
-						`Manpower will be refunded, but will negatively influence the loyalty of the other units`
-					),
-					new App.Events.Result(
-						`Purge the dissidents and dissolve the units`,
-						Purge,
-						`Will not influence the loyalty of the other units, but half the manpower will be refunded.`
-					),
-					new App.Events.Result(
-						`Execute them all`,
-						Execute,
-						`Will positively influence the loyalty of the other units, but manpower will not be refunded.`
-					),
-				]);
-			}
-			App.Events.addNode(node, r, "div");
-		}
-		return node;
-	};
-
-	V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses);
-	if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) {
-		V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops;
-	}
-	V.SecExp.core.totalKills += V.SecExp.war.attacker.losses;
-	V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses);
-
-	if (result === 3 || result === 2) {
-		App.UI.DOM.appendNewElement("h1", node, `${result === 2 ? 'Partial ' : ''}Victory!`, "strong");
-		V.SecExp.rebellions.victories++;
-	} else if (result === -3 || result === -2) {
-		App.UI.DOM.appendNewElement("h1", node, `${result === -2 ? 'Partial ' : ''}Defeat!`, "strong");
-		V.SecExp.rebellions.losses++;
-	} else if (result === -1) {
-		App.UI.DOM.appendNewElement("h1", node, `We surrendered`, "strong");
-		V.SecExp.rebellions.losses++;
-	}
-	App.UI.DOM.appendNewElement("hr", node);
-
-	r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was inflamed by the fires of rebellion. ${num(Math.trunc(V.SecExp.war.attacker.troops))} rebels from all over the structure dared rise up`);
-	if (slaveRebellion) {
-		r.push(`against their owners and conquer their freedom through blood.`);
-	} else {
-		r.push(`to dethrone their arcology owner.`);
-	}
-	r.push(`Our defense force, ${num(App.SecExp.battle.troopCount())} strong, fought with them street by street`);
-	if (allKilled) {
-		r.push(`completely annihilating their troops, while sustaining`);
-	} else {
-		r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`);
-	}
-	if (V.SecExp.war.losses > 1) {
-		r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`);
-	} else if (V.SecExp.war.losses > 0) {
-		r.push(`a casualty`);
-	} else {
-		r.push(`zero casualties`);
-	}
-	r.push(`${allKilled ? '' : 'themselves'}.`);
-	if (V.SecExp.rebellions.sfArmor) {
-		r.push(`More units were able to survive thanks to wearing ${V.SF.Lower}'s combat armor suits.`);
-	}
-	App.Events.addNode(node, r);
-	r = [];
-
-	App.SecExp.slavesDamaged(V.SecExp.war.attacker.losses);
-	if (result === 3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided: our men easily stopped the disorganized revolt in a few well aimed assaults.`);
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard, but in the end our men stopped the disorganized revolt with several well aimed assaults.`);
-		} else {
-			r.push(`The fight was long and hard, but in the end our men stopped the revolt before it could accumulate momentum.`);
-		}
-	} else if (result === -3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided: our men were easily crushed by the furious charge of the rebels.`);
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard and in the end the rebels proved too much to handle for our men.`);
-		} else {
-			r.push(`The fight was long and hard, but despite their bravery the rebels proved too much for our men.`);
-		}
-	} else if (result === 2) {
-		r.push(`The fight was long and hard, but in the end our men managed to stop the revolt, though not without difficulty.`);
-	} else if (result === -2) {
-		r.push(`The fight was long and hard. In the end, our men had to yield to the rebelling slaves, which were fortunately unable to capitalize on their victory.`);
-	} else if (result === -1) {
-		r.push(`You gave your troops the order to surrender; they obediently stand down.`);
-	}
-	App.Events.addNode(node, r);
-	r = [];
-
-	// Effects
-	if (result === 3 || result === 2) {
-		node.append(` Thanks to your victory, your `, App.UI.DOM.makeElement("span", `reputation`, "green"), ` and `, App.UI.DOM.makeElement("span", `authority`, "darkviolet"), ` increased.`);
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `Many of the rebelling slaves were recaptured and punished.`);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `Many of the rebelling citizens were captured and punished, many others enslaved.`);
-		}
-		App.UI.DOM.appendNewElement("div", node, `The instigators were executed one after another in a public trial that lasted for almost three days.`);
-		if (slaveRebellion) {
-			V.NPCSlaves -= random(10, 30);
-		} else {
-			V.lowerClass -= random(10, 30);
-		}
-		repX((result === 3 ? random(800, 1000) : random(600, 180)), "war");
-		V.SecExp.core.authority += (result === 3 ? random(800, 1000) : random(600, 800));
-	} else if (result === -3 || result === -2) {
-		node.append(` Thanks to your defeat, your `, App.UI.DOM.makeElement("span", `reputation`, "red"), ` and `, App.UI.DOM.makeElement("span", `authority`, "red"), ` increased.`);
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
-			V.lowerClass -= (result === -3 ? random(50, 100) : random(40, 80));
-			lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
-			App.SecExp.slavesDamaged(lostSlaves);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
-			V.lowerClass -= Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.6);
-		}
-		repX((result === -3 ? random(-800, -1000) : random(-600, -800)), "war");
-		V.SecExp.core.authority -= (result === -3 ? random(800, 1000) : random(600, 800));
-	} else if (result === -1) {
-		r.push(`Rather than waste the lives of your men you decided to surrender, hoping the rebels will cause less damage if you indulge them, this is however a big hit to your status.`);
-		r.push(`Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
-		r.push(`The surrender allows the arcology to survive <span class="yellow">mostly intact</span>`);
-		r.push(`however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
-		App.Events.addParagraph(node, r);
-		r = [];
-
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
-		}
-		cashX(-1000, "war");
-		repX(random(-1000, -1200), "war");
-		V.SecExp.core.authority -= random(1000, 1200);
-		if (V.week <= 30) {
-			arcologyEffects(100, 150, 5);
-		} else if (V.week <= 60) {
-			arcologyEffects(120, 170, 10);
-		} else if (V.week <= 90) {
-			arcologyEffects(140, 190, 15);
-		} else if (V.week <= 120) {
-			arcologyEffects(160, 210, 20);
-		} else {
-			arcologyEffects(180, 230, 25);
-		}
-		V.lowerClass -= random(50, 100);
-		lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
-		App.SecExp.slavesDamaged(lostSlaves);
-	}
-	V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
-
-	if (result !== -1) {
-		if (V.SecExp.war.engageRule === 0) {
-			r.push(`Since you ordered your troops to limit their weaponry to low caliber or nonlethal, the arcology reported only`);
-			r.push(`<span class="red">minor damage.</span>`);
-			r.push(`Most citizens and non involved slaves remained unharmed, though some casualties between the civilians were inevitable.`);
-			r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
-			r.push(setRepairTime("arc", 3, 1500));
-			if (V.week <= 30) {
-				arcologyEffects(40, 65, 2);
-			} else if (V.week <= 60) {
-				arcologyEffects(50, 75, 5);
-			} else if (V.week <= 90) {
-				arcologyEffects(60, 85, 7);
-			} else if (V.week <= 120) {
-				arcologyEffects(70, 95, 10);
-			} else {
-				arcologyEffects(80, 105, 12);
-			}
-		} else if (V.SecExp.war.engageRule === 1) {
-			r.push(`You ordered your troops to limit their weaponry to non-heavy, non-explosive, because of this the arcology reported`);
-			r.push(`<span class="red">moderate damage.</span>`);
-			r.push(`Most citizens and non involved slaves remained unharmed or only lightly wounded, but many others did not make it. Unfortunately casualties between the civilians were inevitable.`);
-			r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
-			r.push(setRepairTime("arc", 5, 2000));
-			if (V.week <= 30) {
-				arcologyEffects(60, 85, 4);
-			} else if (V.week <= 60) {
-				arcologyEffects(70, 95, 7);
-			} else if (V.week <= 90) {
-				arcologyEffects(80, 105, 9);
-			} else if (V.week <= 120) {
-				arcologyEffects(90, 115, 12);
-			} else {
-				arcologyEffects(100, 125, 14);
-			}
-		} else if (V.SecExp.war.engageRule === 2) {
-			r.push(`Since you did not apply any restriction on the weapons your forces should use, the arcology reported`);
-			r.push(`<span class="red">heavy damage.</span>`);
-			r.push(`Many citizens and uninvolved slaves are reported killed or missing. Casualties between the civilians were inevitable.`);
-			r.push(`Many businesses were damaged during the battle either by the fight itself, by fires which spread unchecked for hours or by looters.`);
-			r.push(setRepairTime("arc", 7, 3000));
-			if (V.week <= 30) {
-				arcologyEffects(100, 150, 5);
-			} else if (V.week <= 60) {
-				arcologyEffects(120, 170, 10);
-			} else if (V.week <= 90) {
-				arcologyEffects(140, 190, 15);
-			} else if (V.week <= 120) {
-				arcologyEffects(160, 210, 20);
-			} else {
-				arcologyEffects(180, 230, 25);
-			}
-		} else {
-			r.push(`Thanks to the advance riot control weaponry developed by your experts, the rebels were mostly subdued or killed with`);
-			r.push(`<span class="yellow">little to no collateral damage to the arcology</span> and its inhabitants.`);
-			r.push(`A few businesses were looted, but the damage was very limited.`);
-			r.push(setRepairTime("arc", 2, 1000));
-			if (V.week <= 30) {
-				arcologyEffects(20, 45, 2);
-			} else if (V.week <= 60) {
-				arcologyEffects(30, 55, 4);
-			} else if (V.week <= 90) {
-				arcologyEffects(40, 65, 6);
-			} else if (V.week <= 120) {
-				arcologyEffects(50, 75, 8);
-			} else {
-				arcologyEffects(60, 85, 10);
-			}
-		}
-	}
-	V.lowerClass = Math.max(V.lowerClass, 0);
-	V.NPCSlaves = Math.max(V.NPCSlaves, 0);
-	App.Events.addParagraph(node, r);
-	r = [];
-
-	// Garrisons
-	if (!V.SecExp.war.reactorDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the reactor complex and sabotaged it, causing massive power fluctuations and blackouts.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("reactor", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0)));
-		} else {
-			r.push(`While the reactor was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the reactor protected it from the multiple sabotage attempts carried out by the rebels.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (!V.SecExp.war.waterwayDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the water management complex and sabotaged it, causing huge water leaks throughout the arcology and severely limiting the water supply.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("waterway", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0)));
-		} else {
-			r.push(`While the water management complex was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the water management complex protected it from the sabotage attempt of the rebels.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (!V.SecExp.war.assistantDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the facility housing ${V.assistant.name}'s mainframe and sabotaged it. Without its AI, the arcology will be next to impossible to manage.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("assistant", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0)));
-		} else {
-			r.push(`While the ${V.assistant.name}'s mainframe was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the facility housing ${V.assistant.name}'s mainframe prevented any sabotage attempt.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (V.SecExp.war.penthouseDefense && V.BodyguardID !== 0) {
-		r.push(`The garrison assigned to the penthouse together with your loyal Bodyguard stopped all assaults against your penthouse with ease.`);
-	} else {
-		if (random(1, 100) <= 75) {
-			r.push(`During the fighting a group of slaves assaulted the penthouse.`);
-			if (S.Bodyguard) {
-				r.push(`Your Bodyguard, ${S.Bodyguard.slaveName}, stood strong against the furious attack.`);
-			} else if (V.SecExp.war.penthouseDefense) {
-				r.push(`The garrison stood strong against the furious attack.`);
-			} else {
-				r.push(`Isolated and alone, you stood strong against the furious attack.`);
-			}
-			["PC", "Concubine", "Bodyguard"].forEach(c => r.push(checkWoundStatus(c)));
-			r.push(`<span class="red">The damage to the structure will be</span> costly to repair.`);
-			r.push(IncreasePCSkills('engineering', 0.1));
-			cashX(-2000, "war");
-		} else {
-			if (!V.SecExp.war.penthouseDefense) {
-				r.push(`While the penthouse was left without a sizable garrison, there was no dangerous assault against it. Let's hope we'll always be this lucky.`);
-			} else {
-				r.push(`There was no sizable assault against the penthouse. Let's hope we'll always be this lucky.`);
-			}
-		}
-	}
-	App.Events.addNode(node, r);
-
-	App.UI.DOM.appendNewElement("p", node, unitsRebellionReport());
-	V.SecExp.rebellions[V.SecExp.war.type.toLowerCase().replace(' rebellion', '') + 'Progress'] = 0;
-	V.SecExp.rebellions.tension = Math.clamp(V.SecExp.rebellions.tension - random(50, 100), 0, 100);
-	if (slaveRebellion) {
-		V.SecExp.rebellions.citizenProgress = Math.clamp(V.SecExp.rebellions.citizenProgress - random(50, 100), 0, 100);
-	} else {
-		V.SecExp.rebellions.slaveProgress = Math.clamp(V.SecExp.rebellions.slaveProgress - random(50, 100), 0, 100);
-	}
-	return node;
-
-	function unitsRebellionReport() {
-		let rand;
-		let r = [];
-		let count = 0;
-		let averageLosses = 0;
-		let loss = 0;
-		const node = new DocumentFragment();
-		const lossesList = [];
-		const hasLosses = V.SecExp.war.losses > 0;
-
-		if (hasLosses || V.SecExp.war.losses === 0) {
-			if (hasLosses) { // Generates a list of randomized losses, from which each unit picks one at random
-				averageLosses = Math.trunc(V.SecExp.war.losses / App.SecExp.battle.deployedUnits());
-				for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) {
-					let assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100));
-					if (assignedLosses > V.SecExp.war.losses) {
-						assignedLosses = V.SecExp.war.losses;
-						V.SecExp.war.losses = 0;
-					} else {
-						V.SecExp.war.losses -= assignedLosses;
-					}
-					lossesList.push(assignedLosses);
-				}
-				if (V.SecExp.war.losses > 0) {
-					lossesList[random(lossesList.length - 1)] += V.SecExp.war.losses;
-				}
-				lossesList.shuffle();
-
-				// Sanity check for losses
-				for (let l of lossesList) {
-					if (!Number.isInteger(l)) {
-						l = 0;
-					}
-					count += l;
-				}
-				if (count < V.SecExp.war.losses) {
-					rand = random(lossesList.length - 1);
-					lossesList[rand] += V.SecExp.war.losses - count;
-				} else if (count > V.SecExp.war.losses) {
-					const diff = count - V.SecExp.war.losses;
-					rand = random(lossesList.length - 1);
-					lossesList[rand] = Math.clamp(lossesList[rand]-diff, 0, 100);
-				}
-			}
-		} else {
-			throw(`Losses are ${V.SecExp.war.losses}.`);
-		}
-
-		if (V.SecExp.war.irregulars > 0) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				if (loss > V.ACitizens * 0.95) { // This is unlikely to happen, but might as well be safe
-					loss = Math.trunc(V.ACitizens * 0.95);
-				}
-			}
-			App.UI.DOM.appendNewElement("div", node, `The volunteering citizens were quickly organized into an irregular militia unit and deployed in the arcology: ${casualtiesReport('irregulars', loss)}`);
-			if (hasLosses) {
-				if (loss > V.lowerClass * 0.95) { // I suspect only lower class ever get to fight/die, but being safe
-					V.lowerClass = Math.trunc(V.lowerClass * 0.05);
-					loss -= Math.trunc(V.lowerClass * 0.95);
-					if (loss > V.middleClass * 0.95) {
-						V.middleClass = Math.trunc(V.middleClass * 0.05);
-						loss -= Math.trunc(V.middleClass *0.95);
-						if (loss > V.upperClass * 0.95) {
-							V.upperClass = Math.trunc(V.upperClass * 0.05);
-							loss -= Math.trunc(V.upperClass * 0.95);
-							if (loss > V.topClass * 0.95) {
-								V.topClass = Math.trunc(V.topClass * 0.05);
-							} else {
-								V.topClass -= loss;
-							}
-						} else {
-							V.upperClass -= loss;
-						}
-					} else {
-						V.middleClass -= loss;
-					}
-				} else {
-					V.lowerClass -= loss;
-				}
-			}
-		}
-		if (App.SecExp.battle.deployedUnits('bots')) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				loss = Math.clamp(loss, 0, V.SecExp.units.bots.troops);
-				V.SecExp.units.bots.troops -= loss;
-			}
-			App.UI.DOM.appendNewElement("div", node, `Security drones: ${casualtiesReport('bots', loss, V.SecExp.units.bots)} `);
-		}
-		if (V.SF.Toggle && V.SF.Active >= 1) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				loss = Math.clamp(loss, 0, V.SF.ArmySize);
-				V.SF.ArmySize -= loss;
-			}
-			App.UI.DOM.appendNewElement("div", node, `${capFirstChar(V.SF.Lower)}, ${num(V.SF.ArmySize)} strong, is called to join the battle: ${casualtiesReport('SF', loss)}`);
-		}
-		for (const u of App.SecExp.unit.list().slice(1)) {
-			if (App.SecExp.battle.deployedUnits(u) >= 1) {
-				let med = 0;
-				for (const s of V.SecExp.units[u].squads.filter(t => App.SecExp.unit.isDeployed(t))) {
-					r = [];
-					s.battlesFought++;
-					if (hasLosses) {
-						loss = lossesList.pluck();
-						loss = Math.clamp(loss, 0, s.troops);
-					}
-					r.push(`${s.platoonName} participated in the battle. They remained loyal to you. ${casualtiesReport(u, loss, s)}`);
-					if (hasLosses) {
-						med = Math.round(Math.clamp(loss * s.medics * 0.25, 1, loss));
-						if (s.medics === 1 && loss > 0) {
-							r.push(`Some men were saved by their medics.`);
-						}
-						s.troops -= Math.trunc(Math.clamp(loss - med, 0, s.maxTroops));
-						V.SecExp.units[u].dead += Math.trunc(loss - med);
-					}
-					if (s.training < 100 && random(1, 100) > 60) {
-						r.push(`Experience has increased.`);
-						s.training += random(5, 15);
-					}
-					App.Events.addNode(node, r, "div");
-				}
-			}
-		}
-
-		for (const unit of App.SecExp.unit.list().slice(1)) {
-			App.UI.DOM.appendNewElement("p", node, rebellingUnitsFate(unit, averageLosses));
-		}
-		return node;
-	}
-};
diff --git a/src/Mods/SecExp/js/edicts.js b/src/Mods/SecExp/js/edicts.js
new file mode 100644
index 0000000000000000000000000000000000000000..8bfeee066dfaef26ad02adc0f69b2e5ac2a8694a
--- /dev/null
+++ b/src/Mods/SecExp/js/edicts.js
@@ -0,0 +1,971 @@
+App.SecExp.edicts = function() {
+	function genMenu(name, detail) {
+		const t = new DocumentFragment();
+		if (detail.implement.find(s => s.conditional) || detail.repeal && detail.repeal.find(s => s.conditional)) {
+			App.UI.DOM.appendNewElement("span", t, `${name}: `, detail.tag || "bold");
+			for (let i = 0; i < detail.implement.length; i++) {
+				let current;
+				if (detail.implement[i].conditional) {
+					current = detail.implement[i];
+				} else if (detail.repeal) {
+					current = detail.repeal[i];
+				}
+				if (current) {
+					if (current.text) {
+						if (detail.implement.filter(s => s.conditional).length > 1) {
+							App.UI.DOM.appendNewElement("div", t);
+						}
+						t.append(`${capFirstChar(current.text)} `);
+					}
+					if (V.SecExp.core.authority >= 1000 && current.set) {
+						t.append(App.UI.DOM.makeElement("span",
+							App.UI.DOM.link(`${detail.implement[i].conditional ? "Implement" : "Repeal"}`,
+								() => {
+									if (detail.implement[i].conditional) {
+										cashX(-5000, "edicts");
+										V.SecExp.core.authority -= 1000;
+									}
+									current.set();
+									App.UI.reload();
+								},
+							)
+							, (detail.implement[i].conditional ? "green" : "yellow")
+						));
+						App.UI.DOM.appendNewElement("div", t);
+						if (detail.implement[i].conditional && detail.implement[i].note) {
+							App.UI.DOM.appendNewElement("div", t, `${detail.implement[i].note}`, ["note", "indent"]);
+						}
+					}
+				}
+			}
+		}
+		return t;
+	}
+
+	function Society() {
+		const weaponsStatus = function() {
+			switch(V.SecExp.edicts.weaponsLaw ) {
+				case 3: return "There are no restrictions on weapons";
+				case 2: return "Non-heavy, non-explosive weapons are legal";
+				case 1: return "Non-automatic, non-high caliber weapons are legal";
+				case 0: return "Residents are unable to buy, sell and keep weapons";
+			}
+		};
+		const data = new Map([
+			["Alternative rent payment", {
+				repeal: [
+					{
+						text: "you are allowing citizens to pay for their rents in menial slaves rather than cash.",
+						conditional: V.SecExp.edicts.alternativeRents === 1,
+						set: function() {
+							V.SecExp.edicts.alternativeRents = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "allow citizens to pay for their rents in menial slaves rather than cash, if so they wish.",
+						conditional: V.SecExp.edicts.alternativeRents === 0,
+						set: function() {
+							V.SecExp.edicts.alternativeRents = 1;
+						},
+						note: "Will decrease rents, but will supply a small amount of menial slaves each week."
+					}
+				]
+			}],
+			["Enslavement rights", {
+				repeal: [
+					{
+						text: "you are the only authority able to declare a person enslaved or not.",
+						conditional: V.SecExp.edicts.enslavementRights === 1,
+						set: function() {
+							V.SecExp.edicts.enslavementRights = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "the arcology owner will be the only authority able to declare a person enslaved or not.",
+						conditional: V.SecExp.edicts.enslavementRights === 0,
+						set: function() {
+							V.SecExp.edicts.enslavementRights = 1;
+						},
+						note: "Will provide cash each week at the cost of a small authority hit. The higher the flux of citizens to slaves the higher the income."
+					}
+				]
+			}],
+			["Private Data marketization", {
+				repeal: [
+					{
+						text: "you are selling private citizens' data to the best bidder.",
+						conditional: V.SecExp.buildings.secHub && V.SecExp.edicts.sellData === 1,
+						set: function() {
+							V.SecExp.edicts.sellData = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "allow the selling of private citizens' data.",
+						conditional: V.SecExp.buildings.secHub && V.SecExp.edicts.sellData === 0 && (Object.values(V.SecExp.buildings.secHub.upgrades.security).reduce((a, b) => a + b) > 0 || Object.values(V.SecExp.buildings.secHub.upgrades.crime).reduce((a, b) => a + b) > 0 || Object.values(V.SecExp.buildings.secHub.upgrades.intel).reduce((a, b) => a + b) > 0),
+						set: function() {
+							V.SecExp.edicts.sellData = 1;
+						},
+						note: "Will generate income dependent on the amount of upgrades installed in the security HQ, but cost a small amount of authority each week."
+					}
+				]
+			}],
+			["Propaganda Campaign Boost", {
+				repeal: [
+					{
+						text: "you are forcing residents to read curated educational material about the arcology.",
+						conditional: V.SecExp.buildings.propHub && V.SecExp.edicts.propCampaignBoost === 1,
+						set: function() {
+							V.SecExp.edicts.propCampaignBoost = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "force residents to read curated educational material about the arcology.",
+						conditional: V.SecExp.buildings.propHub && V.SecExp.edicts.propCampaignBoost === 0,
+						set: function() {
+							V.SecExp.edicts.propCampaignBoost = 1;
+						},
+						note: "Will increase the effectiveness of propaganda campaigns, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Legal aid for new businesses:", {
+				repeal: [
+					{
+						text: "new businesses can rely on your help for legal expenses and issues.",
+						conditional: V.SecExp.buildings.transportHub && V.SecExp.edicts.tradeLegalAid === 1,
+						set: function() {
+							V.SecExp.edicts.tradeLegalAid = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "support new businesses in the arcology by helping them cover legal costs and issues.",
+						conditional: V.SecExp.buildings.transportHub && V.SecExp.edicts.tradeLegalAid === 0,
+						set: function() {
+							V.SecExp.edicts.tradeLegalAid = 1;
+						},
+						note: "Will increase trade, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Trade tariffs", {
+				repeal: [
+					{
+						text: "all goods transitioning in your arcology have to pay a transition fee.",
+						conditional: V.SecExp.buildings.transportHub && V.SecExp.edicts.taxTrade === 1,
+						set: function() {
+							V.SecExp.edicts.taxTrade = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "all goods transitioning in your arcology will have to pay a transition fee.",
+						conditional: V.SecExp.buildings.transportHub && V.SecExp.edicts.taxTrade === 0,
+						set: function() {
+							V.SecExp.edicts.taxTrade = 1;
+						},
+						note: "Will provide income based on trade level, but will negatively affect trade."
+					}
+				]
+			}],
+			["Slave mistreatment watch", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "slaves are able access a special security service in case of mistreatment.",
+						conditional: V.arcologies[0].FSPaternalist !== "unset" && V.SecExp.edicts.slaveWatch === 1,
+						set: function() {
+							V.SecExp.edicts.slaveWatch = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "slaves will be able access a special security service in case of mistreatment.",
+						conditional: V.arcologies[0].FSPaternalist !== "unset" && V.SecExp.edicts.slaveWatch === 0,
+						set: function() {
+							V.SecExp.edicts.slaveWatch = 1;
+						},
+						note: "Will help advance paternalism, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Religious activities subsidy", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are providing economic support to religious activities following the official dogma.",
+						conditional: V.arcologies[0].FSChattelReligionist >= 40 && V.SecExp.edicts.subsidyChurch === 1,
+						set: function() {
+							V.SecExp.edicts.subsidyChurch = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "will provide economic support to religious activities following the official dogma.",
+						conditional: V.arcologies[0].FSChattelReligionist >= 40 && V.SecExp.edicts.subsidyChurch === 0,
+						set: function() {
+							V.SecExp.edicts.subsidyChurch = 1;
+						},
+						note: "Will provide authority each week, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Immigration limits", {
+				repeal: [
+					{
+						text: "you put strict limits to the amount of people the arcology can accept each week.",
+						conditional: V.SecExp.edicts.limitImmigration === 1,
+						set: function() {
+							V.SecExp.edicts.limitImmigration = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "institute limits to the amount of people the arcology will accept each week.",
+						conditional: V.SecExp.edicts.limitImmigration === 0,
+						set: function() {
+							V.SecExp.edicts.openBorders = 0;
+							V.SecExp.edicts.limitImmigration = 1;
+						},
+						note: "Will lower the amount of people immigrating into the arcology and enhance security."
+					}
+				]
+			}],
+			["Open borders", {
+				repeal: [
+					{
+						text: "you have lowered considerably the requirements to become citizens.",
+						conditional: V.SecExp.edicts.openBorders === 1,
+						set: function() {
+							V.SecExp.edicts.openBorders = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "considerably lower requirements to become citizens.",
+						conditional: V.SecExp.edicts.openBorders === 0,
+						set: function() {
+							V.SecExp.edicts.openBorders = 1;
+							V.SecExp.edicts.limitImmigration = 0;
+						},
+						note: "Will increase immigration to the arcology, but will increase crime."
+					}
+				]
+			}],
+
+			[`Weapons Law; ${weaponsStatus()}`, {
+				implement: [
+					{
+						text: "set the range of weapons allowed within the arcology to non-heavy, non-explosive.",
+						conditional: V.SecExp.edicts.weaponsLaw === 3,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 2;
+						},
+						note: "Will slightly increase prosperity, but will cost a small amount of authority each week and will leave rebellions decently armed."
+					},
+					{
+						text: "allow residents of the arcology to buy, sell and keep weaponry of any kind within the arcology.",
+						conditional: V.SecExp.edicts.weaponsLaw === 2,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 3;
+						},
+						note: "Will slightly increase prosperity and provide a small weekly amount of reputation, but rebellions will be very well armed."
+					},
+					{
+						text: "set the range of weapons allowed within the arcology to non-automatic, non-high caliber.",
+						conditional: V.SecExp.edicts.weaponsLaw === 2,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 1;
+						},
+						note: "Will cost some authority each week, but rebellions will be poorly armed."
+					},
+					{
+						text: "set the range of weapons allowed within the arcology to non-heavy, non-explosive.",
+						conditional: V.SecExp.edicts.weaponsLaw === 1,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 2;
+						},
+						note: "Will slightly increase prosperity, but will cost a small amount of authority each week and will leave rebellions decently armed."
+					},
+					{
+						text: "forbid residents to buy, sell and keep weaponry while within the arcology.",
+						conditional: V.SecExp.edicts.weaponsLaw === 1,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 0;
+						},
+						note: "Will cost a moderate amount of authority each week, but rebellions will be very poorly armed."
+					},
+					{
+						text: "set the range of weapons allowed within the arcology to non-automatic, non-high caliber.",
+						conditional: V.SecExp.edicts.weaponsLaw === 0,
+						set: function() {
+							V.SecExp.edicts.weaponsLaw = 1;
+						},
+						note: "Will cost some authority each week, but rebellions will be poorly armed."
+					}
+				]
+			}],
+			["Legionaries traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are funding specialized training for your recruits following the Roman tradition of professional armies.",
+						conditional: V.FSAnnounced && V.SecExp.edicts.defense.legionTradition === 1,
+						set: function() {
+							V.SecExp.edicts.defense.legionTradition = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your recruits to turn them into the professional of Roman tradition.",
+						conditional: V.FSAnnounced && V.SecExp.edicts.defense.militia >= 1 && V.arcologies[0].FSRomanRevivalist >= 40 && V.SecExp.edicts.defense.legionTradition === 0,
+						set: function() {
+							V.SecExp.edicts.defense.legionTradition = 1;
+						},
+						note: "Will increase defense, morale and hp of militia units, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Neo-Imperial traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: `you are funding specialized training for your recruits to inculcate them into a professional Imperial army, led by highly trained and hand-picked ${V.mercenariesTitle}.`,
+						conditional: V.FSAnnounced && V.SecExp.edicts.defense.imperialTradition === 1,
+						set: function() {
+							V.SecExp.edicts.defense.imperialTradition = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your recruits to turn them into a professional Imperial army, led by your handpicked Imperial Knights.",
+						conditional: V.FSAnnounced && V.SecExp.edicts.defense.militia >= 1 && V.arcologies[0].FSNeoImperialist >= 40 && !V.SecExp.edicts.defense.imperialTradition,
+						set: function() {
+							V.SecExp.edicts.defense.imperialTradition = 1;
+						},
+						note: "Will moderately increase defense, hp, and morale of your militia units and increase attack, defense and morale of your mercenaries, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Pharaonic traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are funding specialized training for your recruits to turn them into an army worthy of a pharaon.",
+						conditional: V.SecExp.edicts.defense.pharaonTradition === 1,
+						set: function() {
+							V.SecExp.edicts.defense.pharaonTradition = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your recruits to turn them into an army worthy of a pharaoh.",
+						conditional: V.FSAnnounced && V.SecExp.edicts.defense.militia >= 1 && V.arcologies[0].FSEgyptianRevivalist >= 40 && V.SecExp.edicts.defense.pharaonTradition === 0,
+						set: function() {
+							V.SecExp.edicts.defense.pharaonTradition = 1;
+						},
+						note: "Will increase attack, defense and morale of militia units, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Eagle warriors traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are funding specialized training for your mercenaries following the Aztec tradition of elite warriors.",
+						conditional: V.SecExp.edicts.defense.eagleWarriors === 1,
+						set: function() {
+							V.SecExp.edicts.defense.eagleWarriors = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your mercenaries to turn them into the elite units of Aztec tradition.",
+						conditional: V.FSAnnounced && V.mercenaries > 0 && V.arcologies[0].FSAztecRevivalist >= 40 && V.SecExp.edicts.defense.eagleWarriors === 0,
+						set: function() {
+							V.SecExp.edicts.defense.eagleWarriors = 1;
+						},
+						note: "Will give a high increase in attack and morale, but will lower defense of mercenary units and will incur upkeep costs."
+					}
+				]
+			}],
+			["Ronin traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are funding specialized training for your mercenaries following the Japanese tradition of elite errant samurai.",
+						conditional: V.SecExp.edicts.defense.ronin === 1,
+						set: function() {
+							V.SecExp.edicts.defense.ronin = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your mercenaries to turn them into the errant samurai of Japanese tradition.",
+						conditional: V.FSAnnounced && V.mercenaries > 0 && V.arcologies[0].FSEdoRevivalist >= 40 && V.SecExp.edicts.defense.ronin === 0,
+						set: function() {
+							V.SecExp.edicts.defense.ronin = 1;
+						},
+						note: "Will increase attack, defense and morale of mercenary units, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Mamluks traditions", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you are funding specialized training for your slaves following the Arabian tradition of mamluks slave soldiers.",
+						conditional: V.SecExp.edicts.defense.mamluks === 1,
+						set: function() {
+							V.SecExp.edicts.defense.mamluks = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "fund specialized training for your slaves to turn them into the mamluks slave soldiers of Arabian tradition.",
+						conditional: V.FSAnnounced && V.arcologies[0].FSArabianRevivalist >= 40 && V.SecExp.edicts.defense.mamluks === 0,
+						set: function() {
+							V.SecExp.edicts.defense.mamluks = 1;
+						},
+						note: "Will increase attack, morale and hp of slave units, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Sun Tzu Teachings", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: `you are funding specialized training for your units and officers to follow the teachings of the "Art of War".`,
+						conditional: V.SecExp.edicts.defense.sunTzu === 1,
+						set: function() {
+							V.SecExp.edicts.defense.sunTzu = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: `fund specialized training for your units and officers to conform your army to the teachings of the "Art of War".`,
+						conditional: V.FSAnnounced && V.arcologies[0].FSChineseRevivalist >= 40 && V.SecExp.edicts.defense.sunTzu === 0,
+						set: function() {
+							V.SecExp.edicts.defense.sunTzu = 1;
+						},
+						note: "Will slightly increase attack, defense and morale of all units, but will incur upkeep costs."
+					}
+				]
+			}],
+		]);
+
+		const c = new DocumentFragment();
+		const r = [];
+		let showFS = 0;
+		for (const [name, detail] of data) {
+			if (["Immigration limits", "Open Borders"].includes(name) && !r.includes(name)) {
+				App.UI.DOM.appendNewElement("h1", c, "Immigration:", "underline");
+				r.push(name);
+			} else if (name === "Weapons Law" && !r.includes(name)) {
+				App.UI.DOM.appendNewElement("h1", c, "Weapons:", "underline");
+				r.push(name);
+			} else if (V.FSAnnounced && ["traditions", "Teachings"].includes(name) && !showFS) {
+				App.UI.DOM.appendNewElement("h1", c, "Future Societies:", "underline");
+				showFS = 1;
+			}
+			App.UI.DOM.appendNewElement("p", c, genMenu(name, detail));
+		}
+		return c;
+	}
+	function Military() {
+		const soliderWages = function() {
+			switch(V.SecExp.edicts.defense.soldierWages) {
+				case 0: return "below market rates";
+				case 1: return "at market rates";
+				case 2: return "above market rates";
+			}
+		};
+		const militiaStatus = function() {
+			switch(V.SecExp.edicts.defense.militia) {
+				case 0: return "Not Founded";
+				case 1: return "Disbanded";
+				case 2: return "Volunteers only";
+				case 3: return "Conscription";
+				case 4: return "Obligatory military service";
+				case 5: return "Militarized Society";
+			}
+		};
+		const sfSupport = function() {
+			const x = [];
+			if (V.SecExp.edicts.SFSupportLevel === 0) {
+				x.push("no support");
+			} else {
+				if (V.SecExp.edicts.SFSupportLevel >= 1) {
+					x.push("provided the security HQ with advanced equipment");
+				}
+				if (V.SecExp.edicts.SFSupportLevel >= 2) {
+					x.push("advanced training for security HQ personnel");
+				}
+				if (V.SecExp.edicts.SFSupportLevel >= 3) {
+					x.push("assigned troops to the security department");
+				}
+				if (V.SecExp.edicts.SFSupportLevel >= 4) {
+					x.push("its full support");
+				}
+				if (V.SecExp.edicts.SFSupportLevel === 5) {
+					x.push("assisted with installing a local version of their custom network");
+				}
+			}
+			return toSentence(x);
+		};
+		const capSF = capFirstChar(V.SF.Lower || "the special force");
+		const data = new Map([
+			[`Wages for soldiers are ${soliderWages()}`, {
+				implement: [
+					{
+						text: "the wages paid to arcology soldiers will be at market rates.",
+						conditional: V.SecExp.edicts.defense.soldierWages === 0,
+						set: function() {
+							V.SecExp.edicts.defense.soldierWages = 1;
+						},
+						note: "Will raise all units upkeep and push loyalty to average levels."
+					},
+					{
+						text: "the wages paid to arcology soldiers will be below market rates.",
+						conditional: V.SecExp.edicts.defense.soldierWages === 1,
+						set: function() {
+							V.SecExp.edicts.defense.soldierWages = 0;
+						},
+						note: "Will lower all units upkeep and push loyalty to low levels."
+					},
+					{
+						text: "the wages paid to arcology soldiers will be above market rates.",
+						conditional: V.SecExp.edicts.defense.soldierWages === 1,
+						set: function() {
+							V.SecExp.edicts.defense.soldierWages = 2;
+						},
+						note: "Will raise all units upkeep and push loyalty to high levels."
+					},
+					{
+						text: "the wages paid to arcology soldiers will be at market rates.",
+						conditional: V.SecExp.edicts.defense.soldierWages === 2,
+						set: function() {
+							V.SecExp.edicts.defense.soldierWages = 1;
+						},
+						note: "Will lower all units upkeep and push loyalty to average levels."
+					}
+				]
+			}],
+			["Slave Officers", {
+				repeal: [
+					{
+						text: "your trusted slaves are allowed to lead the defense forces of the arcology.",
+						conditional: V.SecExp.edicts.defense.slavesOfficers === 1,
+						set: function() {
+							V.SecExp.edicts.defense.slavesOfficers = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "allow your trusted slaves to lead the defense forces of the arcology.",
+						conditional: V.SecExp.edicts.defense.slavesOfficers === 0,
+						set: function() {
+							V.SecExp.edicts.defense.slavesOfficers = 1;
+						},
+						note: "Will allow your bodyguard and Head Girl to lead troops into battle, but will cost a small amount of authority each week."
+					}
+				]
+			}],
+			["Mercenary subsidy", {
+				repeal: [
+					{
+						text: "mercenaries willing to immigrate in your arcology will be offered a discount on rent.",
+						conditional: V.SecExp.edicts.defense.discountMercenaries === 1,
+						set: function() {
+							V.SecExp.edicts.defense.discountMercenaries = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "mercenaries willing to immigrate in your arcology will be offered a discount on rent.",
+						conditional: V.mercenaries > 0 && V.SecExp.edicts.defense.discountMercenaries === 0,
+						set: function() {
+							V.SecExp.edicts.defense.discountMercenaries = 1;
+						},
+						note: "Will slightly lower rent, but will increase the amount of available mercenaries."
+					}
+				]
+			}],
+			[`Militia Status (${militiaStatus()})`, {
+				implement: [
+					{
+						text: `lay the groundwork for the formation of the arcology's citizens' army.`,
+						conditional: V.SecExp.edicts.defense.militia === 0,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 2;
+						},
+						note: "Will allow for the recruitment and training of citizens."
+					},
+					{
+						text: `disband the militia.`,
+						conditional: V.SecExp.edicts.defense.militia > 1,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 1;
+						}
+					},
+					{
+						text: `Reinstate the militia as volunteers only.`,
+						conditional: V.SecExp.edicts.defense.militia === 1,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 2;
+						},
+					},
+					{
+						text: `only volunteers will be accepted in the militia.`,
+						conditional: V.SecExp.edicts.defense.militia > 2,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 2;
+						},
+						note: `Will replenish militia manpower slowly and will cap at ${num(App.SecExp.militiaCap(2)*100)}% of the total citizens population.`
+					},
+					{
+						text: `ensure every citizen is required to train in the militia and serve the arcology if the need arises.`,
+						conditional: V.SecExp.edicts.defense.militia === 2,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 3;
+						},
+						note: `Will replenish militia manpower moderately fast and will cap at ${num(App.SecExp.militiaCap(3)*100)}% of the total citizens population, but has a high authority cost.`
+					},
+					{
+						text: `ensure every citizen is required to register and serve under the militia.`,
+						conditional: V.SecExp.edicts.defense.militia === 3,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 4;
+						},
+						note: `Will quickly replenish militia manpower and will cap at ${num(App.SecExp.militiaCap(4)*100)}% of the total citizens population, but has a very high authority cost.`
+					},
+					{
+						text: `ensure that very adult citizen is required to train and participate in the defense of the arcology.`,
+						conditional: V.SecExp.edicts.defense.militia === 4,
+						set: function() {
+							V.SecExp.edicts.defense.militia = 5;
+						},
+						note: `Will very quickly replenish militia manpower and will cap at ${num(App.SecExp.militiaCap(5)*100)}% of the total citizens population, but has an extremely high authority cost`
+					},
+				]
+			}],
+			["Military exemption", {
+				repeal: [
+					{
+						text: "you allow citizens to avoid military duty by paying a weekly fee.",
+						conditional: V.SecExp.edicts.defense.militaryExemption === 1,
+						set: function() {
+							V.SecExp.edicts.defense.militaryExemption = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "allow citizens to avoid military duty by paying a weekly fee.",
+						conditional: V.SecExp.edicts.defense.militia >= 3 && V.SecExp.edicts.defense.militaryExemption === 1,
+						set: function() {
+							V.SecExp.edicts.defense.militaryExemption = 1;
+						},
+						note: "Will slow down the replenishment of manpower, but will supply cash each week. More profitable with stricter recruitment laws."
+					}
+				]
+			}],
+			["Revised minimum requirements", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "you allow citizens outside the normally accepted range to join the militia.",
+						conditional: V.SecExp.edicts.defense.lowerRequirements === 1,
+						set: function() {
+							V.SecExp.edicts.defense.lowerRequirements = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "will allow citizens outside the normally accepted range to join the militia.",
+						conditional: V.SecExp.edicts.defense.militia >= 3 && V.arcologies[0].FSHedonisticDecadence >= 40 && V.SecExp.edicts.defense.lowerRequirements === 0,
+						set: function() {
+							V.SecExp.edicts.defense.lowerRequirements = 1;
+						},
+						note: "Will slightly lower defense and hp of militia units, but will increase the manpower replenishment rate."
+					}
+				]
+			}],
+			["No subhumans in the militia", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "it is forbidden for subhumans to join the militia.",
+						conditional: V.SecExp.edicts.defense.noSubhumansInArmy === 1,
+						set: function() {
+							V.SecExp.edicts.defense.noSubhumansInArmy = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "prevent subhumans from joining the militia.",
+						conditional: V.SecExp.edicts.defense.militia >= 3 && V.arcologies[0].FSSubjugationist >= 40 && V.SecExp.edicts.defense.noSubhumansInArmy === 0,
+						set: function() {
+							V.SecExp.edicts.defense.noSubhumansInArmy = 1;
+						},
+						note: "Will help advance racial Subjugation, but will slow down slightly manpower replenishment."
+					}
+				]
+			}],
+			["Military exemption for pregnancies", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "pregnant citizens are allowed, and encouraged, to avoid military service.",
+						conditional: V.SecExp.edicts.defense.pregExemption === 1,
+						set: function() {
+							V.SecExp.edicts.defense.pregExemption = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "pregnant citizens will be allowed, and encouraged, to avoid military service.",
+						conditional: V.SecExp.edicts.defense.militia >= 3 && V.arcologies[0].FSRepopulationFocus >= 40 && V.SecExp.edicts.defense.militia >= 3 && V.SecExp.edicts.defense.pregExemption === 0,
+						set: function() {
+							V.SecExp.edicts.defense.pregExemption = 1;
+						},
+						note: "Will help advance repopulation focus, but will slow down slightly manpower replenishment."
+					}
+				]
+			}],
+			["Special militia privileges", {
+				repeal: [
+					{
+						text: "citizens joining the militia are exempt from rent payment.",
+						conditional: V.SecExp.edicts.defense.privilege.militiaSoldier === 1,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.militiaSoldier = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "will allow citizens joining the militia to avoid paying rent.",
+						conditional: V.SecExp.edicts.defense.militia >= 1 && V.SecExp.edicts.defense.privilege.militiaSoldier === 0,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.militiaSoldier = 1;
+						},
+						note: "Will increase the loyalty of militia units, but will decrease rents."
+					}
+				]
+			}],
+			["Special slaves privileges", {
+				repeal: [
+					{
+						text: "slaves into the army are allowed to have material possessions.",
+						conditional: V.SecExp.edicts.defense.privilege.slaveSoldier === 1,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.slaveSoldier = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "will allow slaves drafted into the army to be able to have material possessions.",
+						conditional: V.SecExp.edicts.defense.privilege.slaveSoldier === 0,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.slaveSoldier = 1;
+						},
+						note: "Will increase the loyalty of slave units, but will cost authority each week."
+					}
+				]
+			}],
+			["Special mercenary privileges", {
+				repeal: [
+					{
+						text: "mercenaries under contract can claim part of the loot gained from battles.",
+						conditional: V.SecExp.edicts.defense.privilege.mercSoldier === 1,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.mercSoldier = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "will allow mercenaries under contract to claim part of the loot gained from battles.",
+						conditional: V.mercenaries > 0 && V.SecExp.edicts.defense.privilege.mercSoldier === 0,
+						set: function() {
+							V.SecExp.edicts.defense.privilege.mercSoldier = 1;
+						},
+						note: "Will increase the loyalty of mercenary units, but will reduce cash and menial slaves gained from battles."
+					}
+				]
+			}],
+			["Slave martial schools", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "specialized schools are training slaves in martial arts and bodyguarding.",
+						conditional: V.SecExp.edicts.defense.martialSchool === 1,
+						set: function() {
+							V.SecExp.edicts.defense.martialSchool = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "specialized schools will be set up to train slaves in martial arts and bodyguarding.",
+						conditional: V.arcologies[0].FSPhysicalIdealist >= 40 && V.SecExp.edicts.defense.martialSchool === 0,
+						set: function() {
+							V.SecExp.edicts.defense.martialSchool = 1;
+						},
+						note: "Will slightly increase morale of slave units, but will incur upkeep costs."
+					}
+				]
+			}],
+			["Elite officers", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "officers are exclusively recruited from the elite of society.",
+						conditional: V.SecExp.edicts.defense.eliteOfficers === 1,
+						set: function() {
+							V.SecExp.edicts.defense.eliteOfficers = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "officers will be exclusively recruited from the elite of society.",
+						conditional: V.arcologies[0].FSRestart >= 40 && V.SecExp.edicts.defense.eliteOfficers === 0,
+						set: function() {
+							V.SecExp.edicts.defense.eliteOfficers = 1;
+						},
+						note: "Will help advance eugenics and provide a small morale boost to militia units, but will give a small morale malus to slave units."
+					}
+				]
+			}],
+			["Live targets drills", {
+				tag: ["bold", "lime"],
+				repeal: [
+					{
+						text: "disobedient slaves are used as live targets at shooting ranges.",
+						conditional: V.SecExp.edicts.defense.liveTargets === 1,
+						set: function() {
+							V.SecExp.edicts.defense.liveTargets = 0;
+						},
+					}
+				],
+				implement: [
+					{
+						text: "disobedient slaves will be used as live targets at shooting ranges.",
+						conditional: V.arcologies[0].FSDegradationist >= 40 && V.SecExp.edicts.defense.liveTargets === 0,
+						set: function() {
+							V.SecExp.edicts.defense.liveTargets = 1;
+						},
+						note: "Will help advance degradationism and provide a small amount of exp to units, but will make the slave population slowly decline."
+					}
+				]
+			}],
+			[`SF Assistance; ${sfSupport()}`, {
+				repeal: [
+					{
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel > 0,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel--;
+						},
+					}
+				],
+				implement: [
+					{
+						text: `${capSF} will provide the security HQ with advanced equipment.`,
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel === 0 && App.SecExp.Check.reqMenials() > 5,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel = 1;
+						},
+						note: "Will lower the amount of personnel necessary to man the security HQ by 5, but will incur upkeep costs."
+					},
+					{
+						text: `${capSF} will provide the security HQ personnel with advanced training.`,
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel === 1 && V.SF.Squad.Firebase >= 4 && App.SecExp.Check.reqMenials() > 5,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel = 2;
+						},
+						note: "Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs."
+					},
+					{
+						text: `${capSF} will provide troops to the security department.`,
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel === 2 && V.SF.Squad.Firebase >= 6 && App.SecExp.Check.reqMenials() > 5,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel = 3;
+						},
+						note: "Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs."
+					},
+					{
+						text: `${capSF} will give the security department its full support.`,
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel === 3 && V.SF.Squad.Firebase >= 6 && App.SecExp.Check.reqMenials() > 5,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel = 4;
+						},
+						note: "Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs."
+					},
+					{
+						text: `${capSF} will assist the security department with installing a local version of their custom network.`,
+						conditional: V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.edicts.SFSupportLevel === 4 && V.SF.Squad.Firebase === 10 && App.SecExp.Check.reqMenials() > 5,
+						set: function() {
+							V.SecExp.edicts.SFSupportLevel = 5;
+						},
+						note: "Will lower the amount of personnel necessary to man the security HQ by a further 5, but will incur additional upkeep costs."
+					},
+				]
+			}],
+		]);
+
+		const c = new DocumentFragment();
+		const r = [];
+		for (const [name, detail] of data) {
+			if (V.SF.Toggle && V.SF.Active >= 1 && name === "SF Assistance" && !r.includes(name)) {
+				App.UI.DOM.appendNewElement("h1", c, "Special Force:", "underline");
+				r.push(name);
+			}
+			App.UI.DOM.appendNewElement("p", c, genMenu(name, detail));
+		}
+		return c;
+	}
+
+	const count = (x) => V.SecExp[x].victories + V.SecExp[x].losses;
+	const node = new DocumentFragment();
+	App.UI.DOM.appendNewElement("div", node, `Passing any edict will cost ${cashFormat(5000)} and some authority. More will become available as the arcology develops.`, "note");
+	const tabBar = new App.UI.Tabs.TabBar("SlaveInteract");
+	tabBar.addTab("Society", "Society", Society());
+	if (count("battles") > 0 || count("rebellions") > 0 || V.mercenaries > 0) {
+		tabBar.addTab("Military", "Military", Military());
+	}
+	V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
+	if (V.SecExp.core.authority < 1000) {
+		App.UI.DOM.appendNewElement("div", node, "Not enough Authority.", ["red", "note"]);
+	}
+	node.append(tabBar.render());
+	return node;
+};
diff --git a/src/events/RESS/review/PAservant.js b/src/events/RESS/review/PAservant.js
new file mode 100644
index 0000000000000000000000000000000000000000..8bb0c71816a131b5654b1e3b7b576064878735bc
--- /dev/null
+++ b/src/events/RESS/review/PAservant.js
@@ -0,0 +1,558 @@
+App.Events.RESSPAServant = class RESSPAServant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.assistant.appearance !== "normal",
+			() => V.assistant.personality === 1,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canTalk,
+				s => s.devotion >= -20,
+				s => s.devotion <= 50,
+				canSee,
+				s => [Job.HOUSE, Job.QUARTER].includes(s.assignment),
+				s => canDoVaginal(s) || canDoAnal(s),
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+		const {
+			HeA, heA, himA, hisA, himselfA, girlA, womanA, loliA
+		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(`As you begin your day one morning, you hear the quiet`);
+		switch (V.assistant.appearance) {
+			case "monstergirl":
+				r.push(`but unmistakably sensual voice of your monster${girlA}`);
+				break;
+			case "shemale":
+				r.push(`but unmistakably lewd voice of your shemale`);
+				break;
+			case "amazon":
+				r.push(`but unmistakably aggressive voice of your amazon`);
+				break;
+			case "businesswoman":
+				r.push(`but unmistakably dominant voice of your business${womanA}`);
+				break;
+			case "fairy":
+			case "pregnant fairy":
+				r.push(`but unmistakably adorable voice of your fairy`);
+				break;
+			case "goddess":
+			case "hypergoddess":
+				r.push(`and kindly voice of your goddess`);
+				break;
+			case "loli":
+				r.push(`and childish voice of your ${loliA}`);
+				break;
+			case "preggololi":
+				r.push(`and childish, out of breath voice of your pregnant ${loliA}`);
+				break;
+			case "angel":
+				r.push(`but unmistakably caring voice of your angel`);
+				break;
+			case "cherub":
+				r.push(`yet overly cheerful voice of your cherub`);
+				break;
+			case "incubus":
+				r.push(`and commanding, but obviously aroused voice of your incubus`);
+				break;
+			case "succubus":
+				r.push(`and seductive, but obviously aroused voice of your succubus`);
+				break;
+			case "imp":
+				r.push(`and harassing voice of your imp`);
+				break;
+			case "witch":
+				r.push(`and oddly aroused voice of your witch`);
+				break;
+			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+				r.push(`and very distinct voice of your avatar`);
+				break;
+			case "schoolgirl":
+				r.push(`but unmistakably suggestive voice of your school${girlA}`);
+		}
+		r.push(
+			`personal assistant coming from your office. Looking in, you are treated to the sight of`,
+			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), "'s")
+		);
+		if (eventSlave.butt > 8) {
+			r.push(`ridiculous bottom jiggling`);
+		} else if (eventSlave.butt > 4) {
+			r.push(`big behind bouncing`);
+		} else {
+			r.push(`cute rear`);
+		}
+		if (eventSlave.belly >= 5000) {
+			r.push(r.pop() + `, and the ${belly} rounded belly hanging between ${his} legs,`);
+		}
+		r.push(`as ${he} reaches out over the glass top of your desk with a soft, dust-free cloth and a bottle of screen cleaner. ${capFirstChar(V.assistant.name)} is displaying ${hisA} avatar right under where the slave is cleaning the glass screen, and ${heA}'s displaying it nude. ${HeA}'s positioned ${himselfA} so that the poor slave appears to be wiping`);
+		switch (V.assistant.appearance) {
+			case "monstergirl":
+				r.push(`${hisA} hair-tentacles`);
+				break;
+			case "shemale":
+				r.push(`the shaft of ${hisA} massive prick`);
+				break;
+			case "amazon":
+				r.push(`the insides of ${hisA} muscular thighs`);
+				break;
+			case "businesswoman":
+				r.push(`${hisA} pussy`);
+				break;
+			case "fairy":
+				r.push(`${hisA} tiny body`);
+				break;
+			case "pregnant fairy":
+				r.push(`${hisA} tiny yet swollen body`);
+				break;
+			case "goddess":
+				r.push(`${hisA} motherly tits`);
+				break;
+			case "hypergoddess":
+				r.push(`${hisA} huge pregnant belly`);
+				break;
+			case "loli":
+				r.push(`${hisA} flat chest`);
+				break;
+			case "preggololi":
+				r.push(`${hisA} pregnant belly`);
+				break;
+			case "angel":
+				r.push(`${hisA} wide-spread wings`);
+				break;
+			case "cherub":
+				r.push(`${hisA} cute pussy`);
+				break;
+			case "incubus":
+				r.push(`${hisA} throbbing prick`);
+				break;
+			case "succubus":
+				r.push(`${hisA} lovely pussy`);
+				break;
+			case "imp":
+				r.push(`${hisA} pussy`);
+				break;
+			case "witch":
+				r.push(`${hisA} plump tits`);
+				break;
+			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+				r.push(`${hisA} phallic tentacles`);
+				break;
+			case "schoolgirl":
+				r.push(`${hisA} perky tits`);
+		}
+		r.push(`down with screen cleaner, and is talking dirty to the furiously blushing servant. "Ohh, that feels good," ${heA} moans. "Rub me right there, you ${SlaveTitle(eventSlave)} slut! I love it!" The poor slave is doing ${his} best to hurry, embarrassed and unsure of how to react to ${V.assistant.name}'s behavior.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Share the slave with your PA`, share, virginityWarning()),
+			canDoAnal(eventSlave)
+				? new App.Events.Result(`Double penetrate the slave with your PA`, double, virginityWarning())
+				: new App.Events.Result()
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function share() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(
+				`You enter, eliciting an embarrassed`,
+				Spoken(eventSlave, `"Um, hi ${Master}"`),
+				`from ${eventSlave.slaveName} and a cheery wave from ${V.assistant.name}. At this stage of your morning ablutions, you're conveniently naked, so you`
+			);
+			if (PC.belly >= 5000) {
+				r.push(`heft yourself`);
+			} else if (PC.belly >= 1500) {
+				r.push(`clamber up`);
+			} else {
+				r.push(`leap up`);
+			}
+			r.push(`onto the desktop and kneel upright, legs splayed. (Naturally, the desk is reinforced and sealed for exactly this reason.) You point meaningfully at your`);
+			if (PC.dick !== 0) {
+				r.push(`stiff prick`);
+				if (PC.vagina !== -1) {
+					r.push(`and flushed pussy`);
+				}
+				r.push(r.pop() + `, and the obedient slave`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`hefts ${himself}`);
+				} else {
+					r.push(`clambers`);
+				}
+				r.push(`up to suck you off`);
+				if (PC.vagina !== -1) {
+					r.push(`and eat you out`);
+				}
+				r.push(r.pop() + `. When you're close, you surprise ${him} by pulling your cock out of ${his} mouth and blowing your load onto the glass.`);
+			} else {
+				r.push(`hot cunt, and the obedient slave`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`hefts ${himself}`);
+				} else {
+					r.push(`clambers`);
+				}
+				r.push(`up to eat you out. You surprise ${him} by taking your time, drawing out the oral session with the ulterior motive of getting as much saliva and pussyjuice onto the glass as possible.`);
+			}
+			r.push(`${capFirstChar(V.assistant.name)} shifts ${hisA} avatar so that this lands all over ${hisA}`);
+			switch (V.assistant.appearance) {
+				case "monstergirl":
+					r.push(`cocks.`);
+					break;
+				case "shemale":
+					r.push(`huge cock.`);
+					break;
+				case "amazon":
+					r.push(`muscular pussy.`);
+					break;
+				case "businesswoman":
+					r.push(`mature pussy.`);
+					break;
+				case "fairy":
+				case "pregnant fairy":
+					r.push(`tiny body.`);
+					break;
+				case "goddess":
+					r.push(`fertile pussy.`);
+					break;
+				case "hypergoddess":
+					r.push(`gaping pussy.`);
+					break;
+				case "loli":
+				case "cherub":
+					r.push(`tight virgin pussy.`);
+					break;
+				case "preggololi":
+					r.push(`tight young pussy.`);
+					break;
+				case "angel":
+					r.push(`virgin pussy.`);
+					break;
+				case "incubus":
+					r.push(`perfect dick.`);
+					break;
+				case "succubus":
+					r.push(`lovely pussy.`);
+					break;
+				case "imp":
+					r.push(`slutty pussy.`);
+					break;
+				case "witch":
+					r.push(`plump breasts.`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`pussy-like body.`);
+					break;
+				case "schoolgirl":
+					r.push(`pretty young pussy.`);
+			}
+			r.push(`"Clean me off, ${eventSlave.slaveName}," ${heA} demands, winking broadly at you. The slave, knowing that commands from ${himA} are commands from you, repositions ${himself} to lick up the`);
+			if (PC.dick !== 0) {
+				r.push(`ejaculate`);
+				if (PC.vagina !== -1) {
+					r.push(`and`);
+				}
+			}
+			if (PC.vagina !== -1) {
+				r.push(`girlcum`);
+			}
+			r.push(r.pop() + `.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`This brings the slave into a crouch with ${his} ass pointed at you,`);
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina > 2) {
+					r.push(`${his} experienced pussy practically begging for a pounding.`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`${his} nice pussy practically begging for a good hard fucking.`);
+				} else {
+					r.push(`${his} tight little pussy completely vulnerable.`);
+				}
+				r.push(`As`);
+				if (PC.dick !== 0) {
+					if (PC.vagina !== -1) {
+						r.push(`use manual stimulation of your pussy to get your dick`);
+					} else {
+						r.push(`stroke yourself`);
+					}
+					r.push(`rapidly back to full mast,`);
+				} else {
+					r.push(`don a strap-on,`);
+				}
+				r.push(`${V.assistant.name} opines helpfully, "Hey ${eventSlave.slaveName}! You're about to get fucked!" The slave reacts by obediently reaching back to spread ${his} buttocks and relaxing, but ${V.assistant.name} ruins ${his} attempt at graceful submission."`);
+				if (PC.title === 1) {
+					r.push(`Siiir,`);
+				} else {
+					r.push(`Ma'aaam,`);
+				}
+				r.push(`${he}'s bluuuushing," ${he} says tauntingly, and the slave stiffens with renewed embarrassment, not to mention stimulation, as you penetrate ${him}.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				if (eventSlave.anus > 2) {
+					r.push(`${his} big asspussy practically begging for a pounding.`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`${his} nice asshole practically begging for a good hard fucking.`);
+				} else {
+					r.push(`${his} tight little rosebud completely vulnerable.`);
+				}
+				r.push(`As`);
+				if (PC.dick !== 0) {
+					if (PC.vagina !== -1) {
+						r.push(`use manual stimulation of your pussy to get your dick`);
+					} else {
+						r.push(`stroke yourself`);
+					}
+					r.push(`rapidly back to full mast,`);
+				} else {
+					r.push(`don a strap-on,`);
+				}
+				r.push(`${V.assistant.name} opines helpfully, "Hey ${eventSlave.slaveName}! You're about to get buttfucked!" The slave reacts by obediently reaching back to spread ${his} buttocks, and relaxes ${his} anus, but ${V.assistant.name} ruins ${his} attempt at graceful anal submission."`);
+				if (PC.title === 1) {
+					r.push(`Siiir,`);
+				} else {
+					r.push(`Ma'aaam,`);
+				}
+				r.push(`${he}'s bluuuushing," ${heA} says tauntingly, and the slave stiffens with renewed embarrassment, not to mention discomfort, as you penetrate ${him}.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`${He} keeps licking away, cleaning up the mess you made as ${V.assistant.name} does everything ${he} can to make it seem like the slave is pleasuring ${him}. Partway through, ${V.assistant.name} sticks out a hand for a high-five from you, producing a gurgle of indignation <span class="mediumaquamarine">or perhaps even laughter</span> as ${his} owner and ${his} owner's personal assistant program high-five over ${his} back.`);
+			eventSlave.trust += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function double() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(
+				`You enter, eliciting an embarrassed`,
+				Spoken(eventSlave, `"Um, hi ${Master}"`),
+				`from ${eventSlave.slaveName}, and ask ${V.assistant.name} if ${he}'d like to DP the slave with you.`);
+			switch (V.assistant.appearance) {
+				case "monstergirl":
+					r.push(`"Oh yes," ${heA} purrs threateningly over the slave's moan of apprehension, and ${hisA} avatar begins to stroke ${hisA} dicks meaningfully.`);
+					break;
+				case "shemale":
+				case "incubus":
+					r.push(`"Fuck yes," ${heA} groans over the slave's moan of apprehension, and ${hisA} avatar begins to stroke ${hisA} cock meaningfully.`);
+					break;
+				case "amazon":
+					r.push(`"Yeah!" ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on carved from mammoth tusk.`);
+					break;
+				case "businesswoman":
+					r.push(`"Oh yes," ${heA} purrs sadistically over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on.`);
+					break;
+				case "fairy":
+				case "pregnant fairy":
+					r.push(`"Oh yeah!" ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly conjures up a magic floating dick.`);
+					break;
+				case "goddess":
+				case "hypergoddess":
+					r.push(`"That would be lovely," ${heA} says radiantly over the slave's moan of apprehension, and ${hisA} avatar acquires a phallus of light.`);
+					break;
+				case "angel":
+				case "cherub":
+					r.push(`"If you insist," ${heA} says reluctantly over the slave's moan of apprehension, and ${hisA} avatar acquires a phallus of light.`);
+					break;
+				case "succubus":
+					r.push(`"Just this once," ${heA} says stroking ${his} clit as it steadily swells into a fully functional cock.`);
+					break;
+				case "imp":
+					r.push(`"Fuck yes," ${heA} groans over the slave's moan of apprehension, and ${hisA} avatar quickly dons a huge, spiked strap-on.`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`"Of course," ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly forms a huge, fleshy, bulbous cock.`);
+					break;
+				default:
+					r.push(`"Fuck yeah!" ${heA} cheers over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on.`);
+			}
+			r.push(`You indicate a fuckmachine in the corner of the room, and the slave obediently hurries over to it. It's vertical, and ${he} hops up on it, positioning ${his} anus over its`);
+			switch (V.assistant.appearance) {
+				case "monstergirl":
+					r.push(`pair of dildos. They insert themselves`);
+					break;
+				case "shemale":
+				case "incubus":
+					r.push(`frighteningly big dildo. It inserts itself`);
+					break;
+				case "amazon":
+					r.push(`animalistically ribbed dildo. It inserts itself`);
+					break;
+				case "imp":
+					r.push(`terrifyingly spiked, huge dildo. It inserts itself`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`frighteningly big, lumpy and uneven dildo. It inserts itself`);
+					break;
+				default:
+					r.push(`large dildo. It inserts itself`);
+			}
+			r.push(`gently but firmly and then stops, the panting slave's`);
+			if (eventSlave.weight > 130) {
+				r.push(`thick`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`chubby`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`heavily muscled`);
+			} else if (eventSlave.preg >= eventSlave.pregData.normalBirth/8) {
+				r.push(`motherly`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`plush`);
+			} else if (eventSlave.muscles > 5) {
+				r.push(`toned`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`thighs quivering a little from supporting ${his} body in its perch atop the machine, and from the fullness of ${his} anus.`);
+			r.push(VCheck.Anal(eventSlave, 3));
+			r.push(`${He} knows this is going to be challenging, and is breathing deeply, doing ${his} best to stay relaxed. You cannot resist slapping your`);
+			if (PC.dick !== 0) {
+				r.push(`big cock lightly`);
+			} else {
+				r.push(`lubricated strap-on`);
+			}
+			r.push(`against ${his} cheek, producing a groan of apprehension.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`You push ${him} gently backward, letting ${him} get accustomed to the new angle.`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`${His} monstrous tits spread to either side of ${his}`);
+				if (eventSlave.belly >= 5000) {
+					r.push(belly);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly,`);
+				} else {
+					r.push(`now upright torso,`);
+				}
+				r.push(`and you take a moment to play with them as ${he} prepares ${himself}.`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				r.push(`${He} gasps as ${he} feels`);
+				if (PC.dick !== 0) {
+					r.push(`your hot dickhead`);
+				} else {
+					r.push(`the slick head of your strap-on`);
+				}
+				r.push(`part ${his} pussylips, no doubt feeling full already.`);
+				r.push(VCheck.Vaginal(eventSlave, 3));
+				r.push(`When you're all the way in, the`);
+				if (V.assistant.appearance === "monstergirl") {
+					r.push(`dildos in ${his} butt begin`);
+				} else {
+					r.push(`dildo in ${his} butt begins`);
+				}
+				r.push(`to fuck ${him}, harder and harder, as ${V.assistant.name} moans happily. The all-encompassing feeling of fullness as ${his} cunt and ass are fucked to the very limit of their capacities`);
+			} else {
+				r.push(`${He} gasps as ${he} feels you push a finger up ${his} already-full butt and pull ${his} sphincter a bit wider. You withdraw it and replace it with`);
+				if (PC.dick !== 0) {
+					r.push(`your turgid cock`);
+				} else {
+					r.push(`your strap-on`);
+				}
+				r.push(`the slave writhes involuntarily, ${his} body trying to refuse the invasion of yet another phallus.`);
+				r.push(VCheck.Anal(eventSlave, 3));
+				r.push(`When you're all the way in, the`);
+				if (V.assistant.appearance === "monstergirl") {
+					r.push(`dildos alongside your`);
+					if (PC.dick !== 0) {
+						r.push(`dick`);
+					} else {
+						r.push(`strap-on`);
+					}
+					r.push(`in ${his} butt begin`);
+				} else {
+					r.push(`dildo alongside your`);
+					if (PC.dick !== 0) {
+						r.push(`dick`);
+					} else {
+						r.push(`strap-on`);
+					}
+					r.push(`in ${his} butt begins`);
+				}
+				r.push(`to fuck ${him}, harder and harder, as ${V.assistant.name} moans happily. The all-encompassing feeling of fullness as ${his} ass is fucked to the very limit of its capacity`);
+			}
+			r.push(`quickly drives all feminine grace, presence of mind, or really, <span class="devotion inc">conscious thought out of the poor slave.</span> After begging for mercy for a short while, ${he} lapses into animal groans, drooling and leaking tears out the corner of ${his} eyes as you and ${V.assistant.name} fuck ${him} into insensibility. When you climax, ${V.assistant.name} ejaculates, filling the slave's anus with warm fluid.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`By this point ${he}'s so helpless that you`);
+			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
+				r.push(`have to struggle to lift`);
+			} else {
+				r.push(`gently lift`);
+			}
+			r.push(`${him} off the fuckmachine and carry ${him} to the shower. You set ${him} down there, and ${V.assistant.name} activates the water, using the powerful jets in pulses to massage life back into your exhausted fuckpuppet. ${His} avatar appears on a screen behind the shower, creating an optical illusion that makes it look like ${he}'s petting the slave in time with the water. ${He} reassures to the slave as ${he} does:`);
+			switch (V.assistant.appearance) {
+				case "monstergirl":
+					r.push(`"You're a good little cocksock," ${he} says kindly.`);
+					break;
+				case "shemale":
+					r.push(`"I like your butthole," ${he} says politely.`);
+					break;
+				case "amazon":
+					r.push(`"I like fucking your butthole," ${he} says kindly.`);
+					break;
+				case "businesswoman":
+					r.push(`"I'm sure you won't be sold right away," ${he} says.`);
+					break;
+				case "fairy":
+				case "pregnant fairy":
+					r.push(`"You're a good ${girl}," ${he} says.`);
+					break;
+				case "goddess":
+				case "hypergoddess":
+					r.push(`"There, there," ${he} says kindly. "You are a good sex slave."`);
+					break;
+				case "angel":
+				case "cherub":
+					r.push(`"There, there," ${he} says kindly. "You are a good ${girl}."`);
+					break;
+				case "incubus":
+				case "succubus":
+				case "imp":
+					r.push(`"You're a good little cocksleeve," ${he} says honestly.`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`"You're a good little nursery," ${he} says.`);
+					break;
+				default:
+					r.push(`"I like you," ${he} says cheerily.`);
+			}
+			eventSlave.devotion += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/ageImplant.js b/src/events/RESS/review/ageImplant.js
new file mode 100644
index 0000000000000000000000000000000000000000..8063fcd2f95f3dbe191b2ff78ac440786c85874e
--- /dev/null
+++ b/src/events/RESS/review/ageImplant.js
@@ -0,0 +1,387 @@
+App.Events.RESSAgeImplant = class RESSAgeImplant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canTalk,
+				s => s.assignment !== Job.QUARTER,
+				s => s.physicalAge > 30,
+				s => s.ageImplant > 0,
+				s => s.devotion > 20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+
+		App.Events.addParagraph(node, [
+			`In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each others' youthful energy. At the back of the pack is`,
+			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), `. ${He} looks as young as any of them, but after they're out, ${he} leans against the door frame for a moment and exhales slowly.`)
+		]);
+		let r = [];
+		r.push(`${His} ${App.Desc.eyeColor(eventSlave)}-eyed gaze catches yours for a moment, and you are reminded that ${he} isn't as young as they are, not at all. ${His} face might look youthful, but ${his} eyes don't.`);
+		if (canSee(eventSlave)) {
+			r.push(`${He} sees your consideration, and murmurs,`);
+		} else {
+			r.push(`You make yourself known, and ${he} murmurs,`);
+		}
+		r.push(
+			Spoken(eventSlave, `"Sorry, ${Master}. Just a little slow this morning."`),
+			`${He} hurries after ${his} sisters, ${his}`
+		);
+		if (eventSlave.butt > 12) {
+			r.push(`massive`);
+		} else if (eventSlave.butt > 8) {
+			r.push(`giant`);
+		} else if (eventSlave.butt > 5) {
+			r.push(`huge`);
+		} else if (eventSlave.butt > 2) {
+			r.push(`big`);
+		} else {
+			r.push(`pretty little`);
+		}
+		r.push(`naked ass catching your eye as ${he} goes.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Go out clubbing to make ${him} feel young again`, clubbing),
+			new App.Events.Result(`Attend a sporting event with ${him}`, sporting),
+			new App.Events.Result(`Put the old whore in ${his} place`, old, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null),
+		]);
+
+		function clubbing() {
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} to take the day off and meet you that evening for a trip to ${V.arcologies[0].name}'s most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and ${his} eyes widen a little at the implied compliment and challenge. Right at the proper time, ${he} arrives in your office wearing neon ${eventSlave.hColor} makeup to match ${his} hair, and a tiny iridescent club${girl} outfit of the same color. The hem of the skirt is barely low enough to conceal ${him}`);
+			if (eventSlave.dick > 0) {
+				r.push(`dick,`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`total lack of private parts,`);
+			} else {
+				r.push(`pussy,`);
+			}
+			r.push(`and it's backless. The front is held up by a halter around ${his} pretty neck, and is`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`specially tailored to cover ${his} massive tits`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`strained by ${his} big tits`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`tightly filled by ${his} healthy tits`);
+			} else {
+				r.push(`tight against ${his} flat chest`);
+			}
+			if (eventSlave.belly >= 1500) {
+				r.push(`and ${belly}`);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			}
+			r.push(r.pop() + `. ${He} makes a gaudy and very fashionable spectacle, and in response to your`);
+			if (canSee(eventSlave)) {
+				r.push(`look`);
+			} else if (canHear(eventSlave)) {
+				r.push(`whistle`);
+			} else {
+				r.push(`gentle poke`);
+			}
+			r.push(`${he} raises`);
+			if (!hasAnyArms(eventSlave)) {
+				r.push(`the stumps of ${his} arms ever so slightly`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`both arms`);
+				} else {
+					r.push(`${his} arm`);
+				}
+				r.push(`over ${his} head`);
+			}
+			r.push(
+				`and twirls, shimmying ${his} body deliciously.`,
+				Spoken(eventSlave, `"I hope they let me into the club without checking my I.D., ${Master},"`),
+				`${he} jokes, for which ${he} receives a swat on ${his} rear as you head out. With the full day of rest, ${he} is full of vigor and ready to dance. ${He} eagerly heads out onto the floor with you,`);
+			if (eventSlave.skill.entertainment >= 100) {
+				r.push(`masterfully moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, grabbing the attention of all the men and most of the women in ${V.clubName}.`);
+			} else if (eventSlave.skill.entertainment > 60) {
+				r.push(`expertly moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, mesmerizing ${his} neighbors on the floor.`);
+			} else if (eventSlave.skill.entertainment > 30) {
+				r.push(`skillfully moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, drawing a lustful gaze or two.`);
+			} else {
+				r.push(`clumsily moving`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`${his} body to the heavy beat, attracting little notice among the press of novices.`);
+			}
+			r.push(`It doesn't take long for ${him} to back ${himself} into you so ${he} can grind; ${he} cranes ${his} neck back to plant an <span class="devotion inc">earnest kiss</span> on your chin.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function sporting() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} ${he}'ll be spending the day with you at a game outside the arcology, and ${he}'s to meet you at your VTOL pad in two hours. ${He} ponders for a moment but clearly understands this is related to ${his} age, somehow. Right at the proper time, ${he} arrives on the pad. ${He}'s clearly spent the whole time getting the right clothing; somehow ${he} used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal ${his}`);
+			if (eventSlave.dick > 0) {
+				r.push(`dick,`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`lack of private parts,`);
+			} else {
+				r.push(`pussy,`);
+			}
+			r.push(`and ${he} bounces a little on ${his} heels for you to show off how ${he}'s going commando underneath it. ${His}`);
+			if (eventSlave.belly >= 100000) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+			} else if (eventSlave.weight > 130) {
+				r.push(`hugely soft`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+			} else if (eventSlave.muscles > 30) {
+				r.push(`ripped`);
+			} else if (eventSlave.weight > 30) {
+				r.push(`fat`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`plush`);
+			} else {
+				r.push(`taut`);
+			}
+			r.push(`midriff is bare. The top`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`somehow contains ${his} tits, with the team's logo at least`);
+				if (V.showInches === 2) {
+					r.push(`three feet`);
+				} else {
+					r.push(`a meter`);
+				}
+				r.push(`wide across ${his} chest.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`is a great location for the team's logo, since ${his} tits allow it to be quite large.`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`is a good location for the team's logo, since ${his} tits allow it to be pretty big.`);
+			} else {
+				r.push(`flatters ${his} flat chest, especially with the team logo over it.`);
+			}
+			r.push(`${He} even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; ${he}'s made up to look even younger.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`You have a front-row seat, of course, and ${he} excitedly takes ${his} place beside you,`);
+			if (eventSlave.butt > 12) {
+				r.push(`thankful that you reserved a seat for both of ${his} massive cheeks.`);
+			} else if (eventSlave.belly >= 300000) {
+				r.push(`thankful that the front row has plenty of room for ${his} ${belly} belly to occupy.`);
+			} else if (eventSlave.butt > 6) {
+				r.push(`carefully fitting ${his} big bottom into the seat.`);
+			} else if (eventSlave.boobs > 4000) {
+				r.push(`${his} absurd boobs rubbing against your arm.`);
+			}
+			r.push(`${He} cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before <span class="reputation inc">recognizing you,</span> putting two and two together, and realizing enviously that ${he}'s your sex slave. Since this is the Free Cities, the big screen gives ${him} more attention rather than cutting away when ${he} intentionally cheers hard enough that ${his} skirt rides up.`);
+			if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and goes into labor on another of ${his} brood; the contractions forcing ${him} to lean forward onto ${his} r.push(belly);stomach and give the players below a clear view of ${his} crowning child.`);
+			} else if (eventSlave.belly < 300000) {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and bending down to show cleavage to the stands in such a way that ${his}`);
+				if (eventSlave.butt > 5) {
+					r.push(`massive ass`);
+				} else if (eventSlave.butt > 2) {
+					r.push(`big butt`);
+				} else {
+					r.push(`nice ass`);
+				}
+				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
+				if (eventSlave.anus > 2) {
+					r.push(`big slit of an asspussy`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`nice asspussy`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`tight asshole`);
+				} else {
+					r.push(`virgin asshole`);
+				}
+				if (eventSlave.vagina > 3) {
+					r.push(`and gaping pussy`);
+				} else if (eventSlave.vagina > 2) {
+					r.push(`and used pussy`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`and lovely pussy`);
+				} else if (eventSlave.vagina > 0) {
+					r.push(`and tight pussy`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`and virgin pussy`);
+				}
+				r.push(r.pop() + `.`);
+			} else {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, cheering while swinging ${his} absurd belly back and forth and accidentally smashes into a concession vendor sending them to the floor. ${His} efforts to help him up forces ${him} to stand in such a way that ${his}`);
+				if (eventSlave.butt > 5) {
+					r.push(`massive ass`);
+				} else if (eventSlave.butt > 2) {
+					r.push(`big butt`);
+				} else {
+					r.push(`nice ass`);
+				}
+				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
+				if (eventSlave.anus > 2) {
+					r.push(`big slit of an asspussy`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`nice asspussy`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`tight asshole`);
+				} else {
+					r.push(`virgin asshole`);
+				}
+				if (eventSlave.vagina > 3) {
+					r.push(`and gaping pussy`);
+				} else if (eventSlave.vagina > 2) {
+					r.push(`and used pussy`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`and lovely pussy`);
+				} else if (eventSlave.vagina > 0) {
+					r.push(`and tight pussy`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`and virgin pussy`);
+				}
+				r.push(r.pop() + `.`);
+			}
+			r.push(`A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.`);
+			repX(500, "event", eventSlave);
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function old() {
+			let didVaginal = false;
+			let didAnal = false;
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen. You tell ${him} you're interested to see if ${his} old body can still perform. Something about the way you say 'old' makes ${him} flinch, and ${he}'s right to worry. You tell ${him} to go out and make you ${cashFormat(200)}, and to hurry back if ${he} wants to avoid punishment. ${He} hesitates for an instant before hurrying outside. A few hours later you check on ${him} remotely. The feed shows ${him}`);
+			if (eventSlave.belly >= 10000) {
+				r.push(`waddle`);
+			} else {
+				r.push(`walk`);
+			}
+			r.push(`quickly up to a couple out on the street; you can't hear what's said, but ${he}`);
+			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
+				r.push(`turns around to rub ${his} bare butt against the crotch of the man's pants. He pulls them down and fucks ${him} right there`);
+				if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`<span class="virginity loss">taking ${his} virginity</span>,`);
+					didVaginal = true;
+				} else if (canDoAnal(eventSlave) && eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss">taking ${his} anal virginity</span>,`);
+					didAnal = true;
+				}
+				r.push(`as the woman`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`pulls and abuses`);
+				} else {
+					r.push(`roughly fingers`);
+				}
+				r.push(`${his} poor nipples. Boring of this, he switches to torturing the poor slave's`);
+				if (eventSlave.dick > 0) {
+					r.push(`dick,`);
+				} else if (eventSlave.vagina === -1) {
+					r.push(`butthole,`);
+				} else {
+					r.push(`pussy,`);
+				}
+				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your <span class="cash inc"> ${cashFormat(200)}.</span> You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
+					Spoken(eventSlave, `"I'm OK, ${Master}. Holes are pretty sore though. Kinda loose."`)
+				);
+			} else {
+				r.push(`drops to ${his} ${hasBothLegs(eventSlave) ? "knees" : "knee"} to nuzzle against the man's pants. He pulls them down and facefucks ${him} right there, as the woman`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`pulls and abuses`);
+				} else {
+					r.push(`roughly fingers`);
+				}
+				r.push(`${his} poor nipples. Boring of this, ${he} switches to torturing the poor slave's`);
+				if (eventSlave.dick > 0) {
+					r.push(`dick,`);
+				} else if (eventSlave.vagina === -1) {
+					r.push(`butthole,`);
+				} else {
+					r.push(`pussy,`);
+				}
+				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your <span class="cash inc">${cashFormat(200)}.</span> You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
+					Spoken(eventSlave, `"I'm OK, ${Master}. My jaw kinda hurts and my legs are really sore."`)
+				);
+			}
+			r.push(`You tell ${him} that's of little concern, since ${he} has relatively few years of use left: you may as well extract what value you can from ${him}. ${He}'s too exhausted to hide ${his} response, and collapses, <span class="trust dec">sobbing.</span>`);
+			cashX(200, "event", eventSlave);
+			eventSlave.trust -= 5;
+			if (didAnal) {
+				eventSlave.anus++;
+				seX(eventSlave, "anal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			} else if (didVaginal) {
+				eventSlave.vagina++;
+				seX(eventSlave, "vaginal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 0, -2));
+				}
+			} else if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 0, -2));
+				}
+			} else if (canDoAnal(eventSlave)) {
+				seX(eventSlave, "anal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			} else {
+				seX(eventSlave, "oral", "public", "penetrative");
+			}
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/dickWringing.js b/src/events/RESS/review/dickWringing.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e18aca526ce9e1336d8fa5eb4769f6bdc7a2005
--- /dev/null
+++ b/src/events/RESS/review/dickWringing.js
@@ -0,0 +1,364 @@
+App.Events.RESSDickWringing = class RESSDickWringing extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.dick > 8,
+				s => s.balls > 0,
+				s => s.energy > 60,
+				s => s.devotion > 50,
+				s => s.trust > 50,
+				s => canDoAnal(s) || canDoVaginal(s),
+				s => s.belly < 100000,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`You run into`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`in the hallway outside your office. The devoted ${SlaveTitle(eventSlave)} smiles at you as ${he} approaches. You barely notice how awkward ${his} gait is, since ${he} usually walks a little strangely. ${His} third leg tends to have that effect. But on consideration, ${he} does seem especially uncomfortable right now. The poor ${girl}'s`
+		);
+		if (eventSlave.scrotum === 0) {
+			r.push(`internal balls`);
+		} else if (eventSlave.balls < 3) {
+			r.push(`girly balls`);
+		} else if (eventSlave.scrotum < 4) {
+			r.push(`balls, held tightly against ${his} body by ${his} taut scrotum,`);
+		} else {
+			r.push(`swinging balls`);
+		}
+		r.push(`must be in dire need of emptying.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+		r.push(`${He} trusts you, so ${he} approaches you as sensually as ${he} can manage and asks for your help.`);
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} uses quick but submissive gestures to beg you to help ${him} cum, pleading the special difficulties caused by ${his} outlandish member, which ${he} can manage most comfortably if ${he} has both hands free for it.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"${Master}, would you please, please help me cum?"`),
+				`${he} begs submissively.`,
+				Spoken(eventSlave, `"It's nice if I can use both hands on it to, um, manage things."`)
+			);
+		}
+		r.push(`${He}'s referring to the volume issue with ${his} unnaturally massive dick. The thing is so huge and so soft that`);
+		if (eventSlave.balls < 3) {
+			r.push(`one of ${his} (by comparison) pathetically weak ejaculations`);
+		} else if (eventSlave.balls < 6) {
+			r.push(`one of ${his} comparatively normal ejaculations`);
+		} else {
+			r.push(`a single one of even ${his} copious ejaculations`);
+		}
+		r.push(`often fails to make it all the way to the tip of ${his} cock, making it only partway down ${his} urethra without help.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Address ${his} problem together`, together, virginityWarning()),
+			new App.Events.Result(`Use ${his} trouble to dominate ${him}`, dominate, virginityWarning()),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function together() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You step in and give ${him} a quick kiss on the lips, telling ${him} you'd be happy to. ${He} was confident you would, but the tenderness makes ${his} breath catch a little. You take ${him} by ${his}`);
+			if (eventSlave.weight > 130) {
+				r.push(`fat`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`chubby`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`strong`);
+			} else if (eventSlave.shoulders < 0) {
+				r.push(`pretty little`);
+			} else if (eventSlave.shoulders > 1) {
+				r.push(`broad`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`shoulders and keep kissing ${him}, steering ${him} backwards into your office. ${He} gets the idea and cooperates as best ${he} can, giggling`);
+			if (eventSlave.voice === 0) {
+				r.push(`mutely`);
+			} else {
+				r.push(`cutely`);
+			}
+			r.push(`into your mouth as ${his} hot and increasingly horny body bumps against your own.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`When ${his}`);
+			if (eventSlave.butt > 12) {
+				r.push(`monumental ass`);
+			} else if (eventSlave.butt > 7) {
+				r.push(`titanic ass`);
+			} else if (eventSlave.butt > 4) {
+				r.push(`big butt`);
+			} else {
+				r.push(`cute rear`);
+			}
+			r.push(`touches the edge of your desk, the`);
+			if (eventSlave.height > 180) {
+				r.push(`tall ${SlaveTitle(eventSlave)} leans back`);
+			} else if (eventSlave.height > 155) {
+				r.push(`${SlaveTitle(eventSlave)} reclines`);
+			} else {
+				r.push(`short ${SlaveTitle(eventSlave)} hops up`);
+			}
+			r.push(`to lie across it, using a hand to lay ${his} inhumanly big dick`);
+			if (eventSlave.belly > 10000) {
+				r.push(`onto ${his} ${belly}`);
+				if (eventSlave.bellyPreg > 0) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly.`);
+			} else if (eventSlave.weight > 160) {
+				r.push(`across ${his} gut.`);
+			} else if (eventSlave.boobs > 5000) {
+				r.push(`in the warm canyon formed by ${his} inhumanly big boobs.`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`across ${his} soft belly.`);
+			} else if (eventSlave.belly > 1500) {
+				r.push(`over ${his} ${belly}`);
+				if (eventSlave.bellyPreg > 0) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly.`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`across ${his} ripped abs.`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`across ${his} plush stomach.`);
+			} else {
+				r.push(`up ${his} stomach.`);
+			}
+			r.push(`${He} spreads ${his} legs as wide as they'll go, and reaches down to spread ${his} buttocks even wider, offering you ${his}`);
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`holes.`);
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`pussy.`);
+			} else {
+				r.push(`asshole.`);
+			}
+			r.push(`${He}`);
+			if (eventSlave.voice === 0) {
+				r.push(`tries to groan`);
+			} else {
+				r.push(`groans`);
+			}
+			r.push(`with anticipation of the coming relief as you slide`);
+			if (PC.dick !== 0) {
+				r.push(`your cock`);
+			} else {
+				r.push(`a strap-on`);
+			}
+			r.push(`past ${his}`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`pussylips and inside ${his} womanhood.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(`sphincter and inside ${his} asspussy.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`It doesn't take long. ${His}`);
+			if (eventSlave.scrotum === 0) {
+				r.push(`invisible but overfull balls`);
+			} else {
+				r.push(`balls tighten and`);
+			}
+			r.push(`shoot cum into ${his} soft python of a dick, but not a drop appears at its tip. Gasping at the mixed relief and discomfort, ${he} lets ${his} butt go and wriggles around to grab ${his} dick around its base with both hands. ${He} squeezes it from base to tip to bring out its contents. ${He}'s so huge that ${he}'s able to reach down with ${his} lips and get ${his} cockhead into ${his} mouth, the meat filling it entirely. ${He} sucks industriously, swallowing ${his} own load. ${He} was just trying to relieve the pressure, but the added stimulation brings ${him} to climax again. Silenced by ${his} own dickhead, ${he} shudders deliciously and starts over, wringing more cum into ${his} own mouth. You change angles, bringing the hard head of`);
+			if (PC.dick !== 0) {
+				r.push(`your own penis`);
+			} else {
+				r.push(`your phallus`);
+			}
+			r.push(`against ${his} prostate and forcing an agonizing third climax.`); // FIXME: actually check that slave has a prostate
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`${He}'s so discombobulated by this that ${he} goes limp, offering no resistance as you extract yourself,`);
+			if (PC.dick !== 0) {
+				r.push(`straddle ${his} torso, and press your dick inside ${his} mouth to climax there, adding your own ejaculate`);
+			} else {
+				r.push(`slip out of the harness with the ease of long practice, and straddle ${his} face so that your climax adds a good quantity of your pussyjuice`);
+			}
+			r.push(`to everything ${he}'s already gotten down`);
+			if (PC.vagina !== -1) {
+				if (PC.dick !== 0) {
+					r.push(`and leaving quite a lot of your pussyjuice on ${his} chin`);
+				}
+			}
+			r.push(r.pop() + `. When you finally release ${him}, ${he} slithers down to the floor, utterly spent.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} raises a shaky hand to <span class="trust inc">gesture thanks.</span>`);
+			} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} lisps weakly.`);
+			} else {
+				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} murmurs in a tiny voice.`);
+			}
+			eventSlave.trust += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function dominate() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You step in and trace a`);
+			if (PC.title === 1) {
+				r.push(`strong`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`hand across ${his} lips before inserting two fingers into ${his} mouth. ${He} looks puzzled, but obediently begins to suck on your fingers. You use your other hand to explore ${his} body, titillating the heavily aroused ${SlaveTitle(eventSlave)} until ${he}'s on the verge of orgasm. Without warning, you place an elastic band around the slave's dickhead. ${He} writhes with discomfort, but knows better than to protest. It's tight, but not agonizingly so. ${He}'ll be able to cum, but not a drop will get out. Grabbing ${him} by a nipple`);
+			if (eventSlave.nipples === "fuckable") {
+				r.push(`cunt`);
+			}
+			r.push(r.pop() + `, you pull ${him} down to ${his} knees, enjoying the motion of ${his} body as ${he} wriggles with the discomfort of being tugged this way, the uncomfortable thing squeezing the tip of ${his} cock, and the suspicion that this is going to be tough.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`Once ${he}'s in position, you`);
+			if (eventSlave.butt > 12) {
+				r.push(`struggle to wrap your arms around ${his} bountiful buttcheeks,`);
+			} else if (eventSlave.butt > 7) {
+				r.push(`heft ${his} ridiculous buttcheeks possessively,`);
+			} else if (eventSlave.butt > 4) {
+				r.push(`give ${his} huge ass a possessive squeeze,`);
+			} else {
+				r.push(`run your hands across ${his} bottom,`);
+			}
+			r.push(`and then shove`);
+			if (PC.dick !== 0) {
+				r.push(`your cock`);
+			} else {
+				r.push(`a strap-on`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				r.push(`inside ${his} cunt.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(`up ${his} butt.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`${His} cock is so long that it drags along the floor as you pound`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`${him} against ${his} ${belly} dome of a stomach.`);
+			} else if (eventSlave.boobs > 12000) {
+				r.push(`${him}, ${his} enormous tits serving as a cushion for ${his} torso to rest against.`);
+			} else if (eventSlave.boobs > 7000) {
+				r.push(`${him}, accompanied by the nipples that cap ${his} absurd boobs.`);
+			} else {
+				r.push(`${him}.`);
+			}
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`${He}'s so pent up that ${he} reaches ${his} first climax quickly, filling ${his} capped dick with cum. ${He}`);
+			if (eventSlave.voice === 0) {
+				r.push(`tries to moan`);
+			} else {
+				r.push(`moans`);
+			}
+			r.push(`at the combination of relief and pressure inside ${his} dick, and then slumps a little when ${he} feels the`);
+			if (PC.dick !== 0) {
+				r.push(`penis`);
+			} else {
+				r.push(`hard phallus`);
+			}
+			r.push(`inside ${him} fuck ${him} even harder, forcing ${him} towards a second orgasm. And after that one, a third. And a fourth.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`When you finally climax yourself, you stand, leaving ${him} writhing at your feet with ${his} huge soft cock positively pressurized. Considering the situation, you kneel down at ${his} side, deciding what to do. Stroking ${him} in a mockery of reassurance, you grab ${his} agonized member, producing a`);
+			if (eventSlave.voice === 0) {
+				r.push(`gaping, silent scream.`);
+			} else {
+				r.push(`little shriek.`);
+			}
+			if (eventSlave.toyHole === "dick" && (PC.preg === 0 || PC.vagina === 0)) {
+				r.push(`You maneuver the massive thing into your own`);
+				if (PC.preg === 0 && PC.vagina !== -1) {
+					r.push(`pussy,`);
+				} else {
+					r.push(`asshole,`);
+				}
+				r.push(`slide a finger in alongside the monstrous thing as ${he}`);
+				if (eventSlave.voice === 0) {
+					r.push(`moans with expectation,`);
+				} else {
+					r.push(`begs abjectly to unleash ${his},`);
+				}
+				r.push(`and pop the elastic off. You get to watch ${his} face as ${he} floods your`);
+				if (PC.preg === 0 && PC.vagina !== -1) {
+					r.push(`womanhood`);
+				} else {
+					r.push(`bowels`);
+				}
+				r.push(`with cum, your stomach taking on a distinctive swell as ${his} pent-up load empties into you.`);
+				if (PC.vagina !== -1) {
+					seX(eventSlave, "penetrative", PC, "vaginal");
+				} else {
+					seX(eventSlave, "penetrative", PC, "anal");
+				}
+				if (canImpreg(PC, eventSlave)) {
+					r.push(knockMeUp(PC, 50, 0, eventSlave.ID));
+				}
+			} else {
+				r.push(`You maneuver the massive thing inside the slave's own well-fucked`);
+				if (eventSlave.vagina > -1) {
+					r.push(`pussy,`);
+				} else {
+					r.push(`asshole,`);
+				}
+				r.push(`and then slide fingers in alongside the monstrous thing as ${he}`);
+				if (eventSlave.voice === 0) {
+					r.push(`cries desperately.`);
+				} else {
+					r.push(`begs abjectly for mercy.`);
+				}
+				r.push(`Popping the elastic off, you get to watch ${his} face as ${he} floods ${his} own`);
+				if (eventSlave.vagina > -1) {
+					r.push(`womanhood`);
+				} else {
+					r.push(`bowels`);
+				}
+				r.push(`with cum.`);
+				if (canDoVaginal(eventSlave)) {
+					seX(eventSlave, "vaginal", PC, "penetrative");
+					if (canGetPregnant(eventSlave) && canBreed(eventSlave, eventSlave) && eventSlave.vasectomy !== 1) { // can't miss the opportunity to knock ${himself} up
+						knockMeUp(eventSlave, 20, 0, eventSlave.ID);
+					}
+				} else {
+					seX(eventSlave, "anal", PC, "penetrative");
+				}
+			}
+			r.push(`The cum pressurization brought ${him} almost to half-hardness, and as this effect diminishes, ${his} dick slides out again, releasing a lewd torrent of cum. ${He} cries with overstimulation, relief, pain, and humiliation, <span class="devotion inc">groveling below you</span> in utter subjugation.`);
+			eventSlave.devotion += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/diet.js b/src/events/RESS/review/diet.js
new file mode 100644
index 0000000000000000000000000000000000000000..22f33381b1704a97be1881593211833dc7310b93
--- /dev/null
+++ b/src/events/RESS/review/diet.js
@@ -0,0 +1,193 @@
+App.Events.RESSDiet = class RESSDiet extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.devotion <= 50,
+				s => s.trust >= -50,
+				s => s.behavioralFlaw === "gluttonous",
+				s => s.diet === "restricted",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`is on a diet, and ${he} needs it. That doesn't make it any easier for ${him}. Your slaves are not permitted time to waste over meals. They enter the simple kitchen, drink their allotted portion of slave food out of a cup, and get on with their duties.`
+		);
+
+
+		if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
+			r.push(`Despite eating for`);
+			if (eventSlave.pregType <= 1) {
+				r.push(`two,`);
+			} else if (eventSlave.pregType >= 10) {
+				r.push(`far too many,`);
+			} else {
+				r.push(num(eventSlave.pregType + 1),);
+			}
+			r.push(`${his} diet is still in full effect.`);
+		}
+		r.push(`${capFirstChar(V.assistant.name)} catches ${eventSlave.slaveName}, whose cup is always filled less than halfway, skulking around in the hope that one of the others will take ${his} eyes off ${his} cup, or even leave leftovers.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Catch ${him} at it and punish ${him}`, punish),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Make ${him} eat in your office and keep ${him} busy while ${he} does`, busy, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			new App.Events.Result(`Fill ${him} up with water as punishment`, water),
+			new App.Events.Result(`Make ${him} eat until ${he} regrets it`, regret),
+			((cumSlaves().length >= 5) && ((eventSlave.fetish !== "cumslut") || (eventSlave.fetishKnown === 0)))
+				? new App.Events.Result(`Restrict ${him} to nothing but fresh cum from the Dairy`, restrict)
+				: new App.Events.Result(),
+		]);
+
+		function punish() {
+			r = [];
+			r.push(`It's childishly easy to catch ${him} at it. You simply call a slave eating ${his} breakfast away over the arcology's audio system, and then enter the kitchen by a different door. ${eventSlave.slaveName} has the departed slave's cup in ${his} hand and halfway to ${his} mouth when ${he}'s caught in the act. You relieve ${him} of ${his} prize, and finding that ${he} has not started ${his} own proper portion, pour it out onto the floor. You tell ${him} to lap it up without using ${his} hands, and begin counting down from ten. ${He} obeys,`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`only to find ${his} ${belly} stomach keeps ${him} from reaching the puddle. When you reach zero you shove ${him} over ${his} middle, face first into the pool of slave food, and administer a stinging slap across ${his} thieving`);
+				if (V.seeRace === 1) {
+					r.push(eventSlave.race);
+				}
+				r.push(`ass.`);
+			} else {
+				r.push(`but slowly and hesitantly. When you reach zero you order ${him} to get`);
+				if (hasAllLimbs(eventSlave)) {
+					r.push(`to all fours`);
+				} else {
+					r.push(`on the ground`);
+				}
+				r.push(`and administer a stinging slap across ${his} thieving`);
+				if (V.seeRace === 1) {
+					r.push(eventSlave.race);
+				}
+				r.push(`ass.`);
+			}
+			r.push(`${He} alternates ten seconds of desperate lapping with being beaten across the buttocks until ${he}'s done, by which time ${he} is <span class="trust dec">desperate to obey and avoid further punishment.</span>`);
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function busy() {
+			r = [];
+			r.push(`${He} knows what it means when ${he}'s informed that ${him} meals will now be available in your office only. You not only supervise ${him} intake strictly, but set up a bowl for ${him} on a little stand so the chubby bitch can lap up ${his} food`);
+			if (hasBothArms(eventSlave)) {
+				r.push(`hands-free`);
+			}
+			r.push(`on`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`${his} ${belly} belly,`);
+			} else if (hasAllLimbs(eventSlave)) {
+				r.push(`all fours,`);
+			} else {
+				r.push(`the ground,`);
+			}
+			r.push(`leaving ${him} open for use from behind.`);
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(VCheck.Both(eventSlave, 3, 3));
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 6));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 6));
+			}
+			r.push(`You're careful to avoid associating pleasure with misbehavior by taking ${his} cruelly every time ${he} eats, pinching ${his} nipples, and slapping ${his}`);
+			if (V.seeRace === 1) {
+				r.push(eventSlave.race);
+			}
+			r.push(`ass as you ride ${him}. This is so effective that <span class="trust dec">${he} learns to obey</span> and <span class="orange">loses weight</span> both.`);
+			eventSlave.trust -= 5;
+			eventSlave.weight -= 10;
+			eventSlave.diet = "healthy";
+			return r;
+		}
+
+		function water() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} can drink as much as ${he} wants from them if ${he}'ll tell you the truth. ${He} confesses, and is horrified to find they're full of water, not food. You add casually that ${he} can choose not to 'eat' the contents... but that ${he}'ll get no real food until ${he} finishes every one. Torn between hunger and reluctance, ${he} spends the next hour struggling with so much water that you have to check ${him} for water intoxication. ${He} finishes with`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more bulbous`);
+			} else {
+				r.push(`a bulging`);
+			}
+			r.push(`stomach and a <span class="trust dec">sincere desire to avoid further punishment.</span>`);
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function regret() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} is going to eat the contents of every last one; every day, until ${he} regrets being a glutton. ${He} gulps at the sight, but eagerly digs in. As ${his} stomach steadily distends and the cups rapidly empty, you realize you may have made a mistake. ${He} finishes with`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more bulbous`);
+			} else {
+				r.push(`a hugely bulging`);
+			}
+			r.push(`stomach and a <span class="devotion dec">smirk at your so-called punishment.</span>`);
+			eventSlave.devotion -= 5;
+			eventSlave.inflationType = "food";
+			eventSlave.inflationMethod = 1;
+			if (eventSlave.bellyPreg > 0 || eventSlave.bellyImplant > 0) {
+				eventSlave.inflation = 1;
+			} else {
+				eventSlave.inflation = 3;
+			}
+			SetBellySize(eventSlave);
+			return r;
+		}
+
+		function restrict() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You tell ${him} that you understand ${his} need to eat, and that for the rest of the week you'll mercifully be allowing ${him} to try a new diet on which ${he} can eat as much as ${he} wants. ${He}'s overjoyed`);
+			if (canHear(eventSlave)) {
+				r.push(`to hear it,`);
+			} else if (canSee(eventSlave)) {
+				r.push(`when ${he} reads it on a nearby screen display,`);
+			} else {
+				r.push(`when ${he} figures it out,`);
+			}
+			r.push(`though this pleasure is replaced with extreme disgust when ${he} learns that ${his} only culinary options are limited to cum. It's just nutritionally augmented enough to prevent starvation. Disgust is defeated by hunger pangs, and ${he} spends most of the week going around with a <span class="devotion inc">preoccupied</span> look on ${his} face and`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more`);
+			} else {
+				r.push(`a slightly`);
+			}
+			r.push(`distended belly. By the end, ${he}'s starting to <span class="fetish gain">salivate</span> at the mere`);
+			if (canSmell(eventSlave)) {
+				r.push(`scent`);
+			} else {
+				r.push(`thought`);
+			}
+			r.push(`of ejaculate.`);
+			eventSlave.devotion += 4;
+			eventSlave.fetish = "cumslut";
+			eventSlave.fetishKnown = 1;
+			eventSlave.fetishStrength = 65;
+			eventSlave.inflation = 1;
+			eventSlave.inflationType = "cum";
+			eventSlave.inflationMethod = 1;
+			SetBellySize(eventSlave);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hatesOral.js b/src/events/RESS/review/hatesOral.js
new file mode 100644
index 0000000000000000000000000000000000000000..509762cc3533e3742cc80ba4b66f4a0e60caf594
--- /dev/null
+++ b/src/events/RESS/review/hatesOral.js
@@ -0,0 +1,326 @@
+App.Events.RESSHatesOral = class RESSHatesOral extends App.Events.BaseEvent { // Written by anon, coded by Boney M
+	eventPrerequisites() {
+		return [
+			() => V.PC.dick !== 0,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.devotion <= 50,
+				s => s.sexualFlaw === "hates oral",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. ${He}'s`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves.`);
+		} else if (canHear(eventSlave)) {
+			r.push(`heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more.`);
+		} else {
+			r.push(`felt seminal fluid on ${his} skin and on ${his} lips, always coercively or accidentally.`);
+		}
+		r.push(`It's clear from ${eventSlave.slaveName}'s recent reactions to these acts that ${he}'s quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for ${him} to overcome or a weakness you can exploit.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Let ${him} earn a break for ${his} throat`, earn),
+			new App.Events.Result(`Try to brute-force ${his} oral resistance with a public blowbang`, brute),
+			new App.Events.Result(`Teach ${him} to see cum as a reward`, teach),
+			(eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.belly < 1500 && eventSlave.weight < 130) /* won't work if too pregnant */
+				? new App.Events.Result(`Make ${him} eat ${his} own cum`, own)
+				: new App.Events.Result(),
+		]);
+
+		function earn() {
+			r = [];
+			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to suck dick.`);
+			if (!canTalk(eventSlave) && hasAnyArms(eventSlave)) {
+				r.push(`${He} frantically begs with gestures, pleading`);
+				if (hasBothLegs(eventSlave)) {
+					r.push(`on ${his} knees.`);
+				} else {
+					r.push(`desperately.`);
+				}
+			} else if (!canTalk(eventSlave)) {
+				r.push(`${He} frantically mouths pleas that you leave ${his} throat cock-free.`);
+			} else {
+				r.push(`${He} begs, "Please no, ${Master}, please don't rape my mouth, ${Master}!"`);
+			}
+			r.push(`You make a show of considering, and then tell ${him} that if ${he}'s extra obedient, you might let ${him} earn a break for ${his} throat — for now.`);
+			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
+				r.push(`You tell ${him} to lie back and spread ${his} legs, because you're going to give ${him} a good old fashioned missionary-position pounding. ${He} does so with unusual obedience,`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`${his} legs hanging off the couch to give you a better angle with ${his} ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`belly`);
+					}
+					r.push(`in the way,`);
+				}
+				r.push(`and as you're giving ${him} a thorough pounding, whether out of relief, gratitude, or a desire to put on a good performance, ${he} certainly seems to be enjoying it more than usual.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
+				r.push(`You tell ${him} to bend over and spread ${his} ass for you, because if ${he} doesn't want you going in one end you're going to go in the other. ${He} does so with unusual obedience, and as you`);
+				if (eventSlave.anus === 1) {
+					r.push(`gently but firmly pound ${his} still-tight ass`);
+				} else if (eventSlave.anus === 2) {
+					r.push(`pound away at ${his} well-used backdoor`);
+				} else {
+					r.push(`mercilessly jackhammer ${his} gaping hole`);
+				}
+				r.push(`${he} actively tries to match the rhythm of your thrusts.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`You tell ${him} that if ${he}'s going to hesitate to use ${his} mouth when`);
+				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+					r.push(`${he} has no other hole to amuse you`);
+				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`${his} only available hole is still virgin`);
+				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`all ${his} other holes are still virgin`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`${his} girly little butthole is still virgin`);
+				}
+				r.push(`${he}'s going to have to find an amazingly thorough way to please a dick if ${he}'s going to earn ${his} throat a reprieve. ${He} looks`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant < -15) {
+					r.push(`uncharacteristically`);
+				}
+				r.push(`thoughtful for a moment before bending over before you, spitting in ${his} hand`);
+				if (eventSlave.vagina === 0) {
+					r.push(`and thoroughly coating ${his} inner thighs with ${his} saliva.`);
+				} else {
+					r.push(`and thoroughly coating the`);
+					if (eventSlave.butt <= 2) {
+						r.push(`crack of ${his} slender`);
+					} else if (eventSlave.butt <= 4) {
+						r.push(`crack of ${his} curvy`);
+					} else if (eventSlave.butt <= 8) {
+						r.push(`crack of ${his} huge`);
+					} else if (eventSlave.butt <= 12) {
+						r.push(`crevice of ${his} expansive`);
+					} else if (eventSlave.butt <= 20) {
+						r.push(`ravine of ${his} endless`);
+					}
+					r.push(`ass.`);
+				}
+				r.push(`The invitation is obvious, but just to be sure ${he} pleads with you to satisfy yourself alongside ${his}`);
+				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+					r.push(`chastity. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as pilfering an off-limits hole,`);
+					if (eventSlave.vagina > -1) {
+						r.push(`before long ${his}`);
+						if (eventSlave.vagina === 0) {
+							r.push(`virgin`);
+						}
+						r.push(`cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
+					} else {
+						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts slam against ${his} anal chastity is thoroughly entertaining.`);
+					}
+					r.push(`Before long, you plaster ${his} belt with your cum.`);
+				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts. Before long, you plaster ${his} still-virgin hole with your cum.`);
+				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`virgin holes. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole,`);
+					if (eventSlave.vagina === 0) {
+						r.push(`before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
+					} else {
+						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining.`);
+					}
+					r.push(`Before long, you plaster ${his} still-virgin hole with your cum.`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, ${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining. Before long, you plaster ${his} still-virgin hole with your cum.`);
+				}
+			}
+			r.push(`When you're done, you bend down and whisper in ${his} ear that if ${he} shows any sign of rebelliousness, you'll give every dick in ${V.arcologies[0].name} free access to ${his} throat. <span class="devotion inc">${He} has become more obedient,</span> in the hope this will persuade you to not follow through on your threat.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function brute() {
+			r = [];
+			r.push(`Simple problems require simple solutions — ${he}'ll get fucked in the mouth until ${he} either gets over ${his} hang-ups about oral or learns to hide them. You drag the protesting ${eventSlave.slaveName} out in public, chain ${him} low so that ${his} mouth is available, and tell ${him} that ${he}'ll suck dicks until ${he} gets through five in a row without grimacing, gagging, or resisting. You have a comfortable chair brought out to you and settle in to watch the show.`);
+			r.push(`${eventSlave.slaveName} tries, ${he} really does. But when word gets out as to the conditions of ${his} enslavement, ${his} users take a perverse enjoyment in being rougher than usual to evoke the exact reactions ${he}'s trying to avoid. By the third failed streak, you've started to grow bored of the spectacle, but luckily you find entertainment in conversation with those who have already been entertained by poor ${eventSlave.slaveName}. Before long more chairs have been brought up and an impromptu salon has been set up alongside the blowbang line. By the sixth failed streak, an enterprising citizen has set up a small bar and is serving drinks. By the ninth, you've delegated watching ${eventSlave.slaveName} to your assistant. You personally break the eleventh streak after ${he} reached four, to general acclaim from your newfound friends and a toast to your virility.`);
+			r.push(`When the fourteenth streak is finally successful, there are serious talks about making these blowbang salons a regular occurrence and some backslapping directed towards you for your innovation in genteel hedonism. While you seriously doubt ${eventSlave.slaveName} enjoys oral sex any more than ${he} did at the start of the day, ${he}'s certainly <span class="skill inc">learned to keep ${his} feelings on the matter to ${himself}.</span> ${He} did, however, <span class="health dec">have quite a rough time</span>`);
+			if (eventSlave.skill.oral <= 30) {
+				r.push(`of it, though ${he} did learn a thing or two about sucking dick.`);
+				slaveSkillIncrease('oral', eventSlave, 10);
+			} else {
+				r.push(`of it.`);
+			}
+			r.push(`And last of all, you and ${eventSlave.slaveName} did make <span class="reputation inc">quite a good impression</span> today, though for widely differing reasons.`);
+			eventSlave.sexualFlaw = "none";
+			seX(eventSlave, "oral", "public", "penetrative", random(65, 80));
+			repX(500, "event", eventSlave);
+			healthDamage(eventSlave, 10);
+			return r;
+		}
+
+		function teach() {
+			r = [];
+			r.push(`You bring ${eventSlave.slaveName} into your office and stand ${him} in front of your leather couch. ${He}`);
+			if (canSee(eventSlave)) {
+				r.push(`eyes you`);
+			} else if (canHear(eventSlave)) {
+				r.push(`listens`);
+			} else {
+				r.push(`waits silently and`);
+			}
+			if (eventSlave.devotion < -20) {
+				r.push(`suspiciously`);
+			} else {
+				r.push(`worriedly`);
+			}
+			r.push(`as you ready a bullet vibrator.`);
+			if (eventSlave.dick > 0) {
+				r.push(`You secure the bullet to ${eventSlave.slaveName}'s frenulum.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`You secure the bullet to ${his} perineum.`);
+			} else {
+				r.push(`You secure the bullet to ${eventSlave.slaveName}'s clit.`);
+			}
+			r.push(`You explain that the arcology continually monitors your vital signs, and will use them to estimate your arousal; the system controls the bullet vibrator, which will emit stimulating vibrations scaled to your pleasure. The more pleasure you feel, the more pleasant the vibrations will be, though they will not bring ${him} to orgasm until you climax. To demonstrate, you give the head of your cock a quick squeeze. ${eventSlave.slaveName} squeals in surprise at the sudden stimulation as the bullets spring to life. You tell ${him} to get to work. Though timid at first, as ${he} proceeds to blow you, ${he} becomes more and more enthusiastic as ${his} own pleasure builds. It isn't long until ${he}'s deepthroating you enthusiastically and begging you to cum in ${his} mouth. You make ${him} hold out a bit longer, and then you complete the training session,`);
+			if (PC.balls >= 30) {
+				r.push(`pumping cum into ${his} stomach until it visibly begins to swell.`);
+			} else if (PC.balls >= 14) {
+				r.push(`pumping cum into ${his} stomach until it threatens to come back up.`);
+			} else if (PC.balls >= 9) {
+				r.push(`cumming into ${his} mouth until it spurts from ${his} nose.`);
+			} else {
+				r.push(`filling ${his} mouth with your cum.`);
+			}
+			r.push(`${He} climaxes in turn, and virtually melts into a quivering mess on your floor.`);
+			if (eventSlave.dick > 0) {
+				r.push(`${eventSlave.slaveName}'s cock oozes cum from ${his} intense orgasm, and you command ${him} to clean it off the floor before ${he} gets back to ${his} duties.`);
+			}
+			if (random(1, 4) === 4) {
+				r.push(`<span class="fatish gain">You've successfully linked cum and pleasure in ${his} mind,</span> guaranteeing ${him} a confusing few days as ${he} tries to reconcile this with ${his} hatred of oral sex.`);
+				eventSlave.fetish = "cumslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+			} else {
+				r.push(`This has <span class="flaw break">broken ${him} of ${his} bad habits.</span>`);
+				eventSlave.sexualFlaw = "none";
+			}
+			r.push(`This demonstration of your control over ${him} has <span class="devotion inc">worn down ${his} resistance to your commands.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return r;
+		}
+
+		function own() {
+			r = [];
+			r.push(`Your cum training tactics have two components: Cum should be linked with pleasure, and cum should not be disgusting to ${eventSlave.slaveName}, because even ${eventSlave.slaveName} produces it. To drive home these lessons, you lead ${eventSlave.slaveName} to your office's leather couch, arranging ${his}`);
+			if (eventSlave.height < 150) {
+				r.push(`petite`);
+			} else if (eventSlave.height < 160) {
+				r.push(`short`);
+			} else if (eventSlave.height >= 170) {
+				r.push(`tall`);
+			} else if (eventSlave.height >= 185) {
+				r.push(`very tall`);
+			}
+			r.push(`form upside down with ${his} head on the cushion, ${his} back on the backrest, and ${his}`);
+			if (hasBothLegs(eventSlave)) {
+				r.push(`legs`);
+			} else {
+				r.push(`ass`);
+			}
+			r.push(`in the air. In this position, ${his}`);
+			if (eventSlave.dick > 10) {
+				r.push(`obscene`);
+			} else if (eventSlave.dick > 9) {
+				r.push(`inhuman`);
+			} else if (eventSlave.dick > 8) {
+				r.push(`monstrous`);
+			} else if (eventSlave.dick > 7) {
+				r.push(`imposing`);
+			} else if (eventSlave.dick > 6) {
+				r.push(`massive`);
+			} else if (eventSlave.dick > 5) {
+				r.push(`gigantic`);
+			} else if (eventSlave.dick > 4) {
+				r.push(`huge`);
+			} else if (eventSlave.dick > 3) {
+				r.push(`large`);
+			} else if (eventSlave.dick > 2) {
+				r.push(`average`);
+			} else if (eventSlave.dick > 1) {
+				r.push(`small`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`tiny`);
+			}
+			r.push(`cock`);
+			if (eventSlave.belly >= 100 || eventSlave.weight > 30) {
+				r.push(`rests over ${his}`);
+				if (eventSlave.pregKnown === 1) {
+					r.push(`early pregnancy`);
+				} else {
+					r.push(`belly`);
+				}
+				r.push(`and`);
+			}
+			r.push(`hangs directly over ${his} anxious face.`);
+			if ((eventSlave.aphrodisiacs > 0) || eventSlave.inflationType === "aphrodisiac") {
+				r.push(`The aphrodisiacs in ${his} system already have ${him} so aroused ${he}'s already dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
+			} else if (eventSlave.prostate > 1) {
+				r.push(`${His} overactive prostate has ${him} steadily dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
+			} else {
+				r.push(`You sit next to ${his} vulnerable form on the couch as ${he} looks at you in anticipation.`);
+			}
+			r.push(`You`);
+			if (canDoAnal(eventSlave)) {
+				if (eventSlave.anus > 2) {
+					r.push(`insert a wide vibrating plug into ${his} gaping anus,`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`insert a big vibrating plug into ${his} ass,`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`insert a vibrating plug into ${his} tight ass,`);
+				} else {
+					r.push(`place a bullet vibrator over the pucker of ${his} virgin anus,`);
+				}
+			} else {
+				r.push(`strap a strong vibrator to ${his} anal chastity,`);
+			}
+			r.push(`secure a bullet vibrator ${his} quivering perineum, and another to the base of ${his} dick, and set them all to gradually increase the strength of their vibrations. In no time at all ${he} releases a`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`squirt of ejaculate from ${his} cock cage,`);
+			} else if (eventSlave.balls > 0) {
+				r.push(`torrent of thick, white semen,`);
+			} else if (eventSlave.prostate > 2) {
+				r.push(`torrent of nearly clear, watery ejaculate,`);
+			} else if (eventSlave.prostate === 0) {
+				r.push(`pathetic dribble of semen,`);
+			} else {
+				r.push(`pathetic dribble of watery ejaculate,`);
+			}
+			r.push(`all of which lands right on ${his} outstretched tongue and pools in ${his} throat. You nudge ${his} chin to make ${him} close ${his} mouth and swallow. After a week of such treatment, ${he} <span class="fetish gain">acquires a taste for semen.</span>`);
+			eventSlave.fetish = "cumslut";
+			eventSlave.fetishKnown = 1;
+			eventSlave.fetishStrength = 10;
+			eventSlave.devotion += 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hugeNaturals.js b/src/events/RESS/review/hugeNaturals.js
new file mode 100644
index 0000000000000000000000000000000000000000..f60aa4e2bcabd8a54ebcf4c4e4ee50dabdc8ce82
--- /dev/null
+++ b/src/events/RESS/review/hugeNaturals.js
@@ -0,0 +1,275 @@
+App.Events.RESSHugeNaturals = class RESSHugeNaturals extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.boobs >= 2000,
+				s => s.assignment !== Job.QUARTER,
+				s => s.boobsImplant === 0,
+				s => s.nipples !== "tiny" && s.nipples !== "fuckable",
+				s => s.devotion > 20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`comes before you naked for a routine inspection. You take particular care to examine ${his} massive breasts, since they've grown so large it's necessary to check for unsightly veins, stretch marks, and the like. You note ${his} big nipples with appreciation. Since ${his} breasts are so enormous and completely free of implants, they're quite heavy. When ${he} stands,`
+		);
+		if (eventSlave.boobShape === "saggy" || eventSlave.boobShape === "downward-facing") {
+			r.push(`${his} nipples face out and down.`);
+		} else {
+			r.push(`gravity causes them to hang low.`);
+		}
+		r.push(`As you inspect ${him} with your hands, ${he}`);
+		if (!canTalk(eventSlave)) {
+			r.push(`breathes a little harder and looks like ${he} would speak, were ${he} not mute.`);
+		} else {
+			if (eventSlave.lips > 70) {
+				r.push(`murmurs through ${his} huge lips,`);
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+				r.push(`murmurs through ${his} piercings,`);
+			} else {
+				r.push(`murmurs,`);
+			}
+			r.push(Spoken(eventSlave, `"That feels really nice, ${Master}."`));
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Give ${him} a nice massage`, massage),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave) && eventSlave.belly < 100000)
+				? new App.Events.Result(`Use ${him} so they swing around`, swing, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Show ${him} off in public`, show, virginityWarning())
+				: new App.Events.Result()
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && eventSlave.anus === 0) {
+				return `This option will take ${his} anal virginity`;
+			}
+			return null;
+		}
+
+		function massage() {
+			r = [];
+			r.push(`You sit on the couch next to your desk and pat your thighs. ${He} smiles and comes over, lowering ${himself}`);
+			if (V.PC.belly >= 10000) {
+				r.push(`beside you and cozying up to your pregnant belly and sliding a hand down to see to your pussy without hesitation. You help ${him} get comfortable and instead of demanding ${he} please you or get down on all fours, you just sit there with ${him},`);
+			} else if (V.PC.dick === 0) {
+				r.push(`into your lap without hesitation. You help ${him} get comfortable and instead of`);
+				if (V.PC.dick === 0) {
+					r.push(`grinding`);
+				} else {
+					r.push(`thrusting`);
+				}
+				r.push(`or telling ${him} to ride, you just sit there with ${him} in your lap,`);
+			} else {
+				r.push(`onto your member`);
+				if (V.PC.vagina !== -1) {
+					r.push(`and sliding a hand down to see to your pussy`);
+				}
+				r.push(`without hesitation. You help ${him} get comfortable and instead of`);
+				if (V.PC.dick === 0) {
+					r.push(`grinding`);
+				} else {
+					r.push(`thrusting`);
+				}
+				r.push(`or telling ${him} to ride, you just sit there with ${him} in your lap,`);
+			}
+			r.push(`gently massaging ${his} massive tits. They get sore from swinging around as ${he} moves, works, and fucks, and soon ${he}'s groaning with pleasure at the attention. You finally manage to bring ${him} to orgasm with almost nothing but delicate stimulation of ${his} nipples. <span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			seX(eventSlave, "mammary", V.PC, "penetrative");
+			if (eventSlave.lactation > 0) {
+				eventSlave.lactationDuration = 2;
+				eventSlave.boobs -= eventSlave.boobsMilk;
+				eventSlave.boobsMilk = 0;
+			} else {
+				r.push(induceLactation(eventSlave, 3));
+			}
+			return r;
+		}
+
+		function swing() {
+			r = [];
+			r.push(`You tell ${him} to kneel on the smooth floor. ${He} knows this means doggy style, so ${he} compliantly arches ${his} back and cocks ${his} hips to offer ${himself} to you. You`);
+			if (V.PC.dick === 0) {
+				r.push(`don a strap-on and`);
+			}
+			r.push(`enter`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`${his} pussy`);
+			} else {
+				r.push(`${his} ass`);
+			}
+			r.push(`without preamble and seize ${his} hips. ${He} braces ${himself}, knowing what's coming, but soon ${he} discovers a new disadvantage to ${his} pendulous breasts: as you pound ${him} hard, ${his} long nipples frequently brush against the floor, causing ${him} to wince and buck.`);
+			if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
+				if (canAchieveErection(eventSlave)) {
+					r.push(`${His} cock doesn't help, either, flopping around half-erect as ${he} vacillates between pain and arousal.`);
+				} else if (eventSlave.dick > 20) {
+					r.push(`${His} cock doesn't help, either, flopping around on the floor as ${he} vacillates between pain and arousal.`);
+				} else {
+					r.push(`${His} cock doesn't help, either, flopping around feebly as ${he} vacillates between pain and arousal.`);
+				}
+			} else if (eventSlave.clit > 2) {
+				r.push(`${His} huge clit doesn't help, either, flopping around half-erect as ${he} vacillates between pain and arousal.`);
+			}
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`When you switch to ${his} ass, the shallower strokes give ${his} nipples a bit of respite.`);
+			}
+			r.push(`You finish with a particularly hard thrust`);
+			if (V.PC.dick === 0) {
+				r.push(`and shake with climax,`);
+			} else {
+				r.push(`to spill your seed deep inside ${his}`);
+				if (canDoAnal(eventSlave)) {
+					r.push(`butt, ramming forward hard enough to spill ${him} down onto ${his} bosom. As you rise, ${his} discomfited form is a pretty sight, with ${his} breasts squashed against the floor and ${his} well fucked butt lewdly relaxed.`);
+				} else {
+					r.push(`pussy, ramming forward hard enough to spill ${him} down onto ${his} bosom. As you rise, ${his} discomfited form is a pretty sight, with ${his} breasts squashed against the floor and ${his} well fucked cunt lewdly gaped.`);
+				}
+			}
+			r.push(`<span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			r.push(VCheck.Both(eventSlave, 1));
+			return r;
+		}
+
+		function show() {
+			r = [];
+			r.push(`You bring ${him} out onto the promenade, still nude, ${his} huge bare udders attracting open stares as ${his} every movement sets them in motion.`);
+			if (eventSlave.sexualFlaw === "attention whore") {
+				r.push(`The slut loves being the center of attention and couldn't ask for more.`);
+			} else if (eventSlave.fetishKnown === 1 && eventSlave.fetishStrength > 60 && eventSlave.fetish === "humiliation") {
+				r.push(`The slut loves being embarrassed, and ${he} blushes furiously as ${his} nipples stiffen with arousal.`);
+			} else if (eventSlave.energy > 95) {
+				r.push(`The nympho slut loves being shown off, and ${he} flaunts ${his} boobs shamelessly.`);
+			} else if (eventSlave.counter.anal > 100 && eventSlave.counter.oral > 100) {
+				r.push(`${He}'s such a veteran sex slave that ${he} takes the stares in stride.`);
+			} else {
+				r.push(`${He} blushes a little, but tips ${his} chin up and follows you obediently.`);
+			}
+			r.push(`When you reach a good spot, you grab ${his}`);
+			if (eventSlave.weight > 30) {
+				r.push(`fat ass`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`plush hips`);
+			} else if (eventSlave.weight >= -10) {
+				r.push(`trim hips`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big butt`);
+			} else {
+				r.push(`skinny ass`);
+			}
+			r.push(`and`);
+			if (eventSlave.height >= 185) {
+				r.push(`pull ${his} tall body in`);
+			} else if (eventSlave.height >= 160) {
+				r.push(`pull ${him} up on tiptoe`);
+			} else {
+				r.push(`push ${his} petite form up onto a railing`);
+			}
+			r.push(`for standing sex. ${He} cocks ${his} hips and takes your`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`cock`);
+			}
+			r.push(`compliantly, and after a few thrusts you reach down, seize ${him} behind each knee, and`);
+			if (V.PC.belly >= 5000 && eventSlave.belly >= 100000) {
+				r.push(`collapse against a nearby bunch under the excessive weight between your pregnancy and ${his} ${belly} stomach. Appreciating the bench's sacrifice, you return to fucking ${him}.`);
+				if (eventSlave.bellyPreg >= 600000) {
+					r.push(`Penetrating ${him} while feeling so much movement between you is unbelievably lewd. ${His} children squirm at their mother's excitement, causing ${his} bloated body to rub against you in ways you couldn't imagine.`);
+				}
+			} else if (eventSlave.belly >= 100000) {
+				r.push(`pull ${him} as close as you can with ${his} ${belly} belly between you. Struggling to support the immense weight, you back ${him} against a rail so that you can continue to fuck ${him} while holding ${him}.`);
+				if (eventSlave.bellyPreg >= 600000) {
+					r.push(`Penetrating ${him} while feeling so much movement between you is unbelievably lewd. ${His} children squirm at their mother's excitement, causing ${his} bloated body to rub against you in ways you couldn't imagine.`);
+				}
+			} else {
+				r.push(`hoist ${his} legs up so ${he}'s pinned against your`);
+				if (V.PC.belly >= 1500) {
+					r.push(`pregnancy,`);
+				} else if (V.PC.boobs < 300) {
+					r.push(`chest,`);
+				} else {
+					r.push(`boobs,`);
+				}
+				r.push(`helpless to do anything but let you hold ${him} in midair and fuck ${him}.`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina > 1) {
+					r.push(`${His} pussy can take a hard pounding, so you give it to ${him}.`);
+				} else {
+					r.push(`${His} poor tight pussy can barely take the pounding you're administering.`);
+				}
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				if (eventSlave.anus > 1) {
+					r.push(`${His} loose butthole can take a hard pounding, so you give it to ${him}.`);
+				} else {
+					r.push(`${His} poor tight butthole can barely take the pounding you're administering.`);
+				}
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`${He} loses all composure, gasping and panting as the massive weight of ${his} chest bounces up and down, making an audible clap with each stroke as ${his} huge tits slap painfully together. Despite this, or perhaps partly because of it, ${he} begins to orgasm,`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`the discomfort of being half-hard under ${his} chastity cage making ${him} squirm as cum rushes out of the hole at its tip.`);
+			} else if (canAchieveErection(eventSlave)) {
+				if (eventSlave.dick > 4) {
+					r.push(`${his} monster of a cock releasing a jet of cum with each thrust into ${him}.`);
+				} else if (eventSlave.dick > 3) {
+					r.push(`${his} huge cock releasing a jet of cum with each thrust into ${him}.`);
+				} else if (eventSlave.dick > 2) {
+					r.push(`${his} cock releasing a spurt of cum with each thrust into ${him}.`);
+				} else {
+					r.push(`${his} tiny dick spurting cum with each thrust into ${him}.`);
+				}
+			} else if (eventSlave.dick > 9) {
+				r.push(`${his} huge, soft cock spurting cum as it wiggles to your motions.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`${his} soft cock scattering cum all over the place as it flops around.`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(`${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly adding to ${his} near-total discomfiture.`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`${his} soft body jiggling as ${he} climaxes.`);
+			} else if (eventSlave.muscles > 5) {
+				r.push(`${his} abs convulsing deliciously as ${he} climaxes.`);
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`${his} pussy tightening.`);
+			} else {
+				r.push(`${his} poor anal ring tightening.`);
+			}
+			r.push(`The crowd that surrounds you during this noisy spectacle <span class="reputation inc">is suitably impressed.</span>`);
+			repX(1250, "event", eventSlave);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hugelyPregnant.js b/src/events/RESS/review/hugelyPregnant.js
new file mode 100644
index 0000000000000000000000000000000000000000..db88d6cd3986e72f3cb06d1acbe9112f188baf05
--- /dev/null
+++ b/src/events/RESS/review/hugelyPregnant.js
@@ -0,0 +1,267 @@
+App.Events.RESSHugelyPregnant = class RESSHugelyPregnant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seePreg !== 0,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.bellyPreg >= 10000,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(eventSlave), "'s"),
+			`daily routine includes frequent application of special skin care to ${his} ${eventSlave.skin}, hugely swollen belly to prevent ${his} pregnancy from ruining ${his} appearance with unsightly stretch marks. Several times a day, ${he} visits the bathroom to`
+		);
+		if (!hasAnyArms(eventSlave)) {
+			r.push(`have another slave`);
+		} else {
+			r.push(`carefully`);
+		}
+		r.push(`coat ${his} entire ${belly} stomach in the stuff. ${He}'s so pregnant that it's hard to reach`);
+		if (eventSlave.belly >= 150000) {
+			r.push(`most of its mass.`);
+		} else {
+			r.push(`the underside.`);
+		}
+		r.push(`The chore keeps ${him} occupied and stationary for quite a while; there's no need to leave ${him} sexually idle while ${he} completes it.`);
+
+		App.Events.addParagraph(node, r);
+
+		let choices = [new App.Events.Result(`Help ${him} with those hard to reach places`, reach)];
+		if ((canDoAnal(eventSlave) && eventSlave.mpreg === 1) || canDoVaginal(eventSlave)) {
+			choices.push(new App.Events.Result(`Gently fuck ${him} while helping ${him} apply lotion`, lotion, virginityWarning()));
+		}
+		if (canDoAnal(eventSlave)) {
+			choices.push(new App.Events.Result(`${His} backdoor can't get more pregnant`, backdoor, virginityWarning(true)));
+		} else {
+			choices.push(new App.Events.Result(`${His} backdoor isn't pregnant`, unPregnant, virginityWarning(true)));
+		}
+		if ((canDoAnal(eventSlave) && eventSlave.mpreg === 1) || canDoVaginal(eventSlave) && eventSlave.belly >= 300000) {
+			choices.push(new App.Events.Result(`Tip ${him} over and fuck ${him}`, tip, virginityWarning()));
+		}
+		App.Events.addResponses(node, choices);
+
+		function virginityWarning(anusOnly = false) {
+			if (anusOnly) {
+				if (eventSlave.anus === 0) {
+					return `This option will take ${his} virginity`;
+				}
+			}
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0) && eventSlave.mpreg === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function reach() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you gently encircle ${him} from behind with a hug`);
+			if (V.PC.belly >= 5000) {
+				r.push(r.pop() + `, pushing your own gravid belly into the small of ${his} back`);
+			}
+			r.push(r.pop() + `. When you take the lotion and begin to lovingly massage it into ${his} harder to reach areas, ${he} sighs with pleasure and leans against you.`);
+			if (hasAnyArms(eventSlave) && V.PC.belly >= 1500) {
+				r.push(`${He} takes the lotion and begins to return the favor. You spend the rest of ${his} break carefully massaging each other's baby bumps.`);
+			}
+			if (!canTalk(eventSlave)) {
+				if (eventSlave.voice === 0) {
+					r.push(`${He} looks like ${he} would love to thank you, were ${he} not mute.`);
+				} else if (eventSlave.accent >= 3) {
+					r.push(`${He} looks like ${he} would love to thank you, if ${he} knew how.`);
+				}
+			} else {
+				if (eventSlave.lips > 70) {
+					r.push(`${He} murmurs through ${his} huge lips,`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`${He} murmurs through ${his} piercings,`);
+				} else {
+					r.push(`${He} murmurs,`);
+				}
+				r.push(Spoken(eventSlave, `"That felt really nice, ${Master}."`));
+				if (V.PC.belly >= 1500) {
+					r.push(`You have to agree, it did feel nice on your growing middle.`);
+				}
+			}
+			r.push(`<span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function lotion() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you gently encircle ${him} from behind with a hug`);
+			if (V.PC.belly >= 5000) {
+				r.push(r.pop() + `, pushing your own gravid belly into the small of ${his} back`);
+			}
+			r.push(r.pop() + `. When you take the lotion and begin to lovingly massage it into ${his} harder to reach areas, ${he} sighs with pleasure and leans back into you. ${He} feels`);
+			if (V.PC.dick === 0) {
+				r.push(`the warmth of your growing arousal`);
+			} else {
+				r.push(`your erection hard`);
+			}
+			r.push(`against ${him}, so ${he}`);
+			if (isAmputee(eventSlave)) {
+				r.push(`wriggles ${his} limbless form around on the floor so as to offer ${himself} to you.`);
+			} else {
+				r.push(`slowly kneels down with you into a comfortable lotus position on the bathroom floor.`);
+			}
+			if (eventSlave.mpreg === 1) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			r.push(`Coupling like this, you can't`);
+			if (V.PC.dick === 0) {
+				r.push(`scissor`);
+			} else {
+				r.push(`fuck`);
+			}
+			r.push(`${him} all that hard, but that's just fine given`);
+			if (V.PC.preg >= 5000) {
+				r.push(`your condition.`);
+			} else {
+				r.push(`${his} condition.`);
+			}
+			r.push(`${He} snuggles back into you as you have gentle sex while looking after ${his} drum-taut skin.`);
+			if (!canTalk(eventSlave)) {
+				if (eventSlave.voice === 0) {
+					r.push(`${He} looks like ${he} would love to thank you, were ${he} not mute.`);
+				} else if (eventSlave.accent >= 3) {
+					r.push(`${He} looks like ${he} would love to thank you, if ${he} knew how.`);
+				}
+			} else {
+				if (eventSlave.lips > 70) {
+					r.push(`${He} murmurs through ${his} huge lips,`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`${He} murmurs through ${his} piercings,`);
+				} else {
+					r.push(`${He} murmurs,`);
+				}
+				r.push(Spoken(eventSlave, `"That feels really nice, ${Master}."`));
+			}
+			r.push(`<span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function backdoor() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and bend ${him} over the sink for a quick assfuck.`);
+			r.push(VCheck.Anal(eventSlave, 1));
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to brace ${himself} against the sink, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			r.push(`Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function unPregnant() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and bend ${him} over the sink for a quick assfuck.`);
+			r.push(VCheck.Anal(eventSlave, 1));
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to brace ${himself} against the sink, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			r.push(`Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function tip() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and shove ${him} onto ${his} ${belly} stomach for a quick fuck.`);
+			if (eventSlave.mpreg === 1) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to steady ${himself} atop the squirming mass, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			if (eventSlave.mpreg === 1) {
+				r.push(`Taking it up the ass`);
+			} else {
+				r.push(`Getting roughly fucked`);
+			}
+			r.push(`while hugely pregnant isn't the most comfortable way to have sex, neither is being forced to put more pressure on an already overfilled organ, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief and rolls onto ${his} side. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/likeMe.js b/src/events/RESS/review/likeMe.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd2e04d02880c5d5e9f3a4be6de1c0e544093196
--- /dev/null
+++ b/src/events/RESS/review/likeMe.js
@@ -0,0 +1,427 @@
+App.Events.RESSLikeMe = class RESSLikeMe extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.trust <= 20,
+				s => s.trust >= -75,
+				s => s.devotion <= 30,
+				s => s.devotion >= -20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`appears at the door of your office, looking frightened. ${He} takes one hesitant step in and stops, wavering, ${his} hand balled into fists and ${his} lower lip caught behind ${his} teeth. The ${SlaveTitle(eventSlave)} is getting used to ${his} place as chattel, but ${he} isn't sure of ${himself} yet. After a few moments, it becomes obvious that ${he}'s lost whatever mental momentum propelled ${him} to come in here, and can't muster the courage to back out, either. You rescue ${him} by politely but firmly ordering ${him} to tell you why ${he}'s here. After two false starts, ${he}`
+		);
+		if (!canTalk(eventSlave)) {
+			r.push(`uses shaky hands to ask you to fuck ${him}.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"P-please fuck me, ${Master},"`),
+				`${he} chokes out.`
+			);
+		}
+		r.push(`To go by ${his} behavior, the likelihood that ${he}'s actually eager to`);
+		if (PC.dick === 0) {
+			r.push(`eat pussy,`);
+		} else {
+			r.push(`take a dick,`);
+		}
+		r.push(`never mind yours, is vanishingly small.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Fuck ${him}`, fuck, virginityWarning()),
+			new App.Events.Result(`Rape ${him}`, rape, virginityWarning()),
+			new App.Events.Result(`Get the truth out of ${him}`, truth),
+		]);
+
+		function virginityWarning(){
+			if ((eventSlave.anus === 0 || eventSlave.vagina === 0) && PC.dick !== 0) {
+				return `This option will take ${his} virginity`;
+			}
+		}
+
+		function fuck() {
+			r = [];
+			r.push(`${He} asked for it, and ${he}'ll get it. You get to your`);
+			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+				r.push(`feet, unhook ${his} chastity,`);
+			} else {
+				r.push(`feet`);
+			}
+			r.push(`and snap your fingers, pointing`);
+			if (PC.dick === 0) {
+				r.push(`at the floor in front of you`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "floor"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`pulling onto ${his} ${belly} stomach`);
+				} else {
+					r.push(`shoving ${him} down to kneel at your feet`);
+				}
+				r.push(`with ${his} face`);
+				if (PC.belly >= 5000) {
+					r.push(`crammed under your pregnant belly, level with your cunt.`);
+				} else {
+					r.push(`level with your cunt.`);
+				}
+				r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off, looking oddly proud of ${himself}. It seems ${he} got something out of that: <span class="trust inc">a confidence boost,</span> at least.`);
+			} else {
+				r.push(`at the couch next to the desk`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "couch"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over and`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`gently eases ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					} else {
+						r.push(`swollen`);
+					}
+					r.push(`body to the ground,`);
+				} else {
+					r.push(`kneels,`);
+				}
+				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height.`);
+				if (PC.vagina !== -1) {
+					r.push(`You ensure that you're fully hard and get ${him} in the right frame of mind by grinding the pussy beneath your dick against ${him}.`);
+				}
+				r.push(`You fuck`);
+				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+					r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
+					r.push(VCheck.Both(eventSlave, 1));
+					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
+				} else if (canDoVaginal(eventSlave)) {
+					r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
+					r.push(VCheck.Vaginal(eventSlave, 1));
+					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
+				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+					r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
+					r.push(VCheck.Anal(eventSlave, 1));
+					r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
+				}
+				r.push(`${He} stumbles off to wash, looking oddly proud of ${himself}. It seems ${he} got something out of that: <span class="trust inc">a confidence boost,</span> at least.`);
+			}
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function rape() {
+			r = [];
+			r.push(`${He}'ll get more than ${he} asked for. You get to your`);
+			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+				r.push(`feet, unhook ${his} chastity,`);
+			} else {
+				r.push(`feet`);
+			}
+			r.push(`and snap your fingers, pointing`);
+			if (PC.dick === 0) {
+				r.push(`at the floor in front of you`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "floor"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`${His}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`gravid`);
+					} else {
+						r.push(`bloated`);
+					}
+					r.push(`form`);
+				} else {
+					r.push(`${He}`);
+				}
+				r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
+			} else {
+				r.push(`at the couch next to the desk`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "couch"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over and`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`gently eases ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					} else {
+						r.push(`swollen`);
+					}
+					r.push(`body to the ground,`);
+				} else {
+					r.push(`kneels,`);
+				}
+				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
+				if (eventSlave.belly >= 600000) {
+					r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
+				} else {
+					r.push(`jabbing a thumb into one of ${his} kidneys,`);
+				}
+				r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
+				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
+					r.push(VCheck.Both(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+				} else if (canDoVaginal(eventSlave)) {
+					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
+					r.push(VCheck.Vaginal(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
+					if (canGetPregnant(eventSlave)) {
+						r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
+					}
+					r.push(r.pop() + `.`);
+				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+					r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
+					r.push(VCheck.Anal(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+				}
+				r.push(`It isn't the first time you've heard that, or the hundredth.`);
+			}
+			r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking <span class="trust dec">fearful</span> but strangely <span class="devotion inc">complacent,</span> as though ${he}'s accepted this to an extent.`);
+			eventSlave.trust -= 4;
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function truth() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You ask ${him} why ${he}'s really here, with devastating directness and in a tone that will brook no disobedience. ${He} quails, ${his} shoulders slumping as ${he}`);
+			if (eventSlave.belly >= 1500) {
+				if (eventSlave.pregKnown === 1) {
+					r.push(`hugs ${his} pregnancy`);
+				} else {
+					r.push(`attempts to hug ${himself} with ${his} ${belly} belly in the way`);
+				}
+			} else {
+				r.push(`hugs ${himself}`);
+			}
+			r.push(`and ${his} knees turning inward as ${he} cringes, the perfect picture of the standard human fear response. It seems ${he} thought you wouldn't notice ${his} insincerity. ${He} swallows nervously and makes no response, but then you`);
+			if (canSee(eventSlave)) {
+				r.push(`allow impatience to cloud your brow`);
+			} else {
+				r.push(`cough with impatience`);
+			}
+			r.push(`and ${he} hurriedly explains ${himself}.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} uses sign language to communicate that ${he} asked the other slaves what ${he} could do to improve ${his} life, and that they told ${him} to do ${his} best to win your favor. ${He} asked them how to do that, and they told ${him} to ask you to fuck ${him}.`);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"${Master}, I, um, asked the other girls what I could do to, you know, do better here,"`),
+					`${he} ${say}s.`,
+					Spoken(eventSlave, `"They said to g-get you to like me. A-and when I asked them how to do that, th-they said t-to ask you to fuck me."`)
+				);
+			}
+			r.push(`Then ${he} bites ${his} lip and`);
+			if (canSee(eventSlave)) {
+				r.push(`watches you`);
+			} else if (canHear(eventSlave)) {
+				r.push(`listens`);
+			} else {
+				r.push(`waits`);
+			}
+			r.push(`anxiously.`);
+
+			App.Events.addParagraph(frag, r);
+			App.Events.addResponses(frag, [
+				new App.Events.Result(`They're not wrong`, wrong, virginityWarning()),
+				new App.Events.Result(`Now rape ${him}`, rape2, virginityWarning()),
+				new App.Events.Result(`It's not that simple`, simple)
+			]);
+			return frag;
+
+			function wrong() {
+				r = [];
+
+				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is`);
+				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+					r.push(`palpable as you undo ${his} chastity.`);
+				} else {
+					r.push(`palpable.`);
+				}
+				r.push(`You snap your fingers, pointing`);
+				if (PC.dick === 0) {
+					r.push(`at the floor in front of you`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "floor"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
+					if (eventSlave.belly >= 300000) {
+						r.push(`pulling onto ${his} ${belly} stomach`);
+					} else {
+						r.push(`shoving ${him} down to kneel at your feet`);
+					}
+					r.push(`with ${his} face`);
+					if (PC.belly >= 5000) {
+						r.push(`crammed under your pregnant belly, level with your cunt.`);
+					} else {
+						r.push(`level with your cunt.`);
+					}
+					r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off,`);
+				} else {
+					r.push(`at the couch next to the desk`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "couch"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over and`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`gently eases ${his}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnant`);
+						} else {
+							r.push(`swollen`);
+						}
+						r.push(`body to the ground,`);
+					} else {
+						r.push(`kneels,`);
+					}
+					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height. You fuck`);
+					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+						r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
+						r.push(VCheck.Both(eventSlave, 1));
+						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
+						r.push(VCheck.Vaginal(eventSlave, 1));
+						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
+					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+						r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
+						r.push(VCheck.Anal(eventSlave, 1));
+						r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
+					}
+					r.push(`${He} stumbles off to wash,`);
+				}
+				r.push(`looking <span class="trust inc">much more confident.</span>`);
+				eventSlave.trust += 4;
+				return r;
+			}
+
+			function rape2() {
+				r = [];
+				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is palpable, but ${he}'s getting ahead of`);
+				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+					r.push(`${himself} as you undo ${his} chastity.`);
+				} else {
+					r.push(`${himself}.`);
+				}
+				r.push(`You snap your fingers, pointing`);
+				if (PC.dick === 0) {
+					r.push(`at the floor in front of you`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "floor"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`${His}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`gravid`);
+						} else {
+							r.push(`bloated`);
+						}
+						r.push(`form`);
+					} else {
+						r.push(`${He}`);
+					}
+					r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
+				} else {
+					r.push(`at the couch next to the desk`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "couch"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over and`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`gently eases ${his}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnant`);
+						} else {
+							r.push(`swollen`);
+						}
+						r.push(`body to the ground,`);
+					} else {
+						r.push(`kneels,`);
+					}
+					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
+					if (eventSlave.belly >= 600000) {
+						r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
+					} else {
+						r.push(`jabbing a thumb into one of ${his} kidneys,`);
+					}
+					r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
+					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
+						r.push(VCheck.Both(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
+						r.push(VCheck.Vaginal(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
+						if (canGetPregnant(eventSlave)) {
+							r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
+						}
+						r.push(r.pop() + `.`);
+					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+						r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
+						r.push(VCheck.Anal(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+					}
+					r.push(`It isn't the first time you've heard that, or the hundredth.`);
+				}
+				r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking <span class="trust dec">fearful</span> but <span class="devotion inc">submissive,</span> knowing that ${he} now has a better idea of what you want, even if what you want isn't very nice.`);
+				eventSlave.trust -= 4;
+				eventSlave.devotion += 4;
+				return r;
+			}
+			function simple() {
+				r = [];
+				r.push(`You tell ${him} kindly that it isn't that simple, but that if ${he} obeys orders and does ${his} best, you will like ${him} just fine, and ${he} will do well as your slave. Relief floods through ${him}.`);
+				if (!canTalk(eventSlave)) {
+					r.push(`${He} gestures ${his} thanks, and an apology for being silly.`);
+				} else {
+					r.push(
+						Spoken(eventSlave, `"Thank you, ${Master} and I'm sorry for being silly,"`),
+						`${he} apologizes.`
+					);
+				}
+				r.push(`You dismiss ${him}, and ${he} goes, a strangely <span class="devotion inc">respectful</span> look on ${his} face. ${He}'s no more confident of ${his} ability to find safety and stability here with you than ${he} was before, but ${he} seems to like that it apparently isn't as simple as`);
+				if (PC.dick !== 0) {
+					r.push(`taking your cock up ${his} butt`);
+					if (PC.vagina !== -1) {
+						r.push(`or`);
+					}
+				}
+				if (PC.vagina !== -1) {
+					r.push(`eating you out`);
+				}
+				r.push(r.pop() + `.`);
+				eventSlave.devotion += 4;
+				return r;
+			}
+		}
+	}
+};
diff --git a/src/events/RESS/review/masterfulEntertainer.js b/src/events/RESS/review/masterfulEntertainer.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ddbadb8c0d3257e74c7c5a5de9d68c0b41cc7f7
--- /dev/null
+++ b/src/events/RESS/review/masterfulEntertainer.js
@@ -0,0 +1,191 @@
+App.Events.RESSMasterfulEntertainer = class RESSMasterfulEntertainer extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.assignment === Job.PUBLIC,
+				s => s.skill.entertainment >= 100,
+				s => s.trust > 50,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`It's Friday evening, the most socially important part of the week in ${V.arcologies[0].name}.`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`happens to be free this evening, and your schedule is open, too. Lately, ${he}'s been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever ${he} gets the chance to catch someone's eye`
+		);
+		if (eventSlave.belly >= 5000) {
+			r.push(r.pop() + `, even with ${his}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`advanced pregnancy`);
+			} else if (eventSlave.bellyImplant >= 3000) {
+				r.push(`${belly} rounded belly`);
+			} else {
+				r.push(`sloshing ${eventSlave.inflationType}-filled stomach`);
+			}
+		}
+		r.push(r.pop() + `. There are a number of events tonight you could attend with ${him} on your arm.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Go clubbing`, clubbing),
+			(eventSlave.belly < 15000)
+				? new App.Events.Result(`Attend a milonga`, milonga)
+				: new App.Events.Result(),
+			new App.Events.Result(`Never mind Friday night; the moon's out and it's romantic on the balcony`, romantic, virginityWarning()),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function clubbing() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing glitzy heels, an extremely short skirt`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`barely noticeable under ${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			}
+			r.push(r.pop() + `, and a string bikini top so brief that ${his} areolae are clearly visible. As you descend through ${V.arcologies[0].name} the beats get faster and the drops get heavier. By the time you reach the club where the Free Cities' hottest DJ has a show tonight, ${eventSlave.slaveName} is a whirlwind of sexual energy in motion, moving`);
+			if (canHear(eventSlave)) {
+				r.push(`with every beat`);
+			} else {
+				r.push(`wildly`);
+			}
+			r.push(`and catching every eye`);
+			if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
+				r.push(r.pop() + `, despite how far along ${he} is`);
+			} else if (eventSlave.belly >= 5000 || eventSlave.weight > 130) {
+				r.push(r.pop() + `, despite how big ${he} is`);
+			}
+			r.push(r.pop() + `. ${His} skills could have half the club lining up to fuck ${him} for money, but tonight ${he}'s all yours. The entire floor is envious of you as the night wears on and ${his} dancing turns into sexually servicing you`);
+			if (canHear(eventSlave)) {
+				r.push(`in time with the music`);
+			}
+			r.push(r.pop() + `.`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`The smell of ${his} pre-cum is noticeable even over the stink of sweat.`);
+			} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
+				r.push(`${His} tiny skirt does nothing to hide ${his} erection.`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`${His} tiny skirt displays ${his} big, engorged clit.`);
+			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`${His} arched back and cocked hips make it very clear that ${he} wants ${his} asspussy fucked.`);
+			} else {
+				r.push(`The smell of ${his} arousal is noticeable even over the stink of sweat.`);
+			}
+			if (eventSlave.boobs > 1000) {
+				r.push(`${His} breasts get groped and mauled all night.`);
+			} else if (eventSlave.butt > 5) {
+				r.push(`${He} grinds ${his} ass against your crotch all night.`);
+			} else {
+				r.push(`Cum joins the sweat running off ${him}.`);
+			}
+			r.push(`The crowd is duly impressed; <span class="green">your reputation has increased.</span>`);
+			repX(500, "event", eventSlave);
+			return r;
+		}
+
+		function milonga() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing classy heels and a gorgeous long dress cunningly designed to adhere to ${him} while ${he} dances despite the fact that it displays all of one leg, ${his} entire back,`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly,`);
+			}
+			r.push(`cleavage, and the sides of both breasts. ${He} has ${his} hair up in a perfect bun accented with a spray of the latest jewelry, and is wearing severe makeup that makes ${him} look aristocratic and elegant by turns. The host of the milonga, an old-world tango enthusiast, knows well the social graces and invites you, as the most prominent attendee, to perform the traditional demonstration tango that begins the dance. It goes wonderfully, and the entire party sighs in appreciation as you perform the classic tango. You lower ${eventSlave.slaveName}`);
+			if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
+				r.push(`'s heavy body`);
+			}
+			r.push(`gracefully and pull ${him} back up into a close embrace, and breath catches in more than one throat. As tradition dictates ${he} dances with many partners throughout the night. One concession to Free Cities sensibilities is that the male and female roles in the tango may be filled by anyone, and ${eventSlave.slaveName} switches flawlessly between playing the female role to the elderly host one dance and the male role to his teenage granddaughter the next. The poor girl spends the rest of the evening staring at ${eventSlave.slaveName} with her tongue tied. Whoever ${eventSlave.slaveName} dances with, ${he} always subtly shows by glance and gesture that it's you ${he} truly wants. Everyone is quite envious of you; <span class="green">your reputation has increased.</span>`);
+			repX(500, "event", eventSlave);
+			return r;
+		}
+
+		function romantic() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door absolutely naked`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.push(r.pop() + `, ${his} motherly body on full display`);
+			}
+			r.push(r.pop() + `. ${He} has half a question on ${his} face, wondering whether this is going too far, but it vanishes when you`);
+			if (canSee(eventSlave)) {
+				r.push(`smile reassuringly at`);
+			} else {
+				r.push(`compliment`);
+			}
+			r.push(`${him}. You take ${him} by the hand and lead ${him} out onto the private balcony outside your office. It's a cloudless night, and the moon is full. You order the arcology to play a classic dance medley, and ${eventSlave.slaveName} becomes all innocence and grace, the perfect dance partner`);
+			if (eventSlave.bellyPreg >= 10000) {
+				r.push(r.pop() + `, despite ${his} heavy pregnancy`);
+			} else if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
+				r.push(r.pop() + `, despite ${his} weight`);
+			}
+			r.push(r.pop() + `. The only real consequence of ${his} nudity is`);
+			if (eventSlave.boobs >= 300) {
+				r.push(`the extra sway of ${his} breasts,`);
+			}
+			if (canPenetrate(eventSlave)) {
+				r.push(`${his} visible erection, and`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`${his} visibly engorged clit and`);
+			} else if (eventSlave.boobs >= 300) {
+				r.push(`and`);
+			}
+			if (eventSlave.nipples !== "fuckable") {
+				r.push(`the hardness of ${his} nipples`);
+			} else {
+				r.push(`how swollen ${his} nipples are`);
+			}
+			r.push(`in the cool night when the dance brings you close. ${He} enjoys ${himself} immensely and in no time at all, ${he}'s meekly asking you to take ${him} inside and dance with ${him} on the bed. Naturally, you oblige.`);
+			eventSlave.devotion += 3;
+			eventSlave.trust += 3;
+			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
+				seX(eventSlave, "penetrative", PC, "vaginal");
+				if (canImpreg(PC, eventSlave)) {
+					r.push(knockMeUp(PC, 20, 0, eventSlave.ID));
+				}
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else if (eventSlave.boobs >= 1000) {
+				seX(eventSlave, "mammary", PC, "penetrative");
+			} else {
+				seX(eventSlave, "oral", PC, "penetrative");
+			}
+			r.push(`${His} <span class="devotion inc">devotion to you</span> and <span class="mediumaquamarine">trust in you</span> have increased.`);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/sexySuccubus.js b/src/events/RESS/review/sexySuccubus.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8e32b190932a4384852074f6091313a43bab463
--- /dev/null
+++ b/src/events/RESS/review/sexySuccubus.js
@@ -0,0 +1,414 @@
+App.Events.RESSSexySuccubus = class RESSSexySuccubus extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canTalk,
+				s => s.assignment !== Job.QUARTER,
+				s => s.clothes === "a succubus outfit",
+				s => s.devotion > 20,
+				s => s.trust > 20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+		const {heP, himP, womanP, hisP} = getPronouns(PC).appendSuffix("P");
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`You cross paths with`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`as ${he} moves from the living area to ${eventSlave.assignment}, just starting ${his} day. ${He}'s full of energy, and ${his} succubus outfit is delightful. ${He}`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`sees your glance`);
+		} else {
+			r.push(`recognizes your whistle`);
+		}
+		r.push(`and greets you with a`);
+		if (canSee(eventSlave)) {
+			r.push(`wicked glint in ${his} eye,`);
+		} else {
+			r.push(`wicked smirk on ${his} face,`);
+		}
+		r.push(`bowing a bit to show off ${his}`);
+		if (eventSlave.boobs > 6000) {
+			r.push(`bare, inhumanly large breasts`);
+		} else if (eventSlave.lactation > 0) {
+			r.push(`bare udders, heavy with milk`);
+		} else if (eventSlave.boobsImplant > 0) {
+			r.push(`naked fake tits`);
+		} else if (eventSlave.boobs > 800) {
+			r.push(`heavy, naked breasts`);
+		} else if (eventSlave.boobs > 300) {
+			r.push(`naked little tits`);
+		} else {
+			r.push(`pretty chest`);
+		}
+		r.push(`and then continuing towards you with a pirouette. ${His} tail bounces flirtily, holding the back of ${his} skirt up to show off`);
+		if (eventSlave.butt > 8) {
+			r.push(`${his} absurdly wide bottom.`);
+		} else if (eventSlave.analArea > 3) {
+			r.push(`the broad area of puckered skin around ${his} slutty asspussy.`);
+		} else if (eventSlave.buttImplant > 0) {
+			r.push(`${his} butt implants.`);
+		} else if (eventSlave.butt > 5) {
+			r.push(`${his} big butt.`);
+		} else if (eventSlave.anus > 1) {
+			r.push(`a hint of ${his} asshole, which ${his} cute buttocks don't quite conceal.`);
+		} else {
+			r.push(`${his} cute bottom.`);
+		}
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		r.push(`${He} looks like`);
+		if (eventSlave.bellyPreg >= 1500 || eventSlave.bellyImplant >= 1500) {
+			r.push(`a lusty, pregnant, hungry`);
+		} else if (eventSlave.bellyFluid >= 1500) {
+			r.push(`a gluttonous, over-fed but still hungry`);
+		} else if (eventSlave.height > 180) {
+			r.push(`an imposing, hungry`);
+		} else if (eventSlave.muscles > 30) {
+			r.push(`a muscular, hungry`);
+		} else if (eventSlave.weight > 10) {
+			r.push(`a well-fed but still hungry`);
+		} else if (eventSlave.energy > 95) {
+			r.push(`a desperately hungry`);
+		} else {
+			r.push(`a cute, hungry little`);
+		}
+		r.push(`sex demon, and you tell ${him} so.`);
+		if (eventSlave.intelligence > 50) {
+			r.push(`The clever ${girl} knows all about succubi.`);
+		} else if (eventSlave.intelligenceImplant >= 15) {
+			r.push(`${He}'s been taught the basics about succubi.`);
+		} else {
+			r.push(`${He} quickly searches ${his} memory for the basic information about succubi that came with ${his} outfit.`);
+		}
+		if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+			r.push(`"Oh ${Master}, I'm thtarving," ${he} lisps,`);
+		} else {
+			r.push(`"Oh ${Master}, I'm ssstarving," ${he} moans,`);
+		}
+		r.push(`running ${his} tongue over ${his}`);
+		if (eventSlave.lips > 40) {
+			r.push(`whorish`);
+		} else if (eventSlave.lips > 20) {
+			r.push(`plush`);
+		}
+		r.push(`lips and sticking out ${his} chest to present ${his} boobs even more obviously.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Let ${him} eat`, eat),
+			(canDoVaginal(eventSlave) && PC.dick !== 0)
+				? new App.Events.Result(`Feed ${him}`, feed, (eventSlave.vagina === 0) ?`This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			(canDoAnal(eventSlave) && eventSlave.anus > 0 && PC.dick !== 0)
+				? new App.Events.Result(`Fuck ${him} without feeding ${him}`, fuck, (eventSlave.vagina === 0) ?`This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+		]);
+
+		function eat() {
+			r = [];
+			r.push(`You tell ${him} ${he}'s a good little succubus, and you're going to let ${him} feed. ${He} knows exactly what you mean, and`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`leans onto ${his} ${belly} stomach`);
+			} else {
+				if (eventSlave.belly >= 5000) {
+					r.push(`gently lowers ${himself}`);
+				} else {
+					r.push(`gets`);
+				}
+				r.push(`to ${his} knees`);
+			}
+			r.push(`quickly, pressing ${him} ${eventSlave.nipples} nipples against your thighs and grasping your hips to give ${himself} leverage for some very aggressive oral. After`);
+			if (PC.dick !== 0) {
+				r.push(`a couple of lush sucks at each of your balls`);
+				if (PC.vagina !== -1) {
+					r.push(`and some eager nuzzling of your pussylips`);
+				}
+				r.push(r.pop() + `, ${he} moves straight to a hard blowjob, deepthroating your cock and almost ramming ${his} head against you.`);
+				if (PC.vagina !== -1) {
+					r.push(`${He} keeps ${his} tongue stuck out, and whenever ${he} gets you fully hilted, ${he} manages to reach your pussylips with it.`);
+				}
+				r.push(`${He}`);
+				if (eventSlave.fetish === "cumslut") {
+					r.push(`doesn't have to pretend to be starving for your cum.`);
+				} else {
+					r.push(`does a good job of acting like ${he}'s authentically starving for your cum.`);
+				}
+				r.push(`${He} groans with satisfaction when you blow your load down ${his} gullet,`);
+			} else {
+				r.push(`nuzzling ${his} nose against your moist cunt, ${he} starts to eat you out like ${he}'s starving, sparing no time for subtlety, lapping up your female juices with evident relish. You run your fingers through ${his} ${eventSlave.slaveName} hair, telling ${him} ${he}'ll have to survive on pussyjuice. ${He} replies, but you hold ${his} head hard against you as ${he} does, turning whatever ${he} says into an unintelligible, delectable mumbling into your womanhood. ${He} groans with satisfaction when you stiffen with orgasm, giving ${him} a final gush of girlcum,`);
+			}
+			r.push(`and`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`hefts ${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				} else {
+					r.push(`bloated`);
+				}
+				r.push(`bulk up`);
+			} else {
+				r.push(`gets to ${his} feet`);
+			}
+			r.push(`licking ${his} lips and patting ${his} ${belly} stomach.`);
+			if (eventSlave.belly >= 1500) {
+				r.push(
+					Spoken(eventSlave, `"That was such a big meal ${Master}, look how full it made me!"`),
+					`${He} teases, pretending ${his}`
+				);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`gravid belly is filled with your fluids.`);
+				} else if (eventSlave.bellyImplant >= 1500) {
+					r.push(`distended belly is filled with your fluids.`);
+				} else {
+					r.push(`wobbling, ${eventSlave.inflationType}-filled belly is filled with your fluids.`);
+				}
+				if (PC.balls >= 30) {
+					r.push(`Seeing as ${he} took the entirety of your inhuman load, there is some truth to ${his} words.`);
+				}
+			}
+			r.push(`${He}'s obviously <span class="trust inc">becoming more comfortable</span> playing the part of a vampiric sex`);
+			if (eventSlave.fetish === "cumslut" && eventSlave.fetishStrength > 95) {
+				r.push(`demon, and it's a role the incorrigible cumslut <span class="devotion inc">loves.</span>`);
+				eventSlave.devotion += 2;
+			} else if (eventSlave.fetish === "cumslut") {
+				r.push(`demon, and it's a role that <span class="fetish inc">reinforces ${his} oral fixation.</span>`);
+				eventSlave.fetishStrength += 4;
+			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
+				r.push(`demon, and the role <span class="fetish gain">focuses ${his} attention on ${his} mouth.</span>`);
+				eventSlave.fetishStrength = 10;
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetish = "cumslut";
+			} else {
+				r.push(`demon.`);
+			}
+			eventSlave.trust += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return r;
+		}
+
+		function feed() {
+			r = [];
+			r.push(`You tell ${him} ${he}'s a good little succubus, and you're going to feed ${him}.`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`Reaching up under ${his} breasts for the top edge of ${his} outfit`);
+			} else {
+				r.push(`Grabbing ${his} outfit's top edge`);
+			}
+			r.push(`and seizing ${him} behind a knee with your other hand, you sling ${him} across`);
+			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
+				r.push(`an unfortunate nearby tabletop. Once the table finishes its creaking and promises to hold ${his} weight, ${he}`);
+			} else {
+				r.push(`a convenient tabletop nearby. ${He}`);
+			}
+			r.push(`spreads ${his} legs for you, smiling with anticipation, ${his}`);
+			if (eventSlave.vaginaLube > 0) {
+				r.push(`cunt already soaking wet.`);
+			} else if (eventSlave.labia > 0) {
+				r.push(`prominent petals swollen with arousal.`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`big bitch button stiff with arousal.`);
+			} else {
+				r.push(`cunt flushing with arousal.`);
+			}
+			r.push(`${He} reaches down around ${his} own ass and spreads ${his} pussy for you, only releasing ${his} fingertip grip on ${his} labia when ${he} feels you hilt yourself inside ${his}`);
+			if (eventSlave.vagina > 2) {
+				r.push(`cavernous`);
+			} else if (eventSlave.vagina > 1) {
+				r.push(`comfortable`);
+			} else if (eventSlave.vagina > 0) {
+				r.push(`caressing`);
+			} else {
+				r.push(`needy`);
+			}
+			r.push(`channel.`);
+			r.push(VCheck.Vaginal(eventSlave, 1));
+			r.push(`You're here to rut, not make love, and you give it to ${him} hard, forcing`);
+			if (eventSlave.voice >= 3) {
+				r.push(`high squeals`);
+			} else {
+				r.push(`animal grunts`);
+			}
+			r.push(`out of ${him}. ${He} climaxes strongly, and the glorious feeling finishes you as well, bringing rope after rope of your cum jetting into ${him}. ${He} groans at the feeling, and as ${he}`);
+			if (eventSlave.belly >= 5000 || eventSlave.weight > 190) {
+				r.push(`slowly`);
+			}
+			r.push(`gets to ${his} feet ${he} uses a hand to transfer a`);
+			if (canTaste(eventSlave)) {
+				r.push(`taste`);
+			} else {
+				r.push(`bit`);
+			}
+			r.push(`of the mixture of your seed and`);
+			if (PC.vagina !== -1) {
+				r.push(`both of your`);
+			} else {
+				r.push(`${his}`);
+			}
+			r.push(`pussyjuice to ${his} mouth.`);
+			if (eventSlave.belly >= 750000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels like I'm going to burst! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
+					`${He} groans, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`,
+					Spoken(eventSlave, `"${Master}! They won't stop! Oh... So full... I can't stop conceiving!"`),
+					`${He} rolls onto ${his} back and clutches ${his} absurd stomach.`,
+					Spoken(eventSlave, `"So tight! So full! So Good! I need more! Oh, ${Master}..."`),
+					`${He} may be getting a little too into the fantasy.`
+				);
+				if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
+					r.push(
+						`A gush of fluid flows from ${his} pussy, snapping ${him} out of ${his} roleplay.`,
+						Spoken(eventSlave, `"${Master}! I need... One's coming now!"`),
+						`You rub ${his} contracting stomach, enjoying the feeling of the life within shifting to take advantage of the free space. You sigh and lean down, the vessel of your spawn needs help after pinning ${himself} in such a compromising position. Holding ${his} belly clear of ${his} crotch, you watch ${him} steadily push out ${his} child before spasming with orgasm and freeing it effortlessly into the world. After collecting it for a servant to handle, you help the exhausted ${girl} back to ${his} feet. ${He} thanks you sincerely for the assist before going to clean ${himself} up. You barely have time to turn away before another splash catches your attention.`,
+						Spoken(eventSlave, `"${Master}... Another's, mmmmh, coming..."`)
+					);
+				}
+			} else if (eventSlave.belly >= 600000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels like I'm going to burst! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
+					`${He} teases, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`
+				);
+			} else if (eventSlave.belly >= 450000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels so good!! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
+					`${He} teases, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`
+				);
+			} else if (eventSlave.belly >= 300000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels so good! I feel them moving! They're ready to come out ${Master}!"`),
+					`${He} teases, cradling ${his} ${belly} belly and pretending it just grew that huge.`
+				);
+			} else if (eventSlave.belly >= 150000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me, look how big I'm getting!"`),
+					`${He} teases, cradling ${his} ${belly} belly and pretending it just rapidly became that large.`
+				);
+			} else if (eventSlave.belly >= 5000) {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you!"`),
+					`${He} teases, cradling ${his} ${belly} belly and pretending it just grew that big.`
+				);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"Oh ${Master}! I feel it! Your seed is being devoured by my eggs! I can't wait to see how happy they make you!"`),
+					`${He} teases, rubbing ${his} belly and pretending to conceive.`
+				);
+			}
+			r.push(`${He}'s obviously <span class="trust inc">becoming more comfortable</span> playing the part of a sex demon whose hunger knows no`);
+			eventSlave.trust += 4;
+			if (eventSlave.fetish === "pregnancy" && eventSlave.fetishStrength > 95) {
+				r.push(`end, and it's a role the pregnancy fetishist <span class="devotion inc">loves.</span>`);
+				eventSlave.devotion += 2;
+			} else if (eventSlave.fetish === "pregnancy") {
+				r.push(`end, and it's a role that <span class="fetish inc">reinforces ${his} love of insemination.</span>`);
+				eventSlave.fetishStrength += 4;
+			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
+				r.push(`end, and the role <span class="fetish gain">focuses ${his} attention on insemination.</span>`);
+				eventSlave.fetishStrength = 10;
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetish = "pregnancy";
+			} else {
+				r.push(`end.`);
+			}
+			return r;
+		}
+
+		function fuck() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You tell ${him} ${he}'s a good little succubus. Thinking ${he} understands, ${he}`);
+			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+				r.push(`turns and hugs the nearest wall,`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`sliding ${his} ${belly} belly down it until it parts ${his} legs. ${He} shuffles onto it to offer you ${his} needy cunt.`);
+				} else {
+					r.push(`going up on tiptoe and cocking ${his} hips to offer you ${his} needy cunt.`);
+				}
+				r.push(`${He} moans as your dick`);
+				if (eventSlave.vagina > 2) {
+					r.push(`enters ${his} big cunt.`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`fills ${his} wet cunt.`);
+				} else {
+					r.push(`slides slowly inside ${his} tight cunt.`);
+				}
+				r.push(`As you fuck ${him}, you ask ${him} how succubi feed. "W-well," ${he} gasps, struggling to gather ${his} wits,`);
+			} else {
+				if (eventSlave.belly >= 300000) {
+					r.push(`leans onto ${his} ${belly} belly`);
+				} else {
+					r.push(`gets down on ${his} knees`);
+				}
+				r.push(`and starts to suck you off. ${He} deepthroats you eagerly, stretching to tickle your balls with ${his} tongue as ${he} gets you all the way in, and then shifting a hand to roll them around as ${he} sucks. As ${he} blows you, you ask ${him} how succubi feed. "Well," ${he} gasps, popping your dickhead free of ${his} mouth and replacing the sucking with a stroking hand,`);
+			}
+			r.push(Spoken(eventSlave, `"${Master}, they can eat a ${womanP}'s essence by swallowing ${hisP} cum or getting ${himP} to ejaculate inside their pussies."`));
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(
+				`You ask ${him} whether ${he} would like to feed off you.`,
+				Spoken(eventSlave, `"Oh yes ${Master}, please. Please feed me,"`),
+				`${he} begs. Too bad, you tell ${him}; ${he} gets to go hungry. After all, succubi can't feed using their butts.`
+			);
+			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+				r.push(`You withdraw from ${his} cunt and stuff your cock up ${his} ass without pausing or softening your thrusting at all.`);
+			} else {
+				r.push(`You pull ${him} to ${his} feet by the hair, spin ${him} around, shove ${him} up against the wall, and stuff your cock up ${his} ass.`);
+			}
+			if (eventSlave.anus > 2) {
+				r.push(`It's not like ${his} experienced butt can't take an assraping, but`);
+			} else if (eventSlave.anus > 1) {
+				r.push(`${His} practiced ass relaxes and accommodates your dick, but`);
+			} else {
+				r.push(`${His} tight asshole spasms with pain as it stretches to accommodate you, and`);
+			}
+			r.push(`${he} whines at your sudden aggression, wiggling within your dominating grip. You fill ${his} ass with cum as ${he} struggles, still playing ${his} part, begging you not to cum in ${his} bottom, since succubi can't live on buttsex.`);
+			eventSlave.trust += 4;
+			if (eventSlave.fetish === "submissive" && eventSlave.fetishStrength > 95) {
+				r.push(`It's a role the submissive slut <span class="devotion inc">loves.</span>`);
+				eventSlave.devotion += 2;
+			} else if (eventSlave.fetish === "submissive") {
+				r.push(`It's a role that <span class="fetish inc">reinforces ${his} submissive streak.</span>`);
+				eventSlave.fetishStrength += 4;
+			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
+				r.push(`The role <span class="fetish gain">focuses ${his} attention on submission.</span>`);
+				eventSlave.fetishStrength = 10;
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetish = "submissive";
+			} else {
+				r.push(`${He} <span class="devotion inc">plays the role well.</span>`);
+			}
+			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", PC, "penetrative");
+			} else {
+				seX(eventSlave, "oral", PC, "penetrative");
+			}
+			r.push(VCheck.Anal(eventSlave, 1));
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/shiftMasturbation.js b/src/events/RESS/review/shiftMasturbation.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b27ed344b5f38b79bd05e5f8157e85a7711f6b6
--- /dev/null
+++ b/src/events/RESS/review/shiftMasturbation.js
@@ -0,0 +1,308 @@
+App.Events.RESSShiftMasturbation = class RESSShiftMasturbation extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				canTalk,
+				s => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment),
+				s => s.devotion > 20,
+				s => s.trust >= -20,
+				s => canDoAnal(s) || canDoVaginal(s),
+				s => (s.chastityPenis !== 1 || s.dick === 0),
+				canWalk,
+				s => s.rules.release.masturbation === 1,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(`Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you.`);
+		if (S.Concubine) {
+			r.push(`Your concubine, ${S.Concubine.slaveName}`);
+		} else if (V.HeadGirlID !== 0) {
+			r.push(`Your Head Girl, ${S.HeadGirl.slaveName}`);
+		} else if (V.assistant.name === "your personal assistant") {
+			r.push(`Your personal assistant`);
+		} else {
+			r.push(`Your personal assistant, ${capFirstChar(V.assistant.name)},`);
+		}
+		r.push(`manages a schedule for them, constantly changing it up to keep the sluts from getting predictable.`);
+		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		r.push(`has just come on shift.`);
+		r.toParagraph();
+
+		r.push(`And has ${he} ever come on shift. ${He} enters your office at something not far removed from a run, displaying evident signs of sexual excitation, a blush visible on ${his} ${eventSlave.skin} cheeks. Between ${his} job, the mild drugs in ${his} food, and ${his} life, ${he}'s beside ${himself} with need. ${He} realizes you're working and tries to compose ${himself}, but gives up after a short struggle and flings ${himself} down on the couch. ${He} scoots down so ${his}`);
+		if (eventSlave.butt > 5) {
+			r.push(`enormous`);
+		} else if (eventSlave.butt > 2) {
+			r.push(`healthy`);
+		} else {
+			r.push(`trim`);
+		}
+		r.push(`butt is hanging off the edge of the cushion, and spreads ${his} legs up and back`);
+		if (eventSlave.belly >= 5000) {
+			r.push(`to either side of ${his} ${belly}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			}
+			r.push(`belly`);
+		}
+		r.push(`as wide as they'll go`);
+		if (eventSlave.boobs > 1000) {
+			r.addToLast(`, hurriedly shoving ${his} tits out of the way`);
+		}
+		r.addToLast(`. ${He} uses both hands to frantically`);
+		if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+			if (eventSlave.hormoneBalance >= 100) {
+				r.push(`rub ${his} hormone-dysfunctional penis,`);
+			} else if (eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
+				r.push(`rub ${his} limp, useless penis,`);
+			} else if (eventSlave.balls === 0) {
+				r.push(`rub ${his} limp, ballsless penis,`);
+			} else {
+				r.push(`rub ${his} soft penis,`);
+			}
+		} else if (eventSlave.dick > 4) {
+			r.push(`jack off ${his} titanic erection,`);
+		} else if (eventSlave.dick > 2) {
+			r.push(`jack ${himself} off,`);
+		} else if (eventSlave.dick > 0) {
+			r.push(`rub ${his} pathetic little hard-on,`);
+		} else if (eventSlave.vagina === -1) {
+			r.push(`frantically rubs the sensitive area beneath ${his} asspussy,`);
+		} else if (eventSlave.clit > 0) {
+			r.push(`rub ${his} huge, engorged clit,`);
+		} else if (eventSlave.labia > 0) {
+			r.push(`play with ${his} clit and ${his} generous labia,`);
+		} else {
+			r.push(`rub ${his} pussy,`);
+		}
+		r.push(`but after a moment ${he} clearly decides this isn't enough stimulation. ${He}`);
+		if (eventSlave.dick > 0) {
+			r.push(`uses two fingers to collect the precum dribbling from ${his} dickhead.`);
+		} else {
+			r.push(`fucks ${himself} vigorously with two fingers to collect some girl lube.`);
+		}
+		r.push(`${He} brings these fingers up to ${his} face to check ${his} work, hesitates, visibly decides ${he} doesn't care, and reaches down to`);
+		if (eventSlave.anus > 2) {
+			r.push(`slide them into ${his} loose asspussy. ${He} sighs with pleasure at the sensation.`);
+		} else if (eventSlave.anus > 1) {
+			r.push(`shove them up ${his} butt. ${He} wriggles a little at the makeshift lubrication but is clearly enjoying ${himself}.`);
+		} else {
+			r.push(`push them up ${his} tight butt. The pain of anal penetration with only makeshift lubrication extracts a huge sobbing gasp from ${him}, and ${he} tears up a little even as ${he} masturbates furiously.`);
+		}
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Leave ${him} to it`, leave),
+			new App.Events.Result(`Lend ${him} some assistance`, lend, virginityWarning()),
+			new App.Events.Result(`Show the slut off`, show),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && eventSlave.anus === 0) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function leave() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You have work to do. You ignore the shameless slut, who gets ${himself} off in no time at all,`);
+			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) { // Review! Previously: <<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave.balls == 0)>>
+				r.push(`${his} limp dick dribbling cum onto ${his}`);
+				if (eventSlave.pregKnown === 1) {
+					r.push(`pregnant`);
+				}
+				r.push(`stomach.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`orgasming so strongly ${he} manages to hit ${himself} in the face with ${his} own cum.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`indulging in the anal self-stimulation that's ${his} best remaining avenue to an orgasm.`);
+			} else {
+				r.push(`the smell of female pleasure filling the office.`);
+			}
+			r.push(`${He} gets up, washes ${himself} off and rearranges ${his} body on the couch again, languidly this time. ${He} returns to masturbating, gently playing with ${himself} with one hand and`);
+			if (eventSlave.nipples !== "fuckable") {
+				r.push(`teasing`);
+			} else {
+				r.push(`fingering`);
+			}
+			r.push(`a nipple with the other.`);
+			r.toParagraph();
+			return r.container();
+		}
+
+		function lend() {
+			let didAnal = false;
+			let didVaginal = false;
+			const r = new SpacedTextAccumulator();
+			r.push(`You stand and ask ${him} mockingly if ${he} could use some assistance. ${He} gapes at you for a lust-hazed moment before nodding happily,`);
+			if (!canTalk(eventSlave)) {
+				r.push(`gesturing ${his} thanks.`);
+			} else {
+				r.push(
+					`squealing,`,
+					Spoken(eventSlave, `"Yes please, ${Master}!"`)
+				);
+			}
+			r.push(`${He} stops wanking and takes ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} away, laying ${himself} wide for you like a horny human buffet. You make a show of selecting, but decide on ${his}`);
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina > 2) {
+					r.push(`slutty pussy.`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`experienced pussy.`);
+				} else {
+					r.push(`tight pussy.`);
+				}
+				didVaginal = true;
+			} else {
+				if (eventSlave.anus > 2) {
+					r.push(`slutty anal slit.`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`well prepared asshole.`);
+				} else {
+					r.push(`still-tight butt.`);
+				}
+				didAnal = true;
+			}
+			r.push(`${He} calmed down a little while offering ${himself} to you, so ${he} manages not to climax immediately when you`);
+			if (V.PC.dick === 0) {
+				r.push(`push your strap-on into ${him},`);
+			} else {
+				r.push(`thrust your dick into ${him},`);
+			}
+			r.push(`but ${he}'s in a rare mood. You reward ${him} by guiding ${his} hands back to ${his} crotch as you ramp up the pace, at which ${he} looks up at you with something like wordless glee. ${He} goes back to`);
+			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+				r.push(`playing with ${his} limp dick,`);
+			} else if (eventSlave.dick > 4) {
+				r.push(`jerking off ${his} giant cock,`);
+			} else if (eventSlave.dick > 2) {
+				r.push(`jerking off,`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`teasing ${his} girly little dick,`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`jerking off ${his} ridiculous clit,`);
+			} else if (eventSlave.labia > 0) {
+				r.push(`spreading and teasing ${his} petals,`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`playing with ${his} asspussy,`);
+			} else {
+				r.push(`rubbing ${his} clit,`);
+			}
+			if (!canTalk(eventSlave)) {
+				r.push(`making little raspy pleasure noises.`);
+			} else {
+				r.push(`mewling with pleasure.`);
+			}
+			if (didAnal) { // Review! Moved this block up from below "skips off to wash" for better flow
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else if (didVaginal) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			r.push(`When you're finally done, ${he}'s fairly tired, but ${he} manages to give ${his}`);
+			if (eventSlave.butt > 5) {
+				r.push(`huge,`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big,`);
+			} else {
+				r.push(`cute,`);
+			}
+			r.push(`well-fucked butt a little wiggle for you, <span class="trust inc">`);
+			if (canSee(eventSlave)) {
+				r.push(`looking`);
+			} else {
+				r.push(`smiling`);
+			}
+			r.push(`at you gratefully,</span> as ${he} skips off to wash.`);
+			eventSlave.trust += 4;
+
+
+			r.toParagraph();
+			return r.container();
+		}
+
+		function show() {
+			const r = new SpacedTextAccumulator();
+			r.push(`It takes a trifling command at your desk to surreptitiously slave one of the office cameras to ${his} impromptu masturbation session, and send the feed to many of the public screens. After a few minutes,`);
+			if (canSee(eventSlave)) {
+				r.push(`${he} notices the setup through one of the office's glass walls.`);
+			} else {
+				r.push(`you inform the eager masturbator that ${his} show is live across the arcology.`);
+			}
+			if (eventSlave.fetish === "humiliation" && eventSlave.fetishStrength > 60 && eventSlave.fetishKnown === 1) {
+				r.push(`${He} climaxes almost instantly at the realization, which plays right into ${his} fetish.`);
+			} else {
+				r.push(`${He} pauses for a moment at the realization, but goes back to ${his} business, blushing a little harder.`);
+			}
+			r.push(`${He} even plays it up a little for ${his} audience; when ${he}`);
+			if (eventSlave.belly >= 120000 && eventSlave.dick > 0) {
+				r.push(`climaxes, ${he} makes sure they can see the way ${his} enormously distended body spasms with orgasm.`);
+			} else if (eventSlave.belly >= 10000 && eventSlave.dick > 0) {
+				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. However, ${his}`);
+				if (eventSlave.bellyPreg >= 5000) {
+					r.push(`advanced pregnancy`);
+				} else {
+					r.push(`${belly} belly`);
+				}
+				r.push(`thwarts ${his} efforts and ${he} ends up cumming on ${his} stomach's underside. ${He} brushes some cum off with ${his} fingers and brings it to ${his} mouth, smiling at the`);
+				if (canTaste(eventSlave)) {
+					r.push(`taste.`);
+				} else {
+					r.push(`sensation.`);
+				}
+			} else if (eventSlave.dick > 0 && eventSlave.dick < 5 && eventSlave.belly >= 5000) {
+				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. However, ${he} ends up just coating ${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnancy`);
+				} else {
+					r.push(`${belly} belly`);
+				}
+				r.push(`in ${his} own cum.`);
+			} else if (eventSlave.dick > 4 && eventSlave.belly >= 5000) {
+				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. ${His} dick is large enough to extend past ${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnancy,`);
+				} else {
+					r.push(`${belly} belly,`);
+				}
+				r.push(`allowing ${him} to blow ${his} load into ${his} waiting maw.`);
+			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+				r.push(`finally manages to extract an orgasm from ${his} limp dick, ${he} hikes ${his} hips over ${his} head to direct it into ${his} mouth.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`finally empties ${his} balls, ${he} hikes ${his} hips over ${his} head to direct the cum into ${his} mouth.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`climaxes, ${he} makes sure they can see the way ${his} asspussy spasms with orgasm.`);
+			} else {
+				r.push(`finally climaxes, ${he} carefully licks ${his} hands clean, showing off ${his} enjoyment of ${his} own`);
+				if (canTaste(eventSlave)) {
+					r.push(`taste.`);
+				} else {
+					r.push(`fluids.`);
+				}
+			}
+			r.push(`Authenticity is hard to fake, and the many citizens who saw the broadcast don't doubt <span class="reputation inc">your ability to train</span> a shameless slut.`);
+			repX(1250, "event", eventSlave);
+			r.toParagraph();
+			return r.container();
+		}
+	}
+};
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index 2f66026425575bf30edb60c5d4f7d2f744f7e4ef..034e08abb73b4963fb0974d5dbf4d35b679fa034 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -12,6 +12,7 @@ App.Events.getIndividualEvents = function() {
 		// example: new App.Events.TestEvent(),
 		new App.Events.RESSAgeDifferenceOldPC(),
 		new App.Events.RESSAgeDifferenceYoungPC(),
+		new App.Events.RESSAgeImplant(),
 		new App.Events.RESSAmpDevoted(),
 		new App.Events.RESSAGift(),
 		new App.Events.RESSAmpResting(),
@@ -37,15 +38,20 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSDevotedVirgin(),
 		new App.Events.RESSDevotedWaist(),
 		new App.Events.RESSDickgirlPC(),
+		new App.Events.RESSDickWringing(),
+		new App.Events.RESSDiet(),
 		new App.Events.RESSEscapee(),
 		new App.Events.RESSFearfulHumiliation(),
 		new App.Events.RESSForbiddenMasturbation(),
 		new App.Events.RESSFrighteningDick(),
 		new App.Events.RESSGaggedSlave(),
+		new App.Events.RESSHatesOral(),
 		new App.Events.RESSHeavyPiercing(),
 		new App.Events.RESSHeels(),
 		new App.Events.RESSHormoneDysfunction(),
 		new App.Events.RESSHotPC(),
+		new App.Events.RESSHugelyPregnant(),
+		new App.Events.RESSHugeNaturals(),
 		new App.Events.RESSHugeTits(),
 		new App.Events.RESSIgnorantHorny(),
 		new App.Events.RESSImpregnationPlease(),
@@ -55,7 +61,9 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSKitchenMolestation(),
 		new App.Events.RESSLanguageLesson(),
 		new App.Events.RESSLazyEvening(),
+		new App.Events.RESSLikeMe(),
 		new App.Events.RESSLooseButtslut(),
+		new App.Events.RESSMasterfulEntertainer(),
 		new App.Events.RESSMasterfulWhore(),
 		new App.Events.RESSMeanGirls(),
 		new App.Events.RESSMillenary(),
@@ -76,6 +84,7 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSObedientShemale(),
 		new App.Events.RESSObjectifyingVisit(),
 		new App.Events.RESSPAFlirting(),
+		new App.Events.RESSPAServant(),
 		new App.Events.RESSPassingDeclaration(),
 		new App.Events.RESSPermittedMasturbation(),
 		new App.Events.RESSPlimbHelp(),
@@ -92,7 +101,9 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSScrubbing(),
 		new App.Events.RESSServantMaid(),
 		new App.Events.RESSServeThePublicDevoted(),
+		new App.Events.RESSSexySuccubus(),
 		new App.Events.RESSShiftDoorframe(),
+		new App.Events.RESSShiftMasturbation(),
 		new App.Events.RESSSlaveOnSlaveClit(),
 		new App.Events.RESSSlaveOnSlaveDick(),
 		new App.Events.RESSSleepingAmbivalent(),
diff --git a/src/facilities/arcade/arcade.js b/src/facilities/arcade/arcade.js
index 23118203220425406bace710780a24d0497e4eae..01554939571b30f54a399647ee68a55624604eb8 100644
--- a/src/facilities/arcade/arcade.js
+++ b/src/facilities/arcade/arcade.js
@@ -20,7 +20,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Arcade";
 		V.encyclopedia = "Arcade";
 	}
 
@@ -100,8 +99,9 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 				property: "arcadeUpgradeInjectors",
 				tiers: [
 					{
-						value: 1,
-						base: `It is a standard arcade. It can be upgraded to either maximize the pleasure of those that visit it at the expense of the health of the inmates, or to keep them healthy (if not happy) and milk them of useful fluids.`,
+						value: 0,
+						upgraded: 1,
+						text: `It is a standard arcade. It can be upgraded to either maximize the pleasure of those that visit it at the expense of the health of the inmates, or to keep them healthy (if not happy) and milk them of useful fluids.`,
 						link: `Upgrade the arcade with invasive performance-enhancing systems`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -111,33 +111,32 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 						},
 						note: `, increases upkeep costs, and is mutually exclusive with the collectors`,
 						prereqs: [
-							() => V.arcadeUpgradeInjectors < 1,
 							() => V.arcadeUpgradeCollectors < 1,
 						],
 					},
 					{
-						value: 2,
-						base: `It has been upgraded with electroshock applicators. Whether they're enjoying themselves or not is irrelevant; they are shocked to tighten their holes regardless. You may also apply aphrodisiacs to further enhance performance.`,
-						upgraded: `It has been upgraded with aphrodisiac injection systems and electroshock applicators. If the aphrodisiacs fail to force an orgasm from an inmate, they are shocked to tighten their holes regardless.`,
+						value: 1,
+						upgraded: 2,
+						text: `It has been upgraded with electroshock applicators. Whether they're enjoying themselves or not is irrelevant; they are shocked to tighten their holes regardless. You may also apply aphrodisiacs to further enhance performance.`,
 						link: `Apply aphrodisiacs`,
-						handler: () => {
-							V.PC.skill.engineering += .1;
-
-							App.UI.reload();
-						},
+						handler: () => V.PC.skill.engineering += .1,
 						prereqs: [
-							() => V.arcadeUpgradeInjectors > 0,
 							() => V.arcadeUpgradeCollectors < 1,
 						],
 					},
+					{
+						value: 2,
+						text: `It has been upgraded with aphrodisiac injection systems and electroshock applicators. If the aphrodisiacs fail to force an orgasm from an inmate, they are shocked to tighten their holes regardless.`,
+					},
 				],
 			},
 			{
 				property: "arcadeUpgradeCollectors",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `It has been retrofitted to milk lactating slaves${V.seeDicks !== 0 ? ` and cockmilk slaves capable of ejaculating` : ``}, though less efficiently than a dedicated facility.`,
+						value: 0,
+						upgraded: 1,
+						text: `The fluids produced by the inmates here can be collected and sold.`,
 						link: `Retrofit the arcade to collect useful fluids`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -150,14 +149,19 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							() => V.arcadeUpgradeInjectors < 1,
 						],
 					},
+					{
+						value: 1,
+						text: `It has been retrofitted to milk lactating slaves${V.seeDicks !== 0 ? ` and cockmilk slaves capable of ejaculating` : ``}, though less efficiently than a dedicated facility.`,
+					},
 				],
 			},
 			{
 				property: "arcadeUpgradeHealth",
 				tiers: [
 					{
-						value: 1,
-						base: `The arcade can be upgraded to include curative injectors in order to keep inmates from succumbing under the harsh treatment. You are assured the inmates won't like their time in the arcade any better; it is purely intended to keep them functional and ready for use around the clock. It comes equipped with two settings.`,
+						value: -1,
+						upgraded: 0,
+						text: `The arcade can be upgraded to include curative injectors in order to keep inmates from succumbing under the harsh treatment. You are assured the inmates won't like their time in the arcade any better; it is purely intended to keep them functional and ready for use around the clock. It comes equipped with two settings.`,
 						link: `Install curative injectors`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -166,9 +170,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							App.UI.reload();
 						},
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.arcadeUpgradeHealth < 0,
-						],
 					},
 				],
 			},
@@ -176,8 +177,9 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 				property: "arcadeUpgradeFuckdolls",
 				tiers: [
 					{
-						value: 1,
-						base: `${capFirstChar(V.arcadeName)} is not equipped to convert inmates into standard Fuckdolls.`,
+						value: 0,
+						upgraded: 1,
+						text: `${capFirstChar(V.arcadeName)} is not equipped to convert inmates into standard Fuckdolls.`,
 						link: `Upgrade the arcade to create Fuckdolls`,
 						cost: 5000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -186,9 +188,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							App.UI.reload();
 						},
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.arcadeUpgradeFuckdolls === 0,
-						],
 					},
 				],
 			},
diff --git a/src/facilities/brothel/brothel.js b/src/facilities/brothel/brothel.js
index fe0cf230f7494657f9eb3efb67281c0842a6afbf..a3b9dd0aec9a6a57330c39d9b94294f7b8e3518a 100644
--- a/src/facilities/brothel/brothel.js
+++ b/src/facilities/brothel/brothel.js
@@ -17,7 +17,6 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Brothel";
 		V.encyclopedia = "Brothel";
 	}
 
@@ -141,15 +140,25 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 				property: "brothelUpgradeDrugs",
 				tiers: [
 					{
-						value: 1,
-						base: `It is a standard brothel.`,
+						value: 0,
+						upgraded: 1,
+						text: `It is a standard brothel.`,
 						link: `Upgrade the brothel with aphrodisiac injection systems`,
 						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.engineering += .1,
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.brothelUpgradeDrugs === 0,
-						],
+					},
+					{
+						value: 0.1,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
+					},
+					{
+						value: 1,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
+					},
+					{
+						value: 2,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
 					},
 				],
 			},
diff --git a/src/facilities/cellblock/cellblock.js b/src/facilities/cellblock/cellblock.js
index f59485372ae0012ad410ce05a6df2457a301a83b..f67ac8a9d1a4134497b9185a77e8aec627432051 100644
--- a/src/facilities/cellblock/cellblock.js
+++ b/src/facilities/cellblock/cellblock.js
@@ -14,7 +14,6 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Cellblock";
 		V.encyclopedia = "Cellblock";
 	}
 
@@ -98,9 +97,9 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 				property: "cellblockUpgrade",
 				tiers: [
 					{
-						value: 1,
-						base: `Its compliance systems are standard.`,
-						upgraded: `Its compliance systems have been upgraded to allow slaves no mental respite, painstakingly correcting the tiniest misbehaviors to soften flaws into quirks at the cost of considerable anguish to inmates denied any rest from correction.`,
+						value: 0,
+						upgraded: 1,
+						text: `Its compliance systems are standard.`,
 						link: `Upgrade them to soften slave flaws`,
 						cost: 20000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => {
@@ -108,6 +107,10 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 							V.PC.skill.hacking += 0.1;
 						},
 					},
+					{
+						value: 1,
+						text: `Its compliance systems have been upgraded to allow slaves no mental respite, painstakingly correcting the tiniest misbehaviors to soften flaws into quirks at the cost of considerable anguish to inmates denied any rest from correction.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/clinic/clinic.js b/src/facilities/clinic/clinic.js
index ea5cab998a3fe0e3215ee61508ddc81ac8a6955d..fb3910da00f7e28414de4ad4f128d6c6cf2d8d45 100644
--- a/src/facilities/clinic/clinic.js
+++ b/src/facilities/clinic/clinic.js
@@ -18,7 +18,6 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Clinic";
 		V.encyclopedia = "Clinic";
 	}
 
@@ -99,57 +98,69 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility {
 				property: "clinicUpgradeScanner",
 				tiers: [
 					{
-						value: 1,
-						base: `It mounts powerful medical scanning technology.`,
-						upgraded: `${this.facility.nameCaps}'s scanners have been upgraded with a sampling system that can estimate carcinogenic damage to a slave's body.`,
+						value: 0,
+						upgraded: 1,
+						text: `It mounts powerful medical scanning technology.`,
 						link: `Upgrade the scanners to help detect genomic damage`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 10000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and increases the effectiveness of ${V.clinicName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps}'s scanners have been upgraded with a sampling system that can estimate carcinogenic damage to a slave's body.`,
+					},
 				],
 			},
 			{
 				property: "clinicUpgradeFilters",
 				tiers: [
 					{
-						value: 1,
-						base: `It includes standard dialysis equipment.`,
-						upgraded: `The entire floor beneath ${V.clinicName} is occupied by a huge filtration plant that constantly cycles out the patients' blood to remove impurities.`,
+						value: 0,
+						upgraded: 1,
+						text: `It includes standard dialysis equipment.`,
 						link: `Install advanced blood treatment equipment to help address drug side effects`,
-						cost: Math.trunc(50000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
-						handler: () => V.PC.skill.hacking += 0.1,
+						cost: 50000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
+						handler: () => {
+							V.PC.skill.hacking += 0.1;
+
+							App.UI.reload();
+						},
 						note: ` and increases the effectiveness of ${V.clinicName}`,
 					},
+					{
+						value: 1,
+						text: `The entire floor beneath ${V.clinicName} is occupied by a huge filtration plant that constantly cycles out the patients' blood to remove impurities.`,
+					},
 				],
 			},
 			{
 				property: "clinicUpgradePurge",
 				tiers: [
 					{
-						value: 1,
-						base: V.clinicUpgradeFilters ? `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.` : null,
+						value: 0,
+						upgraded: 1,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.`,
 						link: `Increase the effectiveness of the impurity purging`,
-						cost: Math.trunc(150000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 150000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and may cause health problems in slaves`,
 						prereqs: [
 							() => V.clinicUpgradeFilters > 0,
-							() => V.clinicUpgradePurge < 1,
 						],
 					},
 					{
-						value: 2,
-						base: V.clinicUpgradeFilters ? `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.` : null,
-						upgraded: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells. The blood is intensely cleaned to greatly decrease the presence of impurities at the cost of compatibility. Patients will likely be ill for the duration of the treatment.`,
+						value: 1,
+						upgraded: 2,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.`,
 						link: `Further increase the effectiveness of the impurity purging by utilizing nano magnets`,
-						cost: Math.trunc(300000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 300000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and increases the effectiveness of ${V.clinicName}`,
-						prereqs: [
-							() => V.clinicUpgradeFilters > 0,
-							() => V.clinicUpgradePurge > 0,
-						],
+					},
+					{
+						value: 2,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells. The blood is intensely cleaned to greatly decrease the presence of impurities at the cost of compatibility. Patients will likely be ill for the duration of the treatment.`,
 						nodes: !S.Nurse
 							? [`However, without a nurse in attendance, the <span class="yellow">blood treatment equipment remains idle.</span>`]
 							: null,
diff --git a/src/facilities/club/club.js b/src/facilities/club/club.js
index f5367bdababc87bbe3ae41b1cb2824af45b3ded2..31870d8101a62545b5c0fb13540f0d5a5f5a6b74 100644
--- a/src/facilities/club/club.js
+++ b/src/facilities/club/club.js
@@ -17,7 +17,6 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Club";
 		V.encyclopedia = "Club";
 	}
 
@@ -268,14 +267,18 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 				property: "clubUpgradePDAs",
 				tiers: [
 					{
-						value: 1,
-						base: `The rooms are standard.`,
-						upgraded: `${this.facility.nameCaps} has been wired for unobtrusive personal data assistants to let your sluts pass tips about enslavable people to your recruiter.`,
+						value: 0,
+						upgraded: 1,
+						text: `The rooms are standard.`,
 						link: `Upgrade them with PDAs to help your recruiter`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier),
+						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.engineering += 0.1,
 						note: ` and will increase upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been wired for unobtrusive personal data assistants to let your sluts pass tips about enslavable people to your recruiter.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 3de4088de3242efd01390a8d85893508c8c24fc8..d9011d4d686a7957c610c801368aa04f6fcf7aed 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -52,7 +52,6 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Farmyard";
 		V.encyclopedia = "Farmyard";
 	}
 
@@ -138,11 +137,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "pump",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
-						upgraded: `The water pump in ${V.farmyardName} is a more efficient model, slightly improving the amount of crops it produces.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
 						link: `Upgrade the water pump`,
-						cost: Math.trunc(5000 * V.upgradeMultiplierArcology),
+						cost: 5000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -150,6 +149,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 						},
 						note: ` and slightly decreases upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -157,10 +160,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "fertilizer",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is using a higher-quality fertilizer, moderately increasing the amount of crops it produces and slightly raising upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The fertilizer being used in ${this.facility.name} is the cheap, buy-in-bulk stuff you can purchase at the local supermarket.`,
 						link: `Use a higher-quality fertilizer`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology),
+						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -171,6 +175,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.pump > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using a specialized fertilizer created to result in a higher crop yield.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -178,10 +186,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "hydroponics",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus moderately reducing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `There is room enough in ${this.facility.name} to install a hydroponics system for irrigation.`,
 						link: `Purchase an advanced hydroponics system`,
-						cost: Math.trunc(20000 * V.upgradeMultiplierArcology),
+						cost: 20000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -192,6 +201,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.fertilizer > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus saving a bit on your water bill.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -199,10 +212,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "seeds",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is using genetically modified seeds, significantly increasing the amount of crops it produces and moderately increasing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The seeds ${this.facility.name} is using are the standard seeds one could pick up at the local farmers' market.`,
 						link: `Purchase genetically modified seeds`,
-						cost: Math.trunc(25000 * V.upgradeMultiplierArcology),
+						cost: 25000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -213,6 +227,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.hydroponics > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using genetically modified seeds, designed to produce a much greater yield while remaining more resistant to pests and disease.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -220,10 +238,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "machinery",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `The machinery in ${V.farmyardName} has been upgraded and is more efficient, significantly increasing crop yields and significantly decreasing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The machinery in ${this.facility.name} is equipment that was imported before the old world began to fall apart and is fairly old and outdated.`,
 						link: `Upgrade the machinery`,
-						cost: Math.trunc(50000 * V.upgradeMultiplierArcology),
+						cost: 50000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -234,6 +253,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.seeds > 0
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using the latest in farming equipment and technology.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
diff --git a/src/facilities/headGirlSuite/headGirlSuite.js b/src/facilities/headGirlSuite/headGirlSuite.js
index 6cf8dd1ac3880a9078119b5c0924a108b0b97449..aaf1d1b6efba4ab81cea3facf48746dc3f8fa093 100644
--- a/src/facilities/headGirlSuite/headGirlSuite.js
+++ b/src/facilities/headGirlSuite/headGirlSuite.js
@@ -12,7 +12,6 @@ App.Facilities.HGSuite.headGirlSuite = class HeadGirlSuite extends App.Facilitie
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Head Girl Suite";
 		V.encyclopedia = "Head Girl Suite";
 
 		this.subSlave = this.facility.employees()[0];
diff --git a/src/facilities/masterSuite/masterSuite.js b/src/facilities/masterSuite/masterSuite.js
index 970dcbbde605481cf641bff451d83119818ec05d..ffc54a987353ee31adb1d1b4a7e8af07476b2a20 100644
--- a/src/facilities/masterSuite/masterSuite.js
+++ b/src/facilities/masterSuite/masterSuite.js
@@ -19,7 +19,6 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Master Suite";
 		V.encyclopedia = "Master Suite";
 
 		this.pregnantSlaves = 0;
@@ -267,9 +266,9 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				property: "masterSuiteUpgradeLuxury",
 				tiers: [
 					{
-						value: 1,
-						base: `The master suite is a fairly standard room, albeit a much larger and more luxurious one.`,
-						upgraded: `The large bed in the center of the room has been replaced with one that is nothing short of massive.`,
+						value: 0,
+						upgraded: 1,
+						text: `The master suite is a fairly standard room, albeit a much larger and more luxurious one.`,
 						link: `Refit the suite to the height of traditional opulence`,
 						cost: V.masterSuiteUpgradeLuxury === 0
 							? 25000 * V.upgradeMultiplierArcology
@@ -278,8 +277,13 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						note: ` and will focus the suite on you`,
 					},
 					{
-						value: 2,
-						upgraded: `A large, recessed space has been built in the center of the room where slaves can spend their days fucking each other.`,
+						value: 1,
+						text: `The large bed in the center of the room has been replaced with one that is nothing short of massive.`,
+					},
+					{
+						value: 0,
+						upgraded: 2,
+						text: ``,
 						link: `Remodel the suite around a luxurious pit for group sex`,
 						cost: V.masterSuiteUpgradeLuxury === 0
 							? 25000 * V.upgradeMultiplierArcology
@@ -287,22 +291,34 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						handler: () => V.PC.skill.engineering += .1,
 						note: ` and will encourage fucktoys to fuck each other`,
 					},
+					{
+						value: 2,
+						text: `A large, recessed space has been built in the center of the room where slaves can spend their days fucking each other.`,
+					},
 				],
 			},
 			{
 				property: "masterSuiteUpgradePregnancy",
 				tiers: [
 					{
-						value: 1,
-						base: `The master suite does not currently have special customizations to support slave pregnancy.`,
-						upgraded: `The master suite has been further upgraded to support fertile slaves and encourage slave pregnancy, providing additional rest areas, better access to amenities, and a dedicated birthing chamber.`,
+						value: 0,
+						upgraded: 1,
+						text: `The master suite does not currently have special customizations to support slave pregnancy.`,
 						link: `Refit the suite to support and encourage slave pregnancy`,
 						cost: 15000 * V.upgradeMultiplierArcology,
-						handler: () => V.PC.skill.engineering += .1,
+						handler: () => {
+							V.PC.skill.engineering += .1;
+
+							App.UI.reload();
+						},
 						prereqs: [
 							() => !!V.seePreg,
 						],
 					},
+					{
+						value: 1,
+						text: `The master suite has been further upgraded to support fertile slaves and encourage slave pregnancy, providing additional rest areas, better access to amenities, and a dedicated birthing chamber.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/pit/pit.js b/src/facilities/pit/pit.js
index 20ab165ab106ae570a1b66006aba1037e39cf747..9085bdf2a0c39979b5a27af5a3faa7ce1de2cb73 100644
--- a/src/facilities/pit/pit.js
+++ b/src/facilities/pit/pit.js
@@ -14,7 +14,6 @@ App.Facilities.Pit.pit = class Pit extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Pit";
 		V.encyclopedia = "Pit";
 	}
 
diff --git a/src/facilities/schoolroom/schoolroom.js b/src/facilities/schoolroom/schoolroom.js
index f9f5a9ba3a3d966aeb87f0de69ae081e761a2843..cb1281235508c4d9ce18b17a22d666165896390c 100644
--- a/src/facilities/schoolroom/schoolroom.js
+++ b/src/facilities/schoolroom/schoolroom.js
@@ -17,7 +17,6 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Schoolroom";
 		V.encyclopedia = "Schoolroom";
 	}
 
@@ -99,35 +98,43 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 				property: "schoolroomUpgradeSkills",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} inculcates the basic skills necessary to a sex slave.`,
-						upgraded: `${this.facility.nameCaps} provides slaves with some intermediate skills, including a solid foundation in sex, efficient and safe prostitution, and the rudiments of courtesanship.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} inculcates the basic skills necessary to a sex slave.`,
 						link: `Upgrade the curriculum to cover some intermediate skills`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} provides slaves with some intermediate skills, including a solid foundation in sex, efficient and safe prostitution, and the rudiments of courtesanship.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomUpgradeLanguage",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} includes only basic language classes in its curriculum.`,
-						upgraded: `${this.facility.nameCaps} boasts state of the art linguistic interfaces that allow it to teach the basics of the arcology's lingua franca with increased success.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} includes only basic language classes in its curriculum.`,
 						link: `Install advanced linguistic interfaces to efficiently teach the arcology's lingua franca`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} boasts state of the art linguistic interfaces that allow it to teach the basics of the arcology's lingua franca with increased success.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomRemodelBimbo",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
-						upgraded: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
 						link: `Redesign the curriculum to undo pesky educations and retard slaves while benefiting the most simple of minds`,
 						cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.schoolroomUpgradeRemedial = 0,
@@ -135,10 +142,14 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.arcologies[0].FSIntellectualDependency > 80,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
+					},
 					{
 						value: 0,
-						base: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
-						upgraded: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
 						link: `Restore the curriculum to the standard`,
 						cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.schoolroomUpgradeRemedial = 0,
@@ -146,15 +157,19 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.arcologies[0].FSIntellectualDependency > 80,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomUpgradeRemedial",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} teaches woefully smart slaves using its modified methods.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the smartest slave learn at an acceptable pace. Dumb slaves won't learn much faster as a result, but smarties will benefit a great deal.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} teaches woefully smart slaves using its modified methods.`,
 						link: `Purchase specialized materials to help smart slaves get on the right track`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
@@ -164,8 +179,15 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 					},
 					{
 						value: 1,
-						base: `${this.facility.nameCaps} teaches idiots using standard methods.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the stupidest slave learn at an acceptable pace. Intelligent slaves won't learn much faster as a result, but idiots will benefit a great deal.`,
+						text: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the smartest slave learn at an acceptable pace. Dumb slaves won't learn much faster as a result, but smarties will benefit a great deal.`,
+						prereqs: [
+							() => V.schoolroomRemodelBimbo === 1,
+						],
+					},
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} teaches idiots using standard methods.`,
 						link: `Purchase specialized materials to help stupid slaves learn good`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
@@ -173,6 +195,13 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.schoolroomRemodelBimbo === 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the stupidest slave learn at an acceptable pace. Intelligent slaves won't learn much faster as a result, but idiots will benefit a great deal.`,
+						prereqs: [
+							() => V.schoolroomRemodelBimbo === 0,
+						],
+					},
 				],
 			},
 		];
diff --git a/src/facilities/servantsQuarters/servantsQuarters.js b/src/facilities/servantsQuarters/servantsQuarters.js
index 3fb0b7267e1f50d153b3d50a1aa9feb3b17c7226..4616bd215d93f303176fc6bb7629dd45794468f4 100644
--- a/src/facilities/servantsQuarters/servantsQuarters.js
+++ b/src/facilities/servantsQuarters/servantsQuarters.js
@@ -14,7 +14,6 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Servants' Quarters";
 		V.encyclopedia = "Servants' Quarters";
 	}
 
@@ -96,14 +95,18 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend
 				property: "servantsQuartersUpgradeMonitoring",
 				tiers: [
 					{
-						value: 1,
-						base: `The quarters are standard.`,
-						upgraded: `The quarters have been upgraded with enhanced monitoring systems to make the servants work harder, improving their obedience and efficiency.`,
+						value: 0,
+						upgraded: 1,
+						text: `The quarters are standard.`,
 						link: `Upgrade the monitoring systems to force harder work`,
 						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and will increase upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `The quarters have been upgraded with enhanced monitoring systems to make the servants work harder, improving their obedience and efficiency.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/spa/spa.js b/src/facilities/spa/spa.js
index 1b5f78fbd20538c0b0f4ea297a1d4b3fd0c3b723..c0baafe4e225604508747c2195cb6ea0e54a06eb 100644
--- a/src/facilities/spa/spa.js
+++ b/src/facilities/spa/spa.js
@@ -15,7 +15,6 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Spa";
 		V.encyclopedia = "Spa";
 	}
 
@@ -101,12 +100,16 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility {
 				property: "spaUpgrade",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is a standard spa.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with state of the art temperature treatment options, from hot and cold mineral water pools to baking saunas and dense steam rooms.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is a standard spa.`,
 						link: `Upgrade ${V.spaName} with saunas, steam rooms, and mineral water baths`,
 						cost: 1000 * V.upgradeMultiplierArcology,
 						note: ` and increases the effectiveness of ${V.spaName}`,
+					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been upgraded with state of the art temperature treatment options, from hot and cold mineral water pools to baking saunas and dense steam rooms.`,
 					}
 				],
 			},
diff --git a/src/facilities/surgery/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js
index 1473a3ab3b98ead5487ee20dfaedc69f276513c0..68cfadca381d3f3397d1dde19c0cce945d8d9380 100644
--- a/src/facilities/surgery/surgeryPassageLower.js
+++ b/src/facilities/surgery/surgeryPassageLower.js
@@ -548,9 +548,11 @@ App.UI.surgeryPassageLower = function(slave, cheat = false) {
 				} else if (slave.ovaries !== 0) {
 					r.push(`penis and a`);
 				} else if (slave.vagina !== -1) {
-					r.push(`penis and a`);
+					r.push(`penis and`);
 					if (slave.genes === "XY") {
-						r.push(`n artificial`);
+						r.push(`an artificial`);
+					} else {
+						r.push(`a`);
 					}
 				}
 			} else if (slave.dick === 0) {
diff --git a/src/facilities/surgery/surgeryPassageUpper.js b/src/facilities/surgery/surgeryPassageUpper.js
index 1a4cb7a288738f9715332e94534e0db6617bd4a3..dc4ced0d190a574b052c602fbcd1834d3ac33e87 100644
--- a/src/facilities/surgery/surgeryPassageUpper.js
+++ b/src/facilities/surgery/surgeryPassageUpper.js
@@ -473,23 +473,7 @@ App.UI.surgeryPassageUpper = function(slave, cheat = false) {
 					));
 				}
 				if (V.surgeryUpgrade === 1) {
-					linkArray.push(
-						App.UI.DOM.link(
-							"Fat grafting",
-							() => {
-								slave.boobs += (Math.max(V.boobFat, 0) || 0) * 100;
-								slave.butt += Math.max(V.buttFat, 0) || 0;
-								slave.boobs = Math.clamp(slave.boobs, 0, 50000);
-								slave.butt = Math.clamp(slave.butt, 0, 20);
-
-								surgeryDamage(slave, 40);
-								cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery", slave);
-								V.surgeryType = "fat graft";
-							},
-							[],
-							"Fat Grafting"
-						)
-					);
+					linkArray.push(App.UI.DOM.passageLink("Fat grafting", "Fat Grafting"));
 				}
 			}
 			App.Events.addNode(el, r, "div");
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index 2e7333ab8a7005d09a969a8c81268f6aa74ee94a..a46c141d3310b34ef262059c4c51f40823fc0bab 100644
--- a/src/interaction/siWork.js
+++ b/src/interaction/siWork.js
@@ -558,19 +558,19 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			if (V.seeBestiality) {
 				if (V.farmyardKennels > 0 && V.active.canine) {
 					sexOptions.push({
-						text: `Have a ${V.active.canine.species} mount ${him}`,
+						text: `Have ${V.active.canine.articleAn} ${V.active.canine.species} mount ${him}`,
 						scene: () => App.Interact.fAnimal(slave, "canine"),
 					});
 				}
 				if (V.farmyardStables > 0 && V.active.hooved) {
 					sexOptions.push({
-						text: `Let a ${V.active.hooved.species} mount ${him}`,
+						text: `Let ${V.active.hooved.articleAn} ${V.active.hooved.species} mount ${him}`,
 						scene: () => App.Interact.fAnimal(slave, "hooved"),
 					});
 				}
 				if (V.farmyardCages > 0 && V.active.feline) {
 					sexOptions.push({
-						text: `Have a ${V.active.feline.species} mount ${him}`,
+						text: `Have ${V.active.feline.articleAn} ${V.active.feline.species} mount ${him}`,
 						scene: () => App.Interact.fAnimal(slave, "feline"),
 					});
 				}
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 596863bca5b2d7b14fd6a77804bc57dc6c18d053..f0e7f63c8b13d1f8d51ae535908dca8cfb52a968 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -2886,7 +2886,7 @@ globalThis.DefaultRules = (function() {
 				}
 			}
 		}
-		if (rule.autoBrand === 1) {
+		if (rule.autoBrand === 1 && rule.brandDesign !== null) {
 			if (slave.health.condition > -20) {
 				let brandPlace = "";
 				let left;
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 3bc5ac5536baf2e7ba79822317e3471bfa1a82a1..1ca2c43de8fdeb645c3459bab715377361b20533 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -20,32 +20,6 @@ globalThis.generateRandomEventPool = function(eventSlave) {
 					}
 				}
 
-				if (V.assistant.personality === 1) {
-					if (V.assistant.appearance !== "normal") {
-						if (eventSlave.devotion >= -20) {
-							if (canSee(eventSlave)) {
-								if (eventSlave.devotion <= 50) {
-									if (eventSlave.assignment === Job.HOUSE || eventSlave.assignment === Job.QUARTER) {
-										if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-											V.RESSevent.push("PA servant");
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.clothes === "a succubus outfit") {
-						if (eventSlave.devotion > 20) {
-							if (eventSlave.trust > 20) {
-								V.RESSevent.push("sexy succubus");
-							}
-						}
-					}
-				}
-
 				if (eventSlave.assignment !== Job.QUARTER) {
 					if (eventSlave.muscles > 5) {
 						if (eventSlave.devotion > 20) {
@@ -104,16 +78,6 @@ if(eventSlave.drugs === "breast injections") {
 */
 				}
 
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.physicalAge > 30) {
-						if (eventSlave.ageImplant > 0) {
-							if (eventSlave.devotion > 20) {
-								V.RESSevent.push("age implant");
-							}
-						}
-					}
-				}
-
 				if (V.slaves.length > 2) {
 					if (eventSlave.devotion >= -20) {
 						if (eventSlave.heels === 1) {
@@ -287,42 +251,7 @@ if(eventSlave.drugs === "breast injections") {
 				}
 			}
 
-			if (eventSlave.dick > 8) {
-				if (eventSlave.balls > 0) {
-					if (eventSlave.energy > 60) {
-						if (eventSlave.devotion > 50) {
-							if (eventSlave.trust > 50) {
-								if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-									if (eventSlave.belly < 100000) {
-										V.RESSevent.push("dick wringing");
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-
-			if (eventSlave.trust <= 20) {
-				if (eventSlave.trust >= -75) {
-					if (eventSlave.devotion <= 30) {
-						if (eventSlave.devotion >= -20) {
-							V.RESSevent.push("like me");
-						}
-					}
-				}
-			}
 			if (eventSlave.assignment !== Job.QUARTER) {
-				if (eventSlave.boobs >= 2000) {
-					if (eventSlave.boobsImplant === 0) {
-						if (eventSlave.nipples !== "tiny" && eventSlave.nipples !== "fuckable") {
-							if (eventSlave.devotion > 20) {
-								V.RESSevent.push("huge naturals");
-							}
-						}
-					}
-				}
-
 				if (eventSlave.boobs > 800) {
 					if (Math.floor(eventSlave.boobsImplant / eventSlave.boobs) >= 0.60) {
 						if (eventSlave.devotion > 20) {
@@ -332,26 +261,6 @@ if(eventSlave.drugs === "breast injections") {
 				}
 			}
 
-			if (eventSlave.devotion <= 50) {
-				if (eventSlave.trust >= -50) {
-					if (eventSlave.behavioralFlaw === "gluttonous") {
-						if (eventSlave.diet === "restricted") {
-							V.RESSevent.push("diet");
-						}
-					}
-				}
-			}
-
-			if (eventSlave.assignment !== Job.QUARTER) {
-				if (eventSlave.skill.entertainment >= 100) {
-					if (eventSlave.trust > 50) {
-						if (eventSlave.assignment === Job.PUBLIC) {
-							V.RESSevent.push("masterful entertainer");
-						}
-					}
-				}
-			}
-
 			if (eventSlave.assignment === Job.PUBLIC) {
 				if (eventSlave.devotion >= -20) {
 					if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
@@ -370,11 +279,6 @@ if(eventSlave.drugs === "breast injections") {
 								if (V.corp.Incorporated !== 0) {
 									V.RESSevent.push("shift sleep");
 								}
-								if (canWalk(eventSlave)) {
-									if (eventSlave.rules.release.masturbation === 1) {
-										V.RESSevent.push("shift masturbation");
-									}
-								}
 							}
 							if (canDoVaginal(eventSlave)) {
 								if (V.PC.vagina > -1) {
@@ -410,14 +314,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.sexualFlaw === "hates oral") {
-			if (V.PC.dick !== 0) {
-				if (eventSlave.devotion <= 50) {
-					V.RESSevent.push("hates oral");
-				}
-			}
-		}
-
 		if (eventSlave.assignment !== Job.QUARTER) {
 			if (V.seeExtreme === 1) {
 				if (eventSlave.balls > 1) {
@@ -478,12 +374,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (V.seePreg !== 0) {
-			if (eventSlave.bellyPreg >= 10000) {
-				V.RESSevent.push("hugely pregnant");
-			}
-		}
-
 		if (V.PC.dick !== 0) {
 			if (eventSlave.bellyPreg >= 300000) {
 				V.RESSevent.push("hyperpreg stuck");
diff --git a/src/js/upgrade.js b/src/js/upgrade.js
index 599f0f99d2f7e0e39cd2d8b890ba6b7875041fac..3dae4c386f200df899779eb90c16ab9e9e2c1229 100644
--- a/src/js/upgrade.js
+++ b/src/js/upgrade.js
@@ -12,7 +12,7 @@ App.Upgrade = class Upgrade {
 		/** @private */
 		this._div = document.createElement("div");
 		/** @private @type {Object} */
-		this._object = object;
+		this._object = object || V;
 		/** @private @type {FC.IUpgradeTier[]} */
 		this._tiers = tiers;
 	}
@@ -28,39 +28,30 @@ App.Upgrade = class Upgrade {
 
 		this.tiers.forEach(tier => {
 			const {
-				value, link, base, upgraded, handler, note, prereqs, nodes,
+				value, link, text, upgraded, handler, note, prereqs, nodes,
 			} = tier;
 
-			let cost = Math.trunc(tier.cost) || 0;
-
-			if (!prereqs || prereqs.every(prereq => prereq())) {
-				if (upgraded
-					&& (_.isEqual(V[this.property], value)
-						|| _.isEqual(this._object[this.property], value))) {
-					App.UI.DOM.appendNewElement("div", frag, upgraded);
-				} else {
-					App.UI.DOM.appendNewElement("div", frag, base);
-					App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.link(link, () => {
-						cashX(forceNeg(cost), "capEx");
-
-						if (this._object) {
-							this._object[this.property] = value;
-						} else {
-							V[this.property] = value;
-						}
-
-						if (handler) {
-							handler();
-						}
-
-						this.refresh();
-					}, [], '',
-					`${cost > 0 ? `Costs ${cashFormat(cost)}` : `Free`}${note ? `${note}` : ``}.`),
-					['indent']);
-
-					if (nodes) {
-						App.Events.addNode(frag, nodes);
+			const cost = Math.trunc(tier.cost) || 0;
+
+			if ((!prereqs || prereqs.every(prereq => prereq()))
+				&& _.isEqual(value, this._object[this._property])) {
+				App.UI.DOM.appendNewElement("div", frag, text);
+				App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.link(link, () => {
+					cashX(forceNeg(cost), "capEx");
+
+					this._object[this._property] = upgraded;
+
+					if (handler) {
+						handler();
 					}
+
+					this.refresh();
+				}, [], '',
+				`${cost > 0 ? `Costs ${cashFormat(cost)}` : `Free`}${note ? `${note}` : ``}.`),
+				['indent']);
+
+				if (nodes) {
+					App.Events.addNode(frag, nodes);
 				}
 			}
 		});
@@ -69,7 +60,7 @@ App.Upgrade = class Upgrade {
 	}
 
 	/**
-	 * Renders the facility onscreen.
+	 * Renders the upgrade onscreen.
 	 *
 	 * @returns {HTMLDivElement}
 	 */
@@ -80,7 +71,7 @@ App.Upgrade = class Upgrade {
 	}
 
 	/**
-	 * Refreshes the facility onscreen.
+	 * Refreshes the upgrade onscreen.
 	 *
 	 * @returns {void}
 	 */
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 05f7401ddcc8774b3d990b2d516ab41031648c08..8740161a1e0e2436bb0572d2553d8af9fa36f233 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -3009,7 +3009,11 @@ globalThis.parentNames = function(parent, child) {
 globalThis.faceIncrease = function(slave, amount) {
 	const oldFace = slave.face;
 	faceIncreaseAction(slave, amount);
-	return faceIncreaseDesc(slave, oldFace);
+	const newFace = slave.face;
+	slave.face = oldFace;
+	const desc = faceIncreaseDesc(slave, newFace);
+	slave.face = newFace;
+	return desc;
 };
 
 /**
@@ -3024,28 +3028,28 @@ globalThis.faceIncreaseAction = function(slave, amount) {
 };
 
 /**
- * Describes the slave face changes AFTER they were applied to the slave
+ * Describes the slave face changes BEFORE they are applied to the slave
  *
  * @param {App.Entity.SlaveState} slave
- * @param {number} oldFace
+ * @param {number} newFace
  * @returns {string}
  */
-globalThis.faceIncreaseDesc = function(slave, oldFace) {
+globalThis.faceIncreaseDesc = function(slave, newFace) {
 	const pronouns = getPronouns(slave);
 	const his = pronouns.possessive;
 	const His = capFirstChar(his);
 	let r = "";
-	if (oldFace <= -95) {
+	if (slave.face <= -95) {
 		r += `<span class="green">${His} face is no longer horrifying,</span> and is now merely ugly.`;
-	} else if (oldFace <= -40 && slave.face > -40) {
+	} else if (slave.face <= -40 && newFace > -40) {
 		r += `<span class="green">${His} face is no longer ugly,</span> and is now merely unattractive.`;
-	} else if (oldFace <= -10 && slave.face > -10) {
+	} else if (slave.face <= -10 && newFace > -10) {
 		r += `<span class="green">${His} face is no longer unattractive,</span> and is now somewhat tolerable.`;
-	} else if (oldFace <= 10 && slave.face > 10) {
+	} else if (slave.face <= 10 && newFace > 10) {
 		r += `<span class="green">${His} face is now decently attractive,</span> rather than merely tolerable.`;
-	} else if (oldFace <= 40 && slave.face > 40) {
+	} else if (slave.face <= 40 && newFace > 40) {
 		r += `<span class="green">${His} face is now quite beautiful,</span> rather than merely pretty.`;
-	} else if (oldFace <= 95 && slave.face > 95) {
+	} else if (slave.face <= 95 && newFace > 95) {
 		r += `<span class="green">${His} face is now perfect.</span> It's difficult to imagine how it could be any more beautiful.`;
 	}
 	return r;
diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 1ae97178c48d3501eb789bcd0eeadf3ae20f2df4..16083f4b7f1d055ca02928867c5371887bc439c5 100644
--- a/src/npc/interaction/fAnimal.js
+++ b/src/npc/interaction/fAnimal.js
@@ -11,9 +11,7 @@ App.Interact.fAnimal = function(slave, type) {
 		he, him, his, girl
 	} = getPronouns(slave);
 
-	/**
-	 * @enum {string}
-	 */
+	/** @enum {string} */
 	const Acts = {
 		VAGINAL: "vaginal",
 		ANAL: "anal",
@@ -114,7 +112,7 @@ App.Interact.fAnimal = function(slave, type) {
 		? `suck off`
 		: act === Acts.VAGINAL
 			? `get fucked by`
-			: `get fucked in the ass by`} ${anAnimal}. `);
+			: `get fucked in the ass by`} ${anAnimal}.`);
 
 	if (slave.fetish === "mindbroken") {
 		text.push(`${slave.slaveName} nods ${his} head dumbly, ${his} eyes vacant${!canSee(slave) ? ` as always` : ``}.`);
@@ -124,9 +122,9 @@ App.Interact.fAnimal = function(slave, type) {
 		if (slave.devotion > 50) {
 			if (act === Acts.ORAL) {
 				if (slaveApproves()) {
-					text.push(`${slave.slaveName}'s face visibly brightens at the prospect of ${fetishDesc}, even if it's an animal${slave.fetish === "cumslut" ? `'s cum` : ` that ${he} has to suck off`}. `);
+					text.push(`${slave.slaveName}'s face visibly brightens at the prospect of ${fetishDesc}, even if it's an animal${slave.fetish === "cumslut" ? `'s cum` : ` that ${he} has to suck off`}.`);
 				} else {
-					text.push(`${slave.slaveName} visibly blanches at the thought of having to suck down an animal's cum, but ${he} is so devoted to you that ${he} reluctantly agrees. `);
+					text.push(`${slave.slaveName} visibly blanches at the thought of having to suck down an animal's cum, but ${he} is so devoted to you that ${he} reluctantly agrees.`);
 				}
 			} else {
 				if (
@@ -134,24 +132,24 @@ App.Interact.fAnimal = function(slave, type) {
 						(act === Acts.ANAL && slave.anus > 0)
 				) {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is an animal's. `);
+						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is an animal's.`);
 					} else {
-						text.push(`${slave.slaveName} looks visibly disturbed, but is so attentive to your will that ${he} agrees. `);
+						text.push(`${slave.slaveName} looks visibly disturbed, but is so attentive to your will that ${he} agrees.`);
 					}
 				} else {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, although ${he} seems a bit hesitant at the thought of giving ${his} virginity to an animal. `);
+						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, although ${he} seems a bit hesitant at the thought of giving ${his} virginity to an animal.`);
 					} else {
-						text.push(`${slave.slaveName} looks visibly shaken at the thought of having ${his} precious ${!canDoVaginal(slave) ? `anal ` : ``}virginity taken by an animal, but is so attentive to your will that ${he} ultimately agrees. `);
+						text.push(`${slave.slaveName} looks visibly shaken at the thought of having ${his} precious ${!canDoVaginal(slave) ? `anal ` : ``}virginity taken by an animal, but is so attentive to your will that ${he} ultimately agrees.`);
 					}
 				}
 			}
 		} else if (slave.devotion > 20) {
 			if (act === Acts.ORAL) {
 				if (slaveApproves()) {
-					text.push(`${slave.slaveName} isn't too keen on the idea of sucking off an animal, but the idea of ${fetishDesc} is enough to get ${him} to comply. `);
+					text.push(`${slave.slaveName} isn't too keen on the idea of sucking off an animal, but the idea of ${fetishDesc} is enough to get ${him} to comply.`);
 				} else {
-					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal, but quickly regains ${his} composure. `);
+					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal, but quickly regains ${his} composure.`);
 				}
 			} else {
 				if (
@@ -159,44 +157,44 @@ App.Interact.fAnimal = function(slave, type) {
 						(act === Acts.ANAL && slave.anus > 0)
 				) {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking an animal, but the thought of ${fetishDesc} seems to be enough to win ${him} over. `);
+						text.push(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking an animal, but the thought of ${fetishDesc} seems to be enough to win ${him} over.`);
 					} else {
-						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal, but quickly regains ${his} composure. `);
+						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal, but quickly regains ${his} composure.`);
 					}
 				} else {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply. `);
+						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
 					} else {
-						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast, but quickly regains ${his} composure. `);
+						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast, but quickly regains ${his} composure.`);
 					}
 				}
 			}
 		} else if (slave.devotion >= -20) {
 			if (act === Acts.ORAL) {
 				if (slaveApproves()) {
-					text.push(`${slave.slaveName} looks disgusted at the thought of sucking off an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}. `);
+					text.push(`${slave.slaveName} looks disgusted at the thought of sucking off an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
 				} else {
-					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}. `);
+					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
 				}
 			} else {
 				if ((act === Acts.VAGINAL && slave.vagina > 0) || (act === Acts.ANAL && slave.anus > 0)) {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName} looks disgusted at the thought of fucking an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}. `);
+						text.push(`${slave.slaveName} looks disgusted at the thought of fucking an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
 					} else {
-						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}. `);
+						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
 					}
 				} else {
 					if (slaveApproves()) {
-						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply. `);
+						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
 					} else {
-						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}. `);
+						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
 					}
 				}
 			}
 		} else {
 			text.push(`${slave.slaveName}'s face contorts into a mixture of ${slave.devotion < -50 ? `hatred, anger, and disgust` : `anger and disgust`}, ${canWalk(slave)
 				? `and only the threat of far worse punishment is enough to prevent ${him} from running out of the room`
-				: `but ${he} knows ${he} is powerless to stop you`}. `);
+				: `but ${he} knows ${he} is powerless to stop you`}.`);
 		}
 	}
 
@@ -256,6 +254,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 
 		App.Events.addParagraph(div, text);
+		text = [];
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -312,6 +311,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 
 		App.Events.addParagraph(div, text);
+		text = [];
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -368,6 +368,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 
 		App.Events.addParagraph(div, text);
+		text = [];
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -390,7 +391,7 @@ App.Interact.fAnimal = function(slave, type) {
 							: slave.vagina > -1
 								? `a slight sheen on ${his} pussylips`
 								: `a slight blush to ${his} cheeks`}
-								tells you that ${he}'s enjoying this, at least a little. `);
+								tells you that ${he}'s enjoying this, at least a little.`);
 					} else {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
 					}
@@ -414,7 +415,7 @@ App.Interact.fAnimal = function(slave, type) {
 							: slave.vagina > -1
 								? `a slight sheen on ${his} pussylips`
 								: `a slight blush to ${his} cheeks`}
-								tells you that ${he}'s enjoying this, at least a little. `);
+								tells you that ${he}'s enjoying this, at least a little.`);
 					} else {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
 					}
@@ -432,7 +433,7 @@ App.Interact.fAnimal = function(slave, type) {
 							: slave.vagina > -1
 								? `a slight sheen on ${his} pussylips`
 								: `a slight blush to ${his} cheeks`}
-								tells you that ${he}'s enjoying this, at least a little. `);
+								tells you that ${he}'s enjoying this, at least a little.`);
 					} else {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s barbed dick fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment .`);
 					}
@@ -460,7 +461,7 @@ App.Interact.fAnimal = function(slave, type) {
 			} else {
 				text.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice()} in the way only canines can, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice()}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz into ${his} ${orifice()}. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s ${act === Acts.VAGINAL && slave.vagina < 3 || act === Acts.ANAL && slave.anus < 2
 					? `now-gaping ${orifice()}`
-					: orifice()}, causing a thick stream of cum to slide out of it. Having finished its business, the ${animal.name} runs off, presumably in search of food. `);
+					: orifice()}, causing a thick stream of cum to slide out of it. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
 			}
 			break;
 		case V.active.hooved:
@@ -633,19 +634,19 @@ App.Interact.fAnimal = function(slave, type) {
 
 								slave.devotion += 5;
 							} else if (slave.devotion >= -20) {
-								text.push(`Losing ${his} virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust. `);
+								text.push(`Losing ${his} virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust.`);
 
 								slave.devotion += 5;
 								slave.trust -= 5;
 							} else {
-								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust. `);
+								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust.`);
 
 								slave.devotion -= 10;
 								slave.trust -= 10;
 							}
 						}
 					} else {
-						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals. `);
+						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals.`);
 
 						slave.devotion -= 10;
 						slave.trust -= 10;
@@ -672,19 +673,19 @@ App.Interact.fAnimal = function(slave, type) {
 
 								slave.devotion += 5;
 							} else if (slave.devotion >= -20) {
-								text.push(`Losing ${his} anal virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust. `);
+								text.push(`Losing ${his} anal virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust.`);
 
 								slave.devotion += 5;
 								slave.trust -= 5;
 							} else {
-								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} anal virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust. `);
+								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} anal virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust.`);
 
 								slave.devotion -= 10;
 								slave.trust -= 10;
 							}
 						}
 					} else {
-						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals. `);
+						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals.`);
 
 						slave.devotion -= 10;
 						slave.trust -= 10;
diff --git a/src/npc/surgery/fatGraft.js b/src/npc/surgery/fatGraft.js
index 287102ef65c0b29bfc1c72bd392b8f7592133317..461f12ceecd4e31a7f8023fe68c97dddd3dec01e 100644
--- a/src/npc/surgery/fatGraft.js
+++ b/src/npc/surgery/fatGraft.js
@@ -96,12 +96,23 @@ App.UI.SlaveInteract.fatGraft = function(slave) {
 			linkArray.push(App.UI.DOM.disabledLink(`No fat marked for ass use.`, []));
 		}
 		App.UI.DOM.appendNewElement("div", p, App.UI.DOM.generateLinksStrip(linkArray));
+		App.UI.DOM.appendNewElement("p", el, App.UI.DOM.passageLink("Finalize fat transfer", "Surgery Degradation", () => {
+			slave.boobs += boobFat * 100;
+			slave.butt += buttFat;
+			slave.boobs = Math.clamp(slave.boobs, 0, 50000);
+			slave.butt = Math.clamp(slave.butt, 0, 20);
+
+			V.boobFat = boobFat;
+			V.buttFat = buttFat;
+
+			surgeryDamage(slave, 40);
+			cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery", slave);
+			V.surgeryType = "fat graft";
+		}));
 		return el;
 	}
 
 	function refresh() {
-		V.boobFat = boobFat;
-		V.buttFat = buttFat;
 		jQuery(passage).empty().append(content());
 	}
 };
diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js
index 28a08180ed060d80a7eb9fee2ee64357c74e7be2..4e997fe5ce4ae78d2d8303b74a3945c0a03a3029 100644
--- a/src/npc/surgery/surgery.js
+++ b/src/npc/surgery/surgery.js
@@ -128,7 +128,7 @@ App.Medicine.Surgery.makeObjectLink = function(passage, surgery, slave, cheat =
  * @param {boolean} cheat
  */
 App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
-	const slave = procedure.slave;
+	const slave = procedure.originalSlave;
 	return App.UI.DOM.link(procedure.name, apply, [], "", tooltip());
 
 	function healthCosts() {
@@ -167,20 +167,32 @@ App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
 			}
 		}
 
-		const reaction = procedure.apply(cheat);
-		showSlaveReaction(reaction);
+		const [diff, reaction] = procedure.apply(cheat);
+		const f = makeSlaveReaction(diff, reaction);
+
+		App.Utils.Diff.applyDiff(slave, diff);
+
+		// Refresh the surgery options or wherever the surgery originated
+		refresh();
+
+		// Finally show the slaves reaction
+		Dialog.setup(procedure.name);
+		Dialog.append(f);
+		Dialog.open();
 	}
 
 	/**
+	 * @param {Partial<App.Entity.SlaveState>} diff
 	 * @param {App.Medicine.Surgery.SimpleReaction} reaction
+	 * @returns {DocumentFragment}
 	 */
-	function showSlaveReaction(reaction) {
+	function makeSlaveReaction(diff, reaction) {
 		const f = new DocumentFragment();
 		let r = [];
 
-		r.push(...reaction.intro(slave));
+		r.push(...reaction.intro(slave, diff));
 
-		const resultMain = reaction.reaction(slave);
+		const resultMain = reaction.reaction(slave, diff);
 		for (const p of resultMain.longReaction) {
 			r.push(...p);
 			App.Events.addParagraph(f, r);
@@ -189,7 +201,7 @@ App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
 		slave.devotion += resultMain.devotion;
 		slave.trust += resultMain.trust;
 
-		const resultOutro = reaction.outro(slave, resultMain);
+		const resultOutro = reaction.outro(slave, diff, resultMain);
 		for (const p of resultOutro.longReaction) {
 			r.push(...p);
 			App.Events.addParagraph(f, r);
@@ -204,13 +216,7 @@ App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
 			removeJob(slave, slave.assignment);
 		}
 
-		// Refresh the surgery options or wherever the surgery originated
-		refresh();
-
-		// Finally show the slaves reaction
-		Dialog.setup(procedure.name);
-		Dialog.append(f);
-		Dialog.open();
+		return f;
 	}
 };
 
diff --git a/src/npc/surgery/surgeryDegradation.js b/src/npc/surgery/surgeryDegradation.js
index 8faca667bca92affea0cdc844107fc113a0f0ac0..a7983a8dd3e1d216a8fac4a7740f415a1560dd42 100644
--- a/src/npc/surgery/surgeryDegradation.js
+++ b/src/npc/surgery/surgeryDegradation.js
@@ -49,9 +49,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) {
 			removeJob(slave, slave.assignment);
 		}
 
-		r.push(...reaction.intro(slave));
+		r.push(...reaction.intro(slave, {}));
 
-		const resultMain = reaction.reaction(slave);
+		const resultMain = reaction.reaction(slave, {});
 		for (const p of resultMain.longReaction) {
 			r.push(...p);
 			App.Events.addParagraph(el, r);
@@ -60,7 +60,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) {
 		slave.devotion += resultMain.devotion;
 		slave.trust += resultMain.trust;
 
-		const resultOutro = reaction.outro(slave, resultMain);
+		const resultOutro = reaction.outro(slave, {}, resultMain);
 		for (const p of resultOutro.longReaction) {
 			r.push(...p);
 			App.Events.addParagraph(el, r);
diff --git a/src/player/personalAttentionSelect.js b/src/player/personalAttentionSelect.js
index 69d50cd8a847501ad413d7e7112b5559d6d07ef2..ae1c53d7eaebc40ad7271ae3b7f4ec9e084c4aec 100644
--- a/src/player/personalAttentionSelect.js
+++ b/src/player/personalAttentionSelect.js
@@ -764,71 +764,75 @@ App.UI.Player.personalAttention = function() {
 
 				// Paraphilias
 
-				div.append(
-					App.UI.DOM.makeElement("h3", `Induce a paraphilia`),
-					App.UI.DOM.makeElement("div", `Paraphilias can be induced from a strong fetish.`, ['note']),
-				);
+				App.UI.DOM.appendNewElement("h3", div, `Induce a paraphilia`);
+
+				if (slave.fetishStrength >= 95) {
+					addLinks(
+						slave,
+						regimen,
+						links,
+						i,
+						{
+							fetish: "cumslut",
+							flaw: "cum addict",
+							type: "induce cum addiction",
+							link: `Cum addiction`,
+						},
+						{
+							fetish: "buttslut",
+							flaw: "anal addict",
+							type: "induce anal addiction",
+							link: `Anal addiction`,
+						},
+						{
+							fetish: "humiliation",
+							flaw: "attention whore",
+							type: "induce attention whoring",
+							link: `Attention whoring`,
+						},
+						{
+							fetish: "boobs",
+							flaw: "breast growth",
+							type: "induce breast growth obsession",
+							link: `Breast growth obsession`,
+						},
+						{
+							fetish: "dom",
+							flaw: "abusive",
+							type: "induce abusiveness",
+							link: `Abusiveness`,
+						},
+						{
+							fetish: "sadist",
+							flaw: "malicious",
+							type: "induce maliciousness",
+							link: `Maliciousness`,
+						},
+						{
+							fetish: "masochist",
+							flaw: "self hating",
+							type: "induce self hatred",
+							link: `Self hatred`,
+						},
+						{
+							fetish: "submissive",
+							flaw: "neglectful",
+							type: "induce sexual self neglect",
+							link: `Sexual self neglect`,
+						},
+						{
+							fetish: "pregnancy",
+							flaw: "breeder",
+							type: "induce breeding obsession",
+							link: `Breeding obsession`,
+						},
+					);
 
-				addLinks(
-					slave,
-					regimen,
-					links,
-					i,
-					{
-						fetish: "cumslut",
-						flaw: "cum addict",
-						type: "induce cum addiction",
-						link: `Cum addiction`,
-					},
-					{
-						fetish: "buttslut",
-						flaw: "anal addict",
-						type: "induce anal addiction",
-						link: `Anal addiction`,
-					},
-					{
-						fetish: "humiliation",
-						flaw: "attention whore",
-						type: "induce attention whoring",
-						link: `Attention whoring`,
-					},
-					{
-						fetish: "boobs",
-						flaw: "breast growth",
-						type: "induce breast growth obsession",
-						link: `Breast growth obsession`,
-					},
-					{
-						fetish: "dom",
-						flaw: "abusive",
-						type: "induce abusiveness",
-						link: `Abusiveness`,
-					},
-					{
-						fetish: "sadist",
-						flaw: "malicious",
-						type: "induce maliciousness",
-						link: `Maliciousness`,
-					},
-					{
-						fetish: "masochist",
-						flaw: "self hating",
-						type: "induce self hatred",
-						link: `Self hatred`,
-					},
-					{
-						fetish: "submissive",
-						flaw: "neglectful",
-						type: "induce sexual self neglect",
-						link: `Sexual self neglect`,
-					},
-					{
-						fetish: "pregnancy",
-						flaw: "breeder",
-						type: "induce breeding obsession",
-						link: `Breeding obsession`,
-					},
-				);
+					App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(links), ['margin-left']);
+					links = [];
+				} else {
+					App.UI.DOM.appendNewElement("div", div, `Paraphilias can be induced from a strong fetish.`, ['note', 'margin-left']);
+				}
 			}
 		}
 
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 6a9948349a692f272a546c4f653f5c5665a5ab0a..7f13df408a7c8c11d1301665c7527692bb8a3126 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -42,7 +42,7 @@
 <<set $nextButton = "Continue", $nextLink = "AS Dump", $returnTo = "Next Week", _didAnal = 0, _didVaginal = 0>>
 
 <<set _clothesTemp = $activeSlave.clothes>>
-<<if ["age implant",
+<<if [
 "ara ara",
 "back stretch",
 "bonded love",
@@ -56,13 +56,9 @@
 "fucktoy tribbing",
 "gaped asshole",
 "happy dance",
-"huge naturals",
-"hugely pregnant",
 "implant inspection",
 "orchiectomy please",
-"sexy succubus",
 "shaped areolae",
-"shift masturbation",
 "shift sleep",
 "shower slip",
 "slave dick huge",
@@ -351,57 +347,6 @@ in the middle of the room with the machines all around $him. $He has <<if canDoV
 <br><br>
 The source of the many-voiced personal assistant becomes clear: probably on the incorrigible $activeSlave.slaveName's request, your sultry personal assistant is voicing each and every one of the machines. When the nymphomaniac masturbator tries to smile <<if hasAnyArms($activeSlave)>> and wave<</if>>, there's an absolute chorus of "Back to work, slut", "Smile less, suck more", "Take it, bitch", et cetera. Yet another instance of $assistant.name chuckles in your ear. "Care to join in, <<= properTitle()>>? I'm sure we can find room somewhere."
 
-<<case "age implant">>
-
-In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each others' youthful energy. At the back of the pack is <<= App.UI.slaveDescriptionDialog($activeSlave)>>. $He looks as young as any of them, but after they're out, $he leans against the door frame for a moment and exhales slowly.
-<br><br>
-$His <<= App.Desc.eyeColor($activeSlave)>>-eyed gaze catches yours for a moment, and you are reminded that $he isn't as young as they are, not at all. $His face might look youthful, but $his eyes don't. <<if canSee($activeSlave)>>$He sees your consideration, and<<else>>You make yourself known, and $he<</if>> murmurs, "<<S>>orry, <<Master>>. Ju<<s>>t a little <<s>>low thi<<s>> morning."
-$He hurries after $his sisters, $his
-<<if $activeSlave.butt > 12>>
-	massive
-<<elseif $activeSlave.butt > 8>>
-	giant
-<<elseif $activeSlave.butt > 5>>
-	huge
-<<elseif $activeSlave.butt > 2>>
-	big
-<<else>>
-	pretty little
-<</if>>
-naked ass catching your eye as $he goes.
-
-<<case "shift masturbation">>
-
-Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if _S.Concubine>>Your concubine, _S.Concubine.slaveName<<elseif $HeadGirlID != 0>>Your Head Girl, _S.HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift.
-<br><br>
-And has $he ever come on shift. $He enters your office at something not far removed from a run, displaying evident signs of sexual excitation, a blush visible on $his $activeSlave.skin cheeks. Between $his job, the mild drugs in $his food, and $his life, $he's beside $himself with need. $He realizes you're working and tries to compose $himself, but gives up after a short struggle and flings $himself down on the couch. $He scoots down so $his <<if $activeSlave.butt > 5>>enormous<<elseif $activeSlave.butt > 2>>healthy<<else>>trim<</if>> butt is hanging off the edge of the cushion, and spreads $his legs up and back<<if $activeSlave.belly >= 5000>> to either side of $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>> as wide as they'll go<<if ($activeSlave.boobs > 1000)>>, hurriedly shoving $his tits out of the way<</if>>. $He uses both hands to frantically
-<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-	<<if ($activeSlave.hormoneBalance >= 100)>>
-		rub $his hormone-dysfunctional penis,
-	<<elseif $activeSlave.balls > 0 && $activeSlave.ballType == "sterile">>
-		rub $his limp, useless penis,
-	<<elseif ($activeSlave.balls == 0)>>
-		rub $his limp, ballsless penis,
-	<<else>>
-		rub $his soft penis,
-	<</if>>
-<<elseif $activeSlave.dick > 4>>
-	jack off $his titanic erection,
-<<elseif $activeSlave.dick > 2>>
-	jack $himself off,
-<<elseif $activeSlave.dick > 0>>
-	rub $his pathetic little hard-on,
-<<elseif $activeSlave.vagina == -1>>
-	frantically rubs the sensitive area beneath $his asspussy,
-<<elseif $activeSlave.clit > 0>>
-	rub $his huge, engorged clit,
-<<elseif $activeSlave.labia > 0>>
-	play with $his clit and $his generous labia,
-<<else>>
-	rub $his pussy,
-<</if>>
-but after a moment $he clearly decides this isn't enough stimulation. $He <<if $activeSlave.dick > 0>>uses two fingers to collect the precum dribbling from $his dickhead.<<else>>fucks $himself vigorously with two fingers to collect some girl lube.<</if>> $He brings these fingers up to $his face to check $his work, hesitates, visibly decides $he doesn't care, and reaches down to <<if $activeSlave.anus > 2>>slide them into $his loose asspussy. $He sighs with pleasure at the sensation.<<elseif $activeSlave.anus > 1>>shove them up $his butt. $He wriggles a little at the makeshift lubrication but is clearly enjoying $himself.<<else>>push them up $his tight butt. The pain of anal penetration with only makeshift lubrication extracts a huge sobbing gasp from $him, and $he tears up a little even as $he masturbates furiously.<</if>>
-
 <<case "shift sleep">>
 
 Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if _S.Concubine>>Your concubine, _S.Concubine.slaveName<<elseif $HeadGirlID != 0>>Your Head Girl, _S.HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift.
@@ -528,163 +473,6 @@ there. $His nipples are <<if $activeSlave.nipples != "fuckable">>hard<<else>>swo
 <</if>>
 tits dominate $his figure, but the real attention getter are $his unique, <<= $activeSlave.areolaeShape>>-shaped areolae. The darker flesh around $his nipples would be — should be — circular in any other $woman, and the cute $activeSlave.areolaeShape shapes around $activeSlave.slaveName's nipples are proof of just how much you've modified $him. $He's devoted to you, so much so that $he loves showing off $his special assets.
 
-<<case "diet">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is on a diet, and $he needs it. That doesn't make it any easier for $him. Your slaves are not permitted time to waste over meals. They enter the simple kitchen, drink their allotted portion of slave food out of a cup, and get on with their duties.<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/1.33>> Despite eating for <<if $activeSlave.pregType <= 1>>two<<elseif $activeSlave.pregType >= 10>>far too many<<else>><<= num($activeSlave.pregType + 1)>><</if>>, $his diet is still in full effect.<</if>> <<= capFirstChar($assistant.name)>> catches $activeSlave.slaveName, whose cup is always filled less than halfway, skulking around in the hope that one of the others will take $his eyes off $his cup, or even leave leftovers.
-
-<<case "huge naturals">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes before you naked for a routine inspection. You take particular care to examine $his massive breasts, since they've grown so large it's necessary to check for unsightly veins, stretch marks, and the like. You note $his big nipples with appreciation. Since $his breasts are so enormous and completely free of implants, they're quite heavy. When $he stands,
-<<if $activeSlave.boobShape == "saggy" || $activeSlave.boobShape == "downward-facing">>
-	$his nipples face out and down.
-<<else>>
-	gravity causes them to hang low.
-<</if>>
-As you inspect $him with your hands, $he
-<<if !canTalk($activeSlave)>>
-	breathes a little harder and looks like $he would speak, were $he not mute.
-<<else>>
-	<<if ($activeSlave.lips > 70)>>
-		murmurs through $his huge lips,
-	<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-		murmurs through $his piercings,
-	<<else>>
-		murmurs,
-	<</if>>
-	"That feel<<s>> really ni<<c>>e, <<Master>>."
-<</if>>
-
-<<case "hugely pregnant">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>>'s daily routine includes frequent application of special skin care to $his $activeSlave.skin, hugely swollen belly to prevent $his pregnancy from ruining $his appearance with unsightly stretch marks. Several times a day, $he visits the bathroom to <<if (!hasAnyArms($activeSlave))>>have another slave<<else>>carefully<</if>> coat $his entire _belly stomach in the stuff. $He's so pregnant that it's hard to reach <<if $activeSlave.belly >= 150000>>most of its mass<<else>>the underside<</if>>. The chore keeps $him occupied and stationary for quite a while; there's no need to leave $him sexually idle while $he completes it.
-
-<<case "PA servant">>
-
-As you begin your day one morning, you hear the quiet
-<<switch $assistant.appearance>>
-<<case "monstergirl">>
-	but unmistakably sensual voice of your monster<<= _girlA>>
-<<case "shemale">>
-	but unmistakably lewd voice of your shemale
-<<case "amazon">>
-	but unmistakably aggressive voice of your amazon
-<<case "businesswoman">>
-	but unmistakably dominant voice of your business<<= _womanA>>
-<<case "fairy" "pregnant fairy">>
-	but unmistakably adorable voice of your fairy
-<<case "goddess" "hypergoddess">>
-	and kindly voice of your goddess
-<<case "loli">>
-	and childish voice of your _loliA
-<<case "preggololi">>
-	and childish, out of breath voice of your pregnant _loliA
-<<case "angel">>
-	but unmistakably caring voice of your angel
-<<case "cherub">>
-	yet overly cheerful voice of your cherub
-<<case "incubus">>
-	and commanding, but obviously aroused voice of your incubus
-<<case "succubus">>
-	and seductive, but obviously aroused voice of your succubus
-<<case "imp">>
-	and harassing voice of your imp
-<<case "witch">>
-	and oddly aroused voice of your witch
-<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-	and very distinct voice of your avatar
-<<case "schoolgirl">>
-	but unmistakably suggestive voice of your school<<= _girlA>>
-<</switch>>
-personal assistant coming from your office. Looking in, you are treated to the sight of <<= App.UI.slaveDescriptionDialog($activeSlave)>>'s <<if $activeSlave.butt > 8>>ridiculous bottom jiggling<<elseif $activeSlave.butt > 4>>big behind bouncing<<else>>cute rear<</if>><<if $activeSlave.belly >= 5000>>, and the _ belly rounded belly hanging between $his legs,<</if>> as $he reaches out over the glass top of your desk with a soft, dust-free cloth and a bottle of screen cleaner. <<= capFirstChar($assistant.name)>> is displaying _hisA avatar right under where the slave is cleaning the glass screen, and _heA's displaying it nude. _HeA's positioned _himselfA so that the poor slave appears to be wiping
-<<switch $assistant.appearance>>
-<<case "monstergirl">>
-	_hisA hair-tentacles
-<<case "shemale">>
-	the shaft of _hisA massive prick
-<<case "amazon">>
-	the insides of _hisA muscular thighs
-<<case "businesswoman">>
-	_hisA pussy
-<<case "fairy">>
-	_hisA tiny body
-<<case "pregnant fairy">>
-	_hisA tiny yet swollen body
-<<case "goddess">>
-	_hisA motherly tits
-<<case "hypergoddess">>
-	_hisA huge pregnant belly
-<<case "loli">>
-	_hisA flat chest
-<<case "preggololi">>
-	_hisA pregnant belly
-<<case "angel">>
-	_hisA wide-spread wings
-<<case "cherub">>
-	_hisA cute pussy
-<<case "incubus">>
-	_hisA throbbing prick
-<<case "succubus">>
-	_hisA lovely pussy
-<<case "imp">>
-	_hisA pussy
-<<case "witch">>
-	_hisA plump tits
-<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-	_hisA phallic tentacles
-<<case "schoolgirl">>
-	_hisA perky tits
-<</switch>>
-down with screen cleaner, and is talking dirty to the furiously blushing servant. "Ohh, that feels good," _heA moans. "Rub me right there, you $desc slut! I love it!" The poor slave is doing $his best to hurry, embarrassed and unsure of how to react to $assistant.name's behavior.
-
-<<case "like me">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> appears at the door of your office, looking frightened. $He takes one hesitant step in and stops, wavering, $his hand balled into fists and $his lower lip caught behind $his teeth. The $desc is getting used to $his place as chattel, but $he isn't sure of $himself yet. After a few moments, it becomes obvious that $he's lost whatever mental momentum propelled $him to come in here, and can't muster the courage to back out, either. You rescue $him by politely but firmly ordering $him to tell you why $he's here. After two false starts, $he
-<<if !canTalk($activeSlave)>>
-	uses shaky hands to ask you to fuck $him.
-<<else>>
-	"P-plea<<s>>e fuck me, <<Master>>," $he chokes out.
-<</if>>
-To go by $his behavior, the likelihood that $he's actually eager to <<if $PC.dick == 0>>eat pussy<<else>>take a dick<</if>>, never mind yours, is vanishingly small.
-
-<<case "hates oral">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. $He's <<if canSee($activeSlave)>>seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves<<elseif canHear($activeSlave)>>heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more<<else>>felt seminal fluid on $his skin and on $his lips, always coercively or accidentally<</if>>. It's clear from $activeSlave.slaveName's recent reactions to these acts that $he's quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for $him to overcome or a weakness you can exploit.
-
-<<case "masterful entertainer">>
-
-It's Friday evening, the most socially important part of the week in $arcologies[0].name. <<= App.UI.slaveDescriptionDialog($activeSlave)>> happens to be free this evening, and your schedule is open, too. Lately, $he's been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever $he gets the chance to catch someone's eye<<if $activeSlave.belly >= 5000>>, even with $his <<if $activeSlave.bellyPreg >= 3000>>advanced pregnancy<<elseif $activeSlave.bellyImplant >= 3000>>_belly rounded belly<<else>>sloshing <<print $activeSlave.inflationType>>-filled stomach<</if>><</if>>. There are a number of events tonight you could attend with $him on your arm.
-
-<<case "sexy succubus">>
-
-You cross paths with <<= App.UI.slaveDescriptionDialog($activeSlave)>> as $he moves from the living area to $activeSlave.assignment, just starting $his day. $He's full of energy, and $his succubus outfit is delightful. $He <<if canSee($activeSlave)>>sees your glance<<else>>recognizes your whistle<</if>> and greets you with a <<if canSee($activeSlave)>>wicked glint in $his eye<<else>>wicked smirk on $his face<</if>>, bowing a bit to show off $his <<if $activeSlave.boobs > 6000>>bare, inhumanly large breasts<<elseif $activeSlave.lactation > 0>>bare udders, heavy with milk<<elseif $activeSlave.boobsImplant > 0>>naked fake tits<<elseif $activeSlave.boobs > 800>>heavy, naked breasts<<elseif $activeSlave.boobs > 300>>naked little tits<<else>>pretty chest<</if>> and then continuing towards you with a pirouette. $His tail bounces flirtily, holding the back of $his skirt up to show off <<if $activeSlave.butt > 8>>$his absurdly wide bottom<<elseif $activeSlave.analArea > 3>>the broad area of puckered skin around $his slutty asspussy<<elseif $activeSlave.buttImplant > 0>>$his butt implants<<elseif $activeSlave.butt > 5>>$his big butt<<elseif $activeSlave.anus > 1>>a hint of $his asshole, which $his cute buttocks don't quite conceal<<else>>$his cute bottom<</if>>.
-<br><br>
-$He looks like <<if $activeSlave.bellyPreg >= 1500 || $activeSlave.bellyImplant >= 1500>>a lusty, pregnant, hungry<<elseif $activeSlave.bellyFluid >= 1500>>a gluttonous, over-fed but still hungry<<elseif $activeSlave.height > 180>>an imposing, hungry<<elseif $activeSlave.muscles > 30>>a muscular, hungry<<elseif $activeSlave.weight > 10>>a well-fed but still hungry<<elseif $activeSlave.energy > 95>>a desperately hungry<<else>>a cute, hungry little<</if>> sex demon, and you tell $him so.
-<<if $activeSlave.intelligence > 50>>
-	The clever $girl knows all about succubi.
-<<elseif $activeSlave.intelligenceImplant >= 15>>
-	$He's been taught the basics about succubi.
-<<else>>
-	$He quickly searches $his memory for the basic information about succubi that came with $his outfit.
-<</if>>
-<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-	"Oh <<Master>> I'm thtarving," $he lisps,
-<<else>>
-	"Oh <<Master>>, I'm ssstarving," $he moans,
-<</if>>
-running $his tongue over $his<<if $activeSlave.lips > 40>> whorish<<elseif $activeSlave.lips > 20>> plush<</if>> lips and sticking out $his chest to present $his boobs even more obviously.
-
-<<case "dick wringing">>
-
-You run into <<= App.UI.slaveDescriptionDialog($activeSlave)>> in the hallway outside your office. The devoted $desc smiles at you as $he approaches. You barely notice how awkward $his gait is, since $he usually walks a little strangely. $His third leg tends to have that effect. But on consideration, $he does seem especially uncomfortable right now. The poor $girl's <<if $activeSlave.scrotum == 0>>internal balls<<elseif $activeSlave.balls < 3>>girly balls<<elseif $activeSlave.scrotum < 4>>balls, held tightly against $his body by $his taut scrotum,<<else>>swinging balls<</if>> must be in dire need of emptying.
-<br><br>
-$He trusts you, so $he approaches you as sensually as $he can manage and asks for your help.
-<<if !canTalk($activeSlave)>>
-	$He uses quick but submissive gestures to beg you to help $him cum, pleading the special difficulties caused by $his outlandish member, which $he can manage most comfortably if $he has both hands free for it.
-<<else>>
-	"<<Master>>, would you plea<<s>>e, plea<<s>>e help me cum?" $he begs submissively. "It'<<s>> ni<<c>>e if I can u<<s>>e both hand<<s>> on it to, um, manage thing<<s>>."
-<</if>>
-$He's referring to the volume issue with $his unnaturally massive dick. The thing is so huge and so soft that <<if $activeSlave.balls < 3>>one of $his (by comparison) pathetically weak ejaculations<<elseif $activeSlave.balls < 6>>one of $his comparatively normal ejaculations<<else>>a single one of even $his copious ejaculations<</if>> often fails to make it all the way to the tip of $his cock, making it only partway down $his urethra without help.
-
 <<case "fucktoy tribbing">>
 
 <<setNonlocalPronouns $seeDicks>>
@@ -2257,231 +2045,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
 <</if>>
 
-<<case "age implant">>
-
-<<link "Go out clubbing to make $him feel young again">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent club<<= $girl>> outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously.
-		"I hope they let me into the club without checking my I.D., <<Master>>," $he jokes,
-		for which $he receives a swat on $his rear as you head out. With the full day of rest, $he is full of vigor and ready to dance. $He eagerly heads out onto the floor with you,
-		<<if ($activeSlave.skill.entertainment >= 100)>>
-			masterfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, grabbing the attention of all the men and most of the women in $clubName.
-		<<elseif ($activeSlave.skill.entertainment > 60)>>
-			expertly moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, mesmerizing $his neighbors on the floor.
-		<<elseif ($activeSlave.skill.entertainment > 30)>>
-			skillfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, drawing a lustful gaze or two.
-		<<else>>
-			clumsily moving <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> $his body to the heavy beat, attracting little notice among the press of novices.
-		<</if>>
-		It doesn't take long for $him to back $himself into you so $he can grind; $he cranes $his neck back to plant an @@.hotpink;earnest kiss@@ on your chin.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Attend a sporting event with $him">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen; you tell $him $he'll be spending the day with you at a game outside the arcology, and $he's to meet you at your VTOL pad in two hours. $He ponders for a moment but clearly understands this is related to $his age, somehow. Right at the proper time, $he arrives on the pad. $He's clearly spent the whole time getting the right clothing; somehow $he used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal $his <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>lack of private parts<<else>>pussy<</if>>, and $he bounces a little on $his heels for you to show off how $he's going commando underneath it. $His
-		<<if ($activeSlave.belly >= 100000)>>
-			_belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>
-		<<elseif ($activeSlave.weight > 130)>>
-			hugely soft
-		<<elseif ($activeSlave.belly >= 1500)>>
-			_belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>
-		<<elseif ($activeSlave.muscles > 30)>>
-			ripped
-		<<elseif ($activeSlave.weight > 30)>>
-			fat
-		<<elseif ($activeSlave.weight > 10)>>
-			plush
-		<<else>>
-			taut
-		<</if>>
-		midriff is bare. The top <<if ($activeSlave.boobs > 2000)>>somehow contains $his tits, with the team's logo at least <<if $showInches == 2>>three feet<<else>>a meter<</if>> wide across $his chest<<elseif ($activeSlave.boobs > 1000)>>is a great location for the team's logo, since $his tits allow it to be quite large<<elseif ($activeSlave.boobs > 300)>>is a good location for the team's logo, since $his tits allow it to be pretty big<<else>>flatters $his flat chest, especially with the team logo over it<</if>>. $He even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; $he's made up to look even younger.
-		<br><br>
-		You have a front-row seat, of course, and $he excitedly takes $his place beside you,
-		<<if $activeSlave.butt > 12>>
-			thankful that you reserved a seat for both of $his massive cheeks.
-		<<elseif $activeSlave.belly >= 300000>>
-			thankful that the front row has plenty of room for $his _belly belly to occupy.
-		<<elseif $activeSlave.butt > 6>>
-			carefully fitting $his big bottom into the seat.
-		<<elseif $activeSlave.boobs > 4000>>
-			$his absurd boobs rubbing against your arm.
-		<</if>>
-		$He cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before @@.green;recognizing you,@@ putting two and two together, and realizing enviously that $he's your sex slave. Since this is the Free Cities, the big screen gives $him more attention rather than cutting away when $he intentionally cheers hard enough that $his skirt rides up.
-		<<if $activeSlave.broodmother == 2 && $activeSlave.preg > 37>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, facing away from the game and goes into labor on another of $his brood; the contractions forcing $him to lean forward onto $his _belly stomach and give the players below a clear view of $his crowning child.
-		<<elseif $activeSlave.belly < 300000>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, facing away from the game and bending down to show cleavage to the stands in such a way that $his <<if ($activeSlave.butt > 5)>>massive ass<<elseif ($activeSlave.butt > 2)>>big butt<<else>>nice ass<</if>> lifts $his skirt up enough that the players below can clearly see $his <<if ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<elseif $activeSlave.anus > 0>>tight asshole<<else>>virgin asshole<</if>><<if $activeSlave.vagina > 3>> and gaping pussy<<elseif $activeSlave.vagina > 2>> and used pussy<<elseif $activeSlave.vagina > 1>> and lovely pussy<<elseif $activeSlave.vagina > 0>> and tight pussy<<elseif $activeSlave.vagina == 0>> and virgin pussy<</if>>.
-		<<else>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, cheering while swinging $his absurd belly back and forth and accidentally smashes into a concession vendor sending them to the floor. $His efforts to help him up forces $him to stand in such a way that $his <<if ($activeSlave.butt > 5)>>massive ass<<elseif ($activeSlave.butt > 2)>>big butt<<else>>nice ass<</if>> lifts $his skirt up enough that the players below can clearly see $his <<if ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<elseif $activeSlave.anus > 0>>tight asshole<<else>>virgin asshole<</if>><<if $activeSlave.vagina > 3>> and gaping pussy<<elseif $activeSlave.vagina > 2>> and used pussy<<elseif $activeSlave.vagina > 1>> and lovely pussy<<elseif $activeSlave.vagina > 0>> and tight pussy<<elseif $activeSlave.vagina == 0>> and virgin pussy<</if>>.
-		<</if>>
-		A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.
-		<<run repX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<br><<link "Put the old whore in $his place">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen. You tell $him you're interested to see if $his old body can still perform. Something about the way you say 'old' makes $him flinch, and $he's right to worry. You tell $him to go out and make you <<print cashFormat(200)>>, and to hurry back if $he wants to avoid punishment. $He hesitates for an instant before hurrying outside. A few hours later you check on $him remotely. The feed shows $him <<if $activeSlave.belly >= 10000>>waddle<<else>>walk<</if>> quickly up to a couple out on the street; you can't hear what's said, but $he
-		<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-			turns around to rub $his bare butt against the crotch of the man's pants. He pulls them down and fucks $him right there<<if canDoVaginal($activeSlave) && $activeSlave.vagina == 0>>@@.lime;taking $his virginity@@<<set _didVaginal = 1>><<elseif canDoAnal($activeSlave) && $activeSlave.anus == 0>>@@.lime;taking $his anal virginity@@<<set _didAnal = 1>><</if>>, as the woman <<if $activeSlave.nipples != "fuckable">>pulls and abuses<<else>>roughly fingers<</if>> $his poor nipples. Boring of this, he switches to torturing the poor slave's
-			<<if ($activeSlave.dick > 0)>>
-				dick,
-			<<elseif $activeSlave.vagina == -1>>
-				butthole,
-			<<else>>
-				pussy,
-			<</if>>
-			slapping $him until $he cries and then making out with the weeping whore. Much later, $activeSlave.slaveName limps tiredly into your office and gives you your @@.yellowgreen;<<print cashFormat(200)>>.@@ You ask $him how $he's feeling, and $he mumbles, "I'm OK, <<Master>>. Hole<<s>> are pretty <<s>>ore though. Kinda loo<<s>>e."
-		<<else>>
-			drops to $his knee<<if hasBothLegs($activeSlave)>>s<</if>> to nuzzle against the man's pants. He pulls them down and facefucks $him right there, as the woman <<if $activeSlave.nipples != "fuckable">>pulls and abuses<<else>>roughly fingers<</if>> $his poor nipples. Boring of this, $he switches to torturing the poor slave's
-			<<if ($activeSlave.dick > 0)>>
-				dick,
-			<<elseif $activeSlave.vagina == -1>>
-				butthole,
-			<<else>>
-				pussy,
-			<</if>>
-			slapping $him until $he cries and then making out with the weeping whore. Much later, $activeSlave.slaveName limps tiredly into your office and gives you your @@.yellowgreen;<<print cashFormat(200)>>.@@ You ask $him how $he's feeling, and $he mumbles, "I'm OK, <<Master>>. My jaw kinda hurt<<s>> and my leg<<s>> are really <<s>>ore."
-		<</if>>
-		You tell $him that's of little concern, since $he has relatively few years of use left: you may as well extract what value you can from $him. $He's too exhausted to hide $his response, and collapses, @@.gold;sobbing.@@
-		<<run cashX(200, "event", $activeSlave)>>
-		<<set $activeSlave.trust -= 5>>
-		<<if _didAnal == 1>>
-			<<set $activeSlave.anus++>>
-			<<run seX($activeSlave, "anal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 1, -2)>>
-			<</if>>
-		<<elseif _didVaginal == 1>>
-			<<set $activeSlave.vagina++>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 0, -2)>>
-			<</if>>
-		<<elseif canDoVaginal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 0, -2)>>
-			<</if>>
-		<<elseif canDoAnal($activeSlave)>>
-			<<run seX($activeSlave, "anal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 1, -2)>>
-			<</if>>
-		<<else>>
-			<<run seX($activeSlave, "oral", "public", "penetrative")>>
-		<</if>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-
-<<case "shift masturbation">>
-
-<<link "Leave $him to it">>
-	<<replace "#result">>
-		You have work to do. You ignore the shameless slut, who gets $himself off in no time at all,
-		<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave.balls == 0)>>
-			$his limp dick dribbling cum onto $his<<if $activeSlave.pregKnown == 1>> pregnant<</if>> stomach.
-		<<elseif $activeSlave.dick > 0>>
-			orgasming so strongly $he manages to hit $himself in the face with $his own cum.
-		<<elseif $activeSlave.vagina == -1>>
-			indulging in the anal self-stimulation that's $his best remaining avenue to an orgasm.
-		<<else>>
-			the smell of female pleasure filling the office.
-		<</if>>
-		$He gets up, washes $himself off and rearranges $his body on the couch again, languidly this time. $He returns to masturbating, gently playing with $himself with one hand and <<if $activeSlave.nipples != "fuckable">>teasing<<else>>fingering<</if>> a nipple with the other.
-	<</replace>>
-<</link>>
-<br><<link "Lend $him some assistance">>
-	<<replace "#result">>
-		You stand and ask $him mockingly if $he could use some assistance. $He gapes at you for a lust-hazed moment before nodding happily,
-		<<if !canTalk($activeSlave)>>
-			gesturing $his thanks.
-		<<else>>
-			squealing, "Ye<<s>> plea<<s>>e, <<Master>>!"
-		<</if>>
-		$He stops wanking and takes $his hand<<if hasBothArms($activeSlave)>>s<</if>> away, laying $himself wide for you like a horny human buffet. You make a show of selecting, but decide on $his
-		<<if canDoVaginal($activeSlave)>>
-			<<if $activeSlave.vagina > 2>>
-				slutty pussy.
-			<<elseif $activeSlave.vagina > 1>>
-				experienced pussy.
-			<<else>>
-				tight pussy.
-			<</if>>
-			<<set _didVaginal = 1>>
-		<<else>>
-			<<if $activeSlave.anus > 2>>
-				slutty anal slit.
-			<<elseif $activeSlave.anus > 1>>
-				well prepared asshole.
-			<<else>>
-				still-tight butt.
-			<</if>>
-			<<set _didAnal = 1>>
-		<</if>>
-		$He calmed down a little while offering $himself to you, so $he manages not to climax immediately when you <<if $PC.dick == 0>>push your strap-on into $him<<else>>thrust your dick into $him<</if>>, but $he's in a rare mood. You reward $him by guiding $his hands back to $his crotch as you ramp up the pace, at which $he looks up at you with something like wordless glee. $He goes back to
-		<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-			playing with $his limp dick,
-		<<elseif $activeSlave.dick > 4>>
-			jerking off $his giant cock,
-		<<elseif $activeSlave.dick > 2>>
-			jerking off,
-		<<elseif $activeSlave.dick > 0>>
-			teasing $his girly little dick,
-		<<elseif $activeSlave.clit > 0>>
-			jerking off $his ridiculous clit,
-		<<elseif $activeSlave.labia > 0>>
-			spreading and teasing $his petals,
-		<<elseif $activeSlave.vagina == -1>>
-			playing with $his asspussy,
-		<<else>>
-			rubbing $his clit,
-		<</if>>
-		<<if !canTalk($activeSlave)>>
-			making little raspy pleasure noises.
-		<<else>>
-			mewling with pleasure.
-		<</if>>
-		When you're finally done, $he's fairly tired, but $he manages to give $his <<if $activeSlave.butt > 5>>huge<<elseif $activeSlave.butt > 2>>big<<else>>cute<</if>>, well-fucked butt a little wiggle for you, @@.mediumaquamarine;<<if canSee($activeSlave)>>looking<<else>>smiling<</if>> at you gratefully,@@ as $he skips off to wash.
-		<<set $activeSlave.trust += 4>>
-		<<if _didAnal == 1>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<elseif _didVaginal == 1>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<</if>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<br><<link "Show the slut off">>
-	<<replace "#result">>
-		It takes a trifling command at your desk to surreptitiously slave one of the office cameras to $his impromptu masturbation session, and send the feed to many of the public screens. After a few minutes, <<if canSee($activeSlave)>>$he notices the setup through one of the office's glass walls<<else>>you inform the eager masturbator that $his show is live across the arcology<</if>>.
-		<<if ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishStrength > 60) && ($activeSlave.fetishKnown == 1)>>
-			$He climaxes almost instantly at the realization, which plays right into $his fetish.
-		<<else>>
-			$He pauses for a moment at the realization, but goes back to $his business, blushing a little harder.
-		<</if>>
-		$He even plays it up a little for $his audience; when $he
-		<<if ($activeSlave.belly >= 120000) && ($activeSlave.dick > 0)>>
-			climaxes, $he makes sure they can see the way $his enormously distended body spasms with orgasm.
-		<<elseif ($activeSlave.belly >= 10000) && ($activeSlave.dick > 0)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. However, $his <<if $activeSlave.bellyPreg >= 5000>>advanced pregnancy<<else>>_belly belly<</if>> thwarts $his efforts and $he ends up cumming on $his stomach's underside. $He brushes some cum off with $his fingers and brings it to $his mouth, smiling at the <<if canTaste($activeSlave)>>taste<<else>>sensation<</if>>.
-		<<elseif ($activeSlave.dick > 0) && ($activeSlave.dick < 5) && ($activeSlave.belly >= 5000)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. However, $he ends up just coating $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>_belly belly<</if>> in $his own cum.
-		<<elseif ($activeSlave.dick > 4) && ($activeSlave.belly >= 5000)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. $His dick is large enough to extend past $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>_belly belly<</if>>, allowing $him to blow $his load into $his waiting maw.
-		<<elseif ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-			finally manages to extract an orgasm from $his limp dick, $he hikes $his hips over $his head to direct it into $his mouth.
-		<<elseif $activeSlave.dick > 0>>
-			finally empties $his balls, $he hikes $his hips over $his head to direct the cum into $his mouth.
-		<<elseif $activeSlave.vagina == -1>>
-			climaxes, $he makes sure they can see the way $his asspussy spasms with orgasm.
-		<<else>>
-			finally climaxes, $he carefully licks $his hands clean, showing off $his enjoyment of $his own <<if canTaste($activeSlave)>>taste<<else>>fluids<</if>>.
-		<</if>>
-		Authenticity is hard to fake, and the many citizens who saw the broadcast don't doubt @@.green;your ability to train@@ a shameless slut.
-		<<run repX(1250, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-
 <<case "shift sleep">>
 
 <<link "Relaxed sex">>
@@ -2926,1428 +2489,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</replace>>
 <</link>>
 
-<<case "diet">>
-
-<<link "Catch $him at it and punish $him">>
-	<<replace "#result">>
-		It's childishly easy to catch $him at it. You simply call a slave eating $his breakfast away over the arcology's audio system, and then enter the kitchen by a different door. $activeSlave.slaveName has the departed slave's cup in $his hand and halfway to $his mouth when $he's caught in the act. You relieve $him of $his prize, and finding that $he has not started $his own proper portion, pour it out onto the floor. You tell $him to lap it up without using $his hands, and begin counting down from ten. $He obeys,
-		<<if $activeSlave.belly >= 300000>>
-			only to find $his _belly stomach keeps $him from reaching the puddle. When you reach zero you shove $him over $his middle, face first into the pool of slave food, and administer a stinging slap across $his thieving <<if $seeRace == 1>>$activeSlave.race <</if>> ass.
-		<<else>>
-			but slowly and hesitantly. When you reach zero you order $him to get <<if hasAllLimbs($activeSlave)>>to all fours<<else>>on the ground<</if>> and administer a stinging slap across $his thieving <<if $seeRace == 1>>$activeSlave.race <</if>> ass.
-		<</if>>
-		$He alternates ten seconds of desperate lapping with being beaten across the buttocks until $he's done, by which time $he is @@.gold;desperate to obey and avoid further punishment.@@
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Make $him eat in your office and keep $him busy while $he does">>
-		<<replace "#result">>
-			$He knows what it means when $he's informed that $him meals will now be available in your office only. You not only supervise $him intake strictly, but set up a bowl for $him on a little stand so the chubby bitch can lap up $his food<<if hasBothArms($activeSlave)>> hands-free<</if>> on
-			<<if $activeSlave.belly >= 300000>>
-				$his _belly belly,
-			<<elseif hasAllLimbs($activeSlave)>>
-				all fours,
-			<<else>>
-				the ground,
-			<</if>>
-			leaving $him open for use from behind.
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				<<= VCheck.Both($activeSlave, 3, 3)>>
-			<<elseif canDoVaginal($activeSlave)>>
-				<<= VCheck.Vaginal($activeSlave, 6)>>
-			<<elseif canDoAnal($activeSlave)>>
-				<<= VCheck.Anal($activeSlave, 6)>>
-			<</if>>
-			You're careful to avoid associating pleasure with misbehavior by taking $his cruelly every time $he eats, pinching $his nipples, and slapping $his <<if $seeRace == 1>>$activeSlave.race <</if>> ass as you ride $him. This is so effective that @@.gold;$he learns to obey@@ and @@.orange;loses weight@@ both.
-			<<set $activeSlave.trust -= 5, $activeSlave.weight -= 10, $activeSlave.diet = "healthy">>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<br><<link "Fill $him up with water as punishment">>
-	<<replace "#result">>
-		You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You indicate a table full of cups, and tell $him that $he can drink as much as $he wants from them if $he'll tell you the truth. $He confesses, and is horrified to find they're full of water, not food. You add casually that $he can choose not to 'eat' the contents... but that $he'll get no real food until $he finishes every one. Torn between hunger and reluctance, $he spends the next hour struggling with so much water that you have to check $him for water intoxication. $He finishes with <<if $activeSlave.belly >= 1500>>an even more bulbous<<else>>a bulging<</if>> stomach and a @@.gold;sincere desire to avoid further punishment.@@
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<br><<link "Make $him eat until $he regrets it">>
-	<<replace "#result">>
-		You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You indicate a table full of cups, and tell $him that $he is going to eat the contents of every last one, every day, until $he regrets being a glutton. $He gulps at the sight, but eagerly digs in. As $his stomach steadily distends and the cups rapidly empty, you realize you may have made a mistake. $He finishes with <<if $activeSlave.belly >= 1500>>an even more bulbous<<else>>a hugely bulging<</if>> stomach and a @@.mediumorchid;smirk at your so-called punishment.@@
-		<<set $activeSlave.devotion -= 5, $activeSlave.inflationType = "food", $activeSlave.inflationMethod = 1>>
-		<<if $activeSlave.bellyPreg > 0 || $activeSlave.bellyImplant > 0>>
-			<<set $activeSlave.inflation = 1>>
-		<<else>>
-			<<set $activeSlave.inflation = 3>>
-		<</if>>
-		<<run SetBellySize($activeSlave)>>
-	<</replace>>
-<</link>>
-<<if (cumSlaves().length >= 5) && (($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown == 0))>>
-	<br><<link "Restrict $him to nothing but fresh cum from the Dairy">>
-		<<replace "#result">>
-			You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You tell $him that you understand $his need to eat, and that for the rest of the week you'll mercifully be allowing $him to try a new diet on which $he can eat as much as $he wants. $He's overjoyed <<if canHear($activeSlave)>>to hear it<<elseif canSee($activeSlave)>>when $he reads it on a nearby screen display<<else>>when $he figures it out<</if>>, though this pleasure is replaced with extreme disgust when $he learns that $his only culinary options are limited to cum. It's just nutritionally augmented enough to prevent starvation. Disgust is defeated by hunger pangs, and $he spends most of the week going around with a @@.hotpink;preoccupied@@ look on $his face and<<if $activeSlave.belly >= 1500>> an even more<<else>> a slightly<</if>> distended belly. By the end, $he's starting to @@.lightcoral;salivate@@ at the mere <<if canSmell($activeSlave)>>scent<<else>>thought<</if>> of ejaculate.
-			<<set $activeSlave.devotion += 4, $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65, $activeSlave.inflation = 1, $activeSlave.inflationType = "cum", $activeSlave.inflationMethod = 1>>
-			<<run SetBellySize($activeSlave)>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "huge naturals">>
-
-<<link "Give $him a nice massage">>
-	<<replace "#result">>
-		You sit on the couch next to your desk and pat your thighs. $He smiles and comes over, lowering $himself
-		<<if $PC.belly >= 10000>>
-			beside you and cozying up to your pregnant belly and sliding a hand down to see to your pussy without hesitation. You help $him get comfortable and instead of demanding $he please you or get down on all fours, you just sit there with $him,
-		<<elseif $PC.dick == 0>>
-			into your lap without hesitation. You help $him get comfortable and instead of <<if $PC.dick == 0>>grinding<<else>>thrusting<</if>> or telling $him to ride, you just sit there with $him in your lap,
-		<<else>>
-			onto your member
-			<<if $PC.vagina != -1>>
-				and sliding a hand down to see to your pussy
-			<</if>>
-			without hesitation. You help $him get comfortable and instead of <<if $PC.dick == 0>>grinding<<else>>thrusting<</if>> or telling $him to ride, you just sit there with $him in your lap,
-		<</if>>
-		gently massaging $his massive tits. They get sore from swinging around as $he moves, works, and fucks, and soon $he's groaning with pleasure at the attention. You finally manage to bring $him to orgasm with almost nothing but delicate stimulation of $his nipples. @@.mediumaquamarine;$He has become more trusting of you.@@
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-		<<if $activeSlave.lactation > 0>>
-			<<set $activeSlave.lactationDuration = 2>>
-			<<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>>
-		<<else>>
-			<<= induceLactation($activeSlave, 3)>>
-		<</if>>
-	<</replace>>
-<</link>>
-<<if (canDoAnal($activeSlave) || canDoVaginal($activeSlave)) && $activeSlave.belly < 100000>>
-	<br><<link "Use $him so they swing around">>
-		<<replace "#result">>
-			You tell $him to kneel on the smooth floor. $He knows this means doggy style, so $he compliantly arches $his back and cocks $his hips to offer $himself to you. You<<if $PC.dick == 0>> don a strap-on and<</if>> enter
-			<<if canDoVaginal($activeSlave)>>
-				$his pussy
-			<<else>>
-				$his ass
-			<</if>>
-			without preamble and seize $his hips. $He braces $himself, knowing what's coming, but soon $he discovers a new disadvantage to $his pendulous breasts: as you pound $him hard, $his long nipples frequently brush against the floor, causing $him to wince and buck.
-			<<if $activeSlave.dick > 0 && !($activeSlave.chastityPenis)>>
-				<<if canAchieveErection($activeSlave)>>
-					$His cock doesn't help, either, flopping around half-erect as $he vacillates between pain and arousal.
-				<<elseif $activeSlave.dick > 20>>
-					$His cock doesn't help, either, flopping around on the floor as $he vacillates between pain and arousal.
-				<<else>>
-					$His cock doesn't help, either, flopping around feebly as $he vacillates between pain and arousal.
-				<</if>>
-			<<elseif $activeSlave.clit > 2>>
-				$His huge clit doesn't help, either, flopping around half-erect as $he vacillates between pain and arousal.
-			<</if>>
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				When you switch to $his ass, the shallower strokes give $his nipples a bit of respite.
-			<</if>>
-			You finish with a particularly hard thrust
-			<<if $PC.dick == 0>>
-				and shake with climax,
-			<<else>>
-				to spill your seed deep inside $his
-				<<if canDoAnal($activeSlave)>>
-					butt, ramming forward hard enough to spill $him down onto $his bosom. As you rise, $his discomfited form is a pretty sight, with $his breasts squashed against the floor and $his well fucked butt lewdly relaxed.
-				<<else>>
-					pussy, ramming forward hard enough to spill $him down onto $his bosom. As you rise, $his discomfited form is a pretty sight, with $his breasts squashed against the floor and $his well fucked cunt lewdly gaped.
-				<</if>>
-			<</if>>
-			@@.hotpink;$He has become more submissive.@@
-			<<set $activeSlave.devotion += 4>>
-			<<= VCheck.Both($activeSlave, 1)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Show $him off in public">>
-		<<replace "#result">>
-			You bring $him out onto the promenade, still nude, $his huge bare udders attracting open stares as $his every movement sets them in motion.
-			<<if $activeSlave.sexualFlaw == "attention whore">>
-				The slut loves being the center of attention and couldn't ask for more.
-			<<elseif ($activeSlave.fetishKnown == 1) && ($activeSlave.fetishStrength > 60) && ($activeSlave.fetish == "humiliation")>>
-				The slut loves being embarrassed, and $he blushes furiously as $his nipples stiffen with arousal.
-			<<elseif ($activeSlave.energy > 95)>>
-				The nympho slut loves being shown off, and $he flaunts $his boobs shamelessly.
-			<<elseif ($activeSlave.counter.anal > 100) && ($activeSlave.counter.oral > 100)>>
-				$He's such a veteran sex slave that $he takes the stares in stride.
-			<<else>>
-				$He blushes a little, but tips $his chin up and follows you obediently.
-			<</if>>
-			When you reach a good spot, you grab $his
-			<<if ($activeSlave.weight > 30)>>
-				fat ass
-			<<elseif ($activeSlave.weight > 10)>>
-				plush hips
-			<<elseif ($activeSlave.weight >= -10)>>
-				trim hips
-			<<elseif ($activeSlave.butt > 2)>>
-				big butt
-			<<else>>
-				skinny ass
-			<</if>>
-			and
-			<<if ($activeSlave.height >= 185)>>
-				pull $his tall body in
-			<<elseif ($activeSlave.height >= 160)>>
-				pull $him up on tiptoe
-			<<else>>
-				push $his petite form up onto a railing
-			<</if>>
-			for standing sex. $He cocks $his hips and takes your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> compliantly, and after a few thrusts you reach down, seize $him behind each knee, and
-			<<if $PC.belly >= 5000 && $activeSlave.belly >= 100000>>
-				collapse against a nearby bunch under the excessive weight between your pregnancy and $his _belly stomach. Appreciating the bench's sacrifice, you return to fucking $him.
-				<<if $activeSlave.bellyPreg >= 600000>>
-					Penetrating $him while feeling so much movement between you is unbelievably lewd. $His children squirm at their mother's excitement, causing $his bloated body to rub against you in ways you couldn't imagine.
-				<</if>>
-			<<elseif $activeSlave.belly >= 100000>>
-				pull $him as close as you can with $his _belly belly between you. Struggling to support the immense weight, you back $him against a rail so that you can continue to fuck $him while holding $him.
-				<<if $activeSlave.bellyPreg >= 600000>>
-					Penetrating $him while feeling so much movement between you is unbelievably lewd. $His children squirm at their mother's excitement, causing $his bloated body to rub against you in ways you couldn't imagine.
-				<</if>>
-			<<else>>
-				hoist $his legs up so $he's pinned against your
-				<<if $PC.belly >= 1500>>
-					pregnancy,
-				<<elseif ($PC.boobs < 300)>>
-					chest,
-				<<else>>
-					boobs,
-				<</if>>
-				helpless to do anything but let you hold $him in midair and fuck $him.
-			<</if>>
-			<<if canDoVaginal($activeSlave)>>
-				<<if ($activeSlave.vagina > 1)>>
-					$His pussy can take a hard pounding, so you give it to $him.
-				<<else>>
-					$His poor tight pussy can barely take the pounding you're administering.
-				<</if>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<else>>
-				<<if ($activeSlave.anus > 1)>>
-					$His loose butthole can take a hard pounding, so you give it to $him.
-				<<else>>
-					$His poor tight butthole can barely take the pounding you're administering.
-				<</if>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-			$He loses all composure, gasping and panting as the massive weight of $his chest bounces up and down, making an audible clap with each stroke as $his huge tits slap painfully together. Despite this, or perhaps partly because of it, $he begins to orgasm,
-			<<if ($activeSlave.chastityPenis == 1)>>
-				the discomfort of being half-hard under $his chastity cage making $him squirm as cum rushes out of the hole at its tip.
-			<<elseif canAchieveErection($activeSlave)>>
-				<<if ($activeSlave.dick > 3)>>
-					$his monster of a cock releasing a jet of cum with each thrust into $him.
-				<<elseif ($activeSlave.dick > 3)>>
-					$his huge cock releasing a jet of cum with each thrust into $him.
-				<<elseif ($activeSlave.dick > 1)>>
-					$his cock releasing a spurt of cum with each thrust into $him.
-				<<else>>
-					$his tiny dick spurting cum with each thrust into $him.
-				<</if>>
-			<<elseif ($activeSlave.dick > 9)>>
-				$his huge, soft cock spurting cum as it wiggles to your motions.
-			<<elseif ($activeSlave.dick > 0)>>
-				$his soft cock scattering cum all over the place as it flops around.
-			<<elseif ($activeSlave.belly >= 1500)>>
-				$his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly adding to $his near-total discomfiture.
-			<<elseif $activeSlave.weight > 95>>
-				$his soft body jiggling as $he climaxes.
-			<<elseif ($activeSlave.muscles > 5)>>
-				$his abs convulsing deliciously as $he climaxes.
-			<<elseif canDoVaginal($activeSlave)>>
-				$his pussy tightening.
-			<<else>>
-				$his poor anal ring tightening.
-			<</if>>
-			The crowd that surrounds you during this noisy spectacle @@.green;is suitably impressed.@@
-			<<run repX(1250, "event", $activeSlave)>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "hugely pregnant">>
-
-<<link "Help $him with those hard to reach places">>
-	<<replace "#result">>
-		$He's absorbed enough with $his application that $he starts with surprise when you gently encircle $him from behind with a hug<<if $PC.belly >= 5000>>, pushing your own gravid belly into the small of $his back<</if>>. When you take the lotion and begin to lovingly massage it into $his harder to reach areas, $he sighs with pleasure and leans against you.
-		<<if hasAnyArms($activeSlave) && $PC.belly >= 1500>> $He takes the lotion and begins to return the favor. You spend the rest of $his break carefully massaging each other's baby bumps.<</if>>
-		<<if !canTalk($activeSlave)>>
-			<<if $activeSlave.voice == 0>>
-				$He looks like $he would love to thank you, were $he not mute.
-			<<elseif ($activeSlave.accent >= 3)>>
-				$He looks like $he would love to thank you, if $he knew how.
-			<</if>>
-		<<else>>
-			<<if ($activeSlave.lips > 70)>>
-				$He murmurs through $his huge lips,
-			<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-				$He murmurs through $his piercings,
-			<<else>>
-				$He murmurs,
-			<</if>>
-			"That felt really ni<<c>>e, <<Master>>."
-			<<if $PC.belly >= 1500>>
-				You have to agree, it did feel nice on your growing middle.
-			<</if>>
-		<</if>>
-		@@.mediumaquamarine;$He has become more trusting of you.@@
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<<if (canDoAnal($activeSlave) && $activeSlave.mpreg == 1) || (canDoVaginal($activeSlave))>>
-	<br><<link "Gently fuck $him while helping $him apply lotion">>
-		<<replace "#result">>
-			$He's absorbed enough with $his application that $he starts with surprise when you gently encircle $him from behind with a hug<<if $PC.belly >= 5000>>, pushing your own gravid belly into the small of $his back<</if>>. When you take the lotion and begin to lovingly massage it into $his harder to reach areas, $he sighs with pleasure and leans back into you. $He feels <<if $PC.dick == 0>>the warmth of your growing arousal<<else>>your erection hard<</if>> against $him, so $he
-			<<if isAmputee($activeSlave)>>
-				wriggles $his limbless form around on the floor so as to offer $himself to you.
-			<<else>>
-				slowly kneels down with you into a comfortable lotus position on the bathroom floor.
-			<</if>>
-			<<if $activeSlave.mpreg == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<</if>>
-			Coupling like this, you can't <<if $PC.dick == 0>>scissor<<else>>fuck<</if>> $him all that hard, but that's just fine given
-			<<if $PC.preg >= 5000>>
-				your condition.
-			<<else>>
-				$his condition.
-			<</if>>
-			$He snuggles back into you as you have gentle sex while looking after $his drum-taut skin.
-			<<if !canTalk($activeSlave)>>
-				<<if $activeSlave.voice == 0>>
-					$He looks like $he would love to thank you, were $he not mute.
-				<<elseif ($activeSlave.accent >= 3)>>
-					$He looks like $he would love to thank you, if $he knew how.
-				<</if>>
-			<<else>>
-				<<if ($activeSlave.lips > 70)>>
-					$He murmurs through $his huge lips,
-				<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-					$He murmurs through $his piercings,
-				<<else>>
-					$He murmurs,
-				<</if>>
-				"That feel<<s>> really ni<<c>>e, <<Master>>."
-			<</if>>
-			@@.mediumaquamarine;$He has become more trusting of you.@@
-			<<set $activeSlave.trust += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.mpreg == 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave)>>
-	<<if $activeSlave.mpreg == 1>>
-		<br><<link "$His backdoor can't get more pregnant">>
-			<<replace "#result">>
-				$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and bend $him over the sink for a quick assfuck.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				<<if hasAnyArms($activeSlave)>>
-					$He does $his best to brace $himself against the sink, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-				<</if>>
-				Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.
-				<<if ($activeSlave.lactation == 1)>>
-					As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-				<<elseif ($activeSlave.boobs > 1000)>>
-					As you pound $him, $his huge breasts compound the discomfort.
-				<</if>>
-				When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief. @@.hotpink;$He has become more submissive.@@
-				<<set $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his virginity//<</if>>
-		<<else>>
-			<br><<link "$His backdoor isn't pregnant">>
-				<<replace "#result">>
-				$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and bend $him over the sink for a quick assfuck.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				<<if hasAnyArms($activeSlave)>>
-					$He does $his best to brace $himself against the sink, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-				<</if>>
-				Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.
-				<<if ($activeSlave.lactation == 1)>>
-					As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-				<<elseif ($activeSlave.boobs > 1000)>>
-					As you pound $him, $his huge breasts compound the discomfort.
-				<</if>>
-				When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief. @@.hotpink;$He has become more submissive.@@
-				<<set $activeSlave.devotion += 4>>
-			<</replace>>
-		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his virginity//<</if>>
-	<</if>>
-<</if>>
-<<if (canDoAnal($activeSlave) && $activeSlave.mpreg == 1) || (canDoVaginal($activeSlave)) && $activeSlave.belly >= 300000>>
-	<br><<link "Tip $him over and fuck $him">>
-		<<replace "#result">>
-			$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and shove $him onto $his _belly stomach for a quick fuck.
-			<<if $activeSlave.mpreg == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<</if>>
-			<<if hasAnyArms($activeSlave)>>
-				$He does $his best to steady $himself atop the squirming mass, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-			<</if>>
-			<<if $activeSlave.mpreg == 1>>
-				Taking it up the ass
-			<<else>>
-				Getting roughly fucked
-			<</if>>
-			while hugely pregnant isn't the most comfortable way to have sex, neither is being forced to put more pressure on an already overfilled organ, but such is the life of a sex slave.
-			<<if ($activeSlave.lactation == 1)>>
-				As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-			<<elseif ($activeSlave.boobs > 1000)>>
-				As you pound $him, $his huge breasts compound the discomfort.
-			<</if>>
-			When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief and rolls onto $his side. @@.hotpink;$He has become more submissive.@@
-			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.mpreg == 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "PA servant">>
-
-<<link "Share the slave with your PA">>
-	<<replace "#result">>
-		You enter, eliciting an embarrassed
-		"Um, hi <<Master>>" from $activeSlave.slaveName and a cheery wave from $assistant.name. At this stage of your morning ablutions, you're conveniently naked, so you
-		<<if $PC.belly >= 5000>>
-			heft yourself
-		<<elseif $PC.belly >= 1500>>
-			clamber up
-		<<else>>
-			leap up
-		<</if>>
-		onto the desktop and kneel upright, legs splayed. (Naturally, the desk is reinforced and sealed for exactly this reason.) You point meaningfully at your
-		<<if $PC.dick != 0>>
-			stiff prick <<if $PC.vagina != -1>>and flushed pussy<</if>>, and the obedient slave <<if $activeSlave.belly >= 5000>>hefts $himself<<else>>clambers<</if>> up to suck you off<<if $PC.vagina != -1>> and eat you out<</if>>. When you're close, you surprise $him by pulling your cock out of $his mouth and blowing your load onto the glass.
-		<<else>>
-			hot cunt, and the obedient slave <<if $activeSlave.belly >= 5000>>hefts $himself<<else>>clambers<</if>> up to eat you out. You surprise $him by taking your time, drawing out the oral session with the ulterior motive of getting as much saliva and pussyjuice onto the glass as possible.
-		<</if>>
-		<<= capFirstChar($assistant.name)>> shifts _hisA avatar so that this lands all over _hisA
-		<<switch $assistant.appearance>>
-		<<case "monstergirl">>
-			cocks.
-		<<case "shemale">>
-			huge cock.
-		<<case "amazon">>
-			muscular pussy.
-		<<case "businesswoman">>
-			mature pussy.
-		<<case "fairy" "pregnant fairy">>
-			tiny body.
-		<<case "goddess">>
-			fertile pussy.
-		<<case "hypergoddess">>
-			gaping pussy.
-		<<case "loli" "cherub">>
-			tight virgin pussy.
-		<<case "preggololi">>
-			tight young pussy.
-		<<case "angel">>
-			virgin pussy.
-		<<case "incubus">>
-			perfect dick.
-		<<case "succubus">>
-			lovely pussy.
-		<<case "imp">>
-			slutty pussy.
-		<<case "witch">>
-			plump breasts.
-		<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-			pussy-like body.
-		<<case "schoolgirl">>
-			pretty young pussy.
-		<</switch>>
-		"Clean me off, $activeSlave.slaveName," _heA demands, winking broadly at you. The slave, knowing that commands from _himA are commands from you, repositions $himself to lick up the <<if $PC.dick != 0>>ejaculate<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>girlcum<</if>>.
-		<br><br>
-		This brings the slave into a crouch with $his ass pointed at you,
-		<<if canDoVaginal($activeSlave)>>
-			<<if $activeSlave.vagina > 2>>
-				$his experienced pussy practically begging for a pounding.
-			<<elseif $activeSlave.vagina > 1>>
-				$his nice pussy practically begging for a good hard fucking.
-			<<else>>
-				$his tight little pussy completely vulnerable.
-			<</if>>
-			As <<if $PC.dick != 0>><<if $PC.vagina != -1>>use manual stimulation of your pussy to get your dick<<else>>stroke yourself<</if>> rapidly back to full mast<<else>>don a strap-on<</if>>, $assistant.name opines helpfully, "Hey $activeSlave.slaveName! You're about to get fucked!" The slave reacts by obediently reaching back to spread $his buttocks and relaxing, but $assistant.name ruins $his attempt at graceful submission." <<if $PC.title == 1>>Siiir,<<else>>Ma'aaam,<</if>> $he's bluuuushing," $he says tauntingly, and the slave stiffens with renewed embarrassment, not to mention stimulation, as you penetrate $him.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			<<if $activeSlave.anus > 2>>
-				$his big asspussy practically begging for a pounding.
-			<<elseif $activeSlave.anus > 1>>
-				$his nice asshole practically begging for a good hard fucking.
-			<<else>>
-				$his tight little rosebud completely vulnerable.
-			<</if>>
-			As <<if $PC.dick != 0>><<if $PC.vagina != -1>>use manual stimulation of your pussy to get your dick<<else>>stroke yourself<</if>> rapidly back to full mast<<else>>don a strap-on<</if>>, $assistant.name opines helpfully, "Hey $activeSlave.slaveName! You're about to get buttfucked!" The slave reacts by obediently reaching back to spread $his buttocks, and relaxes $his anus, but $assistant.name ruins $his attempt at graceful anal submission." <<if $PC.title == 1>>Siiir,<<else>>Ma'aaam,<</if>> $he's bluuuushing," $he says tauntingly, and the slave stiffens with renewed embarrassment, not to mention discomfort, as you penetrate $him.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		$He keeps licking away, cleaning up the mess you made as $assistant.name does everything $he can to make it seem like the slave is pleasuring $him. Partway through, $assistant.name sticks out a hand for a high-five from you, producing a gurgle of indignation @@.mediumaquamarine;or perhaps even laughter@@ as $his owner and $his owner's personal assistant program high-five over $his back.
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<<if canDoAnal($activeSlave)>>
-	<br><<link "Double penetrate the slave with your PA">>
-		<<replace "#result">>
-			You enter, eliciting an embarrassed
-			"Um, hi <<Master>>" from $activeSlave.slaveName, and ask $assistant.name if $he'd like to DP the slave with you.
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				"Oh yes," _heA purrs threateningly over the slave's moan of apprehension, and _hisA avatar begins to stroke _hisA dicks meaningfully.
-			<<case "shemale" "incubus">>
-				"Fuck yes," _heA groans over the slave's moan of apprehension, and _hisA avatar begins to stroke _hisA cock meaningfully.
-			<<case "amazon">>
-				"Yeah!" _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on carved from mammoth tusk.
-			<<case "businesswoman">>
-				"Oh yes," _heA purrs sadistically over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on.
-			<<case "fairy" "pregnant fairy">>
-				"Oh yeah!" _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly conjures up a magic floating dick.
-			<<case "goddess" "hypergoddess">>
-				"That would be lovely," _heA says radiantly over the slave's moan of apprehension, and _hisA avatar acquires a phallus of light.
-			<<case "angel" "cherub">>
-				"If you insist," _heA says reluctantly over the slave's moan of apprehension, and _hisA avatar acquires a phallus of light.
-			<<case "succubus">>
-				"Just this once," _heA says stroking $his clit as it steadily swells into a fully functional cock.
-			<<case "imp">>
-				"Fuck yes," _heA groans over the slave's moan of apprehension, and _hisA avatar quickly dons a huge, spiked strap-on.
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				"Of course," _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly forms a huge, fleshy, bulbous cock.
-			<<default>>
-				"Fuck yeah!" _heA cheers over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on.
-			<</switch>>
-			You indicate a fuckmachine in the corner of the room, and the slave obediently hurries over to it. It's vertical, and $he hops up on it, positioning $his anus over its
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				pair of dildos. They insert themselves
-			<<case "shemale" "incubus">>
-				frighteningly big dildo. It inserts itself
-			<<case "amazon">>
-				animalistically ribbed dildo. It inserts itself
-			<<case "imp">>
-				terrifyingly spiked, huge dildo. It inserts itself
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				frighteningly big, lumpy and uneven dildo. It inserts itself
-			<<default>>
-				large dildo. It inserts itself
-			<</switch>>
-			gently but firmly and then stops, the panting slave's
-			<<if $activeSlave.weight > 130>>
-				thick
-			<<elseif $activeSlave.weight > 95>>
-				chubby
-			<<elseif $activeSlave.muscles > 30>>
-				heavily muscled
-			<<elseif $activeSlave.preg >= $activeSlave.pregData.normalBirth/8>>
-				motherly
-			<<elseif $activeSlave.weight > 10>>
-				plush
-			<<elseif $activeSlave.muscles > 5>>
-				toned
-			<<else>>
-				feminine
-			<</if>>
-			thighs quivering a little from supporting $his body in its perch atop the machine, and from the fullness of $his anus.
-			<<= VCheck.Anal($activeSlave, 3)>>
-			$He knows this is going to be challenging, and is breathing deeply, doing $his best to stay relaxed. You cannot resist slapping your <<if $PC.dick != 0>>big cock lightly<<else>>lubricated strap-on<</if>> against $his cheek, producing a groan of apprehension.
-			<br><br>
-			You push $him gently backward, letting $him get accustomed to the new angle.<<if $activeSlave.boobs > 2000>> $His monstrous tits spread to either side of $his <<if $activeSlave.belly >= 5000>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>now upright torso<</if>>, and you take a moment to play with them as $he prepares $himself.<</if>>
-			<<if canDoVaginal($activeSlave)>>
-				$He gasps as $he feels <<if $PC.dick != 0>>your hot dickhead<<else>>the slick head of your strap-on<</if>> part $his pussylips, no doubt feeling full already.
-				<<= VCheck.Vaginal($activeSlave, 3)>>
-				When you're all the way in, the <<if $assistant.appearance == "monstergirl">>dildos in $his butt begin<<else>>dildo in $his butt begins<</if>> to fuck $him, harder and harder, as $assistant.name moans happily. The all-encompassing feeling of fullness as $his cunt and ass are fucked to the very limit of their capacities
-			<<else>>
-				$He gasps as $he feels you push a finger up $his already-full butt and pull $his sphincter a bit wider. You withdraw it and replace it with <<if $PC.dick != 0>>your turgid cock<<else>>your strap-on<</if>>; the slave writhes involuntarily, $his body trying to refuse the invasion of yet another phallus.
-				<<= VCheck.Anal($activeSlave, 3)>>
-				When you're all the way in, the <<if $assistant.appearance == "monstergirl">>dildos alongside your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>> in $his butt begin<<else>>dildo alongside your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>> in $his butt begins<</if>> to fuck $him, harder and harder, as $assistant.name moans happily. The all-encompassing feeling of fullness as $his ass is fucked to the very limit of its capacity
-			<</if>>
-			quickly drives all feminine grace, presence of mind, or really, @@.hotpink;conscious thought out of the poor slave.@@ After begging for mercy for a short while, $he lapses into animal groans, drooling and leaking tears out the corner of $his eyes as you and $assistant.name fuck $him into insensibility. When you climax, $assistant.name ejaculates, filling the slave's anus with warm fluid.
-			<br><br>
-			By this point $he's so helpless that you
-			<<if $activeSlave.belly >= 300000 || $activeSlave.weight > 190>>
-				have to struggle to lift
-			<<else>>
-				gently lift
-			<</if>>
-			$him off the fuckmachine and carry $him to the shower. You set $him down there, and $assistant.name activates the water, using the powerful jets in pulses to massage life back into your exhausted fuckpuppet. $His avatar appears on a screen behind the shower, creating an optical illusion that makes it look like $he's petting the slave in time with the water. $He reassures to the slave as $he does:
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				"You're a good little cocksock," $he says kindly.
-			<<case "shemale">>
-				"I like your butthole," $he says politely.
-			<<case "amazon">>
-				"I like fucking your butthole," $he says kindly.
-			<<case "businesswoman">>
-				"I'm sure you won't be sold right away," $he says.
-			<<case "fairy" "pregnant fairy">>
-				"You're a good $girl," $he says.
-			<<case "goddess" "hypergoddess">>
-				"There, there," $he says kindly. "You are a good sex slave."
-			<<case "angel" "cherub">>
-				"There, there," $he says kindly. "You are a good $girl."
-			<<case "incubus" "succubus" "imp">>
-				"You're a good little cocksleeve," $he says honestly.
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				"You're a good little nursery," $he says.
-			<<default>>
-				"I like you," $he says cheerily.
-			<</switch>>
-			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "like me">>
-
-<<link "Fuck $him">>
-	<<replace "#result">>
-		$He asked for it, and $he'll get it. You get to your
-		<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-			feet, unhook $his chastity,
-		<<else>>
-			feet
-		<</if>>
-		and snap your fingers, pointing
-		<<if $PC.dick == 0>>
-			at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by grabbing $him on either side of $his neck and
-			<<if $activeSlave.belly >= 300000>>
-				pulling onto $his _belly stomach
-			<<else>>
-				shoving $him down to kneel at your feet
-			<</if>>
-			with $his face
-			<<if $PC.belly >= 5000>>
-				crammed under your pregnant belly, level with your cunt.
-			<<else>>
-				level with your cunt.
-			<</if>>
-			One of your hands shifts behind $his head and tilts it back as you step forward, grinding against $his mouth. $He struggles involuntarily, but then perceptibly recollects $himself, relaxes, and starts to eat you out. Whatever internal turmoil $he's working through, you don't care, and neither does your pussy. When you climax and release $him, $he stumbles off, looking oddly proud of $himself. It seems $he got something out of that: @@.mediumaquamarine;a confidence boost,@@ at least.
-		<<else>>
-			at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-			<<if $activeSlave.belly >= 5000>>
-				gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-			<<else>>
-				kneels,
-			<</if>>
-			$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by shoving $him down so $his collarbone is resting on the back of the couch and $his ass is at just the right height.<<if $PC.vagina != -1>> You ensure that you're fully hard and get $him in the right frame of mind by grinding the pussy beneath your dick against $him.<</if>> You fuck
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				$his pussy and then $his ass in quick succession, plundering $his holes without much regard for $his pleasure.
-				<<= VCheck.Both($activeSlave, 1)>>
-				$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up $his butt.
-			<<elseif canDoVaginal($activeSlave)>>
-				$his pussy hard, without much regard for $his pleasure.
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-				$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside $him.
-			<<else>>
-				$his ass hard, without cruelty but without much concern for $his pleasure, either.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				$He takes it obediently, and does $his best to act like $he's enjoying being sodomized.
-			<</if>>
-			$He stumbles off to wash, looking oddly proud of $himself. It seems $he got something out of that: @@.mediumaquamarine;a confidence boost,@@ at least.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-<br><<link "Rape $him">>
-	<<replace "#result">>
-		$He'll get more than $he asked for. You get to your
-		<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-			feet, unhook $his chastity,
-		<<else>>
-			feet
-		<</if>>
-		and snap your fingers, pointing
-		<<if $PC.dick == 0>>
-			at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by slapping $him, and when $he instinctively cringes away from the blow, poking the back of one of $his knees with your foot.
-			<<if $activeSlave.belly >= 5000>>
-				$His <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> form
-			<<else>>
-				$He
-			<</if>>
-			collapses like a doll with its strings cut, already crying. You seize $his head in both hands and ride $his sobbing mouth. If $he thought that rape required a dick, $he was wrong. If $he thought that you needed a strap-on to rape $him, $he was wrong. Your fingers form claws, holding $his head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against $his crying face.
-		<<else>>
-			at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-			<<if $activeSlave.belly >= 5000>>
-				gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-			<<else>>
-				kneels,
-			<</if>>
-			$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by
-			<<if $activeSlave.belly >= 600000>>
-				slamming your hands against the bloated mass grossly distending $his sides,
-			<<else>>
-				jabbing a thumb into one of $his kidneys,
-			<</if>>
-			forcing $his back to arch in involuntary response, and then grinding $his face into the couch cushions.
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				$His cunt isn't all that wet, and $he has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to $his anus.
-				<<= VCheck.Both($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-			<<elseif canDoVaginal($activeSlave)>>
-				$His cunt isn't all that wet, and $he has cause to regret this as you waste no time with foreplay.
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you rape $him into inelegant, tearful begging for you to take your dick out of $his cunt because it hurts<<if canGetPregnant($activeSlave)>>, followed by desperate pleas to not cum inside $him since it's a danger day<</if>>.
-			<<else>>
-				You spit on $his asshole and then give $him some anal foreplay, if slapping your dick against $his anus twice before shoving it inside $him counts as anal foreplay.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-			<</if>>
-			It isn't the first time you've heard that, or the hundredth.
-		<</if>>
-		When you're done, you discard $him like the human sex toy $he is, and go back to your work. $He stumbles off, looking @@.gold;fearful@@ but strangely @@.hotpink;complacent,@@ as though $he's accepted this to an extent.
-		<<set $activeSlave.trust -= 4, $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-<br><<link "Get the truth out of $him">>
-	<<replace "#result">>
-		You ask $him why $he's really here, with devastating directness and in a tone that will brook no disobedience. $He quails, $his shoulders slumping as $he
-		<<if $activeSlave.belly >= 1500>>
-			<<if $activeSlave.pregKnown == 1>>
-				hugs $his pregnancy
-			<<else>>
-				attempts to hug $himself with $his _belly belly in the way
-			<</if>>
-		<<else>>
-			hugs $himself
-		<</if>>
-		and $his knees turning inward as $he cringes, the perfect picture of the standard human fear response. It seems $he thought you wouldn't notice $his insincerity. $He swallows nervously and makes no response, but then you <<if canSee($activeSlave)>>allow impatience to cloud your brow<<else>>cough with impatience<</if>> and $he hurriedly explains $himself.
-		<<if !canTalk($activeSlave)>>
-			$He uses sign language to communicate that $he asked the other slaves what $he could do to improve $his life, and that they told $him to do $his best to win your favor. $He asked them how to do that, and they told $him to ask you to fuck $him.
-		<<else>>
-			"<<Master>>, I, um, a<<s>>ked the other girl<<s>> what I could do to, you know, do better here," $he <<say>>s. "They <<s>>aid to g-get you to like me. A-and when I a<<s>>ked them how to do that, th-they <<s>>aid t-to a<<s>>k you to fuck me."
-		<</if>>
-		Then $he bites $his lip and <<if canSee($activeSlave)>>watches you<<elseif canHear($activeSlave)>>listens<<else>>waits<</if>> anxiously.
-		<br><br><span id="result2">
-			<<link "They're not wrong">>
-				<<replace "#result2">>
-					You get to your feet, letting $him know that the other slaves weren't wrong. $His relief is
-					<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-						palpable as you undo $his chastity.
-					<<else>>
-						palpable.
-					<</if>>
-					You snap your fingers, pointing
-					<<if $PC.dick == 0>>
-						at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by grabbing $him on either side of $his neck and
-						<<if $activeSlave.belly >= 300000>>
-							pulling onto $his _belly stomach
-						<<else>>
-							shoving $him down to kneel at your feet
-						<</if>>
-						with $his face
-						<<if $PC.belly >= 5000>>
-							crammed under your pregnant belly, level with your cunt.
-						<<else>>
-							level with your cunt.
-						<</if>>
-						One of your hands shifts behind $his head and tilts it back as you step forward, grinding against $his mouth. $He struggles involuntarily, but then perceptibly recollects $himself, relaxes, and starts to eat you out. Whatever internal turmoil $he's working through, you don't care, and neither does your pussy. When you climax and release $him, $he stumbles off,
-					<<else>>
-						at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-						<<if $activeSlave.belly >= 5000>>
-							gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-						<<else>>
-							kneels,
-						<</if>>
-						$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by shoving $him down so $his collarbone is resting on the back of the couch and $his ass is at just the right height. You fuck
-						<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-							$his pussy and then $his ass in quick succession, plundering $his holes without much regard for $his pleasure.
-							<<= VCheck.Both($activeSlave, 1)>>
-							$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up $his butt.
-						<<elseif canDoVaginal($activeSlave)>>
-							$his pussy hard, without much regard for $his pleasure.
-							<<= VCheck.Vaginal($activeSlave, 1)>>
-							$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside $him.
-						<<else>>
-							$his ass hard, without cruelty but without much concern for $his pleasure, either.
-							<<= VCheck.Anal($activeSlave, 1)>>
-							$He takes it obediently, and does $his best to act like $he's enjoying being sodomized.
-						<</if>>
-						$He stumbles off to wash,
-					<</if>>
-					looking @@.mediumaquamarine;much more confident.@@
-					<<set $activeSlave.trust += 4>>
-				<</replace>>
-			<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-			<br><<link "Now rape $him">>
-				<<replace "#result2">>
-					You get to your feet, letting $him know that the other slaves weren't wrong. $His relief is palpable, but $he's getting ahead of
-					<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-						$himself as you undo $his chastity.
-					<<else>>
-						$himself.
-					<</if>>
-					You snap your fingers, pointing
-					<<if $PC.dick == 0>>
-						at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by slapping $him, and when $he instinctively cringes away from the blow, poking the back of one of $his knees with your foot.
-						<<if $activeSlave.belly >= 5000>>
-							$His <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> form
-						<<else>>
-							$He
-						<</if>>
-						collapses like a doll with its strings cut, already crying. You seize $his head in both hands and ride $his sobbing mouth. If $he thought that rape required a dick, $he was wrong. If $he thought that you needed a strap-on to rape $him, $he was wrong. Your fingers form claws, holding $his head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against $his crying face.
-					<<else>>
-						at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-						<<if $activeSlave.belly >= 5000>>
-							gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-						<<else>>
-							kneels,
-						<</if>>
-						$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by
-						<<if $activeSlave.belly >= 600000>>
-							slamming your hands against the bloated mass grossly distending $his sides,
-						<<else>>
-							jabbing a thumb into one of $his kidneys,
-						<</if>>
-						forcing $his back to arch in involuntary response, and then grinding $his face into the couch cushions.
-						<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-							$His cunt isn't all that wet, and $he has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to $his anus.
-							<<= VCheck.Both($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-						<<elseif canDoVaginal($activeSlave)>>
-							$His cunt isn't all that wet, and $he has cause to regret this as you waste no time with foreplay.
-							<<= VCheck.Vaginal($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you rape $him into inelegant, tearful begging for you to take your dick out of $his cunt because it hurts<<if canGetPregnant($activeSlave)>>, followed by desperate pleas to not cum inside $him since it's a danger day<</if>>.
-						<<else>>
-							You spit on $his asshole and then give $him some anal foreplay, if slapping your dick against $his anus twice before shoving it inside $him counts as anal foreplay.
-							<<= VCheck.Anal($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-						<</if>>
-						It isn't the first time you've heard that, or the hundredth.
-					<</if>>
-					When you're done, you discard $him like the human sex toy $he is, and go back to your work. $He stumbles off, looking @@.gold;fearful@@ but @@.hotpink;submissive,@@ knowing that $he now has a better idea of what you want, even if what you want isn't very nice.
-					<<set $activeSlave.trust -= 4, $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-			<br><<link "It's not that simple">>
-				<<replace "#result2">>
-					You tell $him kindly that it isn't that simple, but that if $he obeys orders and does $his best, you will like $him just fine, and $he will do well as your slave. Relief floods through $him.
-					<<if !canTalk($activeSlave)>>
-						$He gestures $his thanks, and an apology for being silly.
-					<<else>>
-						"Thank you, <<Master>> and I'm <<s>>orry for being <<s>>illy," $he apologizes.
-					<</if>>
-					You dismiss $him, and $he goes, a strangely @@.hotpink;respectful@@ look on $his face. $He's no more confident of $his ability to find safety and stability here with you than $he was before, but $he seems to like that it apparently isn't as simple as <<if $PC.dick != 0>>taking your cock up $his butt<<if $PC.vagina != -1>> or <</if>><</if>><<if $PC.vagina != -1>>eating you out<</if>>.
-					<<set $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>>
-		</span>
-	<</replace>>
-<</link>>
-
-<<case "hates oral">>
-
-<<link "Let $him earn a break for $his throat">>
-	<<replace "#result">>
-		You tell $him $he's a sex slave, and that $he needs to learn how to suck dick.
-		<<if !canTalk($activeSlave) && hasAnyArms($activeSlave)>>
-			$He frantically begs with gestures, pleading <<if hasBothLegs($activeSlave)>>on $his knees<<else>>desperately<</if>>.
-		<<elseif !canTalk($activeSlave)>>
-			$He frantically mouths pleas that you leave $his throat cock-free.
-		<<else>>
-			$He begs, "Plea<<s>>e no, <<Master>>, plea<<s>>e don't rape my mouth, <<Master>>!"
-		<</if>>
-		You make a show of considering, and then tell $him that if $he's extra obedient, you might let $him earn a break for $his throat — for now.
-		<<if canDoVaginal($activeSlave) && $activeSlave.vagina > 0>>
-			You tell $him to lie back and spread $his legs, because you're going to give $him a good old fashioned missionary-position pounding. $He does so with unusual obedience<<if $activeSlave.belly >= 5000>>, $his legs hanging off the couch to give you a better angle with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> in the way<</if>>, and as you're giving $him a thorough pounding, whether out of relief, gratitude, or a desire to put on a good performance, $he certainly seems to be enjoying it more than usual.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<elseif canDoAnal($activeSlave) && $activeSlave.anus > 0>>
-			You tell $him to bend over and spread $his ass for you, because if $he doesn't want you going in one end you're going to go in the other. $He does so with unusual obedience, and as you
-			<<if ($activeSlave.anus == 1)>>
-				gently but firmly pound $his still-tight ass
-			<<elseif ($activeSlave.anus == 2)>>
-				pound away at $his well-used backdoor
-			<<else>>
-				mercilessly jackhammer $his gaping hole
-			<</if>>
-			$he actively tries to match the rhythm of your thrusts.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<else>>
-			You tell $him that if $he's going to hesitate to use $his mouth when
-			<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-				$he has no other hole to amuse you
-			<<elseif !canDoAnal($activeSlave) && $activeSlave.vagina == 0>>
-				$his only available hole is still virgin
-			<<elseif $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-				all $his other holes are still virgin
-			<<elseif $activeSlave.anus == 0>>
-				$his girly little butthole is still virgin
-			<</if>>
-			$he's going to have to find an amazingly thorough way to please a dick if $he's going to earn $his throat a reprieve. $He looks<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant < -15>> uncharacteristically<</if>> thoughtful for a moment before bending over before you, spitting in $his hand
-			<<if $activeSlave.vagina == 0>>
-				and thoroughly coating $his inner thighs with $his saliva.
-			<<else>>
-				and thoroughly coating the
-				<<if $activeSlave.butt <= 2>>
-					crack of $his slender
-				<<elseif $activeSlave.butt <= 4>>
-					crack of $his curvy
-				<<elseif $activeSlave.butt <= 8>>
-					crack of $his huge
-				<<elseif $activeSlave.butt <= 12>>
-					crevice of $his expansive
-				<<elseif $activeSlave.butt <= 20>>
-					ravine of $his endless
-				<</if>>
-				ass.
-			<</if>>
-			The invitation is obvious, but just to be sure $he pleads with you to satisfy yourself alongside $his
-			<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-				chastity. You answer $his pleading with your dick, and though it's not quite as pleasurable as pilfering an off-limits hole,
-				<<if $activeSlave.vagina > -1>>
-					before long $his <<if $activeSlave.vagina == 0>>virgin <</if>>cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts.
-				<<else>>
-					$activeSlave.slaveName's trembling whenever your thrusts slam against $his anal chastity is thoroughly entertaining.
-				<</if>>
-				Before long, you plaster $his belt with your cum.
-			<<elseif !canDoAnal($activeSlave) && $activeSlave.vagina == 0>>
-				virgin hole. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, before long $his virgin cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts. Before long, you plaster $his still-virgin hole with your cum.
-			<<elseif $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-				virgin holes. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole,
-				<<if $activeSlave.vagina == 0>>
-					before long $his virgin cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts.
-				<<else>>
-					$activeSlave.slaveName's trembling whenever your thrusts come perilously close to penetrating $his virgin ass is thoroughly entertaining.
-				<</if>>
-				Before long, you plaster $his still-virgin hole with your cum.
-			<<elseif $activeSlave.anus == 0>>
-				virgin hole. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, $activeSlave.slaveName's trembling whenever your thrusts come perilously close to penetrating $his virgin ass is thoroughly entertaining. Before long, you plaster $his still-virgin hole with your cum.
-			<</if>>
-		<</if>>
-		When you're done, you bend down and whisper in $his ear that if $he shows any sign of rebelliousness, you'll give every dick in $arcologies[0].name free access to $his throat. @@.hotpink;$He has become more obedient,@@ in the hope this will persuade you to not follow through on your threat.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Try to brute-force $his oral resistance with a public blowbang">>
-	<<replace "#result">>
-		Simple problems require simple solutions — $he'll get fucked in the mouth until $he either gets over $his hang-ups about oral or learns to hide them. You drag the protesting $activeSlave.slaveName out in public, chain $him low so that $his mouth is available, and tell $him that $he'll suck dicks until $he gets through five in a row without grimacing, gagging, or resisting. You have a comfortable chair brought out to you and settle in to watch the show.
-		$activeSlave.slaveName tries, $he really does. But when word gets out as to the conditions of $his enslavement, $his users take a perverse enjoyment in being rougher than usual to evoke the exact reactions $he's trying to avoid. By the third failed streak, you've started to grow bored of the spectacle, but luckily you find entertainment in conversation with those who have already been entertained by poor $activeSlave.slaveName. Before long more chairs have been brought up and an impromptu salon has been set up alongside the blowbang line. By the sixth failed streak, an enterprising citizen has set up a small bar and is serving drinks. By the ninth, you've delegated watching $activeSlave.slaveName to your assistant. You personally break the eleventh streak after $he reached four, to general acclaim from your newfound friends and a toast to your virility.
-		When the fourteenth streak is finally successful, there are serious talks about making these blowbang salons a regular occurrence and some backslapping directed towards you for your innovation in genteel hedonism. While you seriously doubt $activeSlave.slaveName enjoys oral sex any more than $he did at the start of the day, $he's certainly @@.green;learned to keep $his feelings on the matter to $himself.@@ $He did, however, @@.health.dec;have quite a rough time@@ of it<<if $activeSlave.skill.oral <= 30>>, though $he did learn a thing or two about sucking dick.<<= slaveSkillIncrease('oral', $activeSlave, 10)>><<else>>.<</if>> And last of all, you and $activeSlave.slaveName did make @@.green;quite a good impression@@ today, though for widely differing reasons.
-		<<set $activeSlave.sexualFlaw = "none">>
-		<<run seX($activeSlave, "oral", "public", "penetrative", random(65,80))>>
-		<<run repX(500, "event", $activeSlave), healthDamage($activeSlave, 10)>>
-	<</replace>>
-<</link>>
-<br><<link "Teach $him to see cum as a reward">>
-	<<replace "#result">>
-		You bring $activeSlave.slaveName into your office and stand $him in front of your leather couch. $He <<if canSee($activeSlave)>>eyes you <<elseif canHear($activeSlave)>>listens <<else>>waits silently and <</if>><<if $activeSlave.devotion < -20>>suspiciously<<else>>worriedly<</if>> as you ready a bullet vibrator.
-		<<if $activeSlave.dick > 0>>
-			You secure the bullet to $activeSlave.slaveName's frenulum.
-		<<elseif $activeSlave.vagina == -1>>
-			You secure the bullet to $his perineum.
-		<<else>>
-			You secure the bullet to $activeSlave.slaveName's clit.
-		<</if>>
-		You explain that the arcology continually monitors your vital signs, and will use them to estimate your arousal; the system controls the bullet vibrator, which will emit stimulating vibrations scaled to your pleasure. The more pleasure you feel, the more pleasant the vibrations will be, though they will not bring $him to orgasm until you climax. To demonstrate, you give the head of your cock a quick squeeze. $activeSlave.slaveName squeals in surprise at the sudden stimulation as the bullets spring to life. You tell $him to get to work. Though timid at first, as $he proceeds to blow you, $he becomes more and more enthusiastic as $his own pleasure builds. It isn't long until $he's deepthroating you enthusiastically and begging you to cum in $his mouth. You make $him hold out a bit longer, and then you complete the training session,
-		<<if $PC.balls >= 30>>
-			pumping cum into $his stomach until it visibly begins to swell.
-		<<elseif $PC.balls >= 14>>
-			pumping cum into $his stomach until it threatens to come back up.
-		<<elseif $PC.balls >= 9>>
-			cumming into $his mouth until it spurts from $his nose.
-		<<else>>
-			filling $his mouth with your cum.
-		<</if>>
-		$He climaxes in turn, and virtually melts into a quivering mess on your floor.
-		<<if $activeSlave.dick > 0>>
-			$activeSlave.slaveName's cock oozes cum from $his intense orgasm, and you command $him to clean it off the floor before $he gets back to $his duties.
-		<</if>>
-		<<if random(1,4) == 4>>
-			@@.lightcoral;You've successfully linked cum and pleasure in $his mind,@@ guaranteeing $him a confusing few days as $he tries to reconcile this with $his hatred of oral sex.
-			<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>>
-		<<else>>
-			This has @@.green;broken $him of $his bad habits.@@
-			<<set $activeSlave.sexualFlaw = "none">>
-		<</if>>
-		This demonstration of your control over $him has @@.hotpink;worn down $his resistance to your commands.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if ($activeSlave.dick > 0) && $activeSlave.balls > 0 && ($activeSlave.belly < 1500) && $activeSlave.weight < 130>> /* won't work if too pregnant */
-	<br><<link "Make $him eat $his own cum">>
-		<<replace "#result">>
-			Your cum training tactics have two components: Cum should be linked with pleasure, and cum should not be disgusting to $activeSlave.slaveName, because even $activeSlave.slaveName produces it. To drive home these lessons, you lead $activeSlave.slaveName to your office's leather couch, arranging $his
-			<<if $activeSlave.height < 150>>
-				petite
-			<<elseif $activeSlave.height < 160>>
-				short
-			<<elseif $activeSlave.height >= 170>>
-				tall
-			<<elseif $activeSlave.height >= 185>>
-				very tall
-			<</if>>
-			form upside down with $his head on the cushion, $his back on the backrest, and $his <<if hasBothLegs($activeSlave)>>legs<<else>>ass<</if>> in the air. In this position, $his
-			<<if ($activeSlave.dick > 10)>>
-				obscene
-			<<elseif ($activeSlave.dick > 9)>>
-				inhuman
-			<<elseif ($activeSlave.dick > 8)>>
-				monstrous
-			<<elseif ($activeSlave.dick > 7)>>
-				imposing
-			<<elseif ($activeSlave.dick > 6)>>
-				massive
-			<<elseif ($activeSlave.dick > 5)>>
-				gigantic
-			<<elseif ($activeSlave.dick > 4)>>
-				huge
-			<<elseif ($activeSlave.dick > 3)>>
-				large
-			<<elseif ($activeSlave.dick > 2)>>
-				average
-			<<elseif ($activeSlave.dick > 1)>>
-				small
-			<<elseif ($activeSlave.dick > 0)>>
-				tiny
-			<</if>>
-			cock <<if $activeSlave.belly >= 100 || $activeSlave.weight > 30>>rests over $his <<if $activeSlave.pregKnown == 1>>early pregnancy<<else>>belly<</if>> and <</if>>hangs directly over $his anxious face.
-			<<if ($activeSlave.aphrodisiacs > 0) || $activeSlave.inflationType == "aphrodisiac">>
-				The aphrodisiacs in $his system already have $him so aroused $he's already dripping precum; as you approach $his vulnerable form on the couch, a drop lands on $his chin.
-			<<elseif $activeSlave.prostate > 1>>
-				$His overactive prostate has $him steadily dripping precum; as you approach $his vulnerable form on the couch, a drop lands on $his chin.
-			<<else>>
-				You sit next to $his vulnerable form on the couch as $he looks at you in anticipation.
-			<</if>>
-			You
-			<<if canDoAnal($activeSlave)>>
-				<<if ($activeSlave.anus > 2)>>
-					insert a wide vibrating plug into $his gaping anus,
-				<<elseif ($activeSlave.anus > 1)>>
-					insert a big vibrating plug into $his ass,
-				<<elseif ($activeSlave.anus > 0)>>
-					insert a vibrating plug into $his tight ass,
-				<<else>>
-					place a bullet vibrator over the pucker of $his virgin anus,
-				<</if>>
-			<<else>>
-				strap a strong vibrator to $his anal chastity,
-			<</if>>
-			secure a bullet vibrator $his quivering perineum, and another to the base of $his dick, and set them all to gradually increase the strength of their vibrations. In no time at all $he releases a
-			<<if ($activeSlave.chastityPenis == 1)>>
-				squirt of ejaculate from $his cock cage,
-			<<elseif $activeSlave.balls > 0>>
-				torrent of thick, white semen,
-			<<elseif $activeSlave.prostate > 2>>
-				torrent of nearly clear, watery ejaculate,
-			<<elseif $activeSlave.prostate == 0>>
-				pathetic dribble of semen,
-			<<else>>
-				pathetic dribble of watery ejaculate,
-			<</if>>
-			all of which lands right on $his outstretched tongue and pools in $his throat. You nudge $his chin to make $him close $his mouth and swallow. After a week of such treatment, $he @@.lightcoral;acquires a taste for semen.@@
-			<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-/*Written by anon, coded by Boney M*/
-
-<<case "masterful entertainer">>
-
-<<link "Go clubbing">>
-	<<replace "#result">>
-		You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door wearing glitzy heels, an extremely short skirt<<if $activeSlave.belly >= 5000>> barely noticeable under $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>, and a string bikini top so brief that $his areolae are clearly visible. As you descend through $arcologies[0].name the beats get faster and the drops get heavier. By the time you reach the club where the Free Cities' hottest DJ has a show tonight, $activeSlave.slaveName is a whirlwind of sexual energy in motion, moving <<if canHear($activeSlave)>>with every beat<<else>>wildly<</if>> and catching every eye<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/1.33>>, despite how far along $he is<<elseif $activeSlave.belly >= 5000 || $activeSlave.weight > 130>>, despite how big $he is<</if>>. $His skills could have half the club lining up to fuck $him for money, but tonight $he's all yours. The entire floor is envious of you as the night wears on and $his dancing turns into sexually servicing you<<if canHear($activeSlave)>> in time with the music<</if>>.
-		<<if ($activeSlave.chastityPenis == 1)>>
-			The smell of $his pre-cum is noticeable even over the stink of sweat.
-		<<elseif ($activeSlave.dick > 0) && canAchieveErection($activeSlave)>>
-			$His tiny skirt does nothing to hide $his erection.
-		<<elseif ($activeSlave.clit > 0)>>
-			$His tiny skirt displays $his big, engorged clit.
-		<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			$His arched back and cocked hips make it very clear that $he wants $his asspussy fucked.
-		<<else>>
-			The smell of $his arousal is noticeable even over the stink of sweat.
-		<</if>>
-		<<if ($activeSlave.boobs > 1000)>>
-			$His breasts get groped and mauled all night.
-		<<elseif ($activeSlave.butt > 5)>>
-			$He grinds $his ass against your crotch all night.
-		<<else>>
-			Cum joins the sweat running off $him.
-		<</if>>
-		The crowd is duly impressed; @@.green;your reputation has increased.@@
-		<<run repX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<<if $activeSlave.belly < 15000>>
-	<br><<link "Attend a milonga">>
-		<<replace "#result">>
-			You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door wearing classy heels and a gorgeous long dress cunningly designed to adhere to $him while $he dances despite the fact that it displays all of one leg, $his entire back<<if $activeSlave.belly >= 5000>>, $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>, cleavage, and the sides of both breasts. $He has $his hair up in a perfect bun accented with a spray of the latest jewelry, and is wearing severe makeup that makes $him look aristocratic and elegant by turns. The host of the milonga, an old-world tango enthusiast, knows well the social graces and invites you, as the most prominent attendee, to perform the traditional demonstration tango that begins the dance. It goes wonderfully, and the entire party sighs in appreciation as you perform the classic tango. You lower $activeSlave.slaveName<<if $activeSlave.belly >= 10000 || $activeSlave.weight > 130>>'s heavy body<</if>> gracefully and pull $him back up into a close embrace, and breath catches in more than one throat. As tradition dictates $he dances with many partners throughout the night. One concession to Free Cities sensibilities is that the male and female roles in the tango may be filled by anyone, and $activeSlave.slaveName switches flawlessly between playing the female role to the elderly host one dance and the male role to his teenage granddaughter the next. The poor girl spends the rest of the evening staring at $activeSlave.slaveName with her tongue tied. Whoever $activeSlave.slaveName dances with, $he always subtly shows by glance and gesture that it's you $he truly wants. Everyone is quite envious of you; @@.green;your reputation has increased.@@
-			<<run repX(500, "event", $activeSlave)>>
-		<</replace>>
-	<</link>>
-<</if>>
-<br><<link "Never mind Friday night; the moon's out and it's romantic on the balcony">>
-	<<replace "#result">>
-		You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door absolutely naked<<if $activeSlave.bellyPreg >= 1500>>, $his motherly body on full display<</if>>. $He has half a question on $his face, wondering whether this is going too far, but it vanishes when you <<if canSee($activeSlave)>>smile reassuringly at<<else>>compliment<</if>> $him. You take $him by the hand and lead $him out onto the private balcony outside your office. It's a cloudless night, and the moon is full. You order the arcology to play a classic dance medley, and $activeSlave.slaveName becomes all innocence and grace, the perfect dance partner<<if $activeSlave.bellyPreg >= 10000>>, despite $his heavy pregnancy<<elseif $activeSlave.belly >= 10000 || $activeSlave.weight > 130>>, despite $his weight<</if>>. The only real consequence of $his nudity is
-		<<if $activeSlave.boobs >= 300>>
-			the extra sway of $his breasts,
-		<</if>>
-		<<if canPenetrate($activeSlave)>>
-			$his visible erection, and
-		<<elseif ($activeSlave.clit > 0)>>
-			$his visibly engorged clit and
-		<<elseif $activeSlave.boobs >= 300>>
-			and
-		<</if>>
-		<<if $activeSlave.nipples != "fuckable">>the hardness of $his nipples<<else>>how swollen $his nipples are<</if>> in the cool night when the dance brings you close. $He enjoys $himself immensely and in no time at all, $he's meekly asking you to take $him inside and dance with $him on the bed. Naturally, you oblige.
-	<</replace>>
-	<<set $activeSlave.devotion += 3, $activeSlave.trust += 3>>
-	<<if ($activeSlave.toyHole == "dick" || $policies.sexualOpenness == 1) && canPenetrate($activeSlave)>>
-		<<run seX($activeSlave, "penetrative", $PC, "vaginal")>>
-		<<if canImpreg($PC, $activeSlave)>>
-			<<= knockMeUp($PC, 20, 0, $activeSlave.ID)>>
-		<</if>>
-	<<elseif canDoVaginal($activeSlave)>>
-		<<= VCheck.Vaginal($activeSlave, 1)>>
-	<<elseif canDoAnal($activeSlave)>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<<elseif $activeSlave.boobs >= 1000>>
-		<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-	<<else>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</if>>
-	$His @@.hotpink;devotion to you@@ and @@.mediumaquamarine;trust in you@@ have increased.
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-
-<<case "sexy succubus">>
-
-<<link "Let $him eat">>
-	<<replace "#result">>
-		You tell $him $he's a good little succubus, and you're going to let $him feed. $He knows exactly what you mean, and
-		<<if $activeSlave.belly >= 300000>>
-			leans onto $his _belly stomach
-		<<else>>
-			<<if $activeSlave.belly >= 5000>>gently lowers $himself<<else>>gets<</if>> to $his knees
-		<</if>>
-		quickly, pressing $him $activeSlave.nipples nipples against your thighs and grasping your hips to give $himself leverage for some very aggressive oral. After
-		<<if $PC.dick != 0>>
-			a couple of lush sucks at each of your balls<<if $PC.vagina != -1>> and some eager nuzzling of your pussylips<</if>>, $he moves straight to a hard blowjob, deepthroating your cock and almost ramming $his head against you.<<if $PC.vagina != -1>> $He keeps $his tongue stuck out, and whenever $he gets you fully hilted, $he manages to reach your pussylips with it.<</if>> $He <<if $activeSlave.fetish == "cumslut">>doesn't have to pretend to be starving for your cum.<<else>>does a good job of acting like $he's authentically starving for your cum.<</if>> $He groans with satisfaction when you blow your load down $his gullet,
-		<<else>>
-			nuzzling $his nose against your moist cunt, $he starts to eat you out like $he's starving, sparing no time for subtlety, lapping up your female juices with evident relish. You run your fingers through $his $activeSlave.slaveName hair, telling $him $he'll have to survive on pussyjuice. $He replies, but you hold $his head hard against you as $he does, turning whatever $he says into an unintelligible, delectable mumbling into your womanhood. $He groans with satisfaction when you stiffen with orgasm, giving $him a final gush of girlcum,
-		<</if>>
-		and <<if $activeSlave.belly >= 5000>>hefts $his <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> bulk up<<else>>gets to $his feet<</if>> licking $his lips and patting $his _belly stomach.
-		<<if $activeSlave.belly >= 1500>>
-			"That wa<<s>> <<s>>uch a big meal <<Master>>, look how full it made me!" $He teases, pretending $his
-			<<if $activeSlave.bellyPreg >= 1500>>
-				gravid belly is filled with your fluids.
-			<<elseif $activeSlave.bellyImplant >= 1500>>
-				distended belly is filled with your fluids.
-			<<else>>
-				wobbling, <<print $activeSlave.inflationType>>-filled belly is filled with your fluids.
-			<</if>>
-			<<if $PC.balls >= 30>>
-				Seeing as $he took the entirety of your inhuman load, there is some truth to $his words.
-			<</if>>
-		<</if>>
-		$He's obviously @@.mediumaquamarine;becoming more comfortable@@ playing the part of a vampiric sex
-		<<if ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishStrength > 95)>>
-			demon, and it's a role the incorrigible cumslut @@.hotpink;loves.@@
-			<<set $activeSlave.devotion += 2>>
-		<<elseif ($activeSlave.fetish == "cumslut")>>
-			demon, and it's a role that @@.lightcoral;reinforces $his oral fixation.@@
-			<<set $activeSlave.fetishStrength += 4>>
-		<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-			demon, and the role @@.lightcoral;focuses $his attention on $his mouth.@@
-			<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "cumslut">>
-		<<else>>
-			demon.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if canDoVaginal($activeSlave) && ($PC.dick != 0)>>
-	<br><<link "Feed $him">>
-		<<replace "#result">>
-			<<setSpokenPlayerPronouns $activeSlave>>
-			You tell $him $he's a good little succubus, and you're going to feed $him.
-			<<if $activeSlave.boobs > 2000>>
-				Reaching up under $his breasts for the top edge of $his outfit
-			<<else>>
-				Grabbing $his outfit's top edge
-			<</if>>
-			and seizing $him behind a knee with your other hand, you sling $him across
-			<<if $activeSlave.belly >= 300000 || $activeSlave.weight > 190>>
-				an unfortunate nearby tabletop. Once the table finishes its creaking and promises to hold $his weight, $he
-			<<else>>
-				a convenient tabletop nearby. $He
-			<</if>>
-			spreads $his legs for you, smiling with anticipation, $his
-			<<if $activeSlave.vaginaLube > 0>>
-				cunt already soaking wet.
-			<<elseif $activeSlave.labia > 0>>
-				prominent petals swollen with arousal.
-			<<elseif $activeSlave.clit > 0>>
-				big bitch button stiff with arousal.
-			<<else>>
-				cunt flushing with arousal.
-			<</if>>
-			$He reaches down around $his own ass and spreads $his pussy for you, only releasing $his fingertip grip on $his labia when $he feels you hilt yourself inside $his
-			<<if $activeSlave.vagina > 2>>
-				cavernous
-			<<elseif $activeSlave.vagina > 1>>
-				comfortable
-			<<elseif $activeSlave.vagina > 0>>
-				caressing
-			<<else>>
-				needy
-			<</if>>
-			channel.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-			You're here to rut, not make love, and you give it to $him hard, forcing <<if $activeSlave.voice >= 3>>high squeals<<else>>animal grunts<</if>> out of $him. $He climaxes strongly, and the glorious feeling finishes you as well, bringing rope after rope of your cum jetting into $him. $He groans at the feeling, and as $he <<if $activeSlave.belly >= 5000 || $activeSlave.weight > 190>>slowly <</if>>gets to $his feet $he uses a hand to transfer a <<if canTaste($activeSlave)>>taste<<else>>bit<</if>> of the mixture of your seed and <<if $PC.vagina != -1>>both of your<<else>>$his<</if>> pussyjuice to $his mouth.
-			<<if $activeSlave.belly >= 750000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> like I'm going to bur<<s>>t! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He groans, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger. "<<Master>>! They won't <<s>>top! Oh... <<S>>o full... I can't <<s>>top con<<c>>eiving!" $He rolls onto $his back and clutches $his absurd stomach. "<<S>>o tight! <<S>>o full! <<S>>o Good! I need more! Oh, <<Master>>..." $He may be getting a little too into the fantasy.
-				<<if $activeSlave.broodmother == 2 && $activeSlave.preg > 37>>
-					A gush of fluid flows from $his pussy, snapping $him out of $his roleplay. "<<Master>>! I need... One'<<s>> coming now!" You rub $his contracting stomach, enjoying the feeling of the life within shifting to take advantage of the free space. You sigh and lean down, the vessel of your spawn needs help after pinning $himself in such a compromising position. Holding $his belly clear of $his crotch, you watch $him steadily push out $his child before spasming with orgasm and freeing it effortlessly into the world. After collecting it for a servant to handle, you help the exhausted $girl back to $his feet. $He thanks you sincerely for the assist before going to clean $himself up. You barely have time to turn away before another splash catches your attention. "<<Master>>... Another'<<s>>, mmmmh, coming..."
-				<</if>>
-			<<elseif $activeSlave.belly >= 600000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> like I'm going to bur<<s>>t! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He teases, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger.
-			<<elseif $activeSlave.belly >= 450000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> <<s>>o good! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He teases, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger.
-			<<elseif $activeSlave.belly >= 300000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> <<s>>o good! I feel them moving! They're ready to come out <<Master>>!" $He teases, cradling $his _belly belly and pretending it just grew that huge.
-			<<elseif $activeSlave.belly >= 150000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me, look how big I'm getting!" $He teases, cradling $his _belly belly and pretending it just rapidly became that large.
-			<<elseif $activeSlave.belly >= 5000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you!" $He teases, cradling $his _belly belly and pretending it just grew that big.
-			<<else>>
-				"Oh <<Master>>! I feel it! Your <<s>>eed is being devoured by my eggs! I can't wait to <<s>>ee how happy they make you!" $He teases, rubbing $his belly and pretending to conceive.
-			<</if>>
-			$He's obviously @@.mediumaquamarine;becoming more comfortable@@ playing the part of a sex demon whose hunger knows no
-			<<set $activeSlave.trust += 4>>
-			<<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishStrength > 95)>>
-				end, and it's a role the pregnancy fetishist @@.hotpink;loves.@@
-				<<set $activeSlave.devotion += 2>>
-			<<elseif ($activeSlave.fetish == "pregnancy")>>
-				end, and it's a role that @@.lightcoral;reinforces $his love of insemination.@@
-				<<set $activeSlave.fetishStrength += 4>>
-			<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-				end, and the role @@.lightcoral;focuses $his attention on insemination.@@
-				<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "pregnancy">>
-			<<else>>
-				end.
-			<</if>>
-		<</replace>>
-	<</link>><<if $activeSlave.vagina == 0>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave) && ($activeSlave.anus > 0) && ($PC.dick != 0)>>
-	<br><<link "Fuck $him without feeding $him">>
-		<<replace "#result">>
-			<<setSpokenPlayerPronouns $activeSlave>>
-			You tell $him $he's a good little succubus. Thinking $he understands, $he
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				turns and hugs the nearest wall,
-				<<if $activeSlave.belly >= 300000>>
-					sliding $his _belly belly down it until it parts $his legs. $He shuffles onto it to offer you $his needy cunt.
-				<<else>>
-					going up on tiptoe and cocking $his hips to offer you $his needy cunt.
-				<</if>>
-				$He moans as your dick
-				<<if $activeSlave.vagina > 2>>
-					enters $his big cunt.
-				<<elseif $activeSlave.vagina > 1>>
-					fills $his wet cunt.
-				<<else>>
-					slides slowly inside $his tight cunt.
-				<</if>>
-				As you fuck $him, you ask $him how succubi feed. "W-well," $he gasps, struggling to gather $his wits,
-			<<else>>
-				<<if $activeSlave.belly >= 300000>>
-					leans onto $his _belly belly
-				<<else>>
-					gets down on $his knees
-				<</if>>
-				and starts to suck you off. $He deepthroats you eagerly, stretching to tickle your balls with $his tongue as $he gets you all the way in, and then shifting a hand to roll them around as $he sucks. As $he blows you, you ask $him how succubi feed. "Well," $he gasps, popping your dickhead free of $his mouth and replacing the sucking with a stroking hand,
-			<</if>>
-			"<<Master>>, they can eat a _womanP'<<s>> e<<ss>>en<<c>>e by <<s>>wallowing _hisP cum or getting _himP to ejaculate in<<s>>ide their pu<<ss>>ie<<s>>."
-			<br><br>
-			You ask $him whether $he would like to feed off you. "Oh ye<<s>> <<Master>>, plea<<s>>e. Plea<<s>>e feed me," $he begs. Too bad, you tell $him; $he gets to go hungry. After all, succubi can't feed using their butts.
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				You withdraw from $his cunt and stuff your cock up $his ass without pausing or softening your thrusting at all.
-			<<else>>
-				You pull $him to $his feet by the hair, spin $him around, shove $him up against the wall, and stuff your cock up $his ass.
-			<</if>>
-			<<if $activeSlave.anus > 2>>
-				It's not like $his experienced butt can't take an assraping, but
-			<<elseif $activeSlave.anus > 1>>
-				$His practiced ass relaxes and accommodates your dick, but
-			<<else>>
-				$His tight asshole spasms with pain as it stretches to accommodate you, and
-			<</if>>
-			$he whines at your sudden aggression, wiggling within your dominating grip. You fill $his ass with cum as $he struggles, still playing $his part, begging you not to cum in $his bottom, since succubi can't live on buttsex.
-			<<set $activeSlave.trust += 4>>
-			<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishStrength > 95)>>
-				It's a role the submissive slut @@.hotpink;loves.@@
-				<<set $activeSlave.devotion += 2>>
-			<<elseif ($activeSlave.fetish == "submissive")>>
-				It's a role that @@.lightcoral;reinforces $his submissive streak.@@
-				<<set $activeSlave.fetishStrength += 4>>
-			<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-				The role @@.lightcoral;focuses $his attention on submission.@@
-				<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "submissive">>
-			<<else>>
-				$He @@.hotpink;plays the role well.@@
-			<</if>>
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-			<<else>>
-				<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-			<</if>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "dick wringing">>
-
-<<link "Address $his problem together">>
-	<<replace "#result">>
-		You step in and give $him a quick kiss on the lips, telling $him you'd be happy to. $He was confident you would, but the tenderness makes $his breath catch a little. You take $him by $his
-		<<if $activeSlave.weight > 130>>
-			fat
-		<<elseif $activeSlave.weight > 95>>
-			chubby
-		<<elseif $activeSlave.muscles > 30>>
-			strong
-		<<elseif $activeSlave.shoulders < 0>>
-			pretty little
-		<<elseif $activeSlave.shoulders > 1>>
-			broad
-		<<else>>
-			feminine
-		<</if>>
-		shoulders and keep kissing $him, steering $him backwards into your office. $He gets the idea and cooperates as best $he can, giggling <<if $activeSlave.voice == 0>>mutely<<else>>cutely<</if>> into your mouth as $his hot and increasingly horny body bumps against your own.
-		<br><br>
-		When $his
-		<<if $activeSlave.butt > 12>>
-			monumental ass
-		<<elseif $activeSlave.butt > 7>>
-			titanic ass
-		<<elseif $activeSlave.butt > 4>>
-			big butt
-		<<else>>
-			cute rear
-		<</if>>
-		touches the edge of your desk, the
-		<<if $activeSlave.height > 180>>
-			tall $desc leans back
-		<<elseif $activeSlave.height > 155>>
-			$desc reclines
-		<<else>>
-			short $desc hops up
-		<</if>>
-		to lie across it, using a hand to lay $his inhumanly big dick
-		<<if $activeSlave.belly > 10000>>
-			onto $his _belly <<if $activeSlave.bellyPreg > 0>>pregnant <</if>>belly.
-		<<elseif $activeSlave.weight > 160>>
-			across $his gut.
-		<<elseif $activeSlave.boobs > 5000>>
-			in the warm canyon formed by $his inhumanly big boobs.
-		<<elseif $activeSlave.weight > 95>>
-			across $his soft belly.
-		<<elseif $activeSlave.belly > 1500>>
-			over $his _belly <<if $activeSlave.bellyPreg > 0>>pregnant <</if>>belly.
-		<<elseif $activeSlave.muscles > 30>>
-			across $his ripped abs.
-		<<elseif $activeSlave.weight > 10>>
-			across $his plush stomach.
-		<<else>>
-			up $his stomach.
-		<</if>>
-		$He spreads $his legs as wide as they'll go, and reaches down to spread $his buttocks even wider, offering you $his
-		<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			holes.
-		<<elseif canDoVaginal($activeSlave)>>
-			pussy.
-		<<else>>
-			asshole.
-		<</if>>
-		$He <<if $activeSlave.voice == 0>>tries to groan<<else>>groans<</if>> with anticipation of the coming relief as you slide <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> past $his
-		<<if canDoVaginal($activeSlave)>>
-			pussylips and inside $his womanhood.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			sphincter and inside $his asspussy.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		<br><br>
-		It doesn't take long. $His <<if $activeSlave.scrotum == 0>>invisible but overfull balls<<else>>balls tighten and<</if>> shoot cum into $his soft python of a dick, but not a drop appears at its tip. Gasping at the mixed relief and discomfort, $he lets $his butt go and wriggles around to grab $his dick around its base with both hands. $He squeezes it from base to tip to bring out its contents. $He's so huge that $he's able to reach down with $his lips and get $his cockhead into $his mouth, the meat filling it entirely. $He sucks industriously, swallowing $his own load. $He was just trying to relieve the pressure, but the added stimulation brings $him to climax again. Silenced by $his own dickhead, $he shudders deliciously and starts over, wringing more cum into $his own mouth. You change angles, bringing the hard head of <<if $PC.dick != 0>>your own penis<<else>>your phallus<</if>> against $his prostate and forcing an agonizing third climax.
-		<br><br>
-		$He's so discombobulated by this that $he goes limp, offering no resistance as you extract yourself, <<if $PC.dick != 0>>straddle $his torso, and press your dick inside $his mouth to climax there, adding your own ejaculate<<else>>slip out of the harness with the ease of long practice, and straddle $his face so that your climax adds a good quantity of your pussyjuice<</if>> to everything $he's already gotten down<<if $PC.vagina != -1>><<if $PC.dick != 0>> and leaving quite a lot of your pussyjuice on $his chin<</if>><</if>>. When you finally release $him, $he slithers down to the floor, utterly spent.
-		<<if !canTalk($activeSlave)>>
-			$He raises a shaky hand to @@.mediumaquamarine;gesture thanks.@@
-		<<elseif SlaveStatsChecker.checkForLisp($activeSlave)>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he lisps weakly.
-		<<else>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he murmurs in a tiny voice.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<br><<link "Use $his trouble to dominate $him">>
-	<<replace "#result">>
-		You step in and trace a <<if $PC.title == 1>>strong<<else>>feminine<</if>> hand across $his lips before inserting two fingers into $his mouth. $He looks puzzled, but obediently begins to suck on your fingers. You use your other hand to explore $his body, titillating the heavily aroused $desc until $he's on the verge of orgasm. Without warning, you place an elastic band around the slave's dickhead. $He writhes with discomfort, but knows better than to protest. It's tight, but not agonizingly so. $He'll be able to cum, but not a drop will get out. Grabbing $him by a nipple<<if $activeSlave.nipples == "fuckable">>cunt<</if>>, you pull $him down to $his knees, enjoying the motion of $his body as $he wriggles with the discomfort of being tugged this way, the uncomfortable thing squeezing the tip of $his cock, and the suspicion that this is going to be tough.
-		<br><br>
-		Once $he's in position, you
-		<<if $activeSlave.butt > 12>>
-			struggle to wrap your arms around $his bountiful buttcheeks,
-		<<elseif $activeSlave.butt > 7>>
-			heft $his ridiculous buttcheeks possessively,
-		<<elseif $activeSlave.butt > 4>>
-			give $his huge ass a possessive squeeze,
-		<<else>>
-			run your hands across $his bottom,
-		<</if>>
-		and then shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>>
-		<<if canDoVaginal($activeSlave)>>
-			inside $his cunt.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			up $his butt.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		$His cock is so long that it drags along the floor as you pound
-		<<if $activeSlave.belly >= 300000>>
-			$him against $his _belly dome of a stomach.
-		<<elseif $activeSlave.boobs > 12000>>
-			$him, $his enormous tits serving as a cushion for $his torso to rest against.
-		<<elseif $activeSlave.boobs > 7000>>
-			$him, accompanied by the nipples that cap $his absurd boobs.
-		<<else>>
-			$him.
-		<</if>>
-		<br><br>
-		$He's so pent up that $he reaches $his first climax quickly, filling $his capped dick with cum. $He <<if $activeSlave.voice == 0>>tries to moan<<else>>moans<</if>> at the combination of relief and pressure inside $his dick, and then slumps a little when $he feels the <<if $PC.dick != 0>>penis<<else>>hard phallus<</if>> inside $him fuck $him even harder, forcing $him towards a second orgasm. And after that one, a third. And a fourth.
-		<br><br>
-		When you finally climax yourself, you stand, leaving $him writhing at your feet with $his huge soft cock positively pressurized. Considering the situation, you kneel down at $his side, deciding what to do. Stroking $him in a mockery of reassurance, you grab $his agonized member, producing a <<if $activeSlave.voice == 0>>gaping, silent scream<<else>>little shriek<</if>>.
-		<<if $activeSlave.toyHole == "dick" && ($PC.preg == 0 || $PC.vagina == 0)>>
-			You maneuver the massive thing into your own <<if $PC.preg == 0 && $PC.vagina != -1>>pussy<<else>>asshole<</if>>, slide a finger in alongside the monstrous thing as $he <<if $activeSlave.voice == 0>>moans with expectation<<else>>begs abjectly to unleash $his<</if>>, and pop the elastic off. You get to watch $his face as $he floods your <<if $PC.preg == 0 && $PC.vagina != -1>>womanhood<<else>>bowels<</if>> with cum, your stomach taking on a distinctive swell as $his pent-up load empties into you.
-			<<if $PC.vagina != -1>>
-				<<run seX($activeSlave, "penetrative", $PC, "vaginal")>>
-			<<else>>
-				<<run seX($activeSlave, "penetrative", $PC, "anal")>>
-			<</if>>
-			<<if canImpreg($PC, $activeSlave)>>
-				<<= knockMeUp($PC, 50, 0, $activeSlave.ID)>>
-			<</if>>
-		<<else>>
-			You maneuver the massive thing inside the slave's own well-fucked <<if $activeSlave.vagina > -1>>pussy<<else>>asshole<</if>>, and then slide fingers in alongside the monstrous thing as $he <<if $activeSlave.voice == 0>>cries desperately<<else>>begs abjectly for mercy<</if>>. Popping the elastic off, you get to watch $his face as $he floods $his own <<if $activeSlave.vagina > -1>>womanhood<<else>>bowels<</if>> with cum.
-			<<if canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-				<<if canGetPregnant($activeSlave) && canBreed($activeSlave, $activeSlave) && $activeSlave.vasectomy != 1>> /* can't miss the opportunity to knock $himself up */
-					<<run knockMeUp($activeSlave, 20, 0, $activeSlave.ID)>>
-				<</if>>
-			<<else>>
-				<<run seX($activeSlave, "anal", $PC, "penetrative")>>
-			<</if>>
-		<</if>>
-		The cum pressurization brought $him almost to half-hardness, and as this effect diminishes, $his dick slides out again, releasing a lewd torrent of cum. $He cries with overstimulation, relief, pain, and humiliation, @@.hotpink;groveling below you@@ in utter subjugation.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-
 <<case "fucktoy tribbing">>
 
 <<link "Make love to $him">>