diff --git a/.eslintignore b/.eslintignore
index 63b268d81542eb01c941f6d8abc4c932324a126c..91dc02378d3c8d5d9e80485d043bf58e9660b885 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -7,3 +7,4 @@
 **/optionsMacro.js
 temp.**
 **.temp
+**/001-lib
diff --git a/.gitignore b/.gitignore
index 443b678cc403fdbb5010386d8564041f96cb421d..3f1f7a8519bc2eb5fd1984c9bd98f7eba8e21f8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,7 +33,7 @@ ENV/
 .ropeproject
 
 # Start.tw
-src/config/start.tw
+src/002-config/start.tw
 
 # eslint
 node_modules
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a5e6496aadbeea4378afc5930f5af8c965704b15..5f70f978e6d1f2486c44d69d73a6ba81fd60d7a8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -18,7 +18,7 @@ variables:
   # precompiled / assets
   # the URLs are the same as inside the game, change both if updating
   WEBGL_NAME: "WebGL art assets"
-  WEBGL_URL: "https://mega.nz/folder/rtAzEYTS#5a5KO_rqq_BB8eqtOuhEow"
+  WEBGL_URL: "https://mega.nz/folder/Sgp0lQbY#L1iG-jMQUeztUFuFqj-ryw"
   RENDER_NAME: "Rendered imagepack (outdated)"
   RENDER_URL: "https://mega.nz/file/upoAlBaZ#EbZ5wCixxZxBhMN_ireJTXt0SIPOywO2JW9XzTIPhe0"
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 23158a55f027b5782fed75b6a570e62b6fdb0570..ff2a3311c5d40aed5398ec3c648f93fdec90d2b2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 ## Unreleased
 
+## 0.10.7.1-4.0.0-alpha.8 - 2021-08-17
+
+* Elohiem's webGL art update 4
+* near complete conversion of .tw passages to .js
+* fixes
 
 ## 0.10.7.1-4.0.0-alpha.7 - 2021-07-16
 
diff --git a/README.md b/README.md
index 89a4fb193eeb0fbdf5100d44e295b6ed6d01d888..06adff9b1fa11db47e60243fd8064ce985bc50e8 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,10 @@ To play open FC_pregmod.html in bin/ (Recommendation: Drag it into incognito mod
 
 ## Common problems
 
+* If compiling takes a while or causes a noticeable increase in system resource utilisation.
+	- It might be worth checking your main Antivirus (AV) settings.
+	- If it is Windows Defender (currently tested with Windows 10): Start menu -> Windows Security -> Virus & threat protection -> Virus & threat protection settings -> Manage settings -> Exclusions (near the bottom) -> Add or remove exclusions -> Add an exclusion -> path to bin/.
+
 * `sessionStorage quota exceeded` / `localStorage quota exceeded` or something similar
     - Your saves stored inside the browser are getting too large. There are multiple ways to solve this:
         1. Delete saves stored in the browser. If you want to keep them, save them to disk first.
diff --git a/artTools/webgl_editor.html b/artTools/webgl_editor.html
new file mode 100644
index 0000000000000000000000000000000000000000..fc585030110552d6eef7cbe0dcd06814aaeb1ef8
--- /dev/null
+++ b/artTools/webgl_editor.html
@@ -0,0 +1,447 @@
+<html>
+    <head>
+        <script> let App = {}; App.Art = {}; </script>
+        <script src="../bin/resources/webgl/scene1/scene1.js" type="text/javascript"> </script>
+        <script src="../src/art/webgl/engine.js" type="text/javascript"> </script>
+
+        <style>
+            html, body {
+                margin: 0;
+                padding: 0;
+                background-color: #E6E6FA;
+            }
+            
+            #glcanvas {
+                float: left;
+                background-color: #000000;
+            }
+
+            .horizontal{
+                display: flex;
+                align-items: center;
+                justify-content: space-evenly;
+                border: 2px solid red;
+                width:fit-content;
+                height: 40px;
+            }
+            .forms{
+                flex: 1;
+                margin: 0px;
+                display: flex;
+                align-items: center;
+                justify-content: space-evenly;
+            }
+
+            .slider {
+                -webkit-appearance: none;
+                flex: auto;
+                height: 25px;
+                width: 120px;
+                margin: 0px;
+                background: #d3d3d3;
+                outline: none;
+                opacity: 0.7;
+            }
+
+            .slider:hover {
+                opacity: 1;
+            }
+
+            .slider::-webkit-slider-thumb {
+                -webkit-appearance: none;
+                width: 25px;
+                height: 25px;
+                background: rgb(8, 77, 156);
+                cursor: pointer;
+            }
+
+            .output{
+                width: 35px;
+            }
+
+            .textbox{
+                width: 120px;
+                padding: 0px;
+            }
+
+            .label{
+                width: 50px;
+            }
+        </style>
+    </head>
+    <body>
+        <canvas id="glcanvas" width="600px" height="750px"></canvas>
+
+        <p>Display</p>
+        <div class="horizontal">
+            <label style="width: 50px;">Fps</label>
+            <output class="output" id="fps"></output>
+        </div>
+        <div class="horizontal">
+            <label style="width: 60px;">rWidth</label>
+            <input class="textbox" type="text" id="rwidth" onchange="sceneParams.settings.rwidth = parseInt(this.value);">
+            <output class="output"></output>
+            <label style="width: 60px;">rHeight</label>
+            <input class="textbox" type="text" id="rheight" onchange="sceneParams.settings.rheight = parseInt(this.value);">
+            <output class="output"></output>
+        </div>
+
+        <div class="horizontal">
+            <label style="width: 75px;">Normals</label>
+            <input type="checkbox" id="normals" onchange="sceneParams.settings.normals = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">Ambient</label>
+            <input type="checkbox" id="ambient" onchange="sceneParams.settings.ambient = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">Diffuse</label>
+            <input type="checkbox" id="diffuse" onchange="sceneParams.settings.diffuse = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">Specular</label>
+            <input type="checkbox" id="specular" onchange="sceneParams.settings.specular = this.checked;">
+            <output class="output"></output>
+       </div>
+       <div class="horizontal">
+            <label style="width: 75px;">Normal</label>
+            <input type="checkbox" id="normal" onchange="sceneParams.settings.normal = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">Emission</label>
+            <input type="checkbox" id="emission" onchange="sceneParams.settings.emission = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">Alpha</label>
+            <input type="checkbox" id="alpha" onchange="sceneParams.settings.alpha = this.checked;">
+            <output class="output"></output>
+            <label style="width: 75px;">BackG</label>
+            <input type="checkbox" id="background" onchange="sceneParams.background.visible = this.checked;">
+            <output class="output"></output>
+        </div>
+
+        <p>Tonemapping</p>
+        <div class="horizontal">
+            <label style="width: 75px;">Rein</label>
+            <input class="textbox" type="text" id="whiteM" onchange="sceneParams.settings.whiteM = parseFloat(this.value);">
+            <input type="checkbox" id="reinhard" onchange="sceneParams.settings.reinhard = this.checked;">
+            <label style="width: 75px;">Gamma</label>
+            <input class="textbox" type="text" id="gammaY" onchange="sceneParams.settings.gammaY = parseFloat(this.value);">
+            <input type="checkbox" id="gamma" onchange="sceneParams.settings.gamma = this.checked;">
+        </div>
+
+        <p>Camera</p>
+        <div class="horizontal">
+            <label class="label">X</label>
+            <input class="textbox" type="text" id="cam_x" onchange="sceneParams.camera.x = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Y</label>
+            <input class="textbox" type="text" id="cam_y" onchange="sceneParams.camera.y = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Z</label>
+            <input class="textbox" type="text" id="cam_z" onchange="sceneParams.camera.z = parseFloat(this.value);">
+            <output class="output"></output>
+        </div>
+        <div class="horizontal">
+            <form class="forms">
+                <label class="label">XR</label>
+                <input class="slider" type="range" id="cam_xr" min="-180" max="180" oninput="cam_xr_out.value = cam_xr.value; sceneParams.camera.xr = parseFloat(this.value);">
+                <output class="output" id="cam_xr_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">YR</label>
+                <input class="slider" type="range" id="cam_yr" min="-180" max="180" oninput="cam_yr_out.value = cam_yr.value; sceneParams.camera.yr = parseFloat(this.value);">
+                <output class="output" id="cam_yr_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">ZR</label>
+                <input class="slider" type="range" id="cam_zr" min="-180" max="180" oninput="cam_zr_out.value = cam_zr.value; sceneParams.camera.zr = parseFloat(this.value);">
+                <output class="output" id="cam_zr_out"></output>
+            </form>
+        </div>
+        <div class="horizontal">
+            <label class="label">Fnear</label>
+            <input class="textbox" type="text" id="cam_fnear" onchange="sceneParams.camera.fnear = this.value">
+            <output class="output"></output>
+            <label class="label">Ffar</label>
+            <input class="textbox" type="text" id="cam_ffar" onchange="sceneParams.camera.ffar = this.value">
+            <output class="output"></output>
+            <form class="forms">
+                <label class="label">FOV</label>
+                <input class="slider" type="range" id="cam_fov" min="1" max="180" oninput="cam_fov_out.value = cam_fov.value; sceneParams.camera.fov = parseFloat(this.value);">
+                <output class="output" id="cam_fov_out"></output>
+            </form>
+        </div>
+
+        <p>DirectionalLight</p>
+        <div class="horizontal">
+            <form class="forms">
+                <label class="label">XR</label>
+                <input class="slider" type="range" id="light_xr" min="-90" max="90" oninput="light_xr_out.value = light_xr.value; sceneParams.directionalLights[0].xr = parseFloat(this.value);">
+                <output class="output" id="light_xr_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">YR</label>
+                <input class="slider" type="range" id="light_yr" min="-90" max="90" oninput="light_yr_out.value = light_yr.value; sceneParams.directionalLights[0].yr = parseFloat(this.value);">
+                <output class="output" id="light_yr_out"></output>
+            </form>
+        </div>
+        <div class="horizontal">
+            <form class="forms">
+                <label class="label">Int</label>
+                <input class="slider" type="range" id="light_int" min="0" max="3" step="0.05" oninput="light_int_out.value = light_int.value; sceneParams.directionalLights[0].intensity = parseFloat(this.value);">
+                <output class="output" id="light_int_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">Amb</label>
+                <input class="slider" type="range" id="light_amb" min="0" max="1" step="0.01" oninput="light_amb_out.value = light_amb.value; sceneParams.directionalLights[0].ambient = parseFloat(this.value);">
+                <output class="output" id="light_amb_out"></output>
+            </form>
+            <label class="label">Color</label>
+            <input class="textbox" type="color" id="light_color" onchange="sceneParams.directionalLights[0].color = hexToRgb(this.value)">
+            <output class="output"></output>
+        </div>
+
+        <p>PointLight</p>
+        <div class="horizontal">
+            <label class="label">X</label>
+            <input class="textbox" type="text" id="point_light_x" onchange="sceneParams.pointLights[0].x = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Y</label>
+            <input class="textbox" type="text" id="point_light_y" onchange="sceneParams.pointLights[0].y = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Z</label>
+            <input class="textbox" type="text" id="point_light_z" onchange="sceneParams.pointLights[0].z = parseFloat(this.value);">
+            <output class="output"></output>
+        </div>
+        <div class="horizontal">
+            <form class="forms">
+                <label class="label">Int</label>
+                <input class="slider" type="range" id="point_light_int" min="0" max="3" step="0.05" oninput="point_light_int_out.value = point_light_int.value; sceneParams.pointLights[0].intensity = parseFloat(this.value);">
+                <output class="output" id="point_light_int_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">Amb</label>
+                <input class="slider" type="range" id="point_light_amb" min="0" max="1" step="0.01" oninput="point_light_amb_out.value = point_light_amb.value; sceneParams.pointLights[0].ambient = parseFloat(this.value);">
+                <output class="output" id="point_light_amb_out"></output>
+            </form>
+            <label class="label">Color</label>
+            <input class="textbox" type="color" id="point_light_color" onchange="sceneParams.pointLights[0].color = hexToRgb(this.value)">
+            <output class="output"></output>
+        </div>
+
+        <p>Object</p>
+        <div class="horizontal">
+            <label class="label">X</label>
+            <input class="textbox" type="text" id="obj_x" onchange="sceneParams.models[0].transform.x = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Y</label>
+            <input class="textbox" type="text" id="obj_y" onchange="sceneParams.models[0].transform.y = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Z</label>
+            <input class="textbox" type="text" id="obj_z" onchange="sceneParams.models[0].transform.z = parseFloat(this.value);">
+            <output class="output"></output>
+            <label class="label">Scale</label>
+            <input class="textbox" type="text" id="obj_scale" onchange="sceneParams.models[0].transform.scale = parseFloat(this.value);">
+            <output class="output"></output>
+        </div>
+        <div class="horizontal">
+            <form class="forms">
+                <label class="label">XR</label>
+                <input class="slider" type="range" id="obj_xr" min="-180" max="180" oninput="obj_xr_out.value = obj_xr.value; sceneParams.transform.xr = parseFloat(this.value);">
+                <output class="output" id="obj_xr_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">YR</label>
+                <input class="slider" type="range" id="obj_yr" min="-180" max="180" oninput="obj_yr_out.value = obj_yr.value; sceneParams.transform.yr = parseFloat(this.value);">
+                <output class="output" id="obj_yr_out"></output>
+            </form>
+            <form class="forms">
+                <label class="label">ZR</label>
+                <input class="slider" type="range" id="obj_zr" min="-180" max="180" oninput="obj_zr_out.value = obj_zr.value; sceneParams.transform.zr = parseFloat(this.value);">
+                <output class="output" id="obj_zr_out"></output>
+            </form>
+        </div>
+        <p>Morphs</p>
+        <div id="morphs">
+        </div>
+
+        <script>
+            'use strict';
+            
+            function rgbToHex(r, g, b) {
+                return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+            }
+
+            function hexToRgb(hex) {
+                hex = hex.replace('#','');
+                let r = parseInt(hex.substring(0,2), 16);
+                let g = parseInt(hex.substring(2,4), 16);
+                let b = parseInt(hex.substring(4,6), 16);
+                return [r/255,g/255,b/255];
+            }
+
+            function updateElements() {
+                document.getElementById('rwidth').value = sceneParams.settings.rwidth;
+                document.getElementById('rheight').value = sceneParams.settings.rheight;
+
+                document.getElementById("fps").value = 0;
+                document.getElementById("normals").checked = sceneParams.settings.normals;
+                document.getElementById("ambient").checked = sceneParams.settings.ambient;
+                document.getElementById("diffuse").checked = sceneParams.settings.diffuse;
+                document.getElementById("specular").checked = sceneParams.settings.specular;
+                document.getElementById("emission").checked = sceneParams.settings.emission;
+                document.getElementById("normal").checked = sceneParams.settings.normal;
+                document.getElementById("alpha").checked = sceneParams.settings.alpha;
+                document.getElementById("background").value = sceneParams.background.visible;
+
+                document.getElementById("gamma").checked = sceneParams.settings.gamma;
+                document.getElementById("gammaY").value = sceneParams.settings.gammaY;
+                document.getElementById("reinhard").checked = sceneParams.settings.reinhard;
+                document.getElementById("whiteM").value = sceneParams.settings.whiteM;
+
+                document.getElementById("cam_x").value = sceneParams.camera.x;
+                document.getElementById("cam_y").value = sceneParams.camera.y;
+                document.getElementById("cam_z").value = sceneParams.camera.z;
+                document.getElementById("cam_xr").value = sceneParams.camera.xr;
+                document.getElementById("cam_xr_out").value = sceneParams.camera.xr;
+                document.getElementById("cam_yr").value = sceneParams.camera.yr;
+                document.getElementById("cam_yr_out").value = sceneParams.camera.yr;
+                document.getElementById("cam_zr").value = sceneParams.camera.zr;
+                document.getElementById("cam_zr_out").value = sceneParams.camera.zr;
+                document.getElementById("cam_fnear").value = sceneParams.camera.fnear;
+                document.getElementById("cam_ffar").value = sceneParams.camera.ffar;
+                document.getElementById("cam_fov").value = sceneParams.camera.fov;
+                document.getElementById("cam_fov_out").value = sceneParams.camera.fov;
+                document.getElementById("light_xr").value = sceneParams.directionalLights[0].xr;
+                document.getElementById("light_xr_out").value = sceneParams.directionalLights[0].xr;
+                document.getElementById("light_yr").value = sceneParams.directionalLights[0].yr;
+                document.getElementById("light_yr_out").value = sceneParams.directionalLights[0].yr;
+                document.getElementById("light_int").value = sceneParams.directionalLights[0].intensity;
+                document.getElementById("light_int_out").value = sceneParams.directionalLights[0].intensity;
+                document.getElementById("light_amb").value = sceneParams.directionalLights[0].ambient;
+                document.getElementById("light_amb_out").value = sceneParams.directionalLights[0].ambient;
+                document.getElementById("light_color").value = rgbToHex(sceneParams.directionalLights[0].color[0]*255, sceneParams.directionalLights[0].color[1]*255, sceneParams.directionalLights[0].color[2]*255);
+                document.getElementById("point_light_x").value = sceneParams.pointLights[0].x;
+                document.getElementById("point_light_y").value = sceneParams.pointLights[0].y;
+                document.getElementById("point_light_z").value = sceneParams.pointLights[0].z;
+                document.getElementById("point_light_int").value = sceneParams.pointLights[0].intensity;
+                document.getElementById("point_light_int_out").value = sceneParams.pointLights[0].intensity;
+                document.getElementById("point_light_amb").value = sceneParams.pointLights[0].ambient;
+                document.getElementById("point_light_amb_out").value = sceneParams.pointLights[0].ambient;
+                document.getElementById("point_light_color").value = rgbToHex(sceneParams.pointLights[0].color[0]*255, sceneParams.pointLights[0].color[1]*255, sceneParams.pointLights[0].color[2]*255);
+                document.getElementById("obj_x").value = sceneParams.models[0].transform.x;
+                document.getElementById("obj_y").value = sceneParams.models[0].transform.y;
+                document.getElementById("obj_z").value = sceneParams.models[0].transform.z;
+                document.getElementById("obj_scale").value = sceneParams.models[0].transform.scale;
+                document.getElementById("obj_xr").value = sceneParams.models[0].transform.xr;
+                document.getElementById("obj_xr_out").value = sceneParams.models[0].transform.xr;
+                document.getElementById("obj_yr").value = sceneParams.models[0].transform.yr;
+                document.getElementById("obj_yr_out").value = sceneParams.models[0].transform.yr;
+                document.getElementById("obj_zr").value = sceneParams.models[0].transform.zr;
+                document.getElementById("obj_zr_out").value = sceneParams.models[0].transform.zr;
+            }
+
+            function createMorphElements(){
+                let horizontal;
+
+                for (let i=0; i < sceneParams.models[0].morphs.length; i++) {
+                    if ( i % 7 == 0) {
+                        horizontal = document.createElement("label");
+                        horizontal.setAttribute("class", "horizontal");
+                        document.getElementById("morphs").appendChild(horizontal);
+                    }
+
+                    let label = document.createElement("label");
+                    label.setAttribute("style", "width: 150px;");
+                    let name = sceneParams.models[0].morphs[i].morphId;
+                    let textnode = document.createTextNode(name);
+                    label.appendChild(textnode);
+                    horizontal.appendChild(label);
+                    let textbox = document.createElement("input");
+                    textbox.setAttribute("style", "width: 30px;");
+                    textbox.setAttribute("type", "text");
+                    textbox.setAttribute("id", "morph_" + name);
+                    textbox.setAttribute("onchange", "sceneParams.models[0].morphs["+i+"].value = parseFloat(this.value);");
+                    textbox.value  = sceneParams.models[0].morphs[i].value;
+                    horizontal.appendChild(textbox);
+                    let output = document.createElement("output");
+                    output.setAttribute("class", "output");
+                    horizontal.appendChild(output);
+                }
+            }
+        
+            const avg = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
+
+            function update(){
+                let t0 = performance.now();
+                engine.render(sceneParams, canvas);
+                requestAnimationFrame(update);
+                let t1  = performance.now();
+                fps.push((t1 - t0));
+                
+                document.getElementById("fps").value = parseFloat(1/avg(fps)*1000).toFixed(0);
+                if (fps.length > 30) {
+                    fps.shift();
+                }
+            }
+
+            // init
+            let fps = [];
+            let canvas = document.getElementById('glcanvas');
+
+            let sceneParams = App.Art.sceneGetParams();
+            let sceneData = App.Art.sceneGetData();
+
+            console.log(sceneParams);
+
+           let isDraggingCanvas = false;
+
+            canvas.onmousemove= function(e){
+                if(!isDraggingCanvas){return;}
+                e.preventDefault();
+                e.stopPropagation();
+
+                sceneParams.models[0].transform.y = sceneParams.models[0].transform.y - e.movementY/10;
+                sceneParams.models[0].transform.yr = sceneParams.models[0].transform.yr + e.movementX*5;
+                engine.render(sceneParams, canvas);
+            }
+
+            canvas.onmousedown= function(e){
+                e.preventDefault();
+                e.stopPropagation();
+                isDraggingCanvas=true;
+            }
+
+            canvas.onmouseup= function(e){
+                if(!isDraggingCanvas){return;}
+                e.preventDefault();
+                e.stopPropagation();
+                isDraggingCanvas=false;
+            }
+
+            canvas.onmouseout = function(e){
+                if(!isDraggingCanvas){return;}
+                e.preventDefault();
+                e.stopPropagation();
+                isDraggingCanvas=false;
+            }
+
+            canvas.onmousewheel = function(e){
+                sceneParams.camera.fov = sceneParams.camera.fov + e.deltaY/10;
+
+                if (sceneParams.camera.fov < 1)
+                    sceneParams.camera.fov = 1;
+                if (sceneParams.camera.fov > 179)
+                    sceneParams.camera.fov = 179;
+
+                engine.render(sceneParams, canvas);
+                return false;
+            }
+
+            createMorphElements();
+            updateElements();
+
+            let engine = new App.Art.Engine();
+            engine.bind(sceneData, sceneParams, "../bin/");
+
+            // loop
+            update();
+        </script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/css/general/formatting.css b/css/general/formatting.css
index 9f08b1b2ffd3bd6c211342c7320664f6af2d9c9f..75d81a5e152118f24a8923f196ada5cdf7929453 100644
--- a/css/general/formatting.css
+++ b/css/general/formatting.css
@@ -95,3 +95,7 @@ dd {
 dt::after {
     content: ":";
 }
+
+.h1 {
+    font-size: 2em;
+}
diff --git a/css/general/layout.css b/css/general/layout.css
index 1baba2d63bfaa71ee394f069fb2278d4cf5b6a1c..73ff33591685d87187339d0524a6c53356a62d31 100644
--- a/css/general/layout.css
+++ b/css/general/layout.css
@@ -60,8 +60,8 @@ div.grid-2columns-auto {
 }
 
 .margin-x {
-    margin-left: 1em;
-    margin-right: 1em;
+    margin-left: 2em;
+    margin-right: 2em;
 }
 
 .margin-y {
@@ -75,3 +75,11 @@ div.grid-2columns-auto {
     margin-top: 1em;
     margin-bottom: 1em;
 }
+
+.space-evenly {
+    justify-content: space-evenly;
+}
+
+.absolute {
+    position: absolute;
+}
diff --git a/css/general/textColors.css b/css/general/textColors.css
index dabcec33218dda021887d2cbdd81889dbec0a749..95f5cfc484faeb834f40c8e199a6e6037dfab507 100644
--- a/css/general/textColors.css
+++ b/css/general/textColors.css
@@ -1,6 +1,8 @@
 /* Colors are made as css classes, to allow them to be changed for a light color scheme (for example). */
 /* a version is for this case: <span class="..."><a>text</a></span> */
 
+/* TODO: remove all color class names (e.g. ".cyan") once all instances are removed in code */
+
 /* link color */
 .link, .link a {
     color: var(--link-color)
diff --git a/css/gui/slaveList/slaveList.css b/css/gui/slaveList/slaveList.css
index a88ed7430ab4fa4a8937d62476a57f45b9d22ae1..79812e0b8bde290445b727ca5e0a94c5743eaced 100644
--- a/css/gui/slaveList/slaveList.css
+++ b/css/gui/slaveList/slaveList.css
@@ -17,6 +17,7 @@ span.freeAssignment {
 
 /* Slave Summary Block */
 .ssb {
+	display: inline-block;
 	margin-right: 2em;
 	text-indent: 0;
 }
diff --git a/devNotes/Extended Family Mode Explained.txt b/devNotes/Extended Family Mode Explained.txt
index 6e888e909c3cd5e091c850382c4c9e346714a1a4..2e80c02cca58b6815b7c5db34b31d40055a2cb9c 100644
--- a/devNotes/Extended Family Mode Explained.txt	
+++ b/devNotes/Extended Family Mode Explained.txt	
@@ -9,7 +9,7 @@ Everything about a slave's family can be gathered by looking into her mother and
 The following values are used with .mother and .father:
 Valid slave IDs (in other words, a value > 0) - Serves as both a target for checks and as a check itself to see if effort should be expended to search for the parent.
 0 - Slave has no known parent. A slave with a parent value of 0 is capable of having a parent added via reRelativeRecruiter
-MissingParentIDs (in other words, a value < -2) - Serves as a placeholder to preserve sibling relations in the case of a parent being sold or lost. Outside of extreme cases, this value will never be restored to its' previous value. $missingParentID starts at -10000 and decrements after application. On NG+, positive values are incremented the same as a normal slave and checked for validity. Should it be invalid, it will be replaced with $missingParentID. Negative values, on the other hand, are decremented by 1200000. Values of -1 and -2 are ignored by the JS, so don't use them. Also -9999 through -9994 are used by hero slaves to preserve their sibling status no matter when they are purchased or obtained during the same game.
+MissingParentIDs (in other words, a value < -2) - Serves as a placeholder to preserve sibling relations in the case of a parent being sold or lost. Outside of extreme cases, this value will never be restored to its previous value. $missingParentID starts at -10000 and decrements after application. On NG+, positive values are incremented the same as a normal slave and checked for validity. Should it be invalid, it will be replaced with $missingParentID. Negative values, on the other hand, are decremented by 1200000. Values of -1 and -2 are ignored by the JS, so don't use them. Also -9999 through -9994 are used by hero slaves to preserve their sibling status no matter when they are purchased or obtained during the same game.
 
 
 The limiters: .sisters and .daughters
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/RA.d.ts b/devTools/types/FC/RA.d.ts
index 3c1d84a173ded8e61137dfff5ccfd949a75cf4a7..f9816fcdafde765781fc6c95f684294d9e31a7cc 100644
--- a/devTools/types/FC/RA.d.ts
+++ b/devTools/types/FC/RA.d.ts
@@ -84,8 +84,8 @@ declare namespace FC {
 			clothes: FC.Clothes;
 			collar: string;
 			faceAccessory: string;
-			mouthAccessory: string;
-			shoes: string;
+			mouthAccessory: WithNone<MouthAccessory>;
+			shoes: WithNone<Shoes>;
 			armAccessory: string;
 			legAccessory: string;
 			chastityVagina: number;
diff --git a/devTools/types/FC/facilities.d.ts b/devTools/types/FC/facilities.d.ts
index db75c9ddb94d1df8d3f8c92e023d640dbb95a6bc..69ea41addb1bd05cd805fdedb7f37cb601a3479d 100644
--- a/devTools/types/FC/facilities.d.ts
+++ b/devTools/types/FC/facilities.d.ts
@@ -1,40 +1,50 @@
 declare namespace FC {
+	export type Upgrade = InstanceType<typeof App.Upgrade>;
+
+	interface IUpgrade {
+		/** The variable name of the upgrade. */
+		property: string;
+		/** Properties pertaining to any tiers available. */
+		tiers: IUpgradeTier[];
+		/** Any object the upgrade property is part of, if not the default `V`. */
+		object?: Object;
+	}
+
+	interface IUpgradeTier {
+		/** 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 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;
+		/** Any additional information to display upon hover on the link. */
+		note?: string;
+		/**
+		 * Any prerequisites that must be met before the upgrade is available.
+		 *
+		 * If none are given, the upgrade will always be available.
+		 */
+		prereqs?: Array<() => boolean>
+		/** Any additional nodes to attach. */
+		nodes?: Array<string|HTMLElement|DocumentFragment>
+	}
+
 	namespace Facilities {
 		export type Facility = InstanceType<typeof App.Facilities.Facility>;
 		export type Animal = InstanceType<typeof App.Entity.Animal>;
 
 		interface Decoration extends Record<FC.FutureSocietyDeco, string> {}
 
-		interface Upgrade {
-			/** The variable name of the upgrade. */
-			property: string;
-			/** Any prerequisites that must be met before the upgrade is available. */
-			prereqs: Array<() => boolean>;
-			/** Properties pertaining to any tiers available. */
-			tiers: Array<{
-				/** The value to set `property` to upon purchase. */
-				value: 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. */
-				cost?: number;
-				/** Any handler to run upon purchase. */
-				handler?: () => void;
-				/** Any additional information to display upon hover on the link. */
-				note?: string;
-				/** Any prerequisites that must be met for the upgrade to be available for purchase. */
-				prereqs?: Array<() => boolean>
-				/** Any additional nodes to attach. */
-				nodes?: Array<string|HTMLElement|DocumentFragment>
-			}>;
-			/** Any object the upgrade property is part of, if not the default `V`. */
-			object?: Object;
-		}
-
 		interface Rule {
 			/** The variable name of the rule. */
 			property: string
diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index e0521754444d6fc41e45b5522021944214d95689..4037fdb6bf69ae510f614a2dd30413eba51910dd 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -55,28 +55,15 @@ declare namespace FC {
 		/** @deprecated */
 		RECIevent: string[];
 		/** @deprecated */
-		RecETSevent: string[];
-		/** @deprecated */
 		REFIevent: string[];
 		/** @deprecated */
-		REFSevent: string[];
-		/** @deprecated */
 		PESSevent: string[];
 		/** @deprecated */
 		PETSevent: string[];
-		/** @deprecated */
-		FSNonconformistEvents: string[];
-		/** @deprecated */
-		rebelSlaves: string[];
-		/** @deprecated */
-		eligibleSlaves: SlaveState[];
 
 		/** @deprecated */
 		surgeryType: string;
 
-		/** @deprecated */
-		i: number;
-
 		relationLinks?: Record<number, {father: number, mother: number}>;
 
 		spire: number;
@@ -106,12 +93,12 @@ declare namespace FC {
 		enunciate?: Enunciation;
 		sortQuickList?: string;
 		slaveAfterRA?: SlaveState;
+		/** @deprecated */
+		returnTo: string;
 
 		slavesToImportMax?: number;
 
-		brandApplied?: number;
 		degradation?: number;
-		partner?: number | "daughter" | "father" | "mother" | "sister" | "relation" | "relationship" | "rivalry" | "";
 
 		activeArcologyIdx?: number;
 
@@ -125,13 +112,9 @@ declare namespace FC {
 		clubSpots?: number;
 		dairySpots?: number;
 		servantsQuartersSpots?: number;
-		clubBonuses?: number;
 		brothelSlavesGettingHelp?: number;
 		clubSlavesGettingHelp?: number;
 
-		lastWeeksRepErrors: Array<string>;
-		lastWeeksCashErrors: Array<string>;
-
 		arcadeDemandDegResult?: 1 | 2 | 3 | 4 | 5;
 
 		FarmerDevotionThreshold?: number;
@@ -151,7 +134,6 @@ declare namespace FC {
 		applyCareerBonus?: Bool;
 		careerBonusNeeded?: number[];
 		prostheticsConfig?: string;
-		relation: number;
 
 		heroSlaves: SlaveTemplate[];
 	}
diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index a4fd526e04fcce3f11ac9a5cfde3a91365527179..b7fdcf8e73f9e11ae975c6761a44f4350c5a167d 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -14,7 +14,7 @@ declare global {
 		}
 
 		export interface GingeredSlave extends SlaveState {
-			// note that all members are optional...GingeredSlave and SlaveState are bidirectionally interchangable
+			// note that all members are optional...GingeredSlave and SlaveState are bidirectionally interchangeable
 			gingering?: InstanceType<typeof App.Entity.GingeringParameters>;
 			beforeGingering?: SlaveState;
 		}
@@ -241,6 +241,8 @@ declare global {
 			"stretch pants and a crop-top" | "striped panties" | "striped underwear" | "uncomfortable straps" |	"Western clothing";
 		type HairStyle = "afro"| "braided" | "cornrows" | "curled" | "dreadlocks" | "eary" | "bun" | "messy bun" | "ponytail" | "tails" |
 			"drills" | "luxurious" | "messy" | "neat" | "permed" | "bangs" | "hime" | "strip" | "up" | "shaved" | "trimmed" | "buzzcut" | "bald" | "undercut";
+		type Shoes = "heels" | "pumps" | "extreme heels" | "boots" | "flats" | "platform heels" | "extreme heels" | "extreme platform heels" | "platform shoes";
+		type MouthAccessory = "dildo gag" | "massive dildo gag" | "ball gag" | "bit gag" | "ring gag";
 		type Diet = "healthy" | "restricted" | "corrective" | "muscle building" | "fattening" | "slimming" | "XX" | "XY" | "XXY" |
 			"cum production" | "cleansing" | "fertility" | "high caloric";
 		type Drug = "no drugs" |
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/devTools/types/assistant.d.ts b/devTools/types/assistant.d.ts
index 767cbfe6b6d780732a115fbd414ac52b7a03d6de..9d0729f420f450793519ae5103e0d3d5c70e6bf2 100644
--- a/devTools/types/assistant.d.ts
+++ b/devTools/types/assistant.d.ts
@@ -7,7 +7,8 @@ interface assistant {
 	personality: -1 | 0 | 1;
 	name: string;
 	power: number;
-	fsOptions: 1 | 0;
+	fsOptions: FC.Bool;
+	options: FC.Bool;
 	market: {
 		relationship: "nonconsensual" | "incestuous" | "cute" | "romantic";
 		limit: number;
diff --git a/js/003-data/careers.js b/js/003-data/careers.js
index 8764824377cbd086155963e1900c364cccbd1446..d1757edade6584a3a06edb7ca11ab35550b92d8e 100644
--- a/js/003-data/careers.js
+++ b/js/003-data/careers.js
@@ -16,6 +16,8 @@ App.Data.Careers = {
 
 		whore: ["a bimbo", "a child prostitute", "a criminal", "a cum dump", "a Futanari Sister", "a juvenile delinquent", "a mail-order bride", "a meat toilet", "a mistress", "a model", "a pageant star", "a pirate", "a porn star", "a prostitute", "a reality show star", "a saleswoman", "a serial divorcee", "a stripper", "a trophy wife", "an escort", "an exotic dancer"],
 
+		servant: ["a butler", "a cook", "a handmaiden", "a housewife", "a maid", "a shrine maiden"],
+
 		/* 	otherCareers: ["a producer", "being homeschooled by her parents", "from a middle class family", "from an upper class family"]>> */
 	},
 	Leader: {
@@ -44,7 +46,5 @@ App.Data.Careers = {
 		schoolteacher: ["a child prodigy", "a coach", "a dean", "a historian", "a librarian", "a principal", "a private instructor", "a professor", "a scholar", "a scientist", "a teacher's pet", "a teacher", "a teaching assistant", "an archaeologist", "an astronaut", "an economist"],
 
 		recruiter: ["a club recruiter", "a college scout", "a con artist", "a cult leader", "a girl scout", "a hunter", "a lobbyist", "a military recruiter", "a missionary", "a political activist", "a princess", "a spy", "a talent scout", "retired"],
-
-		servant: ["a butler", "a cook", "a handmaiden", "a housewife", "a maid", "a shrine maiden"],
 	},
 };
diff --git a/js/003-data/clothes/001-slaveWearData.js b/js/003-data/clothes/001-slaveWearData.js
index 5fdaedc70f5c0fe38be948e5d6dbd4eb87d25aa9..a5a64627b615e6ffb62f57a38bebbd9caf94c188 100644
--- a/js/003-data/clothes/001-slaveWearData.js
+++ b/js/003-data/clothes/001-slaveWearData.js
@@ -1123,42 +1123,6 @@ App.Data.slaveWear = {
 		],
 	]),
 
-	mouthAccessory: new Map([
-		["ball gag",
-			{
-				name: "Ball gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["bit gag",
-			{
-				name: "Bit gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["ring gag",
-			{
-				name: "Ring gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["massive dildo gag",
-			{
-				name: "Massive dildo gag",
-				get requirements() {
-					return V.boughtItem.toys.gags === 1;
-				},
-				note: "Increases oral skill up to a point and causes fear for disobedient slaves."
-			}
-		],
-		["dildo gag",
-			{
-				name: "Dildo gag",
-				note: "Increases oral skill up to a point and causes fear for disobedient slaves."
-			}
-		],
-	]),
-
 	vaginalAttachment: new Map([
 		["none", {name: "None"}],
 		["vibrator",
@@ -1244,6 +1208,51 @@ App.Data.slaveWear = {
 
 	]),
 };
+
+/**
+ * @typedef {object} mouthAccessory
+ * @property {string} name
+ * @property {boolean} [requirements]
+ * @property {string} [note]
+ */
+
+/** @type {Map<FC.MouthAccessory, mouthAccessory>} */
+App.Data.mouthAccessory = new Map([
+	["ball gag",
+		{
+			name: "Ball gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["bit gag",
+		{
+			name: "Bit gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["ring gag",
+		{
+			name: "Ring gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["massive dildo gag",
+		{
+			name: "Massive dildo gag",
+			get requirements() {
+				return V.boughtItem.toys.gags === 1;
+			},
+			note: "Increases oral skill up to a point and causes fear for disobedient slaves."
+		}
+	],
+	["dildo gag",
+		{
+			name: "Dildo gag",
+			note: "Increases oral skill up to a point and causes fear for disobedient slaves."
+		}
+	],
+]);
+
 /**
  * @typedef {object} slaveShoes
  * @property {string} name
@@ -1255,7 +1264,7 @@ App.Data.slaveWear = {
  */
 
 /**
- * @type {Map<string, slaveShoes>} slaveShoesCategory
+ * @type {Map<FC.Shoes, slaveShoes>} slaveShoesCategory
  */
 App.Data.shoes = new Map([ // TODO: add lift property
 	["none",
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index f854524c630582fdb5c8c98c6f93a962c2947c9d..01567d806b7000cc2829c817baf782bd09691811 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -140,6 +140,9 @@ App.Data.defaultGameStateVariables = {
 	seeVectorArtHighlights: 1,
 	setSuperSampling: 2,
 	setZoomSpeed: 1,
+	setFaceCulling: false,
+	setTextureResolution: 1024,
+	setColorBurn: true,
 	showAgeDetail: 1,
 	showAppraisal: 1,
 	showAssignToScenes: 1,
@@ -431,7 +434,9 @@ App.Data.resetOnNGPlus = {
 	lastWeeksRepIncome: {},
 	lastWeeksRepExpenses: {},
 	showAllEntries: {costsBudget: 0, repBudget: 0},
+	/** @type {string[]} */
 	lastWeeksCashErrors: [],
+	/** @type {string[]} */
 	lastWeeksRepErrors: [],
 
 	localEcon: 0,
@@ -805,6 +810,7 @@ App.Data.resetOnNGPlus = {
 	milkPipeline: 0,
 	cumPipeline: 0,
 	wcPiping: 0,
+	/** @type {Map<number, "oldAge"|"overdosed"|"lowHealth">} */
 	slaveDeath: new Map(),
 	playerBred: 0,
 	playerBredTube: 0,
@@ -979,39 +985,72 @@ App.Data.resetOnNGPlus = {
 	organFarmUpgrade: 0,
 	/** @type {FC.Medicine.OrganFarm.GrowingOrgan[]} */
 	completedOrgans: [],
+	/** @type {FC.Bool} */
 	ImplantProductionUpgrade: 0,
+	/** @type {FC.Bool} */
 	permaPregImplant: 0,
+	/** @type {0|1|2|3} */
 	injectionUpgrade: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradeMood: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradeShrinkage: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradePower: 0,
+	/** @type {FC.Bool} */
 	pubertyHormones: 0,
+	/** @type {FC.Bool} */
 	dietXXY: 0,
+	/** @type {FC.Bool} */
 	dietCleanse: 0,
+	/** @type {FC.Bool} */
 	cumProDiet: 0,
+	/** @type {FC.Bool} */
 	dietFertility: 0,
+	/** @type {FC.Bool} */
 	curativeUpgrade: 0,
+	/** @type {FC.Bool} */
 	growthStim: 0,
+	/** @type {FC.Bool} */
 	reproductionFormula: 0,
+	/** @type {FC.Bool} */
 	aphrodisiacUpgrade: 0,
+	/** @type {FC.Bool} */
 	aphrodisiacUpgradeRefine: 0,
+	/** @type {FC.Bool} */
 	healthyDrugsUpgrade: 0,
+	/** @type {FC.Bool} */
 	superFertilityDrugs: 0,
+	/** @type {FC.Bool} */
 	bellyImplants: 0,
+	/** @type {0|1|2} */
 	cervixImplants: 0,
+	/** @type {FC.Bool} */
 	meshImplants: 0,
+	/** @type {FC.Bool} */
 	prostateImplants: 0,
+	/** @type {FC.Bool} */
 	youngerOvaries: 0,
+	/** @type {FC.Bool} */
 	sympatheticOvaries: 0,
+	/** @type {FC.Bool} */
 	fertilityImplant: 0,
+	/** @type {FC.Bool} */
 	asexualReproduction: 0,
+	/** @type {FC.Bool} */
 	animalOvaries: 0, /* {pigOvaries: 0, canineOvaries: 0, horseOvaries: 0, cowOvaries: 0} currently unused*/
+	/** @type {FC.Bool} */
 	animalTesticles: 0, /* {pigTestes: 0, dogTestes: 0, horseTestes: 0, cowTestes: 0} currently unused*/
+	/** @type {FC.Bool} */
 	animalMpreg: 0, /* {pigMpreg: 0, dogMpreg: 0, horseMpreg: 0, cowMpreg: 0} currently unused*/
+	/** @type {0|1|2} */
 	geneticMappingUpgrade: 0,
 	toyShop: false,
+	/** @type {FC.Bool} */
 	pregnancyMonitoringUpgrade: 0,
+	/** @type {FC.Bool} */
 	cloningSystem: 0,
+	/** @type {FC.Bool} */
 	geneticFlawLibrary: 0,
 
 	projectN: App.Data.projectN,
@@ -1251,7 +1290,6 @@ App.Data.resetOnNGPlus = {
 		Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0,
 	},
 	DefaultBirthDestination: "individually decided fates",
-	legendaryFacility: 0,
 	heroSlavesPurchased: [],
 	/** @type {string[]} */
 	fcnn: [],
diff --git a/js/003-data/miscDataNames.js b/js/003-data/miscDataNames.js
index 849d1d719254445c88c50e7cce4f82babdbdeede..7a064ba431a9ec695a998fb5854019e9cfee99ff 100644
--- a/js/003-data/miscDataNames.js
+++ b/js/003-data/miscDataNames.js
@@ -920,9 +920,9 @@ App.Data.misc.bimboSlaveNames = ["Air", "Alex", "Alexis", "Amaze", "Amber-Louise
 App.Data.misc.bimboMaleNames = ["A.J.", "Aaron", "Abe", "Adam", "Aiden", "Al", "Alex", "Andy", "Anvil", "Ares", "Argo", "Arnold", "Austin", "Barrett", "Barron", "Bash", "Beardo", "Beast", "Beau", "Beef", "Ben", "Bernie", "Bert", "Beto", "Biff", "Bill", "Billie", "Billy", "Bimbo", "Blake", "Blane", "Bob", "Bobby", "Bod", "Boogie", "Boone", "Boris", "Boss", "Bow", "Brad", "Bradley", "Brak", "Brandon", "Brayden", "Brenden", "Brent", "Brett", "Brian", "Brick", "Bro", "Brock", "Brodie", "Brody", "Broly", "Broski", "Bruce", "Brute", "Bryan", "Bryce", "Bubba", "Buck", "Bud", "Bull", "Bullet", "Burner", "Burnie", "Burt", "Butch", "Buzz", "Cain", "Cal", "Cam", "Cameron", "Cap", "Carson", "Cayden", "Chad", "Champ", "Charlie", "Chase", "Chaz", "Chet", "Chip", "Chris", "Chud", "Chunk", "Clark", "Cody", "Cole", "Connor", "Cool", "Coors", "Cosmo", "Crane", "Crash", "Croc", "Crud", "Crunch", "Crunk", "Crusher", "Curt", "Cutter", "Cyrus", "D.J.", "Dave", "Davey", "David", "Dawg", "Deuce", "Dex", "Dick", "Dickie", "Diesel", "Dino", "Dirk", "Dog", "Dolf", "Dolph", "Dom", "Don", "Donald", "Doug", "Downtown", "Doyle", "Duke", "Dylan", "Dynamite", "Earl", "Earle", "Ed", "Eddie", "Edge", "Ego", "Eric", "Erwin", "Ethan", "Falcon", "Finn", "Flash", "Ford", "Frank", "Fred", "Freddie", "Freddy", "Gabe", "Garrett", "Garth", "Gator", "Georgy", "Gerry", "Giorgio", "Grant", "Grease", "Greg", "Guinness", "Guy", "Hammer", "Han", "Hank", "Hawk", "Heff", "Hock", "Huck", "Hugh", "Hunk", "Hunter", "Ian", "Igor", "Iron", "Irwin", "Isaac", "Jack", "Jackie", "Jackson", "Jake", "Jared", "Jay", "Jayson", "Jerry", "Jesse", "Jimbo", "Jock", "Joe", "Johnny", "Jonah", "Jones", "Jonesy", "Juggernaut", "Junior", "Justin", "Kane", "Kay", "Keith", "Kevin", "King", "Kramer", "Kris", "Kurt", "Kyle", "Lance", "Lee", "Levi", "Liam", "Lightning", "Logan", "Lou", "Louie", "Luke", "M.C.", "Marc", "Mark", "Marshall", "Mash", "Master", "Mate", "Mater", "Matt", "Maverick", "Max", "Meat", "Mel", "Mike", "Mikey", "Miller", "Mitch", "Mongo", "Moose", "Munch", "Murray", "Musk", "Nash", "Nate", "Neal", "Neil", "Newt", "Nick", "Nigel", "Oliver", "Owen", "Ox", "Patch", "Paul", "Paulie", "Pauly", "Pax", "Pete", "Petey", "Pitt", "Powers", "Preston", "Puck", "Punk", "Quincey", "Rack", "Ralph", "Ray", "Rex", "Rich", "Rick", "Ricky", "Rico", "Rip", "Rob", "Rocco", "Rock", "Rocker", "Rocko", "Rod", "Ron", "Rooster", "Ross", "Rum", "Russ", "Russell", "Rusty", "Sabre", "Scooter", "Scott", "Seth", "Skip", "Slash", "Sledge", "Smash", "Smasher", "Spencer", "Spinner", "Spud", "Spuds", "Stallion", "Stan", "Stanley", "Steel", "Steele", "Steve", "Stone", "Stuart", "Stud", "Sylvester", "Tad", "Tanner", "Terence", "Thad", "Thor", "Thrush", "Toby", "Todd", "Tom", "Tone", "Tony", "Topher", "Track", "Travis", "Trent", "Trevor", "Trey", "Trip", "Tucker", "Twitch", "Tyler", "Tyrone", "Verne", "Vince", "Volk", "Wally", "Wash", "Wayne", "Wells", "Will", "Willie", "Witt", "Wolf", "Wolfgang", "Wyatt", "Zach", "Zack", "Zap", "Zayne", "Zeke", "Zeus"];
 
 /*
-Name pool selector based on nationality and race. Use as follows, given some slave _slave:
-<<set _namePool = (setup.namePoolSelector[_slave.nationality + "." + _slave.race] || setup.namePoolSelector[_slave.nationality] || setup.whiteAmericanSlaveNames)>>
-Then pick _namePool.random(), or display those names as possible choices, or do whatever else you do with name pools.
+Name pool selector based on nationality and race. Use as follows, given some slave "slave":
+namePool = (setup.namePoolSelector[slave.nationality + "." + slave.race] || setup.namePoolSelector[slave.nationality] || setup.whiteAmericanSlaveNames)
+Then pick namePool.random(), or display those names as possible choices, or do whatever else you do with name pools.
 */
 App.Data.misc.namePoolSelector = {
 	"Afghan": App.Data.misc.afghanSlaveNames,
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..58289bda2280a2314d25ac1cdf36c707dd985176 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
@@ -13,6 +21,8 @@ App.Medicine.Surgery.Procedure = class {
 	get name() { throw new Error("Method 'name()' must be implemented."); }
 
 	/**
+	 * Lowercase and without punctuation at the end.
+	 *
 	 * @returns {string}
 	 */
 	get description() { return ""; }
@@ -30,10 +40,35 @@ App.Medicine.Surgery.Procedure = class {
 
 	get healthCost() { return 0; }
 
+	/**
+	 * The value this surgery applies to the relevant slave property. Used by the RA to evaluate the effectiveness of
+	 * the surgery. If numeric, it is the delta change, otherwise the result.
+	 * @returns {any}
+	 */
+	get changeValue() { return null; }
+
+	/**
+	 * If there are any entries, the procedure cannot be applied. The reason(s) are in array entries.
+	 *
+	 * @returns {Array<string>} May contain HTML
+	 */
+	get disabledReasons() { return []; }
+
 	// 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/artInfrastructure.js b/js/artInfrastructure.js
index b999b4292e71af3852a38bfcf4bd0d299e3e6236..419c9ef99409714e8ab2976d67b4a4e92082edf6 100644
--- a/js/artInfrastructure.js
+++ b/js/artInfrastructure.js
@@ -175,7 +175,8 @@ App.Art.SvgQueue = class {
 				return false; // only one is nullish, not equal
 			}
 
-			const leftNames = attrNames(left), rightNames = attrNames(right);
+			const leftNames = attrNames(left);
+			const rightNames = attrNames(right);
 			const intersectionLength = _.intersection(leftNames, rightNames).length;
 			if (leftNames.length !== intersectionLength || rightNames.length !== intersectionLength) {
 				return false; // contain different attributes, not equal
@@ -185,7 +186,8 @@ App.Art.SvgQueue = class {
 		}
 
 		let frag = document.createDocumentFragment();
-		let currentAttributes, outSvg;
+		let currentAttributes;
+		let outSvg;
 		for (const svg of this._container) {
 			if (!equalAttributes(currentAttributes, svg.attrs)) {
 				outSvg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
diff --git a/js/diff.js b/js/diff.js
new file mode 100644
index 0000000000000000000000000000000000000000..98319c2189128e988f0ae0f4bbef16798b5019f4
--- /dev/null
+++ b/js/diff.js
@@ -0,0 +1,192 @@
+/**
+ * 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.
+ *
+ * NOTE: When doing any changes to this, rerun the tests cases at devNotes/tests.
+ */
+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)) {
+						// TODO check if there is a way to keep the data structure valid without the need for deep clone
+						localDiff[key] = _.cloneDeep(original);
+					}
+				}
+				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/3-organMap.js b/js/medicine/3-organMap.js
index 3cf4fc2b3f302f3433544c1ee2335f5cb005deb4..31c7707a0468decd1bd1c0205c06bcb726fcc116 100644
--- a/js/medicine/3-organMap.js
+++ b/js/medicine/3-organMap.js
@@ -148,7 +148,7 @@ App.Medicine.OrganFarm.Organs = new Map([
 						/**
 						 * @type {FC.PregnancyData}
 						 */
-							// @ts-ignore
+						// @ts-ignore
 						const data = {};
 						deepAssign(data, App.Data.misc.pregData.human);
 						s.pregData = data;
diff --git a/js/medicine/surgery/assets/boobs.js b/js/medicine/surgery/assets/boobs.js
new file mode 100644
index 0000000000000000000000000000000000000000..f873c09c957e949fe52de1ce365afc99fb09a9a0
--- /dev/null
+++ b/js/medicine/surgery/assets/boobs.js
@@ -0,0 +1,413 @@
+App.Medicine.Surgery.Reactions.BoobsGain = class extends App.Medicine.Surgery.SimpleReaction {
+	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 = [];
+
+		if (diff.areolae > slave.areolae) {
+			r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
+		}
+		if (diff.nipples === "cute" && slave.nipples === "puffy") {
+			r.push(`The breast surgery is invasive, and when ${his} nipples heal, <span class="orange">they're a bit more normal.</span>`);
+		} else if (diff.nipples === "puffy" && slave.nipples === "huge") {
+			r.push(`The breast surgery is invasive, and when ${his} nipples heal, <span class="orange">they're a bit smaller.</span>`);
+		} else if (diff.nipples === "flat" && (slave.nipples === "cute" || slave.nipples === "tiny")) {
+			r.push(`The sudden increase in breast size has <span class="orange">stretched ${his} already small nipples flat.</span>`);
+		}
+		if (slave.boobShape !== "spherical") {
+			if (diff.boobShape === "spherical") {
+				r.push(`With so little actual flesh left, the shape of ${his} breasts are now entirely dictated by the implants within, <span class="lime">rendering them comically spherical.</span>`);
+			} else if (diff.boobShape === "normal" && slave.boobShape !== "normal") {
+				r.push(`The natural shape of ${his} breasts has been eliminated by the cosmetic surgery, <span class="lime">rendering ${his} boobs pretty and rounded.</span>`);
+			}
+		}
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} shows little reaction to the new weight on ${his} chest. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`);
+			} else {
+				r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new assets against anything ${he} can reach.`);
+			}
+			r.push(`${He}'s <span class="devotion inc">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.trust += 4;
+			reaction.devotion += 4;
+		} else if (slave.devotion > 50) {
+			if (hasAnyArms(slave)) {
+				r.push(`${He} hefts ${his} new breasts experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
+			} else {
+				r.push(`${He} bounces a little to feel ${his} new breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too much, but ${he} wiggles ${himself} a little to make them bounce for you.`);
+			}
+			r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.devotion += 4;
+		} else if (slave.devotion >= -20) {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new breasts`);
+			} else {
+				r.push(`${He} shifts them`);
+			}
+			r.push(`skeptically.`);
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
+			}
+			r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+			reaction.trust -= 5;
+		} else {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new breasts`);
+			} else {
+				r.push(`The new weight on ${his} chest fills ${him}`);
+			}
+			r.push(`with resentment.`);
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them, but ${heGlaresDaggers}.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`);
+			}
+			r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view these fake breasts as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+			reaction.trust -= 10;
+			reaction.devotion -= 5;
+		}
+
+		reaction.longReaction.push(r);
+		return reaction;
+	}
+};
+
+App.Medicine.Surgery.Reactions.BoobsLoss = class extends App.Medicine.Surgery.SimpleReaction {
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
+		const {He, he, his, him, himself} = getPronouns(slave);
+		const r = [];
+
+		if (diff.areolae < slave.areolae) {
+			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
+		}
+		if (slave.nipples === "huge") {
+			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
+		} else if (slave.nipples === "fuckable" && diff.boobs < 500) {
+			r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
+		} else if (slave.nipples === "flat") {
+			r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
+		}
+		if (slave.boobShape === "spherical") {
+			r.push(`With the removal of ${his} load bearing implants, <span class="orange">${his} breasts are left deflated and sagging.</span>`);
+		}
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} shows little awareness that ${his} breasts are smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+		} else if (slave.devotion > 50) {
+			if (hasAnyArms(slave)) {
+				r.push(`${He} hefts ${his} new, sleeker breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
+			} else {
+				r.push(`${He} bounces a little to feel ${his} smaller breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
+			}
+			r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.devotion += 4;
+		} else if (slave.devotion >= -20) {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new, smaller breasts skeptically.`);
+			} else {
+				r.push(`${He} attempts to sway ${his} big tits experimentally, only to find them substantially less bouncy.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
+			}
+			r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+			reaction.trust -= 5;
+		} else {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} sudden lack of ${his} former breasts with resentment.`);
+			} else {
+				r.push(`The sudden lack of weight on ${his} chest fills ${him} with resentment.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
+			}
+			r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
+			r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+			reaction.trust -= 10;
+			reaction.devotion -= 5;
+		}
+
+		reaction.longReaction.push(r);
+		return reaction;
+	}
+};
+
+{
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 */
+	const applyBoobsGain = function(slave) {
+		if (slave.areolae < 2 && Math.random() > 0.7) {
+			slave.areolae += 1;
+		}
+		if (slave.nipples === "puffy") {
+			if (Math.random() > 0.7) {
+				slave.nipples = "cute";
+			}
+		} else if (slave.nipples === "huge") {
+			if (Math.random() > 0.9) {
+				slave.nipples = "puffy";
+			}
+		} else if ((slave.nipples === "cute" || slave.nipples === "tiny") && (slave.boobsImplant / slave.boobs >= 0.75)) {
+			slave.nipples = "flat";
+		}
+		if (slave.boobShape !== "spherical") {
+			if (slave.boobsImplant / slave.boobs >= 0.90) {
+				slave.boobShape = "spherical";
+			} else if (slave.boobShape !== "normal" && Math.random() > 0.5) {
+				slave.boobShape = "normal";
+			}
+		}
+	};
+
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 */
+	const applyBoobsLoss = function(slave) {
+		if (slave.areolae > 2) {
+			slave.areolae -= 1;
+		}
+		if (slave.nipples === "huge") {
+			slave.nipples = "puffy";
+		} else if (slave.nipples === "fuckable" && slave.boobs < 500) {
+			slave.nipples = "huge";
+		} else if (slave.nipples === "flat") {
+			slave.nipples = "huge";
+		}
+		if (slave.boobShape === "spherical") {
+			slave.boobShape = "saggy";
+		}
+	};
+
+	App.Medicine.Surgery.Procedures.InstallBoobImplants = class extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {string} name
+		 * @param {FC.SizingImplantType} implantType
+		 * @param {number} size how big is the implant
+		 */
+		constructor(slave, name, implantType, size) {
+			super(slave);
+			this._size = size;
+			this._implantType = implantType;
+			this._name = name;
+		}
+
+		get name() {
+			return `${capFirstChar(this._name)} implants`;
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			return `place ${this._name}${V.showBoobCCs ? ` ${this._size}cc` : ''} implants into ${his} boobs`;
+		}
+
+		get healthCost() { return 10; }
+
+		get changeValue() { return this._size; }
+
+		apply(cheat) {
+			this._slave.boobs += this._size;
+			this._slave.boobsImplant = this._size;
+			this._slave.boobsImplantType = this._implantType;
+
+			applyBoobsGain(this._slave);
+
+			return this._assemble(new App.Medicine.Surgery.Reactions.BoobsGain());
+		}
+	};
+
+	App.Medicine.Surgery.Procedures.RemoveBoobImplants = class extends App.Medicine.Surgery.Procedure {
+		get name() {
+			return "Remove implants";
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			return `remove ${his} boob implants`;
+		}
+
+		get healthCost() { return 5; }
+
+		get changeValue() { return -this._slave.boobsImplant; }
+
+		apply(cheat) {
+			this._slave.boobs -= this._slave.boobsImplant;
+			this._slave.boobsImplant = 0;
+			this._slave.boobsImplantType = "none";
+
+			applyBoobsLoss(this._slave);
+
+			return this._assemble(new App.Medicine.Surgery.Reactions.BoobsLoss());
+		}
+	};
+
+
+	App.Medicine.Surgery.Procedures.ReplaceBoobImplants = class extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {string} name
+		 * @param {FC.SizingImplantType} implantType
+		 * @param {number} size how big is the implant
+		 * @param {boolean} [advanced=false] advanced implants may be more expensive
+		 */
+		constructor(slave, name, implantType, size, advanced = false) {
+			super(slave);
+			this._size = size;
+			this._implantType = implantType;
+			this._name = name;
+			this._advanced = advanced;
+		}
+
+		get name() {
+			return `${capFirstChar(this._name)} implants${this._advanced && V.ImplantProductionUpgrade < 1 ? " (special order)" : ""}`;
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			const r = [];
+			r.push(`replace ${his} boob implants with ${this._name}`);
+			if (V.showBoobCCs) {
+				r.push(`(${this._size}cc)`);
+			}
+			r.push("ones");
+			if (this._advanced && V.ImplantProductionUpgrade < 1) {
+				r.push("(special order)");
+			}
+			return r.join(" ");
+		}
+
+		get cost() { return super.cost + (this._advanced && V.ImplantProductionUpgrade < 1 ? 10000 : 0); }
+
+		get healthCost() { return 10; }
+
+		get changeValue() { return this._size - this.originalSlave.boobsImplant; }
+
+		apply(cheat) {
+			this._slave.boobs += this._size - this._slave.boobsImplant;
+			this._slave.boobsImplant = this._size;
+			this._slave.boobsImplantType = this._implantType;
+
+			if (this.changeValue >= 0) {
+				applyBoobsGain(this._slave);
+				return this._assemble(new App.Medicine.Surgery.Reactions.BoobsGain());
+			} else {
+				applyBoobsLoss(this._slave);
+				return this._assemble(new App.Medicine.Surgery.Reactions.BoobsLoss());
+			}
+		}
+	};
+
+
+	App.Medicine.Surgery.Procedures.FillBoobImplants = class extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {number} amount
+		 */
+		constructor(slave, amount) {
+			super(slave);
+			this._amount = amount;
+		}
+
+		get name() {
+			return `Add inert filler`;
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			return `add ${V.showBoobCCs ? `${this._amount}cc of` : 'some'} inert filler to each of ${his} boob implants`;
+		}
+
+		get healthCost() { return 10; }
+
+		get changeValue() { return this._amount; }
+
+		apply(cheat) {
+			this._slave.boobs += this._amount;
+			this._slave.boobsImplant += this._amount;
+
+			applyBoobsGain(this._slave);
+
+			return this._assemble(new App.Medicine.Surgery.Reactions.BoobsGain());
+		}
+	};
+
+	App.Medicine.Surgery.Procedures.DrainBoobImplants = class extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {number} amount
+		 */
+		constructor(slave, amount) {
+			super(slave);
+			this._amount = amount;
+		}
+
+		get name() {
+			return `Drain inert filler`;
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			return `drain ${V.showBoobCCs ? `${this._amount}cc of` : 'some'} inert filler from ${his} boob implants`;
+		}
+
+		get healthCost() { return 5; }
+
+		get changeValue() { return -this._amount; }
+
+		apply(cheat) {
+			this._slave.boobs -= this._amount;
+			this._slave.boobsImplant -= this._amount;
+
+			applyBoobsLoss(this._slave);
+
+			return this._assemble(new App.Medicine.Surgery.Reactions.BoobsLoss());
+		}
+	};
+
+
+	App.Medicine.Surgery.Procedures.ReduceBoobs = class extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {string} procedureName
+		 * @param {number} amount
+		 */
+		constructor(slave, procedureName, amount) {
+			super(slave);
+			this._procedureName = capFirstChar(procedureName);
+			this._amount = amount;
+		}
+
+		get name() {
+			return `${this._procedureName} boobs`;
+		}
+
+		get description() {
+			const {his} = getPronouns(this._slave);
+			return `${this._procedureName} ${his} boobs`;
+		}
+
+		get healthCost() { return 5; }
+
+		get changeValue() { return -this._amount; }
+
+		apply(cheat) {
+			this._slave.boobs -= this._amount;
+
+			applyBoobsLoss(this._slave);
+
+			return this._assemble(new App.Medicine.Surgery.Reactions.BoobsLoss());
+		}
+	};
+}
diff --git a/js/medicine/surgery/assets/butt.js b/js/medicine/surgery/assets/butt.js
new file mode 100644
index 0000000000000000000000000000000000000000..ce2673fd4190e1d9495b4aa3c408f50c621b201f
--- /dev/null
+++ b/js/medicine/surgery/assets/butt.js
@@ -0,0 +1,279 @@
+App.Medicine.Surgery.Reactions.ButtGain = class extends App.Medicine.Surgery.SimpleReaction {
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
+		const {He, he, his, him, himself} = getPronouns(slave);
+		const r = [];
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} doesn't notice that ${his} butt has gotten larger. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "buttslut")) {
+			r.push(`${He} gently flexes ${his} sore buttocks with a sigh of pleasure. ${He}'s <span class="devotion inc">deliriously happy</span> to have a bigger butt, since ${he} confidently expects that this will mean more cocks being shoved up ${his} asshole. ${He}'s so pleased that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.trust += 4;
+			reaction.devotion += 4;
+		} else if (slave.devotion > 50) {
+			r.push(`${He} rubs ${his} new butt experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles. <span class="devotion inc">${He}'s happy with your changes to ${his} ass.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.devotion += 4;
+		} else if (slave.devotion >= -20) {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new butt`);
+			} else {
+				r.push(`${He} shifts ${his} new butt`);
+			}
+			r.push(`skeptically. ${He}'s still sore, so ${he} doesn't touch it. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+			reaction.trust -= 5;
+		} else {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new butt`);
+			} else {
+				r.push(`The new weight in ${his} backside fills ${him}`);
+			}
+			r.push(`with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${he} glares daggers. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this fake ass as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+			reaction.trust -= 10;
+			reaction.devotion -= 5;
+		}
+
+		reaction.longReaction.push(r);
+		return reaction;
+	}
+};
+App.Medicine.Surgery.Reactions.ButtLoss = class extends App.Medicine.Surgery.SimpleReaction {
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
+		const {He, he, his, himself} = getPronouns(slave);
+		const r = [];
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} doesn't notice that ${his} butt has gotten smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+		} else if (slave.devotion > 50) {
+			r.push(`${He}`);
+			if (canSee(slave)) {
+				r.push(`twists to view`);
+			} else {
+				r.push(`${He} jiggles`);
+			}
+			r.push(`${his} new, sleeker derrière and turns to you with a smile and a flirty little roll of ${his} hips. ${He}'s still sore, so ${he} doesn't bounce ${his} tighter buttocks for you, but ${he} seems happy all the same. <span class="devotion inc">${He}'s happy with your changes to ${his} buttocks.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+			reaction.devotion += 4;
+		} else if (slave.devotion >= -20) {
+			r.push(`${He}`);
+			if (canSee(slave)) {
+				r.push(`twists to view`);
+			} else {
+				r.push(`jiggles`);
+			}
+			r.push(`${his} new, sleeker derrière skeptically.`);
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch it.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
+			}
+			r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+			reaction.trust -= 5;
+		} else {
+			r.push(`${He} shifts ${his} diminished ass with resentment.`);
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch it,`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
+			}
+			r.push(`but ${(canSee(slave)) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
+			r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical ass theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+			reaction.trust -= 10;
+			reaction.devotion -= 5;
+		}
+
+		reaction.longReaction.push(r);
+		return reaction;
+	}
+};
+
+App.Medicine.Surgery.Procedures.InstallButtImplants = class extends App.Medicine.Surgery.Procedure {
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {string} name
+	 * @param {FC.SizingImplantType} implantType
+	 * @param {number} size how big is the implant
+	 */
+	constructor(slave, name, implantType, size) {
+		super(slave);
+		this._size = size;
+		this._implantType = implantType;
+		this._name = name;
+	}
+
+	get name() {
+		return `${capFirstChar(this._name)} implants`;
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `place ${this._name} implants into ${his} butt`;
+	}
+
+	get healthCost() { return 10; }
+
+	get changeValue() { return this._size; }
+
+	apply(cheat) {
+		this._slave.butt += this._size;
+		this._slave.buttImplant = this._size;
+		this._slave.buttImplantType = this._implantType;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ButtGain());
+	}
+};
+
+App.Medicine.Surgery.Procedures.RemoveButtImplants = class extends App.Medicine.Surgery.Procedure {
+	get name() {
+		return "Remove implants";
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `remove ${his} butt implants`;
+	}
+
+	get healthCost() { return 5; }
+
+	get changeValue() { return -this._slave.buttImplant; }
+
+	apply(cheat) {
+		this._slave.butt -= this._slave.buttImplant;
+		this._slave.buttImplant = 0;
+		this._slave.buttImplantType = "none";
+		return this._assemble(new App.Medicine.Surgery.Reactions.ButtLoss());
+	}
+};
+
+App.Medicine.Surgery.Procedures.ReplaceButtImplants = class extends App.Medicine.Surgery.Procedure {
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {string} name
+	 * @param {FC.SizingImplantType} implantType
+	 * @param {number} size how big is the implant
+	 * @param {boolean} [advanced=false] advanced implants may be more expensive
+	 */
+	constructor(slave, name, implantType, size, advanced = false) {
+		super(slave);
+		this._size = size;
+		this._implantType = implantType;
+		this._name = name;
+		this._advanced = advanced;
+	}
+
+	get name() {
+		return `${capFirstChar(this._name)} implants${this._advanced && V.ImplantProductionUpgrade < 1 ? " (special order)" : ""}`;
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `replace ${his} butt implants with ${this._name} ones${this._advanced && V.ImplantProductionUpgrade < 1 ? " (special order)" : ""}`;
+	}
+
+	get cost() { return super.cost + (this._advanced && V.ImplantProductionUpgrade < 1 ? 10000 : 0); }
+
+	get healthCost() { return 10; }
+
+	get changeValue() { return this._size - this._slave.buttImplant; }
+
+	apply(cheat) {
+		this._slave.butt += this._size - this._slave.buttImplant;
+		this._slave.buttImplant = this._size;
+		this._slave.buttImplantType = this._implantType;
+		if (this.changeValue >= 0) {
+			return this._assemble(new App.Medicine.Surgery.Reactions.ButtGain());
+		} else {
+			return this._assemble(new App.Medicine.Surgery.Reactions.ButtLoss());
+		}
+	}
+};
+
+
+App.Medicine.Surgery.Procedures.FillButtImplants = class extends App.Medicine.Surgery.Procedure {
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {number} amount
+	 */
+	constructor(slave, amount) {
+		super(slave);
+		this._amount = amount;
+	}
+
+	get name() {
+		return `Add inert filler`;
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `add some inert filler to each of ${his} butt implants`;
+	}
+
+	get healthCost() { return 10; }
+
+	get changeValue() { return this._amount; }
+
+	apply(cheat) {
+		this._slave.butt += this._amount;
+		this._slave.buttImplant += this._amount;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ButtGain());
+	}
+};
+
+App.Medicine.Surgery.Procedures.DrainButtImplants = class extends App.Medicine.Surgery.Procedure {
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {number} amount
+	 */
+	constructor(slave, amount) {
+		super(slave);
+		this._amount = amount;
+	}
+
+	get name() {
+		return `Drain inert filler`;
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `drain some inert filler from ${his} butt implants`;
+	}
+
+	get healthCost() { return 5; }
+
+	get changeValue() { return -this._amount; }
+
+	apply(cheat) {
+		this._slave.butt -= this._amount;
+		this._slave.buttImplant -= this._amount;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ButtLoss());
+	}
+};
+
+App.Medicine.Surgery.Procedures.ReduceButt = class extends App.Medicine.Surgery.Procedure {
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {string} procedureName
+	 * @param {number} amount
+	 */
+	constructor(slave, procedureName, amount) {
+		super(slave);
+		this._procedureName = capFirstChar(procedureName);
+		this._amount = amount;
+	}
+
+	get name() {
+		return `${this._procedureName} butt`;
+	}
+
+	get description() {
+		const {his} = getPronouns(this._slave);
+		return `${this._procedureName} ${his} butt`;
+	}
+
+	get healthCost() { return 5; }
+
+	get changeValue() { return -this._amount; }
+
+	apply(cheat) {
+		this._slave.butt -= this._amount;
+		return this._assemble(new App.Medicine.Surgery.Reactions.ButtLoss());
+	}
+};
diff --git a/js/medicine/surgery/assets/mastectomy.js b/js/medicine/surgery/assets/mastectomy.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0e53321d4a1ad8842fa371ad7c7f2cf92ce2bbd
--- /dev/null
+++ b/js/medicine/surgery/assets/mastectomy.js
@@ -0,0 +1,247 @@
+App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.SimpleReaction {
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
+		const {his} = getPronouns(slave);
+		const r = [];
+
+		if (slave.boobShape === "saggy") {
+			r.push(`As excess skin and flesh was removed from ${his} breasts, care was taken to <span class="lime">reshape ${his} boobs to be nice and perky.</span>`);
+		}
+		if (slave.areolae > 2) {
+			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
+		}
+		if (slave.nipples === "huge") {
+			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
+		} else if (slave.nipples === "flat") {
+			r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
+		} else if (slave.nipples === "fuckable") {
+			r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
+		}
+
+		if (slave.boobs >= 7000) {
+			this._largeMastectomy(slave, r, reaction);
+		} else {
+			this._normalMastectomy(slave, r, reaction);
+		}
+
+		return reaction;
+	}
+
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {string[]} r
+	 * @param {reactionResult} reaction
+	 * @private
+	 */
+	_normalMastectomy(slave, r, reaction) {
+		const {He, he, His, his, him, himself} = getPronouns(slave);
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} shows little awareness that ${his} breasts are gone. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+		} else if (slave.sexualFlaw === "breast growth") {
+			if (canSee(slave)) {
+				r.push(`${He} can hardly believe what ${he} is seeing. ${His} once glorious bust has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
+			} else {
+				r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${His}`);
+				if (!hasBothArms(slave)) {
+					r.push(`hands immediately dart`);
+				} else {
+					r.push(`hand immediately darts`);
+				}
+				r.push(`to grope ${his} tits, but ${he} only ends up grabbing air. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${His}`);
+				if (!hasBothArms(slave)) {
+					r.push(`hand falls to ${his} side`);
+				} else {
+					r.push(`hands fall to ${his} sides`);
+				}
+				r.push(`as ${his} will breaks.`);
+			} else {
+				r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`);
+			}
+			r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+			applyMindbroken(slave);
+			reaction.shortReaction.push(`${His} mind <span class="mindbreak">broke.</span>`);
+		} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
+			if (canSee(slave)) {
+				r.push(`${He} can hardly believe what ${he} is seeing. ${His} once magnificent bust has been all but stripped from ${him}. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
+			} else {
+				r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
+			}
+			r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
+			r.push(`${He} loved ${his} huge breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="devotion dec">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> that you may chose to steal something else ${he} loves.`);
+			reaction.trust -= 40;
+			reaction.devotion -= 20;
+		} else if (slave.devotion > 50) {
+			if (hasAnyArms(slave)) {
+				r.push(`${He} hefts ${his} new, tiny breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
+			} else {
+				r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
+			}
+			r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+			reaction.devotion += 4;
+		} else if (slave.devotion >= -20) {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new, tiny breasts skeptically.`);
+			} else {
+				r.push(`${He} attempts to sway ${his} big tits experimentally, only to find ${his} chest barely moves at all.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
+			}
+			r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+			reaction.trust -= 5;
+		} else {
+			if (canSee(slave)) {
+				r.push(`${He} eyes the sudden lack of ${his} former breasts with resentment.`);
+			} else {
+				r.push(`The sudden lack of weight on ${his} chest fills ${him} with resentment.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
+			}
+			r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
+			r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+			reaction.trust -= 10;
+			reaction.devotion -= 5;
+		}
+		reaction.longReaction.push(r);
+	}
+
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @param {string[]} r
+	 * @param {reactionResult} reaction
+	 * @private
+	 */
+	_largeMastectomy(slave, r, reaction) {
+		const {He, he, His, his, him, himself} = getPronouns(slave);
+
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} shows little awareness that ${his} breasts are gone, despite such a massive change. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+		} else if (slave.sexualFlaw === "breast growth") {
+			if (canSee(slave)) {
+				r.push(`${He} can hardly believe what ${he} is seeing. The immense bust ${he} managed to grow has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
+			} else {
+				r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${His}`);
+				if (!hasBothArms(slave)) {
+					r.push(`hands immediately dart`);
+				} else {
+					r.push(`hand immediately darts`);
+				}
+				r.push(`to grope ${his} tits, but ${he} only ends up grabbing air. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${His}`);
+				if (!hasBothArms(slave)) {
+					r.push(`hand falls to ${his} side`);
+				} else {
+					r.push(`hands fall to ${his} sides`);
+				}
+				r.push(`as ${his} will breaks.`);
+			} else {
+				r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`);
+			}
+			r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+			applyMindbroken(slave);
+			reaction.shortReaction.push(`${His} mind <span class="mindbreak">broke.</span>`);
+		} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
+			if (canSee(slave)) {
+				r.push(`${He} can hardly believe what ${he} is seeing. ${His} once magnificent, immense bust has been all but stripped from ${him}. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
+			} else {
+				r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
+			}
+			r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
+			r.push(`${He} loved ${his} enormous breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="devotion dec">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> that you may chose to steal something else ${he} loves.`);
+			reaction.trust -= 40;
+			reaction.devotion -= 20;
+		} else if (slave.devotion > 50) {
+			if (hasAnyArms(slave)) {
+				r.push(`${He} hefts ${his} new, tiny breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
+			} else {
+				r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
+			}
+			r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs</span> and <span class="trust inc">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+			reaction.devotion += 4;
+			reaction.trust += 4;
+		} else if (slave.devotion >= -20) {
+			if (canSee(slave)) {
+				r.push(`${He} eyes ${his} new, tiny breasts with appreciation.`);
+			} else {
+				r.push(`${He} attempts to sway ${his} big tits experimentally, only to find ${his} chest barely moves at all.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
+			}
+			r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="trust inc">thankful</span> that you removed the literal weight off ${his} chest.`);
+			reaction.trust += 5;
+		} else {
+			if (canSee(slave)) {
+				r.push(`${He} eyes the sudden lack of ${his} former breasts with relief.`);
+			} else {
+				r.push(`The sudden lack of weight on ${his} chest fills ${him} with relief.`);
+			}
+			if (hasAnyArms(slave)) {
+				r.push(`${He}'s still sore, so ${he} doesn't touch them, but ${he} breathes easier without the immense weight hanging from ${him}.`);
+			} else {
+				r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${he} breathes easier without the immense weight hanging from ${him}.`);
+			}
+			r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion inc">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="trust inc">is thankful for your consideration of ${his} health.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
+			reaction.trust += 10;
+			reaction.devotion += 5;
+		}
+
+		reaction.longReaction.push(r);
+	}
+};
+
+App.Medicine.Surgery.Procedures.Mastectomy = class extends App.Medicine.Surgery.Procedure {
+	get name() {
+		return `Mastectomy`;
+	}
+
+	get description() {
+		return "Perform Mastectomy";
+	}
+
+	get healthCost() { return 30; }
+
+	get changeValue() { return 300 - this._slave.boobs; }
+
+	apply(cheat) {
+		if (this._slave.boobShape === "saggy") {
+			this._slave.boobShape = "perky";
+		}
+		if (this._slave.areolae > 2) {
+			this._slave.areolae -= 1;
+		}
+		if (this._slave.nipples === "huge") {
+			this._slave.nipples = "puffy";
+		} else if (this._slave.nipples === "flat") {
+			this._slave.nipples = "huge";
+		} else if (this._slave.nipples === "fuckable") {
+			this._slave.nipples = "huge";
+		}
+		this._slave.boobs = 300;
+
+		return this._assemble(new App.Medicine.Surgery.Reactions.Mastectomy());
+	}
+};
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 209bb26b2c75a577f3011b969bf2908478ccbb97..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 a3e507e47c2bd8e5af421e5399e9a8710eceafde..ed2275e3936791c53019f913f26fe3cacf56c798 100644
--- a/js/medicine/surgery/reaction/addForeskin.js
+++ b/js/medicine/surgery/reaction/addForeskin.js
@@ -2,13 +2,13 @@
 	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 = [];
 
 			if (slave.dick > 0) {
-				r.push(`${He} leaves the surgery gingerly, knowing ${he}'s had surgery on ${his} dick. Taking the first opportunity to check out ${his} member${(canSee(slave)) ? `in a mirror` : ``}, ${he}'s`);
+				r.push(`${He} leaves the surgery gingerly, knowing ${he}'s had surgery on ${his} dick. Taking the first opportunity to check out ${his} member${(canSee(slave)) ? ` in a mirror` : ``}, ${he}'s`);
 				if (slave.fetish === "mindbroken") {
 					r.push(`confused to find nothing has really changed.`);
 				} else if (slave.devotion > 50) {
@@ -31,7 +31,7 @@
 					reaction.trust -= 5;
 				}
 			} else {
-				r.push(`${He} leaves the surgery gingerly, knowing ${he}'s had surgery on ${his} genitals. Taking the first opportunity to check out ${his} crotch${(canSee(slave)) ? `in a mirror` : ``}, ${he}'s`);
+				r.push(`${He} leaves the surgery gingerly, knowing ${he}'s had surgery on ${his} genitals. Taking the first opportunity to check out ${his} crotch${(canSee(slave)) ? ` in a mirror` : ``}, ${he}'s`);
 				if (slave.fetish === "mindbroken") {
 					r.push(`confused to find that ${his} clitoris is missing.`);
 				} else if (slave.devotion > 50) {
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 8a44289cc8fd60f3297164da96fbd66a690586e2..16fe18f552e24156d9cf7a816b5b2b2600a28e1d 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 = [];
 
@@ -23,9 +23,9 @@
 					if (slave.dick === 0) {
 						r.push(`squirting female`);
 					}
-					r.push(`ejaculation, since ${his} new organ is of course hooked into ${his} urethra and does its duty whenever ${he} climaxes${(slave.balls === 0) ? `despite ${his} lack of testicles to add actual semen to ${his} copious emissions` : ``}.`);
+					r.push(`ejaculation, since ${his} new organ is of course hooked into ${his} urethra and does its duty whenever ${he} climaxes${(slave.balls === 0) ? ` despite ${his} lack of testicles to add actual semen to ${his} copious emissions` : ``}.`);
 					if (slave.fetishKnown === 1 && slave.fetish === "buttslut") {
-						r.push(`${He} was already an anal slut, but ${he} can now experience anal pleasure along an entirely new dimension. ${He}'s <span class="devotion inc">extremely grateful,</span> and <span class="lightsalmon">a more eager buttslut than ever.</span>`);
+						r.push(`${He} was already an anal slut, but ${he} can now experience anal pleasure along an entirely new dimension. ${He}'s <span class="devotion inc">extremely grateful,</span> and <span class="fetish inc">a more eager buttslut than ever.</span>`);
 						reaction.devotion += 5;
 						slave.fetishStrength = Math.clamp(slave.fetishStrength + 20, 0, 100);
 					} else {
@@ -47,7 +47,7 @@
 					if (slave.dick === 0) {
 						r.push(`squirting female`);
 					}
-					r.push(`ejaculation, since ${his} new organ is of course hooked into ${his} urethra and does its duty whenever ${he} climaxes${(slave.balls === 0) ? `despite ${his} lack of testicles to add actual semen to ${his} copious emissions` : ``}. ${His} main reaction is confusion; this alteration is pretty far outside any of the more conventional surgeries slaves might expect to receive, and ${his} mixed feeling tend to cancel each other out.`);
+					r.push(`ejaculation, since ${his} new organ is of course hooked into ${his} urethra and does its duty whenever ${he} climaxes${(slave.balls === 0) ? ` despite ${his} lack of testicles to add actual semen to ${his} copious emissions` : ``}. ${His} main reaction is confusion; this alteration is pretty far outside any of the more conventional surgeries slaves might expect to receive, and ${his} mixed feeling tend to cancel each other out.`);
 				} else {
 					r.push(`${He} doesn't have to know exactly what you did, though, to be <span class="trust dec">mortified</span> and <span class="devotion dec">infuriated</span> by your messing around inside ${his} body. ${He} hasn't yet learned to accept that you control ${him} completely, down to the arrangement and even presence of ${his} internal organs.`);
 					reaction.trust -= 10;
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..78695b8a4d7e3c8dcc2490b043deb03ac0985700 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 = " ";
@@ -21,7 +21,7 @@
 
 			if (slave.behavioralFlaw === "arrogant") {
 				reaction.longReaction.last()
-					.push(`<span class="green">${He} can hardly be arrogant relying on others to feed, bathe and carry ${him}.</span>`);
+					.push(`<span class="flaw break">${He} can hardly be arrogant relying on others to feed, bathe and carry ${him}.</span>`);
 				slave.behavioralFlaw = "none";
 			}
 
diff --git a/js/medicine/surgery/reaction/anus.js b/js/medicine/surgery/reaction/anus.js
index f0208d733943f0c71a6ff07b82e14b3a1537fe38..e7efcb9cce72a907861eec3862db030cc2e27f98 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 = [];
 
@@ -11,17 +11,17 @@
 				r.push(`${He} leaves the surgery with a terribly sore rear end and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			} else {
 				if (this._strongKnownFetish(slave, "buttslut")) {
-					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} is <span class="devotion inc">filled with joy</span> at the prospect of having a tight butt all over again, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} is <span class="devotion inc">filled with joy</span> at the prospect of having a tight butt all over again, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. If ${he} had much in the way of anal skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 					reaction.trust += 4;
 					reaction.devotion += 10;
 				} else if (slave.devotion > 50) {
-					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s a bit anxious at the prospect of the pain having to get back to a loose asshole the hard way, but ${he}'s <span class="devotion inc">happy</span> that you think ${him} worth the effort of surgical improvement. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s a bit anxious at the prospect of the pain having to get back to a loose asshole the hard way, but ${he}'s <span class="devotion inc">happy</span> that you think ${him} worth the effort of surgical improvement. If ${he} had much in the way of anal skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 					reaction.devotion += 4;
 				} else if (slave.devotion >= -20) {
-					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} knows ${he}'ll have to endure the pain of being fucked in a tight asshole again soon enough, but trepidation is nothing new for ${him}. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} knows ${he}'ll have to endure the pain of being fucked in a tight asshole again soon enough, but trepidation is nothing new for ${him}. If ${he} had much in the way of anal skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
 					reaction.trust -= 5;
 				} else {
-					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s <span class="devotion dec">horrified</span> at surgical alteration of ${his} rear end, and knows that this means that ${he}'ll have to take the pain of sodomy in a tight ass all over again. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} most intimate parts.`);
+					r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s <span class="devotion dec">horrified</span> at surgical alteration of ${his} rear end, and knows that this means that ${he}'ll have to take the pain of sodomy in a tight ass all over again. If ${he} had much in the way of anal skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} most intimate parts.`);
 					reaction.trust -= 10;
 					reaction.devotion -= 5;
 				}
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..63882d6d0c6ceeee67125ebb7173eaf480abbdc6 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 = [];
 
@@ -30,7 +30,7 @@
 				} else {
 					r.push(`The slave carrying ${him} struggles to keep their grip on the orgasm wracked ${girl}.`);
 				}
-				r.push(`By the time ${he} is finished, ${he} is a sweat-soaked, panting mess with a womb <span class="lime">`);
+				r.push(`By the time ${he} is finished, ${he} is a sweat-soaked, panting mess with a womb <span class="pregnant">`);
 				if (slave.pregType > 50) {
 					r.push(`stuffed full of fertilized eggs.`);
 				} else if (slave.pregType > 20) {
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
deleted file mode 100644
index b14c453838c995a36b83c21de9137e0d286409f8..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/boobs.js
+++ /dev/null
@@ -1,92 +0,0 @@
-{
-	class Boobs extends App.Medicine.Surgery.Reaction {
-		get key() { return "boobs"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, his, him, himself} = getPronouns(slave);
-			const heGlaresDaggers = canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`;
-			const r = [];
-
-			if (slave.areolae < 2 && Math.random() > 0.7) {
-				r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
-				slave.areolae += 1;
-			}
-			if (slave.nipples === "puffy") {
-				if (Math.random() > 0.7) {
-					r.push(`The breast surgery is invasive, and when ${his} nipples heal, <span class="orange">they're a bit more normal.</span>`);
-					slave.nipples = "cute";
-				}
-			} else if (slave.nipples === "huge") {
-				if (Math.random() > 0.9) {
-					r.push(`The breast surgery is invasive, and when ${his} nipples heal, <span class="orange">they're a bit smaller.</span>`);
-					slave.nipples = "puffy";
-				}
-			} else if ((slave.nipples === "cute" || slave.nipples === "tiny") && (slave.boobsImplant / slave.boobs >= 0.75)) {
-				r.push(`The sudden increase in breast size has <span class="orange">stretched ${his} already small nipples flat.</span>`);
-				slave.nipples = "flat";
-			}
-			if ((slave.boobShape !== "spherical") && (slave.boobsImplant / slave.boobs >= 0.90)) {
-				r.push(`With so little actual flesh left, the shape of ${his} breasts are now entirely dictated by the implants within, <span class="lime">rendering them comically spherical.</span>`);
-				slave.boobShape = "spherical";
-			} else if (slave.boobShape !== "normal" && slave.boobShape !== "spherical" && Math.random() > 0.5) {
-				r.push(`The natural shape of ${his} breasts has been eliminated by the cosmetic surgery, <span class="lime">rendering ${his} boobs pretty and rounded.</span>`);
-				slave.boobShape = "normal";
-			}
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} shows little reaction to the new weight on ${his} chest. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-			} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`);
-				} else {
-					r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new assets against anything ${he} can reach.`);
-				}
-				r.push(`${He}'s <span class="devotion inc">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.trust += 4;
-				reaction.devotion += 4;
-			} else if (slave.devotion > 50) {
-				if (hasAnyArms(slave)) {
-					r.push(`${He} hefts ${his} new breasts experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
-				} else {
-					r.push(`${He} bounces a little to feel ${his} new breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too much, but ${he} wiggles ${himself} a little to make them bounce for you.`);
-				}
-				r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.devotion += 4;
-			} else if (slave.devotion >= -20) {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new breasts`);
-				} else {
-					r.push(`${He} shifts them`);
-				}
-				r.push(`skeptically.`);
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
-				}
-				r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
-				reaction.trust -= 5;
-			} else {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new breasts`);
-				} else {
-					r.push(`The new weight on ${his} chest fills ${him}`);
-				}
-				r.push(`with resentment.`);
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them, but ${heGlaresDaggers}.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`);
-				}
-				r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view these fake breasts as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
-				reaction.trust -= 10;
-				reaction.devotion -= 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new Boobs();
-}
diff --git a/js/medicine/surgery/reaction/boobsLoss.js b/js/medicine/surgery/reaction/boobsLoss.js
deleted file mode 100644
index d5f3ba5b67a8ac23443d35e3a05d3568ec27cbb8..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/boobsLoss.js
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-	class BoobsLoss extends App.Medicine.Surgery.Reaction {
-		get key() { return "boobsLoss"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, his, him, himself} = getPronouns(slave);
-			const r = [];
-
-			if (slave.areolae > 2) {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
-				slave.areolae -= 1;
-			}
-
-			if (slave.nipples === "huge") {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
-				slave.nipples = "puffy";
-			} else if (slave.nipples === "fuckable" && slave.boobs < 500) {
-				r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			} else if (slave.nipples === "flat") {
-				r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			}
-			if (slave.boobShape === "spherical") {
-				r.push(`With the removal of ${his} load bearing implants, <span class="orange">${his} breasts are left deflated and sagging.</span>`);
-				slave.boobShape = "saggy";
-			}
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} shows little awareness that ${his} breasts are smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-			} else if (slave.devotion > 50) {
-				if (hasAnyArms(slave)) {
-					r.push(`${He} hefts ${his} new, sleeker breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
-				} else {
-					r.push(`${He} bounces a little to feel ${his} smaller breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
-				}
-				r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.devotion += 4;
-			} else if (slave.devotion >= -20) {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new, smaller breasts skeptically.`);
-				} else {
-					r.push(`${He} attempts to sway ${his} big tits experimentally, only to find them substantially less bouncy.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
-				}
-				r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
-				reaction.trust -= 5;
-			} else {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} sudden lack of ${his} former breasts with resentment.`);
-				} else {
-					r.push(`The sudden lack of weight on ${his} chest fills ${him} with resentment.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
-				}
-				r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
-				r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
-				reaction.trust -= 10;
-				reaction.devotion -= 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new BoobsLoss();
-}
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..2ed1fad2fd3d914342e0e9e5912b5968da39eb7d 100644
--- a/js/medicine/surgery/reaction/breastShapePreservationFailure.js
+++ b/js/medicine/surgery/reaction/breastShapePreservationFailure.js
@@ -6,25 +6,25 @@
 			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`;
 
 			function areolaeAndNipples() {
 				if (slave.areolae > 2) {
-					r.push(`The emergency mastectomy also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
+					r.push(`The emergency mastectomy also <span class="change negative">slightly reduces ${his} massive areolae.</span>`);
 					slave.areolae -= 1;
 				}
 				if (slave.nipples === "huge") {
-					r.push(`The emergency mastectomy also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
+					r.push(`The emergency mastectomy also <span class="change negative">slightly reduces ${his} massive nipples.</span>`);
 					slave.nipples = "puffy";
 				} else if (slave.nipples === "fuckable") {
-					r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
+					r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="change negative">to being huge and protruding.</span>`);
 					slave.nipples = "huge";
 				} else if (slave.nipples === "flat") {
-					r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
+					r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="change positive">to being huge and protruding.</span>`);
 					slave.nipples = "huge";
 				}
 			}
diff --git a/js/medicine/surgery/reaction/butt.js b/js/medicine/surgery/reaction/butt.js
deleted file mode 100644
index 3981c66c95f6b0168d1c460745ed97cb38707456..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/butt.js
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-	class Butt extends App.Medicine.Surgery.Reaction {
-		get key() { return "butt"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, his, him, himself} = getPronouns(slave);
-			const r = [];
-
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} doesn't notice that ${his} butt has gotten larger. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-			} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "buttslut")) {
-				r.push(`${He} gently flexes ${his} sore buttocks with a sigh of pleasure. ${He}'s <span class="devotion inc">deliriously happy</span> to have a bigger butt, since ${he} confidently expects that this will mean more cocks being shoved up ${his} asshole. ${He}'s so pleased that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.trust += 4;
-				reaction.devotion += 4;
-			} else if (slave.devotion > 50) {
-				r.push(`${He} rubs ${his} new butt experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles. <span class="devotion inc">${He}'s happy with your changes to ${his} ass.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.devotion += 4;
-			} else if (slave.devotion >= -20) {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new butt`);
-				} else {
-					r.push(`${He} shifts ${his} new butt`);
-				}
-				r.push(`skeptically. ${He}'s still sore, so ${he} doesn't touch it. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
-				reaction.trust -= 5;
-			} else {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new butt`);
-				} else {
-					r.push(`The new weight in ${his} backside fills ${him}`);
-				}
-				r.push(`with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${he} glares daggers. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this fake ass as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
-				reaction.trust -= 10;
-				reaction.devotion -= 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new Butt();
-}
diff --git a/js/medicine/surgery/reaction/buttLoss.js b/js/medicine/surgery/reaction/buttLoss.js
deleted file mode 100644
index 2d8dcd134f9c38209f4325a0081941c271c2636b..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/buttLoss.js
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-	class ButtLoss extends App.Medicine.Surgery.Reaction {
-		get key() { return "buttLoss"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, his, himself} = getPronouns(slave);
-			const r = [];
-
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} doesn't notice that ${his} butt has gotten smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-			} else if (slave.devotion > 50) {
-				r.push(`${He}`);
-				if (canSee(slave)) {
-					r.push(`twists to view`);
-				} else {
-					r.push(`${He} jiggles`);
-				}
-				r.push(`${his} new, sleeker derrière and turns to you with a smile and a flirty little roll of ${his} hips. ${He}'s still sore, so ${he} doesn't bounce ${his} tighter buttocks for you, but ${he} seems happy all the same. <span class="devotion inc">${He}'s happy with your changes to ${his} buttocks.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-				reaction.devotion += 4;
-			} else if (slave.devotion >= -20) {
-				r.push(`${He}`);
-				if (canSee(slave)) {
-					r.push(`twists to view`);
-				} else {
-					r.push(`jiggles`);
-				}
-				r.push(`${his} new, sleeker derrière skeptically.`);
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch it.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
-				}
-				r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
-				reaction.trust -= 5;
-			} else {
-				r.push(`${He} shifts ${his} diminished ass with resentment.`);
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch it,`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
-				}
-				r.push(`but ${(canSee(slave)) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
-				r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical ass theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
-				reaction.trust -= 10;
-				reaction.devotion -= 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new ButtLoss();
-}
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..5c640e70cb0f76f8e1bbd0f03c4ff83bbed40ccf 100644
--- a/js/medicine/surgery/reaction/cervixPumpAnus.js
+++ b/js/medicine/surgery/reaction/cervixPumpAnus.js
@@ -2,12 +2,12 @@
 	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 = [];
 
-			// TODO unify with normal cervix pump?
+			// TODO: unify with normal cervix pump?
 
 			const cervixPumpAcheLocation = "anus";
 			const cervixPumpLocation = "rectum";
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..afbfe5f92b33e8720514200aa6e1324b525996b8 100644
--- a/js/medicine/surgery/reaction/earRestore.js
+++ b/js/medicine/surgery/reaction/earRestore.js
@@ -2,14 +2,14 @@
 	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 = [];
 
 			if (slave.fetish === "mindbroken") {
 				r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`);
-			} else { /* Will expand in future*/
+			} else { // TODO: Will expand in future
 				r.push(`${He} is delighted to have ${his} ears back. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`);
 			}
 
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..dc664cdf4add70e22da31f7173b13bc71bed8a6c 100644
--- a/js/medicine/surgery/reaction/endLactation.js
+++ b/js/medicine/surgery/reaction/endLactation.js
@@ -2,16 +2,16 @@
 	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 = [];
 
 			r.push(`${He} notices almost immediately that the soreness that used to tell ${him} ${he} needed to be milked has gone. ${He} bounces ${his} breasts idly; it looks like ${he} doesn't know what to think about having ${his} lactation dry up. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 
 			if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
-				r.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
-				reaction.shortReaction.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
+				r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
+				reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 				removeJob(slave, slave.assignment);
 			}
 
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..cd13de6977dd1e59f3869ae6a76b079164f3c905 100644
--- a/js/medicine/surgery/reaction/fatGraft.js
+++ b/js/medicine/surgery/reaction/fatGraft.js
@@ -2,13 +2,13 @@
 	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 = [];
 
-			const boobFat = Math.max(V.boobFat, 0) || 0;
-			const buttFat = Math.max(V.buttFat, 0) || 0;
+			const boobFat = Math.max(V.boobFat, 0) || 0;	// FIXME: Property 'boobFat' does not exist on type 'GameVariables'.
+			const buttFat = Math.max(V.buttFat, 0) || 0;	// FIXME: Property 'buttFat' does not exist on type 'GameVariables'.
 
 			if (slave.fetish === "mindbroken") {
 				r.push(`${He} notices that ${his} weight is slightly off, almost as if it were someplace else. As with all surgeries, <span class="health dec">${his} health has been affected.</span>`);
@@ -22,7 +22,7 @@
 				if (boobFat > 0) {
 					if (slave.areolae < 2) {
 						if (Math.random() > 0.7) {
-							r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
+							r.push(`The increase in breast size <span class="change positive">stretches and broadens ${his} areolae.</span>`);
 							slave.areolae += 1;
 						}
 					}
@@ -65,7 +65,7 @@
 				if (boobFat > 0) {
 					if (slave.areolae < 2) {
 						if (Math.random() > 0.7) {
-							r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
+							r.push(`The increase in breast size <span class="change positive">stretches and broadens ${his} areolae.</span>`);
 							slave.areolae += 1;
 						}
 					}
@@ -101,7 +101,7 @@
 				if (boobFat > 0) {
 					if (slave.areolae < 2) {
 						if (Math.random() > 0.7) {
-							r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
+							r.push(`The increase in breast size <span class="change positive">stretches and broadens ${his} areolae.</span>`);
 							slave.areolae += 1;
 						}
 					}
@@ -137,7 +137,7 @@
 				if (boobFat > 0) {
 					if (slave.areolae < 2) {
 						if (Math.random() > 0.7) {
-							r.push(`The increase in breast size <span class="lime">stretches and broadens ${his} areolae.</span>`);
+							r.push(`The increase in breast size <span class="change positive">stretches and broadens ${his} areolae.</span>`);
 							slave.areolae += 1;
 						}
 					}
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..6ca648de6577395cd66605550def96fac61138e5 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 = [];
@@ -88,7 +88,7 @@
 					rel.relationshipTarget = 0;
 				}
 			} else if (slave.relationship < 0) {
-				r.push(`${His} <span class="lightsalmon">slave relationship to you is effectively over,</span> since everyone in the world outside ${his} suit is created equal to ${him}. ${He}'ll probably forget to distinguish your`);
+				r.push(`${His} <span class="relationship dec">slave relationship to you is effectively over,</span> since everyone in the world outside ${his} suit is created equal to ${him}. ${He}'ll probably forget to distinguish your`);
 				if (V.PC.dick !== 0) {
 					r.push(`dick if it's pushed inside ${his}`);
 				} else {
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..9fdbc20de5a44a6c3b250fc481a6edd17286fa61 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 = [];
 
@@ -26,8 +26,8 @@
 				reaction.devotion -= 20;
 			}
 			if ((slave.assignment === "get milked" || slave.assignment === "work in the dairy") && slave.lactation === 0) {
-				r.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
-				reaction.shortReaction.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
+				r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
+				reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 				removeJob(slave, slave.assignment);
 			}
 
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..08a47443a4fe7691ec65f9c207e87d9887eef654 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 = [];
 
@@ -32,7 +32,7 @@
 				if (slave.pregSource === -1) {
 					r.push(`your`);
 				} else {
-					r.push(`${V.impregnatrix.slaveName}'s`);
+					r.push(`${V.impregnatrix.slaveName}'s`);	// FIXME: Property 'impregnatrix' does not exist on type 'GameVariables'.
 				}
 				r.push(`${(slave.pregType > 1) ? `children` : `child`}, and a little nervous about how ${he}'ll perform as a mother.`);
 				reaction.devotion += 4;
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..78c0afaedb5576edbc363c6ea23d77ea544da5f0 100644
--- a/js/medicine/surgery/reaction/lips.js
+++ b/js/medicine/surgery/reaction/lips.js
@@ -2,22 +2,22 @@
 	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 = [];
 
 			if (slave.fetish === "mindbroken") {
 				r.push(`${He} vaguely realizes ${his} mouth doesn't move as well as it used to. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "cumslut")) {
-				r.push(`${He} licks ${his} new lips experimentally but doesn't lose much time before turning to you with ${his} mouth open and ready. ${He}'s still sore, so ${he}'s careful, but ${he} runs ${his} wet tongue over ${his} lips, already panting at the thought of sucking dick. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="devotion inc">${He}'s happy with your changes to ${his} lips,</span> so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+				r.push(`${He} licks ${his} new lips experimentally but doesn't lose much time before turning to you with ${his} mouth open and ready. ${He}'s still sore, so ${he}'s careful, but ${he} runs ${his} wet tongue over ${his} lips, already panting at the thought of sucking dick. If ${he} had much in the way of oral skills, <span class="stat drop">they've likely suffered.</span> <span class="devotion inc">${He}'s happy with your changes to ${his} lips,</span> so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 				reaction.trust += 4;
 				reaction.devotion += 4;
 				if (slave.skill.oral > 10) {
 					slave.skill.oral -= 10;
 				}
 			} else if (slave.devotion > 50) {
-				r.push(`${He} puckers ${his} new lips experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he}'s careful as ${he} blows you an awkward kiss. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="devotion inc">${He}'s happy with your changes to ${his} lips.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+				r.push(`${He} puckers ${his} new lips experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he}'s careful as ${he} blows you an awkward kiss. If ${he} had much in the way of oral skills, <span class="stat drop">they've likely suffered.</span> <span class="devotion inc">${He}'s happy with your changes to ${his} lips.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 				reaction.devotion += 4;
 				if (slave.skill.oral > 10) {
 					slave.skill.oral -= 10;
@@ -29,7 +29,7 @@
 				} else {
 					r.push(`puckers`);
 				}
-				r.push(`${his} new lips skeptically. ${He}'s still sore, so ${he} doesn't touch them. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally, <span class="red">but if ${he} had much in the way of oral skills, they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+				r.push(`${his} new lips skeptically. ${He}'s still sore, so ${he} doesn't touch them. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally, <span class="stat drop">but if ${he} had much in the way of oral skills, they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
 				reaction.trust -= 5;
 				if (slave.skill.oral > 10) {
 					slave.skill.oral -= 10;
@@ -41,7 +41,7 @@
 				} else {
 					r.push(`puckers`);
 				}
-				r.push(`${his} new lips with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> For now, <span class="devotion dec">${he} seems to view these fake lips as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
+				r.push(`${his} new lips with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. If ${he} had much in the way of oral skills, <span class="stat drop">they've likely suffered.</span> For now, <span class="devotion dec">${he} seems to view these fake lips as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
 				reaction.trust -= 10;
 				reaction.devotion -= 5;
 				if (slave.skill.oral > 10) {
diff --git a/js/medicine/surgery/reaction/maleToFemale.js b/js/medicine/surgery/reaction/maleToFemale.js
index 0f187848e9514814b8d81767940edb85c485c2df..f5f16191124caca8add12d842cc86c2787bf457e 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 = [];
 
@@ -34,8 +34,8 @@
 				reaction.devotion -= 20;
 			}
 			if ((slave.assignment === "get milked" || slave.assignment === "work in the dairy") && slave.lactation === 0) {
-				r.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
-				reaction.shortReaction.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`);
+				r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
+				reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 				removeJob(slave, slave.assignment);
 			}
 
diff --git a/js/medicine/surgery/reaction/mastectomy.js b/js/medicine/surgery/reaction/mastectomy.js
deleted file mode 100644
index 91c897c3b09934d2510647f2737dc6d00ad9dddb..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/mastectomy.js
+++ /dev/null
@@ -1,115 +0,0 @@
-{
-	class Mastectomy extends App.Medicine.Surgery.Reaction {
-		get key() { return "mastectomy"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, His, his, him, himself} = getPronouns(slave);
-			const r = [];
-
-			if (slave.breastShape === "saggy") {
-				r.push(`As excess skin and flesh was removed from ${his} breasts, care was taken to <span class="lime">reshape ${his} boobs to be nice and perky.</span>`);
-				slave.breastShape = "perky";
-			}
-			if (slave.areolae > 2) {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
-				slave.areolae -= 1;
-			}
-			if (slave.nipples === "huge") {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
-				slave.nipples = "puffy";
-			} else if (slave.nipples === "flat") {
-				r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			} else if (slave.nipples === "fuckable") {
-				r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			}
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} shows little awareness that ${his} breasts are gone. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-			} else if (slave.sexualFlaw === "breast growth") {
-				if (canSee(slave)) {
-					r.push(`${He} can hardly believe what ${he} is seeing. ${His} once glorious bust has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
-				} else {
-					r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${His}`);
-					if (!hasBothArms(slave)) {
-						r.push(`hands immediately dart`);
-					} else {
-						r.push(`hand immediately darts`);
-					}
-					r.push(`to grope ${his} tits, but ${he} only ends up grabbing air. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${His}`);
-					if (!hasBothArms(slave)) {
-						r.push(`hand falls to ${his} side`);
-					} else {
-						r.push(`hands fall to ${his} sides`);
-					}
-					r.push(`as ${his} will breaks.`);
-				} else {
-					r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`);
-				}
-				r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-				applyMindbroken(slave);
-				reaction.shortReaction.push(`${His} mind <span class="mindbreak">broke.</span>`);
-			} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
-				if (canSee(slave)) {
-					r.push(`${He} can hardly believe what ${he} is seeing. ${His} once magnificent bust has been all but stripped from ${him}. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
-				} else {
-					r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
-				}
-				r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
-				r.push(`${He} loved ${his} huge breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="devotion dec">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> that you may chose to steal something else ${he} loves.`);
-				reaction.trust -= 40;
-				reaction.devotion -= 20;
-			} else if (slave.devotion > 50) {
-				if (hasAnyArms(slave)) {
-					r.push(`${He} hefts ${his} new, tiny breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
-				} else {
-					r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
-				}
-				r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-				reaction.devotion += 4;
-			} else if (slave.devotion >= -20) {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new, tiny breasts skeptically.`);
-				} else {
-					r.push(`${He} attempts to sway ${his} big tits experimentally, only to find ${his} chest barely moves at all.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
-				}
-				r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
-				reaction.trust -= 5;
-			} else {
-				if (canSee(slave)) {
-					r.push(`${He} eyes the sudden lack of ${his} former breasts with resentment.`);
-				} else {
-					r.push(`The sudden lack of weight on ${his} chest fills ${him} with resentment.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
-				}
-				r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
-				r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion dec">${he} seems to view this surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> of your total power over ${his} body.`);
-				reaction.trust -= 10;
-				reaction.devotion -= 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new Mastectomy();
-}
diff --git a/js/medicine/surgery/reaction/mastectomyPlus.js b/js/medicine/surgery/reaction/mastectomyPlus.js
deleted file mode 100644
index 94f54aaad50ae21b4c4058a3ed33c4c619d2d92e..0000000000000000000000000000000000000000
--- a/js/medicine/surgery/reaction/mastectomyPlus.js
+++ /dev/null
@@ -1,115 +0,0 @@
-{
-	class MastectomyPlus extends App.Medicine.Surgery.Reaction {
-		get key() { return "mastectomy+"; }
-
-		reaction(slave) {
-			const reaction = super.reaction(slave);
-			const {He, he, His, his, him, himself} = getPronouns(slave);
-			const r = [];
-
-			if (slave.breastShape === "saggy") {
-				r.push(`As excess skin and flesh was removed from ${his} breasts, care was taken to <span class="lime">reshape ${his} boobs to be nice and perky.</span>`);
-				slave.breastShape = "perky";
-			}
-			if (slave.areolae > 2) {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
-				slave.areolae -= 1;
-			}
-			if (slave.nipples === "huge") {
-				r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
-				slave.nipples = "puffy";
-			} else if (slave.nipples === "flat") {
-				r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="lime">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			} else if (slave.nipples === "fuckable") {
-				r.push(`Without the tissue needed to support their unusual shape, ${his} fuckable nipples have reverted <span class="orange">to being huge and protruding.</span>`);
-				slave.nipples = "huge";
-			}
-			if (slave.fetish === "mindbroken") {
-				r.push(`${He} shows little awareness that ${his} breasts are gone, despite such a massive change. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-			} else if (slave.sexualFlaw === "breast growth") {
-				if (canSee(slave)) {
-					r.push(`${He} can hardly believe what ${he} is seeing. The immense bust ${he} managed to grow has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
-				} else {
-					r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${His}`);
-					if (!hasBothArms(slave)) {
-						r.push(`hands immediately dart`);
-					} else {
-						r.push(`hand immediately darts`);
-					}
-					r.push(`to grope ${his} tits, but ${he} only ends up grabbing air. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${His}`);
-					if (!hasBothArms(slave)) {
-						r.push(`hand falls to ${his} side`);
-					} else {
-						r.push(`hands fall to ${his} sides`);
-					}
-					r.push(`as ${his} will breaks.`);
-				} else {
-					r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`);
-				}
-				r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-				applyMindbroken(slave);
-				reaction.shortReaction.push(`${His} mind <span class="mindbreak">broke.</span>`);
-			} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
-				if (canSee(slave)) {
-					r.push(`${He} can hardly believe what ${he} is seeing. ${His} once magnificent, immense bust has been all but stripped from ${him}. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
-				} else {
-					r.push(`${He} immediately notices the lack of an immense weight hanging off ${his} chest. ${His} face fills with resentment as ${his} flatness dawns on ${him}.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them,`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still,`);
-				}
-				r.push(`but ${canSee(slave) ? `${he} glares daggers` : `${his} face contorts with distaste`}.`);
-				r.push(`${He} loved ${his} enormous breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="devotion dec">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="trust dec">terribly afraid</span> that you may chose to steal something else ${he} loves.`);
-				reaction.trust -= 40;
-				reaction.devotion -= 20;
-			} else if (slave.devotion > 50) {
-				if (hasAnyArms(slave)) {
-					r.push(`${He} hefts ${his} new, tiny breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`);
-				} else {
-					r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`);
-				}
-				r.push(`<span class="devotion inc">${He}'s happy with your changes to ${his} boobs</span> and <span class="trust inc">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-				reaction.devotion += 4;
-				reaction.trust += 4;
-			} else if (slave.devotion >= -20) {
-				if (canSee(slave)) {
-					r.push(`${He} eyes ${his} new, tiny breasts with appreciation.`);
-				} else {
-					r.push(`${He} attempts to sway ${his} big tits experimentally, only to find ${his} chest barely moves at all.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`);
-				}
-				r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="trust inc">thankful</span> that you removed the literal weight off ${his} chest.`);
-				reaction.trust += 5;
-			} else {
-				if (canSee(slave)) {
-					r.push(`${He} eyes the sudden lack of ${his} former breasts with relief.`);
-				} else {
-					r.push(`The sudden lack of weight on ${his} chest fills ${him} with relief.`);
-				}
-				if (hasAnyArms(slave)) {
-					r.push(`${He}'s still sore, so ${he} doesn't touch them, but ${he} breathes easier without the immense weight hanging from ${him}.`);
-				} else {
-					r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${he} breathes easier without the immense weight hanging from ${him}.`);
-				}
-				r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="devotion inc">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="trust inc">is thankful for your consideration of ${his} health.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-				reaction.trust += 10;
-				reaction.devotion += 5;
-			}
-
-			reaction.longReaction.push(r);
-			return reaction;
-		}
-	}
-
-	new MastectomyPlus();
-}
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..531ecfca0fd121fee19bc3a92959b503e1e6f669 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 = [];
 
@@ -19,7 +19,7 @@
 					reaction.trust += 10;
 				} else {
 					r.push(`${He} is <span class="trust dec">disturbed</span> that you replaced ${his} eyes with artificial ones and afraid of increased control over ${him} that such device grants.`);
-					reaction.devotion -= 5; // TODO text says trust, but devotion changed?
+					reaction.devotion -= 5; // TODO: text says trust, but devotion changed?
 				}
 			}
 
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..ab230e2ceff79ce93b3515dc170c583b533cca1d 100644
--- a/js/medicine/surgery/reaction/pLimbInterface.js
+++ b/js/medicine/surgery/reaction/pLimbInterface.js
@@ -2,12 +2,12 @@
 	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 = " ";
-			r.push(App.Medicine.Limbs.prosthetic(slave, V.oldLimbs, "Remote Surgery"));
+			r.push(App.Medicine.Limbs.prosthetic(slave, V.oldLimbs, "Remote Surgery"));	// FIXME: Property 'oldLimbs' does not exist on type 'GameVariables'.
 			delete V.oldLimbs;
 
 			reaction.longReaction.push(r);
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 43fc3fcb9cf35af4f31085732c3ca21ad978bd61..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 = [];
 
@@ -16,9 +16,9 @@
 			r.push(`installed in ${his} stumps. ${His} stumps twitch slightly as the software begins configuring. Since ${he} already had anchors installed in previous surgery this procedure was less invasive and thus <span class="health dec">${his} health has been only slightly affected.</span>`);
 			if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) {
 				if (slave.devotion > 20) {
-					r.push(`${He} is <span class="devotion inc">overjoyed</span> when ${he} finds out this upgrade will allow ${him} to //feel// with ${his} limbs again and thanks you profusely the first chance ${he} gets. ${He} <span class="trust inc">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`);
+					r.push(`${He} is <span class="devotion inc">overjoyed</span> when ${he} finds out this upgrade will allow ${him} to <i>feel</i> with ${his} limbs again and thanks you profusely the first chance ${he} gets. ${He} <span class="trust inc">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`);
 				} else if (slave.devotion >= -20) {
-					r.push(`${He}'s <span class="devotion inc">overwhelmed with joy and gratitude,</span> when ${he} finds out this upgrade will allow ${him} to //feel// with ${his} limbs again, in part because ${he} didn't think you'd do something like this for ${him}. ${He} thanks you profusely the first chance ${he} gets and is determined to prove ${himself} worthy of the expense you went to for ${him}. ${He} <span class="trust inc">places more trust in you,</span> too, since you seem to have a plan for ${him}.`);
+					r.push(`${He}'s <span class="devotion inc">overwhelmed with joy and gratitude,</span> when ${he} finds out this upgrade will allow ${him} to <i>feel</i> with ${his} limbs again, in part because ${he} didn't think you'd do something like this for ${him}. ${He} thanks you profusely the first chance ${he} gets and is determined to prove ${himself} worthy of the expense you went to for ${him}. ${He} <span class="trust inc">places more trust in you,</span> too, since you seem to have a plan for ${him}.`);
 				} else {
 					r.push(`Despite ${his} hatred of you, ${he} can't help but feel some <span class="trust inc">trust</span> and <span class="devotion inc">gratitude,</span> towards you, since you clearly have a plan that involves putting a good deal of value into ${him}. Your goals might not be ${hers}, but at least ${he} has an indication that you're not toying with ${him}.`);
 				}
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..e899b6388ff8a7b80dd305ca69b7c67251613cf4 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 = [];
 
@@ -40,7 +40,7 @@
 						} else {
 							r.push(`grow heavy`);
 						}
-						r.push(`with <span class="lime">your brood.</span>`);
+						r.push(`with <span class="pregnant">your brood.</span>`);
 						slave.pregSource = -1;
 						WombImpregnate(slave, 1, -1, 1);
 						/* to ensure player paternity we need actual fetus here */
diff --git a/js/medicine/surgery/reaction/preg1hack.js b/js/medicine/surgery/reaction/preg1hack.js
index 8d69e51fa9503cce997de5682a37a19d052f8813..2b1685ba0f44f104c209bd1f37bbea10bc2ed28c 100644
--- a/js/medicine/surgery/reaction/preg1hack.js
+++ b/js/medicine/surgery/reaction/preg1hack.js
@@ -2,20 +2,20 @@
 	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);
+			// My testing shows that 2 or 3 is 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 = [2, 2, 2, 2, 3, 3, 4].random();
 
 			if (slave.fetish === "mindbroken") {
 				/* nothing*/
 			} else if (this._strongKnownFetish(slave, "pregnancy")) {
-				r.push(`${He} is <span class="devotion inc">filled with joy</span> about being even more swollen with life and gleefully rubs ${his} soon-to-be-larger belly. ${He}'s so pleased that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="d">${his} health has been slightly affected.</span>`);
+				r.push(`${He} is <span class="devotion inc">filled with joy</span> about being even more swollen with life and gleefully rubs ${his} soon-to-be-larger belly. ${He}'s so pleased that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 				reaction.trust += 4;
 				reaction.devotion += 10;
 			} else if (slave.devotion > 50) {
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..347f9da4f89c1cbe62d61fe7446fe4ee5de0e416 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 = [];
 
@@ -13,7 +13,7 @@
 					if (slave.anus === 0) {
 						r.push(`Since ${he}'s still an anal virgin, ${he} doesn't have any immediate way to discover what's been taken from ${him}. Thus, ${he} carries on, accepting what you did to ${him} out of simple ignorance.`);
 					} else if (this._strongKnownFetish(slave, "buttslut")) {
-						r.push(`${He} realizes that ${his} prostate's gone the first time ${he} takes it up the butt, though. The incorrigible buttslut is crushed, but ${he}'s devoted to you, so ${he} resolves to carry on regardless. If anything, ${he} does ${his} best to push ${himself} to <span class="coral">consider other kinks,</span> now that a hard anal pounding isn't as fun for ${him} as it once was.`);
+						r.push(`${He} realizes that ${his} prostate's gone the first time ${he} takes it up the butt, though. The incorrigible buttslut is crushed, but ${he}'s devoted to you, so ${he} resolves to carry on regardless. If anything, ${he} does ${his} best to push ${himself} to <span class="fetish loss">consider other kinks,</span> now that a hard anal pounding isn't as fun for ${him} as it once was.`);
 						slave.fetishStrength -= 40;
 					} else {
 						r.push(`${He} realizes that ${his} prostate's gone the first time ${he} takes it up the butt, though. <span class="devotion inc">Awed by your permeating control over ${him},</span> even down to ${his} internal organs, ${he} accepts that you've decided to make buttsex less fun for ${him}.`);
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 c8e04b20ec3ef91619f22215155c88cf4d034315..a6ab6c7a73394dc81ed6be7d24e0eb108a98dfc3 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,14 +89,14 @@
 				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="change negative">less wide,</span>`);
 				slave.hips -= 1;
 				slave.shoulders -= 1;
 			} else if (slave.shoulders - Math.abs(slave.shouldersImplant) > -1) {
-				physicalChanges.push(`${his} shoulders are <span class="orange">less wide,</span>`);
+				physicalChanges.push(`${his} shoulders are <span class="change negative">less wide,</span>`);
 				slave.shoulders -= 1;
 			} else if (slave.hips - Math.abs(slave.hipsImplant) > -1) {
-				physicalChanges.push(`${his} hips are <span class="orange">less wide,</span>`);
+				physicalChanges.push(`${his} hips are <span class="change negative">less wide,</span>`);
 				slave.hips -= 1;
 			}
 			if (slave.visualAge < 18) {
@@ -115,16 +115,16 @@
 					} else {
 						shrinkage = 1;
 					}
-					physicalChanges.push(`${he} is a little <span class="orange">shorter,</span>`);
+					physicalChanges.push(`${he} is a little <span class="change negative">shorter,</span>`);
 					slave.height -= shrinkage;
 				}
 			}
 			if (slave.visualAge > 18) {
-				statusChanges.push(`${He} feels a little <span class="orange">younger.</span>`);
+				statusChanges.push(`${He} feels a little <span class="change negative">younger.</span>`);
 				slave.visualAge -= 1;
 			}
 			if (slave.voice.isBetween(0, 3)) {
-				let voiceReaction = [`${He} hears ${his} voice coming out as <span class="orange">higher</span> and more ${slave.voice < 2 ? "feminine" : "girly"} than it was before.`];
+				let voiceReaction = [`${He} hears ${his} voice coming out as <span class="change negative">higher</span> and more ${slave.voice < 2 ? "feminine" : "girly"} than it was before.`];
 				if (slave.devotion > 20) {
 					voiceReaction.push(`${He} laughs at ${his} new voice happily as ${he} gets used to it.`);
 				} else if (slave.devotion >= -20) {
@@ -169,7 +169,7 @@
 					r.push(hair);
 				}
 				if (genitalChanges.length > 0) {
-					r.push(`${He} can${sense} that ${his} junk is different now, it seems ${his}`);
+					r.push(`${He} can ${sense} that ${his} junk is different now, it seems ${his}`);
 					if (genitalChanges.length > 2) {
 						for (let i = 0; i < genitalChanges.length; i++) {
 							if (i < genitalChanges.length - 1) {
@@ -178,11 +178,11 @@
 								r.push(`and ${genitalChanges[i]}.`);
 							}
 						}
-						r.push(`have all become <span class="orange">smaller.</span>`);
+						r.push(`have all become <span class="change negative">smaller.</span>`);
 					} else if (genitalChanges.length > 1) {
-						r.push(`${genitalChanges[0]}, and ${genitalChanges[1]} have both become <span class="orange">smaller.</span>`);
+						r.push(`${genitalChanges[0]}, and ${genitalChanges[1]} have both become <span class="change negative">smaller.</span>`);
 					} else {
-						r.push(`${genitalChanges[0]} has become <span class="orange">smaller.</span>`);
+						r.push(`${genitalChanges[0]} has become <span class="change negative">smaller.</span>`);
 					}
 				}
 				if (physicalChanges.length > 0) {
@@ -190,21 +190,8 @@
 					if (genitalChanges.length > 0 || hairChanges > 0) {
 						r.push(`also`);
 					}
-					r.push(`${sense} that ${his} body has some physical changes, it seems to ${him} that`);
-					if (physicalChanges.length > 2) {
-						for (let i = 0; i < physicalChanges.length; i++) {
-							if (i < physicalChanges.length - 1) {
-								r.push(physicalChanges[i]);
-							} else {
-								r.push(`and${physicalChanges[i]}`);
-							}
-						}
-					} else if (physicalChanges.length > 1) {
-						r.push(`${physicalChanges[0]} and ${physicalChanges[1]}`);
-					} else {
-						r.push(physicalChanges[0]);
-					}
-					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`) + '.';
+					r.push(`${sense} that ${his} body has some physical changes, it seems to ${him} that ${toSentence(physicalChanges)}`);
+					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) {
@@ -227,7 +214,7 @@
 			if (slave.fetish === "mindbroken") {
 				r.push(`${He} doesn't seem to comprehend what this means for ${him}.`);
 			} else if (slave.devotion > 20) {
-				r.push(`${He} is <span class="devotion inc">happy</span> with how young ${his} body has become${(slave.visualAge > 26) ? `and is excited about the process continuing` : ``}. ${He} is already <span class="trust inc">wondering</span> what new kinky things you have planned for ${him}.`);
+				r.push(`${He} is <span class="devotion inc">happy</span> with how young ${his} body has become${(slave.visualAge > 26) ? ` and is excited about the process continuing` : ``}. ${He} is already <span class="trust inc">wondering</span> what new kinky things you have planned for ${him}.`);
 				reaction.trust += 5;
 				reaction.devotion += 5;
 				if (slave.visualAge > 26) {
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..8e89311586a196eff0b271c90dcf6eba2f21f8f4 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 = [];
 
@@ -11,17 +11,17 @@
 				r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			} else {
 				if (slave.energy > 95) {
-					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="devotion inc">filled with joy</span> at the prospect of having a tight cunt again, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="devotion inc">filled with joy</span> at the prospect of having a tight cunt again, so much so that ${he} now <span class="trust inc">trusts</span> your plans for ${his} body. If ${he} had much in the way of vanilla sex skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 					reaction.trust += 4;
 					reaction.devotion += 10;
 				} else if (slave.devotion > 50) {
-					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="devotion inc">happy</span> that you think ${him} worth the effort of surgical improvement, and a little excited to feel like ${he}'s a girl again. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
+					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="devotion inc">happy</span> that you think ${him} worth the effort of surgical improvement, and a little excited to feel like ${he}'s a girl again. If ${he} had much in the way of vanilla sex skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 					reaction.devotion += 4;
 				} else if (slave.devotion >= -20) {
-					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
+					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. If ${he} had much in the way of vanilla sex skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">sensibly fearful</span> of your total power over ${his} body.`);
 					reaction.trust -= 5;
 				} else {
-					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="devotion dec">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} most intimate parts.`);
+					r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="devotion dec">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. If ${he} had much in the way of vanilla sex skills, <span class="stat drop">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="trust dec">terribly afraid</span> of your total power over ${his} most intimate parts.`);
 					reaction.trust -= 10;
 					reaction.devotion -= 5;
 				}
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/js/random.js b/js/random.js
index f21de6962ce4922b8ee608cea4c3809616e7ec77..8b42d1b96c0cc7178746fa1383ac902e8a19d82d 100644
--- a/js/random.js
+++ b/js/random.js
@@ -21,6 +21,7 @@ function gaussianPair(mean = 0, deviation = 1) {
  * @param {number} [max]
  * @returns {number}
  */
+/* exported normalRandInt */
 function normalRandInt(mean = 0, deviation = 1, min = mean - 3 * deviation, max = mean + 3 * deviation) {
 	let val = gaussianPair(mean, deviation)[0];
 	while (val < min || val > max) {
@@ -37,6 +38,7 @@ function normalRandInt(mean = 0, deviation = 1, min = mean - 3 * deviation, max
  * @param {number} [count]
  * @returns {number}
  */
+/* exported jsRandom */
 function jsRandom(min, max, count = 1) {
 	function rand() {
 		return Math.random() * (max - min + 1) + min;
@@ -60,12 +62,13 @@ function jsRandom(min, max, count = 1) {
  * @param {number} count
  * @returns {Array<T>}
  */
+/* exported jsRandomMany */
 function jsRandomMany(arr, count) {
 	let result = [];
-	let _tmp = arr.slice();
+	let tmp = arr.slice();
 	for (let i = 0; i < count; i++) {
-		let index = Math.floor(Math.random() * _tmp.length);
-		result.push(_tmp.splice(index, 1)[0]);
+		let index = Math.floor(Math.random() * tmp.length);
+		result.push(tmp.splice(index, 1)[0]);
 	}
 	return result;
 }
@@ -77,6 +80,7 @@ function jsRandomMany(arr, count) {
  * @param {...T} [otherChoices]
  * @returns {T}
  */
+/* exported jsEither */
 function jsEither(choices, ...otherChoices) {
 	if (otherChoices.length === 0 && Array.isArray(choices)) {
 		return choices[Math.floor(Math.random() * choices.length)];
diff --git a/js/utils.js b/js/utils.js
index 32ff8ed53793bc6e54a4e7504f4ea816c63cbda2..ca698bfdeaa7d2f9da05424c56fa8e772b7f20e4 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -280,7 +280,8 @@ App.Utils.topologicalSort = function(keys, edges) {
 	});
 
 	edges.forEach(edge => {
-		const from = edge[0], to = edge[1];
+		const from = edge[0];
+		const to = edge[1];
 		if (!nodes[from]) { nodes[from] = new Node(from); }
 		if (!nodes[to]) { nodes[to] = new Node(to); }
 		nodes[from].afters.push(to);
diff --git a/sanityCheck.sh b/sanityCheck.sh
index cbe5b51291def7d2035d9bdc930dd0bc100dfa10..e8199e4e2f4ac26dfd89e666e58fc46114307a43 100755
--- a/sanityCheck.sh
+++ b/sanityCheck.sh
@@ -117,6 +117,8 @@ $GREP "span class=[^\"\']" -- src/*.js ':!src/001-lib/Jquery/Jquery.js' | myprin
 $GREP '[^A-Za-z]let(\r|\n)' | myprint "WrongLetStyle"
 # Check for lines with only "const"
 $GREP 'const(\r|\n)' | myprint "WrongConstStyle"
+# Check for events with mismatched names
+$GREP -P 'App\.Events\.(.*)\s*=\s*class\s+(?!\1)(.*)(?=\s+extends\s+App\.Events\.BaseEvent)' -- src/*.js | myprint "MismatchedEventName"
 
 # Check that all the tags are properly opened and closed & a lot of other stuff
 java -jar devTools/javaSanityCheck/SanityCheck.jar
diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt
index cfb2d1866362ea20feb33c31fa2e35960135f774..4daddafe3010d50d670df148936ed6f7ec609350 100644
--- a/slave variables documentation - Pregmod.txt	
+++ b/slave variables documentation - Pregmod.txt	
@@ -2350,15 +2350,16 @@ slave has hip implant
 butt:
 
 butt size
-0	  - flat
-1	  - small
-2	  - plump*
-3	  - big bubble butt
-4	  - huge
-5	  - enormous
-6	  - gigantic
-7	  - ridiculous
-8 - 10 - immense
+0	   - flat
+1      - slightly less flat
+2	   - small
+3	   - big
+4	   - large
+5	   - huge
+6	   - enormous
+7	   - gigantic
+8	   - ridiculous
+9 - 10 - immense
 11 - 20- inhuman
 
 *Descriptions vary for just how big 2 is, as such, it may be better to just go with 3
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index d158b67ed64fa99cedf4be8582f43cd002dd8cb6..a828794ca51c7b0d36c79a75294271f8347c7c4d 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,6 +1,6 @@
 App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
-	pmod: "4.0.0-alpha.7",
+	pmod: "4.0.0-alpha.8",
 	commitHash: null,
-	release: 1134 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1135 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/002-config/mousetrapConfig.js b/src/002-config/mousetrapConfig.js
index bce7279d0c465e3ba86605cf7d193d4312ce6cf9..0ff26bcdb3e89196f717110f7c1ac1c8c64015d0 100644
--- a/src/002-config/mousetrapConfig.js
+++ b/src/002-config/mousetrapConfig.js
@@ -342,6 +342,11 @@ App.UI.Hotkeys.add("Next Tab", {
 		App.UI.Tabs.right();
 	}, combinations: []
 });
+App.UI.Hotkeys.add("Close Dialog", {
+	callback: function() {
+		Dialog.close();
+	}, combinations: ["esc"]
+});
 App.UI.Hotkeys.add("walkpast", {
 	callback: function() {
 		$("#walkpast a").trigger("click");
diff --git a/src/004-base/arcologyBuilding.js b/src/004-base/arcologyBuilding.js
index 6c569b4440349c897a47170e216eeaafd202c284..78b51ef79496929d2390ea16ce7845918b9dd429 100644
--- a/src/004-base/arcologyBuilding.js
+++ b/src/004-base/arcologyBuilding.js
@@ -86,7 +86,7 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable {
 		 * Thanks JS!
 		 * @type {App.Arcology.Cell.BaseCell}
 		 */
-		const _this = this;
+		const that = this;
 
 		const fragment = document.createDocumentFragment();
 
@@ -172,7 +172,7 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable {
 				if (ownedCells > 1) {
 					const span = document.createElement("span");
 					span.classList.add("clear-formatting");
-					span.append(App.Arcology.getCellLink("Sell", _this.name, () => _this.cellPassage(containingBuilding),
+					span.append(App.Arcology.getCellLink("Sell", that.name, () => that.cellPassage(containingBuilding),
 						() => {
 							cashX(price(false), "capEx");
 							App.Arcology.updateOwnership();
@@ -187,7 +187,7 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable {
 				if (availableCells >= 1) {
 					const buySpan = document.createElement("span");
 					buySpan.classList.add("clear-formatting");
-					buySpan.append(App.Arcology.getCellLink("Buy", _this.name, () => _this.cellPassage(containingBuilding),
+					buySpan.append(App.Arcology.getCellLink("Buy", that.name, () => that.cellPassage(containingBuilding),
 						() => {
 							cashX(-(price(true) + 10000), "capEx");
 							A.demandFactor += DEMAND_FACTOR_DIFF;
@@ -202,7 +202,7 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable {
 
 						const repPrice = Math.clamp(price(true) / 2, 0, 18000);
 						repDiv.append("You have so much political capital that you can spend reputation to acquire ownership by spending reputation. ",
-							App.Arcology.getCellLink("Use reputation", _this.name, () => _this.cellPassage(containingBuilding),
+							App.Arcology.getCellLink("Use reputation", that.name, () => that.cellPassage(containingBuilding),
 								() => {
 									repX(-(repPrice), "capEx");
 									A.demandFactor += DEMAND_FACTOR_DIFF;
diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index dee2d1a7d55ffef05ab234cd5084f304ea00aece..f046369d7c972dda4e8a9286a8850a352075381b 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.Facilities.Upgrade[]} */
+		/** @private @type {FC.IUpgrade[]} */
 		this._upgrades = [];
-		/** @protected @type {FC.Facilities.Rule[]} */
+		/** @private @type {FC.Facilities.Rule[]} */
 		this._rules = [];
 
 		this._addUpgrades(...this.upgrades);
@@ -85,7 +85,7 @@ App.Facilities.Facility = class {
 
 	/**
 	 * Adds new purchaseable upgrades.
-	 * @param {...FC.Facilities.Upgrade} upgrades
+	 * @param {...FC.IUpgrade} upgrades
 	 *
 	 * @private
 	 * @returns {void}
@@ -175,48 +175,15 @@ App.Facilities.Facility = class {
 	_makeUpgrades() {
 		const div = document.createElement("div");
 
-		if (this.upgrades.length > 0 && this.upgrades.some(upgrade => upgrade.prereqs.every(prereq => prereq()))) {
+		if (this.upgrades.length > 0) {
 			App.UI.DOM.appendNewElement("h2", div, `Upgrades`);
-		}
 
-		this._upgrades.forEach(upgrade => {
-			if (upgrade.prereqs.every(prereq => prereq())) {
-				upgrade.tiers.forEach(tier => {
-					tier.cost = Math.trunc(tier.cost) || 0;
-
-					if (!tier.prereqs || tier.prereqs.every(prereq => prereq())) {
-						if (tier.upgraded
-						&& (upgrade.object && _.isEqual(upgrade.object[upgrade.property], tier.value))
-						|| (_.isEqual(V[upgrade.property], tier.value))) {
-							App.UI.DOM.appendNewElement("div", div, tier.upgraded);
-						} else {
-							App.UI.DOM.appendNewElement("div", div, tier.base);
-							App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(tier.link, () => {
-								cashX(forceNeg(tier.cost), "capEx");
-
-								if (upgrade.object) {
-									upgrade.object[upgrade.property] = tier.value;
-								} else {
-									V[upgrade.property] = tier.value;
-								}
-
-								if (tier.handler) {
-									tier.handler();
-								}
-
-								this.refresh();
-							}, [], '',
-							`${tier.cost > 0 ? `Costs ${cashFormat(tier.cost)}` : `Free`}${tier.note ? `${tier.note}` : ``}.`),
-							['indent']);
-
-							if (tier.nodes) {
-								App.Events.addNode(div, tier.nodes);
-							}
-						}
-					}
-				});
-			}
-		});
+			this._upgrades.forEach(u => {
+				const upgrade = new App.Upgrade(u.property, u.tiers, u.object);
+
+				div.append(upgrade.render());
+			});
+		}
 
 		return div;
 	}
@@ -368,6 +335,10 @@ App.Facilities.Facility = class {
 		return div;
 	}
 
+	// Getters and Setters
+
+	// Getters that returns a nullish type are used for type checking and autocompletion.
+
 	/**
 	 * The text displayed in the intro scene.
 	 *
@@ -400,7 +371,7 @@ App.Facilities.Facility = class {
 	/**
 	 * Any upgrades available for purchase.
 	 *
-	 * @returns {FC.Facilities.Upgrade[]}
+	 * @returns {FC.IUpgrade[]}
 	 */
 	get upgrades() {
 		return [];
diff --git a/src/005-passages/endWeekPassages.js b/src/005-passages/endWeekPassages.js
index 33e93c72fd560dbca0439cc4605bb0ba91690c5c..c7cdc293a1dffa690a29c4488b126efb01052b43 100644
--- a/src/005-passages/endWeekPassages.js
+++ b/src/005-passages/endWeekPassages.js
@@ -37,3 +37,10 @@ new App.DomPassage("Economics",
 		return App.EndWeek.economics();
 	}
 );
+
+new App.DomPassage("Security Force Naming-Colonel",
+	() => {
+		V.nextButton = " ";
+		return App.UI.securityForceNamingColonel();
+	}
+);
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 d63f42a4fa207e2593af21dc9ba57ac7fe3b2a71..58be9186488758a72954dd3c8378a6fdf56cddc8 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));
 	}
@@ -53,6 +53,16 @@ new App.DomPassage(
 	}
 );
 
+new App.DomPassage(
+	"Incubator Retrieval Workaround",
+	() => {
+		V.returnTo = "Main";
+		V.nextLink = "Incubator";
+		V.nextButton = "Continue";
+		return App.UI.incubatorRetrievalWorkaround();
+	}
+);
+
 new App.DomPassage(
 	"Agent Company",
 	() => {
@@ -353,3 +363,33 @@ new App.DomPassage("Analyze PC Pregnancy",
 		return App.UI.analyzePCPregnancy();
 	}, ["jump-from-safe"]
 );
+
+new App.DomPassage("Surrogacy Workaround",
+	() => {
+		V.nextButton = "Cancel";
+		return App.UI.surrogacyWorkaround();
+	}
+);
+
+new App.DomPassage("Cloning Workaround",
+	() => {
+		V.nextButton = "Cancel";
+		V.nextLink = "Gene Lab";
+		return App.UI.cloningWorkaround();
+	}
+);
+
+new App.DomPassage("Ova Transplant Workaround",
+	() => {
+		V.nextButton = "Cancel";
+		return App.UI.ovaTransplantWorkaround();
+	}
+);
+
+new App.DomPassage("Subordinate Targeting",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = V.returnTo;
+		return App.UI.subordinateTargeting();
+	}
+);
diff --git a/src/005-passages/introPassages.js b/src/005-passages/introPassages.js
index 89c2573bbfaf27019dd0288fac25e75fc268cca5..ef07aa0cb829927fad241ebf37d1ef4a553c4ccc 100644
--- a/src/005-passages/introPassages.js
+++ b/src/005-passages/introPassages.js
@@ -1,5 +1,7 @@
 new App.DomPassage("Alpha disclaimer", () => { return App.Intro.alphaDisclaimer(); });
 
+new App.DomPassage("New Game Plus", () => { return App.Intro.newGamePlus(); });
+
 new App.DomPassage("PC Body Intro", () => { return App.Intro.PCBodyIntro(); });
 
 new App.DomPassage("Intro Summary", () => { return App.Intro.summary(); });
diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js
index c0a2b0d55882d2d26f7544cbff6ade5a6b139a68..fc46819fda7140f504062e96f86e6750659e7584 100644
--- a/src/005-passages/managePassages.js
+++ b/src/005-passages/managePassages.js
@@ -94,16 +94,21 @@ new App.DomPassage("Elective Surgery",
 new App.DomPassage("Brothel Advertisement",
 	() => {
 		return App.Facilities.Brothel.ads();
-	}
+	}, ["jump-from-safe"]
+);
+
+new App.DomPassage("Club Advertisement",
+	() => {
+		return App.Facilities.Club.ads();
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Coursing Association",
 	() => {
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Coursing Association";
 		return App.UI.coursingAssociation();
-	}
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Personal assistant options",
@@ -145,7 +150,7 @@ new App.DomPassage("Prosthetic Lab",
 		V.nextButton = "Back";
 		V.nextLink = "Manage Penthouse";
 		return App.UI.prostheticLab();
-	}
+	}, ["jump-to-safe", "jump-from-safe"]
 );
 
 new App.DomPassage("Gene Lab",
@@ -164,3 +169,45 @@ new App.DomPassage("Breeder Proposal",
 		return App.UI.breederProposal();
 	}
 );
+
+new App.DomPassage("Implant Manufactory",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Manage Penthouse";
+		V.encyclopedia = "The Pharmaceutical Fab.";
+		return App.UI.implantManufactory();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
+
+new App.DomPassage("Organ Farm",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Manage Penthouse";
+		V.encyclopedia = "The Pharmaceutical Fab.";
+		return App.UI.organFarm();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
+
+new App.DomPassage("Barracks",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Main";
+		return App.UI.barracks();
+	}
+);
+
+new App.DomPassage("editSF",
+	() => {
+		V.nextButton = `Back to ${V.SF.Lower}'s Firebase`;
+		V.nextLink = "Firebase";
+		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/005-passages/optionsPassages.js b/src/005-passages/optionsPassages.js
index dc39958b5c640ebcd25142e0fc4d55559b594550..580a3c2e0742ae04cf4b83096447f0525d17783a 100644
--- a/src/005-passages/optionsPassages.js
+++ b/src/005-passages/optionsPassages.js
@@ -59,7 +59,7 @@ new App.DomPassage("Hotkey Settings",
 new App.DomPassage("Edit Genetics",
 	() => {
 		return App.UI.editGenetics();
-	}, ["jump-to-safe", "jump-from-safe"]
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Variable Difference",
diff --git a/src/Corporation/manageCorporation.js b/src/Corporation/manageCorporation.js
index e6b4c10a13cb40c99a9c791705fc93bb0f99b832..c18d9f886c475bcd4d04c1c918cf5b4cc069a942 100644
--- a/src/Corporation/manageCorporation.js
+++ b/src/Corporation/manageCorporation.js
@@ -108,105 +108,105 @@ App.Corporate.manage = function() {
 		const el = new DocumentFragment();
 		App.UI.DOM.appendNewElement("h1", el, "Division Management");
 
-		for (let _div of App.Corporate.divisionList) {
-			if (!_div.founded) {
+		for (let division of App.Corporate.divisionList) {
+			if (!division.founded) {
 				continue;
 			}
 
-			App.UI.DOM.appendNewElement("h2", el, `${_div.name} Division`);
-			if (_div.foundedDate !== 0) {
-				App.UI.DOM.appendNewElement("div", el, `Founded on ${asDateString(_div.foundedDate)}.`, "founding");
+			App.UI.DOM.appendNewElement("h2", el, `${division.name} Division`);
+			if (division.foundedDate !== 0) {
+				App.UI.DOM.appendNewElement("div", el, `Founded on ${asDateString(division.foundedDate)}.`, "founding");
 			}
 
-			App.UI.DOM.appendNewElement("div", el, `This division focuses on ${_div.focusDescription}.`);
+			App.UI.DOM.appendNewElement("div", el, `This division focuses on ${division.focusDescription}.`);
 
 			let div = document.createElement("div");
-			$(div).append(_div.messageSlaveCount());
+			$(div).append(division.messageSlaveCount());
 			el.append(div);
 
-			let _divMaint = _div.getDisplayMaintenanceCost();
+			let divMaint = division.getDisplayMaintenanceCost();
 			addDiv(el, "It costs ",
-				App.UI.DOM.makeElement("span", cashFormat(Math.trunc(_divMaint.cost)), ["cash", "dec"]),
+				App.UI.DOM.makeElement("span", cashFormat(Math.trunc(divMaint.cost)), ["cash", "dec"]),
 				" to run. On average that is ",
-				App.UI.DOM.makeElement("span", cashFormat(Math.trunc(_divMaint.perUnit)), ["cash", "dec"]),
+				App.UI.DOM.makeElement("span", cashFormat(Math.trunc(divMaint.perUnit)), ["cash", "dec"]),
 				" per slave.");
 
 			div = document.createElement("div");
-			$(div).append(_div.messageSlaveOutput());
+			$(div).append(division.messageSlaveOutput());
 			el.append(div);
 
-			let _divSentenceStart = ["Currently the division", "It also"];
+			let divSentenceStart = ["Currently the division", "It also"];
 			App.UI.DOM.appendNewElement("h3", el, "Direct Control");
 
-			if (_div.fromMarket) {
-				addDiv(el, `${_divSentenceStart.shift()} is ${_div.slaveAction.present} `,
-					App.UI.DOM.makeElement("span", numberWithPlural(_div.activeSlaves, "slave"), "green"));
+			if (division.fromMarket) {
+				addDiv(el, `${divSentenceStart.shift()} is ${division.slaveAction.present} `,
+					App.UI.DOM.makeElement("span", numberWithPlural(division.activeSlaves, "slave"), "green"));
 
-				if (_div.activeSlaves < _div.developmentCount) {
-					let _fillSlaveCount = _div.availableRoom;
-					addDiv(el, `There is room to ${_div.slaveAction.future} ${numberWithPluralOne(_fillSlaveCount, "more slave")}.`);
+				if (division.activeSlaves < division.developmentCount) {
+					let fillSlaveCount = division.availableRoom;
+					addDiv(el, `There is room to ${division.slaveAction.future} ${numberWithPluralOne(fillSlaveCount, "more slave")}.`);
 
-					let _buySlaveArray = [
+					let buySlaveArray = [
 						{'name': 'Buy Slave', 'count': 1},
 						{'name': 'Buy x10', 'count': 10}
 					];
 
-					if (!_buySlaveArray.some(function(x) { return x.count === _fillSlaveCount; })) {
-						_buySlaveArray.push({'name': 'Fill', 'count': _fillSlaveCount});
+					if (!buySlaveArray.some(function(x) { return x.count === fillSlaveCount; })) {
+						buySlaveArray.push({'name': 'Fill', 'count': fillSlaveCount});
 					}
-					let _singleSlaveCost = App.Corporate.slaveMarketPurchaseValue(_div, 1);
-					if (V.corp.Cash > _singleSlaveCost) {
+					let singleSlaveCost = App.Corporate.slaveMarketPurchaseValue(division, 1);
+					if (V.corp.Cash > singleSlaveCost) {
 						addDiv(el, `The corporation can purchase slaves directly from the market for about `,
-							cashFormatColor(_singleSlaveCost), ".");
+							cashFormatColor(singleSlaveCost), ".");
 
 						const links = [];
 
-						for (const _slaveNum of _buySlaveArray.filter(num => _div.availableRoom >= num.count)) {
-							let _slaveSetCost = App.Corporate.slaveMarketPurchaseValue(_div, _slaveNum.count);
-							if (V.corp.Cash < _slaveSetCost) {
+						for (const slaveNum of buySlaveArray.filter(num => division.availableRoom >= num.count)) {
+							let slaveSetCost = App.Corporate.slaveMarketPurchaseValue(division, slaveNum.count);
+							if (V.corp.Cash < slaveSetCost) {
 								continue;
 							}
-							links.push(App.UI.DOM.link(_slaveNum.name, () => {
-								App.Corporate.buySlaves(_div.id, _slaveNum.count);
+							links.push(App.UI.DOM.link(slaveNum.name, () => {
+								App.Corporate.buySlaves(division.id, slaveNum.count);
 								refresh();
 							}));
 						}
 						el.append(App.UI.DOM.generateLinksStrip(links));
 					} else {
 						addDiv(el, App.UI.DOM.makeElement("span", "The corporation cannot afford to purchase any slaves from the market.", "note"), " It requires about ",
-							App.UI.DOM.makeElement("span", cashFormat(_singleSlaveCost), "cash"), ` to buy a ${asSingular(_div.slaveAction.market)}.`);
+							App.UI.DOM.makeElement("span", cashFormat(singleSlaveCost), "cash"), ` to buy a ${asSingular(division.slaveAction.market)}.`);
 					}
 				} else {
-					addDiv(el, "There is ", App.UI.DOM.makeElement("em", "no room"), ` to ${_div.slaveAction.future} more slaves.`);
+					addDiv(el, "There is ", App.UI.DOM.makeElement("em", "no room"), ` to ${division.slaveAction.future} more slaves.`);
 				}
 			}
-			if (_div.toMarket) {
-				let _finishedSlaveNoun = _div.nounFinishedSlave;
-				if (_div.heldSlaves > 0) {
-					addDiv(el, `${_divSentenceStart.shift()} holds `,
-						App.UI.DOM.makeElement("span", numberWithPlural(_div.heldSlaves, _finishedSlaveNoun), "green"),
+			if (division.toMarket) {
+				let finishedSlaveNoun = division.nounFinishedSlave;
+				if (division.heldSlaves > 0) {
+					addDiv(el, `${divSentenceStart.shift()} holds `,
+						App.UI.DOM.makeElement("span", numberWithPlural(division.heldSlaves, finishedSlaveNoun), "green"),
 						".");
-					for (const _nextDiv of _div.relatedDivisions.to
+					for (const nextDiv of division.relatedDivisions.to
 						.filter(div => div.availableRoom > 0
-							&& !App.Corporate.ownsIntermediaryDivision(_div, div))) {
-						addDiv(el, `The ${_nextDiv.name} Division can accept up to `, App.UI.DOM.makeElement("span", numberWithPlural(_nextDiv.availableRoom, "slave"), "green"), ".");
+							&& !App.Corporate.ownsIntermediaryDivision(division, div))) {
+						addDiv(el, `The ${nextDiv.name} Division can accept up to `, App.UI.DOM.makeElement("span", numberWithPlural(nextDiv.availableRoom, "slave"), "green"), ".");
 
-						let _sendSlaveArray = [
+						let sendSlaveArray = [
 							{'name': 'Send Slave', 'count': 1},
 							{'name': 'Send x10', 'count': 10}
 						];
-						if (_div.heldSlaves >= _nextDiv.availableRoom) {
-							_sendSlaveArray.push({
-								'name': `Fill  ${_nextDiv.name} Division`,
-								'count': _nextDiv.availableRoom
+						if (division.heldSlaves >= nextDiv.availableRoom) {
+							sendSlaveArray.push({
+								'name': `Fill  ${nextDiv.name} Division`,
+								'count': nextDiv.availableRoom
 							});
 						} else {
-							_sendSlaveArray.push({'name': 'Send All', 'count': _div.heldSlaves});
+							sendSlaveArray.push({'name': 'Send All', 'count': division.heldSlaves});
 						}
 						const links = [];
-						for (const _slaveNum of _sendSlaveArray.filter(slaveNum => slaveNum.count <= _nextDiv.availableRoom && slaveNum.count <= _div.heldSlaves)) {
-							links.push(App.UI.DOM.link(_slaveNum.name, () => {
-								App.Corporate.transferSlaves(_div.id, _nextDiv.id, _slaveNum.count);
+						for (const slaveNum of sendSlaveArray.filter(slaveNum => slaveNum.count <= nextDiv.availableRoom && slaveNum.count <= division.heldSlaves)) {
+							links.push(App.UI.DOM.link(slaveNum.name, () => {
+								App.Corporate.transferSlaves(division.id, nextDiv.id, slaveNum.count);
 								refresh();
 							}));
 						}
@@ -215,23 +215,23 @@ App.Corporate.manage = function() {
 
 					App.UI.DOM.appendNewElement("div", el, "The corporation can sell these slaves to the market.");
 
-					let _sellSlaveArray = [
+					let sellSlaveArray = [
 						{'name': 'Sell Slave', 'count': 1},
 						{'name': 'Sell x10', 'count': 10},
 						{'name': 'Sell x100', 'count': 100},
-						{'name': 'Sell All', 'count': _div.heldSlaves}
+						{'name': 'Sell All', 'count': division.heldSlaves}
 					];
 
 					const links = [];
-					for (const _slaveNum of _sellSlaveArray.filter(slaveNum => _div.heldSlaves >= slaveNum.count)) {
-						links.push(App.UI.DOM.link(_slaveNum.name, () => {
-							App.Corporate.sellSlaves(_div.id, _slaveNum.count);
+					for (const slaveNum of sellSlaveArray.filter(slaveNum => division.heldSlaves >= slaveNum.count)) {
+						links.push(App.UI.DOM.link(slaveNum.name, () => {
+							App.Corporate.sellSlaves(division.id, slaveNum.count);
 							refresh();
 						}));
 					}
 					el.append(App.UI.DOM.generateLinksStrip(links));
 				} else {
-					App.UI.DOM.appendNewElement("div", el, `The division is not holding any ${asPlural(_finishedSlaveNoun)}.`);
+					App.UI.DOM.appendNewElement("div", el, `The division is not holding any ${asPlural(finishedSlaveNoun)}.`);
 				}
 			}
 
@@ -239,30 +239,30 @@ App.Corporate.manage = function() {
 			const links = [];
 
 			/* Expanding the division*/
-			let _depExpandCost = _div.sizeCost * 1000;
-			addDiv(el, "Expanding the division costs ", App.UI.DOM.makeElement("span", cashFormat(_depExpandCost), ["cash", "dec"]), " Downsizing recoups 80% of the investment; slaves will be sold at the going rate.");
+			let depExpandCost = division.sizeCost * 1000;
+			addDiv(el, "Expanding the division costs ", App.UI.DOM.makeElement("span", cashFormat(depExpandCost), ["cash", "dec"]), " Downsizing recoups 80% of the investment; slaves will be sold at the going rate.");
 
-			let _buyDevArray = [
+			let buyDevArray = [
 				{'name': 'Expand Division', 'count': 1},
 				{'name': 'Expand x10', 'count': 10}
 			];
 
-			for (const _buySet of _buyDevArray.filter(buySet => App.Corporate.cash >= buySet.count * _depExpandCost)) {
-				links.push(App.UI.DOM.link(_buySet.name, () => {
-					App.Corporate.buyDevelopment(_div.id, _buySet.count);
+			for (const buySet of buyDevArray.filter(buySet => App.Corporate.cash >= buySet.count * depExpandCost)) {
+				links.push(App.UI.DOM.link(buySet.name, () => {
+					App.Corporate.buyDevelopment(division.id, buySet.count);
 					refresh();
 				}));
 			}
 
 			/* Downsize the division*/
-			const _sellDevArray = [
+			const sellDevArray = [
 				{'name': 'Downsize Division', 'count': 1},
 				{'name': 'Downsize x10', 'count': 10}
 			];
 
-			for (const _sellSet of _sellDevArray.filter(divNum => _div.developmentCount > divNum.count)) {
-				links.push(App.UI.DOM.link(_sellSet.name, () => {
-					App.Corporate.sellDevelopment(_div.id, _sellSet.count);
+			for (const sellSet of sellDevArray.filter(divNum => division.developmentCount > divNum.count)) {
+				links.push(App.UI.DOM.link(sellSet.name, () => {
+					App.Corporate.sellDevelopment(division.id, sellSet.count);
 					refresh();
 				}));
 			}
@@ -272,43 +272,43 @@ App.Corporate.manage = function() {
 			App.UI.DOM.appendNewElement("h3", el, "Rules");
 
 			const options = new App.UI.OptionsGroup().customRefresh(refresh);
-			for (const _nextDiv of _div.relatedDivisions.to
-				.filter(nextDiv => nextDiv.founded && !App.Corporate.ownsIntermediaryDivision(_div, nextDiv))) {
+			for (const nextDiv of division.relatedDivisions.to
+				.filter(nextDiv => nextDiv.founded && !App.Corporate.ownsIntermediaryDivision(division, nextDiv))) {
 				// TODO: Originally this had a bit of flavor per nextDep. ie, Surgery said "to undergo surgery"
-				const o = {send: _div.getAutoSendToDivision(_nextDiv)};
-				options.addOption(`Auto send slaves to ${_nextDiv.name} Division`, "send", o)
+				const o = {send: division.getAutoSendToDivision(nextDiv)};
+				options.addOption(`Auto send slaves to ${nextDiv.name} Division`, "send", o)
 					.addValue("Enabled", true, () => {
-						App.Corporate.setAutoSendToDivision(_div.id, _nextDiv.id, true);
+						App.Corporate.setAutoSendToDivision(division.id, nextDiv.id, true);
 						refresh();
 					}).on()
 					.addValue("Disabled", false, () => {
-						App.Corporate.setAutoSendToDivision(_div.id, _nextDiv.id, false);
+						App.Corporate.setAutoSendToDivision(division.id, nextDiv.id, false);
 						refresh();
 					}).off();
 			}
 
-			if (_div.toMarket) {
-				const o = {send: _div.getAutoSendToMarket()};
+			if (division.toMarket) {
+				const o = {send: division.getAutoSendToMarket()};
 				options.addOption("Auto send to market", "send", o)
 					.addValue("Enabled", 1, () => {
-						App.Corporate.setAutoSendToMarket(_div.id, 1);
+						App.Corporate.setAutoSendToMarket(division.id, 1);
 						refresh();
 					}).on()
 					.addValue("Disabled", 0, () => {
-						App.Corporate.setAutoSendToMarket(_div.id, 0);
+						App.Corporate.setAutoSendToMarket(division.id, 0);
 						refresh();
 					}).off();
 			}
 
-			if (_div.fromMarket) {
-				const o = {buy: _div.getAutoBuyFromMarket()};
+			if (division.fromMarket) {
+				const o = {buy: division.getAutoBuyFromMarket()};
 				options.addOption("Auto buy slaves from the market", "buy", o)
 					.addValue("Enabled", 1, () => {
-						App.Corporate.setAutoBuyFromMarket(_div.id, 1);
+						App.Corporate.setAutoBuyFromMarket(division.id, 1);
 						refresh();
 					}).on()
 					.addValue("Disabled", 0, () => {
-						App.Corporate.setAutoBuyFromMarket(_div.id, 0);
+						App.Corporate.setAutoBuyFromMarket(division.id, 0);
 						refresh();
 					}).off();
 			}
@@ -327,7 +327,7 @@ App.Corporate.manage = function() {
 						App.UI.DOM.appendNewElement("p", frag, "Dissolving the division will destroy all of its assets!", "note");
 						App.UI.DOM.appendNewElement("p", frag, "This decision cannot be reverted!", ["warning", "note"]);
 						frag.append(App.UI.DOM.link("Dissolve", () => {
-							App.Corporate.divisions[_div.id].dissolve();
+							App.Corporate.divisions[division.id].dissolve();
 							refresh();
 							Dialog.close();
 						}));
@@ -349,22 +349,22 @@ App.Corporate.manage = function() {
 
 		addDiv(el, `The corporation can expand by founding a new division related to its current ${onlyPlural(App.Corporate.divisionList.filter(div => div.founded).length, "division")}.`);
 
-		for (const _div of App.Corporate.divisionList.filter(x => !x.founded && x.relatedDivisions.anyFounded)) {
-			const _depCost = _div.foundingCost * 1000;
+		for (const division of App.Corporate.divisionList.filter(x => !x.founded && x.relatedDivisions.anyFounded)) {
+			const depCost = division.foundingCost * 1000;
 
-			if (App.Corporate.cash >= _depCost) {
+			if (App.Corporate.cash >= depCost) {
 				addDiv(el,
-					App.UI.DOM.link("Add " + _div.name + " Division", () => {
-						App.Corporate.divisions[_div.id].create(App.Corporate);
+					App.UI.DOM.link("Add " + division.name + " Division", () => {
+						App.Corporate.divisions[division.id].create(App.Corporate);
 						refresh();
 					}),
 					" (",
-					App.UI.DOM.makeElement("span", cashFormat(_depCost), "cash"),
-					`): A division focusing on ${_div.focusDescription}.`);
+					App.UI.DOM.makeElement("span", cashFormat(depCost), "cash"),
+					`): A division focusing on ${division.focusDescription}.`);
 			} else {
-				addDiv(el, `${_div.name} (`,
-					App.UI.DOM.makeElement("span", cashFormat(_depCost), ["cash", "dec"]),
-					`): The corporation cannot afford to start a division focusing on ${_div.focusDescription}.`);
+				addDiv(el, `${division.name} (`,
+					App.UI.DOM.makeElement("span", cashFormat(depCost), ["cash", "dec"]),
+					`): The corporation cannot afford to start a division focusing on ${division.focusDescription}.`);
 			}
 		}
 		return el;
@@ -380,23 +380,23 @@ App.Corporate.manage = function() {
 		App.UI.DOM.appendNewElement("h2", el, "Dividend");
 
 		const div = document.createElement("div");
-		let _dividends = App.Corporate.dividendOptions;
-		let _index = _dividends.findIndex(element => App.Corporate.dividendRatio >= element);
-		let _dividend = _dividends[_index];
-		if (_index >= 0) {
-			let _nextIndex = _index + 1;
-			App.Corporate.dividendRatio = _dividend;/* Normalize */
-			div.append(`The corporation is currently reserving ${Math.trunc(_dividend * 100)}% of its profit to be paid out as dividends. `);
+		let dividends = App.Corporate.dividendOptions;
+		let index = dividends.findIndex(element => App.Corporate.dividendRatio >= element);
+		let dividend = dividends[index];
+		if (index >= 0) {
+			let nextIndex = index + 1;
+			App.Corporate.dividendRatio = dividend;/* Normalize */
+			div.append(`The corporation is currently reserving ${Math.trunc(dividend * 100)}% of its profit to be paid out as dividends. `);
 			const links = [];
-			if (_index > 0) {
+			if (index > 0) {
 				links.push(App.UI.DOM.link("Increase Ratio", () => {
-					App.Corporate.dividendRatio = _dividends[_index - 1];
+					App.Corporate.dividendRatio = dividends[index - 1];
 					refresh();
 				}));
 			}
-			if (_nextIndex !== _dividends.length) {
+			if (nextIndex !== dividends.length) {
 				links.push(App.UI.DOM.link("Reduce Ratio", () => {
-					App.Corporate.dividendRatio = _dividends[_nextIndex];
+					App.Corporate.dividendRatio = dividends[nextIndex];
 					refresh();
 				}));
 			} else {
@@ -409,7 +409,7 @@ App.Corporate.manage = function() {
 		} else {
 			div.append(`The corporation is currently not reserving a portion of its profit to be paid out as dividends. `);
 			div.append(App.UI.DOM.link("Increase Ratio", () => {
-				App.Corporate.dividendRatio = _dividends[_dividends.length - 1];
+				App.Corporate.dividendRatio = dividends[dividends.length - 1];
 				refresh();
 			}));
 		}
@@ -449,43 +449,43 @@ App.Corporate.manage = function() {
 		if (V.corp.Cash > corpSharePrice(-1000)) {
 			if (V.publicShares <= V.personalShares - 2000 && V.publicShares > 0) {
 				// It won't buy back player shares if the corporation is entirely owned by the player
-				let _persExtraShares = V.personalShares % 1000 || 1000;
+				let persExtraShares = V.personalShares % 1000 || 1000;
 				addDiv(el, "The corporation can buyback some of your shares. ",
-					App.UI.DOM.link(`Buyback ${_persExtraShares}`, () => {
-						cashX(corpSharePrice(-_persExtraShares), 'stocksTraded');
-						V.corp.Cash -= corpSharePrice(-_persExtraShares);
-						V.personalShares -= _persExtraShares;
+					App.UI.DOM.link(`Buyback ${persExtraShares}`, () => {
+						cashX(corpSharePrice(-persExtraShares), 'stocksTraded');
+						V.corp.Cash -= corpSharePrice(-persExtraShares);
+						V.personalShares -= persExtraShares;
 						refresh();
 					}));
 			}
 			if (V.publicShares >= 1000) {
-				let _pubExtraShares = V.publicShares % 1000 || 1000;
+				let pubExtraShares = V.publicShares % 1000 || 1000;
 				addDiv(el, "The corporation can buyback some of the public shares. ",
-					App.UI.DOM.link(`Buyback ${_pubExtraShares}`, () => {
-						V.corp.Cash -= corpSharePrice(-_pubExtraShares);
-						V.corp.Cash -= corpSharePrice(-_pubExtraShares);
-						V.publicShares -= _pubExtraShares;
+					App.UI.DOM.link(`Buyback ${pubExtraShares}`, () => {
+						V.corp.Cash -= corpSharePrice(-pubExtraShares);
+						V.corp.Cash -= corpSharePrice(-pubExtraShares);
+						V.publicShares -= pubExtraShares;
 						refresh();
 					}));
 			}
 		}
 
-		let _persLeftoverShares = 1000 - (V.personalShares % 1000);
-		if (V.cash > corpSharePrice(_persLeftoverShares)) {
-			addDiv(el, `The corporation can issue ${_persLeftoverShares} shares to you. `,
-				App.UI.DOM.link(`Issue ${_persLeftoverShares}`, () => {
-					cashX(forceNeg(corpSharePrice(_persLeftoverShares)), 'stocksTraded');
-					V.corp.Cash += corpSharePrice(_persLeftoverShares);
-					V.personalShares += _persLeftoverShares;
+		let persLeftoverShares = 1000 - (V.personalShares % 1000);
+		if (V.cash > corpSharePrice(persLeftoverShares)) {
+			addDiv(el, `The corporation can issue ${persLeftoverShares} shares to you. `,
+				App.UI.DOM.link(`Issue ${persLeftoverShares}`, () => {
+					cashX(forceNeg(corpSharePrice(persLeftoverShares)), 'stocksTraded');
+					V.corp.Cash += corpSharePrice(persLeftoverShares);
+					V.personalShares += persLeftoverShares;
 					refresh();
 				}));
 		}
-		let _pubLeftoverShares = 1000 - (V.publicShares % 1000);
+		let pubLeftoverShares = 1000 - (V.publicShares % 1000);
 		if (V.publicShares <= V.personalShares - 2000) {
-			addDiv(el, `The corporation can issue ${_pubLeftoverShares} shares onto the stock market. `,
-				App.UI.DOM.link(`Issue ${_pubLeftoverShares}`, () => {
-					V.corp.Cash += corpSharePrice(_pubLeftoverShares);
-					V.publicShares += _pubLeftoverShares;
+			addDiv(el, `The corporation can issue ${pubLeftoverShares} shares onto the stock market. `,
+				App.UI.DOM.link(`Issue ${pubLeftoverShares}`, () => {
+					V.corp.Cash += corpSharePrice(pubLeftoverShares);
+					V.publicShares += pubLeftoverShares;
 					refresh();
 				}));
 		}
@@ -511,16 +511,16 @@ App.Corporate.manage = function() {
 
 		App.UI.DOM.appendNewElement("h3", el, "Stock Split");
 		// Splitting shares when they're unwieldy
-		let _splitFeeInitial = 10000;
-		let _splitFeeValue = _splitFeeInitial - Math.floor((_splitFeeInitial * (V.PC.skill.trading / 100.0) / 2.0) / 1000) * 1000;
-		let _splitStockConstants = App.Corporate.stockSplits;
+		let splitFeeInitial = 10000;
+		let splitFeeValue = splitFeeInitial - Math.floor((splitFeeInitial * (V.PC.skill.trading / 100.0) / 2.0) / 1000) * 1000;
+		let splitStockConstants = App.Corporate.stockSplits;
 
 		r = [];
 		r.push(`The corporation can perform a stock split to increase the number of stocks while maintaining the same owned value. This requires paying a market fee of`);
-		r.push(App.UI.DOM.makeElement("span", cashFormat(_splitFeeValue), ["cash", "dec"]));
+		r.push(App.UI.DOM.makeElement("span", cashFormat(splitFeeValue), ["cash", "dec"]));
 		r.push(`plus a per-share fee depending on the type of split being done.`);
 
-		if (_splitFeeValue < _splitFeeInitial) {
+		if (splitFeeValue < splitFeeInitial) {
 			r.push(App.UI.DOM.makeElement("span", "You negotiated lower fees due to your", "note"));
 			r.push(App.UI.DOM.makeElement("span", "business acumen", ["skill", "player", "note"]));
 		}
@@ -531,36 +531,36 @@ App.Corporate.manage = function() {
 		}
 
 		const ul = document.createElement("ul");
-		for (const _stockType of _splitStockConstants) {
-			let _splitValue = _stockType.cost;
-			let _splitDenom = _stockType.oldStocks || 1;
-			let _splitNumerator = _stockType.newStocks || 1;
-			let _splitMultiplier = _splitNumerator / _splitDenom;
-			let _splitTotal = _splitValue * (V.publicShares + V.personalShares) + _splitFeeValue;
-			let _splitWeek = _stockType.weeks;
+		for (const stockType of splitStockConstants) {
+			let splitValue = stockType.cost;
+			let splitDenom = stockType.oldStocks || 1;
+			let splitNumerator = stockType.newStocks || 1;
+			let splitMultiplier = splitNumerator / splitDenom;
+			let splitTotal = splitValue * (V.publicShares + V.personalShares) + splitFeeValue;
+			let splitWeek = stockType.weeks;
 
 			const li = document.createElement("li");
 			r = [];
-			r.push(`${_splitNumerator}-for-${_splitDenom}`);
-			if (_splitDenom > _splitNumerator) {
+			r.push(`${splitNumerator}-for-${splitDenom}`);
+			if (splitDenom > splitNumerator) {
 				r.push(`inverse`);
 			}
 			r.push(`stock split at`);
-			r.push(App.UI.DOM.makeElement("span", cashFormat(_splitValue), ["cash", "dec"]));
+			r.push(App.UI.DOM.makeElement("span", cashFormat(splitValue), ["cash", "dec"]));
 			r.push(`per share. Including market fees, this will cost the corporation a total of`);
-			r.push(App.UI.DOM.makeElement("span", `${cashFormat(_splitTotal)},`, ["cash", "dec"]));
+			r.push(App.UI.DOM.makeElement("span", `${cashFormat(splitTotal)},`, ["cash", "dec"]));
 			r.push(`leaving the going rate for stock at`);
-			r.push(App.UI.DOM.makeElement("span", cashFormat(Math.floor(corpSharePrice(0, V.personalShares * _splitMultiplier, V.publicShares * _splitMultiplier))), "cash"));
+			r.push(App.UI.DOM.makeElement("span", cashFormat(Math.floor(corpSharePrice(0, V.personalShares * splitMultiplier, V.publicShares * splitMultiplier))), "cash"));
 			r.push(`per 1000 shares.`);
 			if (V.corp.SpecTimer === 0) {
-				if (V.publicShares % _splitDenom !== 0 || V.personalShares % _splitDenom !== 0) {
+				if (V.publicShares % splitDenom !== 0 || V.personalShares % splitDenom !== 0) {
 					r.push(App.UI.DOM.makeElement("span", "The number of shares cannot be evenly split", "note"));
-				} else if (V.corp.Cash > _splitTotal) {
+				} else if (V.corp.Cash > splitTotal) {
 					r.push(App.UI.DOM.link("Split Shares", () => {
-						V.corp.Cash -= _splitTotal;
-						V.publicShares *= _splitMultiplier;
-						V.personalShares *= _splitMultiplier;
-						V.corp.SpecTimer = _splitWeek;
+						V.corp.Cash -= splitTotal;
+						V.publicShares *= splitMultiplier;
+						V.personalShares *= splitMultiplier;
+						V.corp.SpecTimer = splitWeek;
 						refresh();
 					}));
 				} else {
diff --git a/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js b/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
index 96490a05ac8e306fd687351db79dd5501e20a407..7e365d00f3d2719b54144c9e9d4f2ce4fd9e9aa7 100644
--- a/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
+++ b/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
@@ -1,7 +1,7 @@
 App.Events.refsTotallyLegitCatgirls = class refsTotallyLegitCatgirls extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => !!V.seeCats, //TODO: was not hooked up in TW, what else should gate be? Project N something?
+			() => !!V.seeCats, // TODO: was not hooked up in TW, what else should gate be? Project N something?
 		];
 	}
 
diff --git a/src/Mods/Catmod/events/CMRESS/annoyingcat.js b/src/Mods/Catmod/events/CMRESS/annoyingcat.js
index 1071bc486ab833503ace5fb30e0603b4d0038b68..73c9f2f4196652149dc61d9e6054d80462bc03e3 100644
--- a/src/Mods/Catmod/events/CMRESS/annoyingcat.js
+++ b/src/Mods/Catmod/events/CMRESS/annoyingcat.js
@@ -21,7 +21,7 @@ App.Events.CMRESSAnnoyingCat = class CMRESSAnnoyingCat extends App.Events.BaseEv
 		const {
 			He, he, his, him, girl
 		} = getPronouns(eventSlave);
-		const {s, title} = getEnunciation(eventSlave);
+		const {title} = getEnunciation(eventSlave);
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -40,7 +40,7 @@ App.Events.CMRESSAnnoyingCat = class CMRESSAnnoyingCat extends App.Events.BaseEv
 
 		App.Events.addResponses(node, [
 			canDoAnal(eventSlave)
-				? new App.Events.Result(`Roughly fuck ${his} ass to shut ${him} up`, annoyedfuck, analVirginWarning())
+				? new App.Events.Result(`Roughly fuck ${his} ass to shut ${him} up`, annoyedFuck, analVirginWarning())
 				: new App.Events.Result(),
 			new App.Events.Result(`Tell ${him} to stop being such a nuisance`, stopit),
 			new App.Events.Result(`Ignore ${him}`, ignore),
@@ -52,7 +52,7 @@ App.Events.CMRESSAnnoyingCat = class CMRESSAnnoyingCat extends App.Events.BaseEv
 			}
 		}
 
-		function annoyedfuck() {
+		function annoyedFuck() {
 			t = [];
 			t.push(`As ${eventSlave.slaveName} meows at you, you order the irritating cat${girl} to turn around, drop ${his} bottoms, lift ${his} tail and spread ${his} cheeks. As though to make the command's intent even more obvious, you ${PC.dick !== 0 ? "pull your cock free from your pants" : "take a strapon and slide it up your legs"} as the furball look at you in surprise for a moment. Without a word of protest, the cat${girl} simply turns, pulls ${his} bottoms just under ${his} asscheeks, and lifts up ${his} tail to show you ${his}`);
 			if (eventSlave.butt > 12) {
@@ -85,7 +85,13 @@ App.Events.CMRESSAnnoyingCat = class CMRESSAnnoyingCat extends App.Events.BaseEv
 
 		function stopit() {
 			let t = [];
-			t.push(`You grab ${eventSlave.slaveName} by the hand and tell ${him} to stop being so goddamn annoying. ${He} cocks ${his} head at you, apparently genuinely confused, and then huffs out a loud exhale. ${canTalk(eventSlave) ? `"Uh, ${s}orry, ${title}, I wa${s}n't trying to be annoying or anything..." ${He} mewls,` : `${He} makes a second weird, apologetic sounding noise,`} then scurries off when you let ${him} go with ${his} <span class="trust dec">ears flat against ${his} head.</span>`);
+			t.push(`You grab ${eventSlave.slaveName} by the hand and tell ${him} to stop being so goddamn annoying. ${He} cocks ${his} head at you, apparently genuinely confused, and then huffs out a loud exhale.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Uh, sorry, ${title}, I wasn't trying to be annoying or anything..." ${He} mewls,`));
+			} else {
+				t.push(`${He} makes a second weird, apologetic sounding noise,`);
+			}
+			t.push(`then scurries off when you let ${him} go with ${his} <span class="trust dec">ears flat against ${his} head.</span>`);
 			eventSlave.trust -= 3;
 			return t;
 		}
diff --git a/src/Mods/Catmod/events/CMRESS/catLove.js b/src/Mods/Catmod/events/CMRESS/catLove.js
index d1d452d8779481b8333bd7b1a49e216cc449bf3a..b7b80e50b04ccd24431019645b2d304a4c9af565 100644
--- a/src/Mods/Catmod/events/CMRESS/catLove.js
+++ b/src/Mods/Catmod/events/CMRESS/catLove.js
@@ -21,7 +21,7 @@ App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent {
 		const {
 			He, he, his, His, him, himself, girl
 		} = getPronouns(eventSlave);
-		const {s, title} = getEnunciation(eventSlave);
+		const {title} = getEnunciation(eventSlave);
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -37,28 +37,64 @@ App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent {
 			App.Events.addParagraph(node, t);
 
 			t = [];
-			t.push(`${eventSlave.slaveName} ${him}self is prominently displayed at the center of the catfolk at the bottom of the image, all of whom are looking up to you with big, worshipful smiles across their faces, pointed ears perked up. The bright golden hues make it look like a religious icon, but instead of a halo you're surrounded by two complex-looking genetic tubes; the faces of Dr. Nieskowitz and some other wizened scientists hang around you like angels. It's incredibly well-made, and even inlaid with a few sparkly things that seem to be whatever ${eventSlave.slaveName} could find lying around. ${canTalk(eventSlave) ? `"I, uhm, wanted to make you ${s}omething nice, ${title}..." ${eventSlave.slaveName} meows out sheepishly as ${he} holds the icon out towards you. "You made all of u${s}, and um, well, you're ${s}o good and pretty and everything..." ` : `${He} just holds out the icon, staring at you with big ${App.Desc.eyesColor(eventSlave)} that hope you get the meaning.`}`);
+			t.push(`${eventSlave.slaveName} ${himself} is prominently displayed at the center of the catfolk at the bottom of the image, all of whom are looking up to you with big, worshipful smiles across their faces, pointed ears perked up. The bright golden hues make it look like a religious icon, but instead of a halo you're surrounded by two complex-looking genetic tubes; the faces of Dr. Nieskowitz and some other wizened scientists hang around you like angels. It's incredibly well-made, and even inlaid with a few sparkly things that seem to be whatever ${eventSlave.slaveName} could find lying around.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"I, uhm, wanted to make you something nice, ${title}..."`),
+					`${eventSlave.slaveName} meows out sheepishly as ${he} holds the icon out towards you.`,
+					Spoken(eventSlave, `"You made all of us, and um, well, you're so good and pretty and everything..." `)
+				);
+			} else {
+				t.push(`${He} just holds out the icon, staring at you with big ${App.Desc.eyesColor(eventSlave)} that hope you get the meaning.`);
+			}
 			App.Events.addParagraph(node, t);
 		} else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) {
 			t.push("an elegant, small clay sculpture portraying you surrounded by a few happy catgirls.");
 			App.Events.addParagraph(node, t);
 
 			t = [];
-			t.push(`${He} holds the little sculpture out to you with wobbly hands, finding it hard to balance the unwieldy thing as you examine ${his} craftscatship. The sculpture is surprisingly pretty; one of the slaves around you is obviously supposed to be ${eventSlave.slaveName}, and they're all burshing up against you lovingly with individual expressions of happiness tediously moulded onto their faces. ${canTalk(eventSlave) ? `"I thought you might like a better gift, so I found ${s}ome clay in the workshop and made thi${s}, ${title}." ${eventSlave.slaveName} says, struggling to hold the awkward sculpture. "You're ${s}o nice to me and I like you ${s}o much, I, um, wanted to give you ${s}omething to ${s}how how much I love you..." ` : `${He} holds the sculpture out obediently as you examine it, ears twitching atop ${his} head as ${he} eagerly awaits your judgement.`}`);
+			t.push(`${He} holds the little sculpture out to you with wobbly hands, finding it hard to balance the unwieldy thing as you examine ${his} craftscatship. The sculpture is surprisingly pretty; one of the slaves around you is obviously supposed to be ${eventSlave.slaveName}, and they're all burshing up against you lovingly with individual expressions of happiness tediously moulded onto their faces.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"I thought you might like a better gift, so I found some clay in the workshop and made this, ${title}."`),
+					`${eventSlave.slaveName} says, struggling to hold the awkward sculpture.`,
+					Spoken(eventSlave, `"You're so nice to me and I like you so much, I, um, wanted to give you something to show how much I love you..." `)
+				);
+			} else {
+				t.push(`${He} holds the sculpture out obediently as you examine it, ears twitching atop ${his} head as ${he} eagerly awaits your judgement.`);
+			}
 			App.Events.addParagraph(node, t);
 		} else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 35) {
 			t.push("a pretty drawing of the two of you cuddling one another happily.");
 			App.Events.addParagraph(node, t);
 
 			t = [];
-			t.push(`${He} displays the drawing proudly. It's surprisingly well-drawn, especially considering ${his} awkward, furry hands, and ${he}'s rendered all your features flatteringly with ${eventSlave.slaveName} lovingly cradling up against your chest like an old-world girlfriend. It's obvious that ${he}'s put a lot of work into drawing this, likely in ${his} spare time after finishing the day's assignments. ${canTalk(eventSlave) ? `"I hope you like it, ${title}!" ${eventSlave.slaveName} says, eagerly watching your face as you study the nice drawing. "I worked really hard on it, but it'${s} okay, becau${s}e I got to look at your face the whole time, and you're extremely pretty, ${title}..." ` : `${He} holds the drawing out enthusiastically, obviously proud of ${his} work and silently waiting for you to decide whether you're proud of it too.`}`);
+			t.push(`${He} displays the drawing proudly. It's surprisingly well-drawn, especially considering ${his} awkward, furry hands, and ${he}'s rendered all your features flatteringly with ${eventSlave.slaveName} lovingly cradling up against your chest like an old-world girlfriend. It's obvious that ${he}'s put a lot of work into drawing this, likely in ${his} spare time after finishing the day's assignments.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"I hope you like it, ${title}!"`),
+					`${eventSlave.slaveName} says, eagerly watching your face as you study the nice drawing.`,
+					Spoken(eventSlave, `"I worked really hard on it, but it's okay, because I got to look at your face the whole time, and you're extremely pretty, ${title}..."`)
+				);
+			}else {
+				t.push(`${He} holds the drawing out enthusiastically, obviously proud of ${his} work and silently waiting for you to decide whether you're proud of it too.`);
+			}
 			App.Events.addParagraph(node, t);
 		} else {
 			t.push("a heart cut out of red construction paper showing crude figures of you and a catgirl holding hands and smiling.");
 			App.Events.addParagraph(node, t);
 
 			t = [];
-			t.push(`Upon closer inspection, the crude cat figure is clearly intended to be ${eventSlave.slaveName}, and the two of you are standing above big white text written in what looks like crayon reading "I LUV U ${V.PC.title !== 0 ? `MASTER` : `MISTRESS`}". ${eventSlave.slaveName} trembles a little as you look at the simple drawing. ${canTalk(eventSlave) ? `"I'm ${s}-${s}orry ${title}..." ${eventSlave.slaveName} meows weakly, still holding out ${his} heart. "I w-wanted to make you ${s}omething pretty like everybody else because I love you ${s}o m-much, but I can't draw good like them, ${title}... I h-hope you like it..." ` : `${He} holds hi${s} little paper heart out for you, staring at you with big wide ${App.Desc.eyesColor(eventSlave)} as ${his} ears flatten preemptively, apparently expecting you to hate the crude offering.`}`);
+			t.push(`Upon closer inspection, the crude cat figure is clearly intended to be ${eventSlave.slaveName}, and the two of you are standing above big white text written in what looks like crayon reading "I LUV U ${V.PC.title !== 0 ? `MASTER` : `MISTRESS`}". ${eventSlave.slaveName} trembles a little as you look at the simple drawing.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"I'm s-sorry ${title}..."`),
+					`${eventSlave.slaveName} meows weakly, still holding out ${his} heart.`,
+					Spoken(eventSlave, `"I w-wanted to make you something pretty like everybody else because I love you so m-much, but I can't draw good like them, ${title}... I h-hope you like it..."`)
+				);
+			} else {
+				t.push(`${He} holds his little paper heart out for you, staring at you with big wide ${App.Desc.eyesColor(eventSlave)} as ${his} ears flatten preemptively, apparently expecting you to hate the crude offering.`);
+			}
 			App.Events.addParagraph(node, t);
 		}
 
@@ -105,16 +141,40 @@ App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent {
 			let t = [];
 			t.push(`You take ${eventSlave.slaveName} by the hand, still holding ${his} little present, and lead ${him} over to your office. As ${he} looks at you confused, you gingerly take the`);
 			if (eventSlave.intelligence + eventSlave.intelligenceImplant > 80) {
-				t.push(`beautiful icon from ${his} hand, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest. ${canTalk(eventSlave) ? `"I'm ${s}o happy you like it, ${title}!" ` : `${He} purrs from the back of ${his} throat so intensely you can hear it against your heart`}, filled with <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart.</span>`);
+				t.push(`beautiful icon from ${his} hand, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest.`);
+				if (canTalk(eventSlave)) {
+					t.push(Spoken(eventSlave, `"I'm so happy you like it, ${title}!",`));
+				} else {
+					t.push(`${He} purrs from the back of ${his} throat so intensely you can hear it against your heart,`);
+				}
+				t.push(`filled with <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart.</span>`);
 				V.trinkets.push(`a gorgeous quasi-religious icon made by ${eventSlave.slaveName} showing you creating the catgirl race`);
 			} else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) {
-				t.push(`elegant clay sculpture from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest, tears welling up in ${his} eyes. ${canTalk(eventSlave) ? `"You're the be${s}t -- the best ${title} in the whole wide world, ${title}!" She mrowls out while hugging you` : `${He} purrs from the back of ${his} throat so intensely you can hear it against your heart`}, filled with <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart.</span>`);
+				t.push(`elegant clay sculpture from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest, tears welling up in ${his} eyes.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"You're the best -- the best ${title} in the whole wide world, ${title}!"`),
+						`She mrowls out while hugging you,`
+					);
+				} else {
+					t.push(`${He} purrs from the back of ${his} throat so intensely you can hear it against your heart,`);
+				}
+				t.push(`filled with <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart.</span>`);
 				V.trinkets.push(`a small, elegant clay sculpture made by ${eventSlave.slaveName} showing you surrounded by happy catgirl slaves`);
 			} else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 35) {
 				t.push(`pretty drawn picture from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then chokes out a shocked meow, opens ${his} mouth, half-meows again, and stutters. ${canTalk(eventSlave) ? `"Y-you really like it that much, ${title}?" She squeaks, and then, tears forming in the corner of ${his} eyes, launches into a tight, warm hug around your waist.` : `Incapable of saying anything further, ${he} simply launches himself at you and hugs you so tight it nearly squeezes on your ribs, tears forming at the corner of ${his} eyes.`} ${He}'s filled with the kind of <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart</span> that only comes from genuine adoration.`);
 				V.trinkets.push(`a pretty drawing of you and ${eventSlave.slaveName} cuddling together peacefully`);
 			} else {
-				t.push(`construction paper heart from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} looks at you, looks at the display case, looks back at you, and then suddenly breaks into tears. ${canTalk(eventSlave) ? `"${title} -- I l-love you ${s}o much --" She almost whimpers, before hugging ${himself} around your waist so tight it feels like ${he}'s squeezing down your ribs.` : `${He} simply sobs for a few moments, then hugs you with so much furry warmth that you swear you can feel ${his} heart beating against yours.`} ${He}'s filled with the kind of <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart</span> that only comes from genuine adoration.`);
+				t.push(`construction paper heart from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} looks at you, looks at the display case, looks back at you, and then suddenly breaks into tears.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"${title} -- I l-love you so much --"`),
+						`${He} almost whimpers, before hugging ${himself} around your waist so tight it feels like ${he}'s squeezing down your ribs.`
+					);
+				} else {
+					t.push(`${He} simply sobs for a few moments, then hugs you with so much furry warmth that you swear you can feel ${his} heart beating against yours.`);
+				}
+				t.push(`${He}'s filled with the kind of <span class="trust inc">safety</span> and <span class="devotion inc">love from the bottom of ${his} heart</span> that only comes from genuine adoration.`);
 				V.trinkets.push(`a red construction paper heart with crude crayon figures of you and ${eventSlave.slaveName} holding hands above text reading "I LUV U ${V.PC.title !== 0 ? `MASTER` : `MISTRESS`}"`);
 			}
 			eventSlave.trust += 20;
diff --git a/src/Mods/Catmod/events/CMRESS/catPresent.js b/src/Mods/Catmod/events/CMRESS/catPresent.js
index 36ccf9a770b4ff4c2b50323c55e3cd8e0d3a843a..b34b260f80960dd66f508dd6b3af47f43f4f7fd3 100644
--- a/src/Mods/Catmod/events/CMRESS/catPresent.js
+++ b/src/Mods/Catmod/events/CMRESS/catPresent.js
@@ -21,7 +21,7 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 		const {
 			He, he, his, him, himself, His, girl
 		} = getPronouns(eventSlave);
-		const {s, title} = getEnunciation(eventSlave);
+		const {title} = getEnunciation(eventSlave);
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -40,34 +40,83 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 
 		t = [];
 		if (catPresent === 0) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a bundle of credits in one of ${his} furry hands. ${He} proudly drops the small wad of cash on your desk, beaming up at you with a mouthful of feline fangs. ${canTalk(eventSlave) ? `"Look what I found, ${title}! Someone dropped all this, ${s}o now it's your${s}!"` : `${He} swishes ${his} tail from side to side, apparently waiting for you to take the mysterious money.`} There's maybe two hundred credits worth of small bills here. It looks more like ${he} lifted some poor guy's wallet than 'found' this on the ground.`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a bundle of credits in one of ${his} furry hands. ${He} proudly drops the small wad of cash on your desk, beaming up at you with a mouthful of feline fangs.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Look what I found, ${title}! Someone dropped all this, so now it's yours!"`));
+			} else {
+				t.push(`${He} swishes ${his} tail from side to side, apparently waiting for you to take the mysterious money.`);
+			}
+			t.push(`There's maybe two hundred credits worth of small bills here. It looks more like ${he} lifted some poor guy's wallet than 'found' this on the ground.`);
 			presentType = "nice";
 		} else if (catPresent === 1) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a small, fluffy, brightly-colored toy in ${his} mouth. The cat${girl} confidently walks up to your desk as though about to discuss some important matter of business, then opens ${his} mouth to drop it right in front of you, slick with ${his} drool. ${canTalk(eventSlave) ? `"Thi${s} i${s} my favorite toy, ${title}! So I wanted it to be your favorite toy too!"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`} You stare blankly for a moment at the fully-grown, ostensibly intelligent cat${girl} asking you to play with a drooled-on cat toy.`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a small, fluffy, brightly-colored toy in ${his} mouth. The cat${girl} confidently walks up to your desk as though about to discuss some important matter of business, then opens ${his} mouth to drop it right in front of you, slick with ${his} drool.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"This is my favorite toy, ${title}! So I wanted it to be your favorite toy too!"`));
+			} else {
+				t.push(`${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`);
+			}
+			t.push(`You stare blankly for a moment at the fully-grown, ostensibly intelligent cat${girl} asking you to play with a drooled-on cat toy.`);
 			presentType = "junk";
 		} else if (catPresent === 2) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying what looks like a dead rat in ${his} mouth. ${He} walks right up to your desk and opens ${his} mouth to show off equally bloodstained fangs, dropping the dead rodent onto your desk with a wet plop of blood and saliva, where it proceeds to bleed out in the middle of the desk. ${canTalk(eventSlave) ? `"Look, ${title}! I ${s}aw this gros${s} rat running around the garden ${s}o I killed it. Are you proud of me?"` : `${He} looks enormously proud of ${himself} for killing a rodent that's smaller than ${his} fist and dropping the mutilated body in front of you.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying what looks like a dead rat in ${his} mouth. ${He} walks right up to your desk and opens ${his} mouth to show off equally bloodstained fangs, dropping the dead rodent onto your desk with a wet plop of blood and saliva, where it proceeds to bleed out in the middle of the desk.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Look, ${title}! I saw this gross rat running around the garden so I killed it. Are you proud of me?"`));
+			} else {
+				t.push(`${He} looks enormously proud of ${himself} for killing a rodent that's smaller than ${his} fist and dropping the mutilated body in front of you.`);
+			}
 			presentType = "dead";
 		} else if (catPresent === 3) {
 			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a dead rat on your desk which is now creating a red puddle around itself. ${eventSlave.slaveName} just smiles ear-to-ear at you with what seems like genuine pride and a mouth full of sharp fangs, which you now realize are streaked with blood.`);
 			presentType = "dead";
 		} else if (catPresent === 4) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a dead rat on your desk - or at least, you assume that the furry thing bleeding out is dead, until it twitches its leg, scampers up, and leaps off your desk, attempting to scurry out of the room. ${eventSlave.slaveName}'s stilted eyes go wide and ${his} tail perks up, and before you can even issue an order ${he}'s leaped atop the fleeing, injured rat, pinning the tiny thing down and sinking ${his} sharp fangs into it without a moment of hesitation. ${He} shakes his head violently from side to side, apparently trying to snap the vermin's spine, then stands up, walks back to you, opens ${his} mouth and drops the disgusting, bleeding, mutilated rat corpse on your desk. Again. ${canTalk(eventSlave) ? `"Did you ${s}ee me kill it, ${title}!? I did good, right?"` : `${He} smiles ear to ear at you, waiting for you to take the 'present'.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a dead rat on your desk - or at least, you assume that the furry thing bleeding out is dead, until it twitches its leg, scampers up, and leaps off your desk, attempting to scurry out of the room. ${eventSlave.slaveName}'s stilted eyes go wide and ${his} tail perks up, and before you can even issue an order ${he}'s leaped atop the fleeing, injured rat, pinning the tiny thing down and sinking ${his} sharp fangs into it without a moment of hesitation. ${He} shakes his head violently from side to side, apparently trying to snap the vermin's spine, then stands up, walks back to you, opens ${his} mouth and drops the disgusting, bleeding, mutilated rat corpse on your desk. Again.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Did you see me kill it, ${title}!? I did good, right?"`));
+			} else {
+				t.push(`${He} smiles ear to ear at you, waiting for you to take the 'present'.`);
+			}
 			presentType = "dead";
 		} else if (catPresent === 5) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a bundle of small bills which ${he} was, for some inexplicable reason, carrying around in ${his} mouth. They are drenched with ${his} saliva and completely ruined. You look at the pile of ruined currency and ask ${him} why ${he} didn't just carry it to you in ${his} hands. ${canTalk(eventSlave) ? `${eventSlave.slaveName} blinks twice. "Oh - um, yeah, I gues${s} I probably ${s}hould have done that, ${title}. Um- ${s}orry."` : `${He} looks down at the pile of ruined money, looks back up at you, and then blinks sheepishly.`} `);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a bundle of small bills which ${he} was, for some inexplicable reason, carrying around in ${his} mouth. They are drenched with ${his} saliva and completely ruined. You look at the pile of ruined currency and ask ${him} why ${he} didn't just carry it to you in ${his} hands.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					`${eventSlave.slaveName} blinks twice.`,
+					Spoken(eventSlave, `"Oh - um, yeah, I guess I probably should have done that, ${title}. Um- sorry."`));
+			} else {
+				t.push(`${He} looks down at the pile of ruined money, looks back up at you, and then blinks sheepishly.`);
+			}
 			presentType = "junk";
 		} else if (catPresent === 6) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a small ball of brightly colored string in front of you, beaming wide enough to show of ${his} pearly white fangs. ${canTalk(eventSlave) ? `"Look at thi${s}, ${title}! You can bat it around and ${s}tuff! I brought it to you becau${s}e I thought you'd have fun playing with it!"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a small ball of brightly colored string in front of you, beaming wide enough to show of ${his} pearly white fangs.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Look at this, ${title}! You can bat it around and stuff! I brought it to you because I thought you'd have fun playing with it!"`));
+			} else {
+				t.push(`${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`);
+			}
 			presentType = "junk";
 		} else if (catPresent === 7) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying an entire dead rabbit in ${his} mouth, the dead thing almost as big as ${his} entire head and hanging limply from between ${his} fangs. ${He} nearly sprints over to your desk, looking excited beyond belief as ${he} spits the large rabbit out in front of you, where the corpse splats against your desk in a splash of saliva and blood that flicks some liquid against your face. ${He}'s nearly quivering with excitement and pride. ${canTalk(eventSlave) ? `"Look! Look! I killed a rabbit, ${title}!! A whole rabbit! I saw it out${s}ide and cha${s}ed it down ${s}o you could hang it up on your wall! Did I do good, ${title}?"` : `${He} looks absolutely overjoyed with ${himself} for having killed something bigger than a rat for once.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying an entire dead rabbit in ${his} mouth, the dead thing almost as big as ${his} entire head and hanging limply from between ${his} fangs. ${He} nearly sprints over to your desk, looking excited beyond belief as ${he} spits the large rabbit out in front of you, where the corpse splats against your desk in a splash of saliva and blood that flicks some liquid against your face. ${He}'s nearly quivering with excitement and pride.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Look! Look! I killed a rabbit, ${title}!! A whole rabbit! I saw it outside and chased it down so you could hang it up on your wall! Did I do good, ${title}?"`));
+			} else {
+				t.push(`${He} looks absolutely overjoyed with ${himself} for having killed something bigger than a rat for once.`);
+			}
 			presentType = "dead";
 		} else if (catPresent === 8) {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a shiny, gorgeous ring in front of you, beaming wide enough to show of ${his} pearly white fangs. This looks like a valuable piece of jewelry, easily worth a few thousand credits at least. You ask ${him} where ${he} got this as you examine the expensive thing. ${canTalk(eventSlave) ? `"I found it, ${title}! That mean${s} it'${s} your${s} now."` : `However, given that ${he} is totally mute, ${he} just stares back at you while smiling. You don't think you're going to get any answers there.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a shiny, gorgeous ring in front of you, beaming wide enough to show of ${his} pearly white fangs. This looks like a valuable piece of jewelry, easily worth a few thousand credits at least. You ask ${him} where ${he} got this as you examine the expensive thing.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"I found it, ${title}! That means it's yours now."`));
+			} else {
+				t.push(`However, given that ${he} is totally mute, ${he} just stares back at you while smiling. You don't think you're going to get any answers there.`);
+			}
 			presentType = "nice";
 		} else {
-			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a lump of shiny metal in front of you, beaming wide enough to show of ${his} pearly white fangs, which glint almost as brightly as the metal. ${canTalk(eventSlave) ? `"Look what I found, ${title}! You can put it on your wall or ${s}omething. I${s}n't it pretty?"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`}`);
+			t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a lump of shiny metal in front of you, beaming wide enough to show of ${his} pearly white fangs, which glint almost as brightly as the metal.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Look what I found, ${title}! You can put it on your wall or something. Isn't it pretty?"`));
+			} else {
+				t.push(`${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`);
+			}
 			presentType = "junk";
 		}
 		App.Events.addParagraph(node, t);
@@ -121,7 +170,16 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 		function yes() {
 			let t = [];
 			if (catPresent === 0) {
-				t.push(`You take the <span class="green">wad of cash</span> as ${eventSlave.slaveName} smiles at you, thanking ${him} for bringing it. It's a relatively insignificant amount of money for someone as wealthy as you, although probably a significant sum to whatever poor sod lost it, but ${eventSlave.slaveName} swishes ${his} tail from side to side enthusiastically as you put the cash in your pocket. ${canTalk(eventSlave) ? `"Of cour${s}e, ${title}!" ${He} meows out,` : `${He} makes a satisfied purring noise,`} then leaves <span class="devotion inc">with ${his} ears twitching happily.</span>`);
+				t.push(`You take the <span class="green">wad of cash</span> as ${eventSlave.slaveName} smiles at you, thanking ${him} for bringing it. It's a relatively insignificant amount of money for someone as wealthy as you, although probably a significant sum to whatever poor sod lost it, but ${eventSlave.slaveName} swishes ${his} tail from side to side enthusiastically as you put the cash in your pocket.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"Of course, ${title}!"`),
+						`${He} meows out,`
+					);
+				} else {
+					t.push(`${He} makes a satisfied purring noise,`);
+				}
+				t.push(`then leaves <span class="devotion inc">with ${his} ears twitching happily.</span>`);
 				cashX(200, "event", eventSlave);
 				eventSlave.devotion += 2;
 			} else if (catPresent === 8) {
@@ -129,10 +187,28 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 				cashX(2500, "event", eventSlave);
 				eventSlave.devotion += 2;
 			} else if (presentType === "junk") {
-				t.push(`You pick up the piece of junk, examine it for a few moments, then smile back at ${eventSlave.slaveName} and thank ${him} for bringing you something that ${he} clearly personally treasures. ${eventSlave.slaveName}'s furry face lights up as you say that you like ${his} little present, even though it's totally useless to you, and ${his} tail starts to <span class="devotion inc">swish from side to side happily behind ${him}.</span> ${canTalk(eventSlave) ? `"I'm ${s}o glad you like it, ${title}. I knew you would! I'm happy that you're my ${title}." ${He} says,` : `${He} makes a satisfied purring noise,`} then leaves you to file the small trinket away in one of your drawers.`);
+				t.push(`You pick up the piece of junk, examine it for a few moments, then smile back at ${eventSlave.slaveName} and thank ${him} for bringing you something that ${he} clearly personally treasures. ${eventSlave.slaveName}'s furry face lights up as you say that you like ${his} little present, even though it's totally useless to you, and ${his} tail starts to <span class="devotion inc">swish from side to side happily behind ${him}.</span>`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"I'm so glad you like it, ${title}. I knew you would! I'm happy that you're my ${title}."`),
+						`${He} says,`
+					);
+				} else {
+					t.push(`${He} makes a satisfied purring noise,`);
+				}
+				t.push(`then leaves you to file the small trinket away in one of your drawers.`);
 				eventSlave.devotion += 4;
 			} else {
-				t.push(`You wince slightly as you pick up the dead, bleeding animal, pulling it off your desk before it can leak onto anything important. Even though you own ${eventSlave.slaveName} and have absolute power over ${him}, the look of anticipation and excitement on ${his} face is too much to resist, and you say that you're very proud of ${him} for doing such good hunting work. ${eventSlave.slaveName} beams a full mouth of bloody fangs at you, obviously <span class="devotion inc">overjoyed</span> at your praise. ${canTalk(eventSlave) ? `"I killed it for you, ${title}! I promi${s}e I won't let any gros${s} vermin dirty up the penthouse." ${He} mrows,` : `${He} makes a satisfied purring noise,`} then leaves you to quietly throw the dead animal into the nearby trashcan and call for another slave to clean up the blood.`);
+				t.push(`You wince slightly as you pick up the dead, bleeding animal, pulling it off your desk before it can leak onto anything important. Even though you own ${eventSlave.slaveName} and have absolute power over ${him}, the look of anticipation and excitement on ${his} face is too much to resist, and you say that you're very proud of ${him} for doing such good hunting work. ${eventSlave.slaveName} beams a full mouth of bloody fangs at you, obviously <span class="devotion inc">overjoyed</span> at your praise.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"I killed it for you, ${title}! I promise I won't let any gross vermin dirty up the penthouse."`),
+						`${He} mrows,`
+					);
+				} else {
+					t.push(`${He} makes a satisfied purring noise,`);
+				}
+				t.push(`then leaves you to quietly throw the dead animal into the nearby trashcan and call for another slave to clean up the blood.`);
 				eventSlave.devotion += 6;
 			}
 			return t;
@@ -141,12 +217,39 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 		function no() {
 			let t = [];
 			if (presentType === "nice") {
-				t.push(`You push the 'found' offering away, shaking your head. You tell ${him} that it's a very nice offering to bring this to you, but then briefly explain that taking other people's money without giving them a choice is wrong, and that someone out there probably needs this more than you do anyway. ${eventSlave.slaveName} ${canTalk(eventSlave) ? `cocks ${his} head slightly. "How come taking people'${s} money without a choice is wrong but you en${s}lave lots of people then, ${title}?" Not wanting to get into an ethical debate with an overgrown housecat, you tell ${him} that it just is and to leave so you can get back to work. ${eventSlave.slaveName} gives you a puzzled look and then heads out.` : `${He} just makes a confused noise from the back of ${his} throat, then nods at you and heads out.`}`);
+				t.push(`You push the 'found' offering away, shaking your head. You tell ${him} that it's a very nice offering to bring this to you, but then briefly explain that taking other people's money without giving them a choice is wrong, and that someone out there probably needs this more than you do anyway. ${eventSlave.slaveName}`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						`cocks ${his} head slightly.`,
+						Spoken(eventSlave, `"How come taking people's money without a choice is wrong but you enslave lots of people then, ${title}?"`),
+						`Not wanting to get into an ethical debate with an overgrown housecat, you tell ${him} that it just is and to leave so you can get back to work. ${eventSlave.slaveName} gives you a puzzled look and then heads out.`
+					);
+				} else {
+					t.push(`${He} just makes a confused noise from the back of ${his} throat, then nods at you and heads out.`);
+				}
 			} else if (presentType === "junk") {
-				t.push(`You push the piece of junk into the trashcan to the side of your desk with one hand, ignoring the <span class="devotion dec">dismayed</span> look that spreads across ${his} furry face as you do. You sternly tell ${him} to stop bothering you with useless junk and that have more important things to do than look at ${his} stupid cat toys and shiny rocks. ${canTalk(eventSlave) ? `"I'm - I-I'm ${s}orry, ${title}, I ju${s}t thought you'd like it..." ${He} weakly meows. You tell ${him} that you don't.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`} ${His} eyes look a little watery as ${he} leaves.`);
+				t.push(`You push the piece of junk into the trashcan to the side of your desk with one hand, ignoring the <span class="devotion dec">dismayed</span> look that spreads across ${his} furry face as you do. You sternly tell ${him} to stop bothering you with useless junk and that have more important things to do than look at ${his} stupid cat toys and shiny rocks.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"I'm - I-I'm sorry, ${title}, I just thought you'd like it..."`),
+						`${He} weakly meows. You tell ${him} that you don't.`
+					);
+				} else {
+					t.push(`${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`);
+				}
+				t.push(`${His} eyes look a little watery as ${he} leaves.`);
 				eventSlave.devotion -= 4;
 			} else {
-				t.push(`You pick the disgusting dead animal up with one hand and drop the corpse into the trashcan next to your desk. Once it's off your workspace, you proceed to sternly tell ${eventSlave.slaveName} that what ${he} just did is disgusting, unsanitary, and incredibly infantile, and that ${he} could have ruined something important by dropping a filthy corpse in the area where you conduct multinational business deals. ${canTalk(eventSlave) ? `"S-${s}orry, ${title}... I wa${s} ju${s}t... really proud of it, I gues${s}... I killed it for you..." ${He} weakly meows.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`} You tell ${him} to clean up the mess ${he} made on your desk, glaring at the overexcitable cat${girl}. ${His} eyes look a <span class="devotion dec">little watery</span> as ${he} leans over the surface and gets to cleaning off the blood.`);
+				t.push(`You pick the disgusting dead animal up with one hand and drop the corpse into the trashcan next to your desk. Once it's off your workspace, you proceed to sternly tell ${eventSlave.slaveName} that what ${he} just did is disgusting, unsanitary, and incredibly infantile, and that ${he} could have ruined something important by dropping a filthy corpse in the area where you conduct multinational business deals.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						Spoken(eventSlave, `"S-sorry, ${title}... I was just... really proud of it, I guess... I killed it for you..."`),
+						`${He} weakly meows.`
+					);
+				} else {
+					t.push(`${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`);
+				}
+				t.push(`You tell ${him} to clean up the mess ${he} made on your desk, glaring at the overexcitable cat${girl}. ${His} eyes look a <span class="devotion dec">little watery</span> as ${he} leans over the surface and gets to cleaning off the blood.`);
 				eventSlave.devotion -= 6;
 			}
 			return t;
@@ -154,14 +257,36 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 
 		function rabbit() {
 			let t = [];
-			t.push(`You take a good look at the dead rabbit on your desk. For once, this thing actually looks kind of good. It's got two small puncture wounds just beneath its neck, but the corpse is almost totally intact, and it's pretty fat, too. With rabbit becoming an increasingly rare delicacy these days as desperate poachers violate the nature restrictions of old world governments too impotent to enforce them, you make up your mind to cook and eat this rare hunted treat. Placing your hands on the desk, you look back up at ${eventSlave.slaveName}, tell ${him} ${he}'s done an excellent job, and that you're going to have ${his} kill roasted and eaten. ${eventSlave.slaveName} practically quivers up and down with excitement at the praise, visibly excited that you're going to actually do something useful with ${his} present - and at the prospect of a real meal. After listening to ${him} gush your praises for a few minutes, you send ${him} out to get back to work. Later in the evening, the two of you enjoy delicious roast rabbit together, cooked with golden-brown crispy skin and a tender inside that leaves traces of juice running down both of your cheeks. ${canTalk(eventSlave) ? `"You're the <span class="devotion inc">be${s}t,</span> ${title}." ${He} mrows,` : `${He} stares <span class="devotion inc">happily</span> for a long time into your eyes as you eat,`} bloody juice running down into the fur around ${his} mouth for the second time today.`);
+			t.push(`You take a good look at the dead rabbit on your desk. For once, this thing actually looks kind of good. It's got two small puncture wounds just beneath its neck, but the corpse is almost totally intact, and it's pretty fat, too. With rabbit becoming an increasingly rare delicacy these days as desperate poachers violate the nature restrictions of old world governments too impotent to enforce them, you make up your mind to cook and eat this rare hunted treat. Placing your hands on the desk, you look back up at ${eventSlave.slaveName}, tell ${him} ${he}'s done an excellent job, and that you're going to have ${his} kill roasted and eaten. ${eventSlave.slaveName} practically quivers up and down with excitement at the praise, visibly excited that you're going to actually do something useful with ${his} present - and at the prospect of a real meal. After listening to ${him} gush your praises for a few minutes, you send ${him} out to get back to work. Later in the evening, the two of you enjoy delicious roast rabbit together, cooked with golden-brown crispy skin and a tender inside that leaves traces of juice running down both of your cheeks.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"You're the`),
+					App.UI.DOM.makeElement("span", Spoken(eventSlave, "best,"), ["devotion", "inc"]),
+					Spoken(eventSlave, `${title}."`),
+					`${He} mrows,`
+				);
+			} else {
+				t.push(`${He} stares <span class="devotion inc">happily</span> for a long time into your eyes as you eat,`);
+			}
+			t.push(`bloody juice running down into the fur around ${his} mouth for the second time today.`);
 			eventSlave.devotion += 8;
 			return t;
 		}
 
 		function noMoreDeadShit() {
 			let t = [];
-			t.push(`You slam your fist on the table loud enough that it makes ${eventSlave.slaveName} jump and ${his} tail to flick straight up in the air, the dead animal still bleeding out over your desk, and yell at the harebrained cat${girl} to stop dropping filthy fucking dead animals on your desk, and for that matter for all the rest of your idiotic catsluts to stop doing it too. ${eventSlave.slaveName} cowers in front of your desk as you yell at ${him}, all of ${his} pride and excitement at securing a kill on something immediately forgotten. ${canTalk(eventSlave) ? `"I - I d-didn't know you hated my hunting ${s}o much, ${title}," ${He} weakly meows. "I ju${s}t want to make you proud - u-uhm, I promi${s}e I'll ${s}top..." You tell ${him} that ${he} better, or you'll beat ${his} ass so red ${he} won't be walking for a month.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness. You tell ${him} that that better mean that ${he}'s going to stop, and ${he} weakly nods ${his} head up and down in confirmation.`} ${He} does ${his} best to hide ${his} <span class="devotion dec">watering eyes</span> as ${he} gets to cleaning off your desk, but they're pretty obvious.`);
+			t.push(`You slam your fist on the table loud enough that it makes ${eventSlave.slaveName} jump and ${his} tail to flick straight up in the air, the dead animal still bleeding out over your desk, and yell at the harebrained cat${girl} to stop dropping filthy fucking dead animals on your desk, and for that matter for all the rest of your idiotic catsluts to stop doing it too. ${eventSlave.slaveName} cowers in front of your desk as you yell at ${him}, all of ${his} pride and excitement at securing a kill on something immediately forgotten.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					Spoken(eventSlave, `"I - I d-didn't know you hated my hunting so much, ${title},"`),
+					`${He} weakly meows.`,
+					Spoken(eventSlave, `"I just want to make you proud - u-uhm, I promise I'll stop..."`),
+					`You tell ${him} that ${he} better, or you'll beat ${his} ass so red ${he} won't be walking for a month.`
+				);
+			} else {
+				t.push(`${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness. You tell ${him} that that better mean that ${he}'s going to stop, and ${he} weakly nods ${his} head up and down in confirmation.`);
+			}
+			t.push(`${He} does ${his} best to hide ${his} <span class="devotion dec">watering eyes</span> as ${he} gets to cleaning off your desk, but they're pretty obvious.`);
 			V.noDeadShit = 1;
 			eventSlave.devotion -= 10;
 			return t;
@@ -169,7 +294,13 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 
 		function moreDeadShit() {
 			let t = [];
-			t.push(`You sigh as ${eventSlave.slaveName} drops a stupid present on your desk once more and wearily tell ${him} that ${he}'s allowed to hunt again. ${His} pointy ears immediately perk up, instantaneously forgetting whatever it was that ${he}'d offered up to you in tribute just a few seconds ago. ${canTalk(eventSlave) ? `"Really!? I - thank${s}, ${title}! I'm gonna find lot${s} of stuff to kill for you, I promi${s}e! I'll be the be${s}t hunter ever!"` : `${He} wiggles ${his} butt from side to side enthusiastically and makes the loudest purring sound ${his} damaged vocal chords are capable of.`} You sigh in exasperation as the excitable cat${girl} bounds out of the room <span class="devotion inc">enthusiastically,</span> mentally preparing yourself for whatever disgusting corpse ${he}'s liable to drop on your desk next to show off ${his} catlike adoration.`);
+			t.push(`You sigh as ${eventSlave.slaveName} drops a stupid present on your desk once more and wearily tell ${him} that ${he}'s allowed to hunt again. ${His} pointy ears immediately perk up, instantaneously forgetting whatever it was that ${he}'d offered up to you in tribute just a few seconds ago.`);
+			if (canTalk(eventSlave)) {
+				t.push(Spoken(eventSlave, `"Really!? I - thanks, ${title}! I'm gonna find lots of stuff to kill for you, I promise! I'll be the best hunter ever!"`));
+			} else {
+				t.push(`${He} wiggles ${his} butt from side to side enthusiastically and makes the loudest purring sound ${his} damaged vocal chords are capable of.`);
+			}
+			t.push(`You sigh in exasperation as the excitable cat${girl} bounds out of the room <span class="devotion inc">enthusiastically,</span> mentally preparing yourself for whatever disgusting corpse ${he}'s liable to drop on your desk next to show off ${his} catlike adoration.`);
 			V.noDeadShit = 0;
 			eventSlave.devotion += 8;
 			return t;
diff --git a/src/Mods/Catmod/events/CMRESS/catWorship.js b/src/Mods/Catmod/events/CMRESS/catWorship.js
index 87108458018e00e5aac3ff85f03e21c7baa9e268..b7c0a356796c9c3bcb4e8b2136f2dc2814a001d9 100644
--- a/src/Mods/Catmod/events/CMRESS/catWorship.js
+++ b/src/Mods/Catmod/events/CMRESS/catWorship.js
@@ -33,7 +33,7 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven
 
 		let t = [];
 
-		t.push(`For a dominant catgirl like ${eventSlave.slaveName}, your arcology is a virtual paradise. The similarity of ${his} feline body to the ancient Egyptian Goddesses ensures a steady stream of devout worshippers to pay their respects to every part of ${eventSlave.slaveName}'s body. To ${his} dominance-focused mind, this mostly means a steady stream of human toys.`);
+		t.push(`For a dominant cat${girl} like ${eventSlave.slaveName}, your arcology is a virtual paradise. The similarity of ${his} feline body to the ancient Egyptian Goddesses ensures a steady stream of devout worshippers to pay their respects to every part of ${eventSlave.slaveName}'s body. To ${his} dominance-focused mind, this mostly means a steady stream of human toys.`);
 		App.Events.addParagraph(node, t);
 		t = [];
 		t.push(`Today, while walking through your penthouse, a series of high moans from the showers prompt you to step in and see what's going on. It looks like ${eventSlave.slaveName} has managed to get two of your other slaves kneeling down on either side of ${him}, one of them giving ${him} some intense oral while the other rims ${him} from behind, ${his} tail flicked high up in the air as the shower's water runs down over the little orgy. ${He}'s quivering a little from the force of the two worshipful tongues toying with all ${his} sensitive bits, but the cat${girl} still manages to give you a nice little smile as you come across the hedonistic scene.`);
diff --git a/src/Mods/Catmod/events/CMRESS/lazyCat.js b/src/Mods/Catmod/events/CMRESS/lazyCat.js
index fdb91c2e3ce738f1ea679d1934d7bd4d6f0f7215..2add5b05d388a526fcfd9155691402b639e9331d 100644
--- a/src/Mods/Catmod/events/CMRESS/lazyCat.js
+++ b/src/Mods/Catmod/events/CMRESS/lazyCat.js
@@ -20,7 +20,7 @@ App.Events.CMRESSLazyCat = class CMRESSLazyCat extends App.Events.BaseEvent {
 		const {
 			He, he, his, him, girl
 		} = getPronouns(eventSlave);
-		const {s, title} = getEnunciation(eventSlave);
+		const {title} = getEnunciation(eventSlave);
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -134,10 +134,22 @@ App.Events.CMRESSLazyCat = class CMRESSLazyCat extends App.Events.BaseEvent {
 			}
 			t.push(`and immediately delivering a powerful, open-handed slap to ${his} right asscheek. The forceful slap sears through the fur and makes ${his} tail jerk upwards as ${his} bubbly ass jiggles, ears flicking up in pain. Before ${he} can even yelp out in protest or react to the sharp, stinging pain, you land a second slap, then a third, loud smacking noises echoing across the room as you give the pinned cat a hard spanking. Over the next ten minutes, you absolutely blister the lazy cat${girl}'s furry ass, working into a rhythm of disciplined abuse that leaves the fluffy bitch sobbing and ${his} butt beaten so well you can see it glowing a painful, alluring cherry-red even through ${his} ${eventSlave.skin} fur. The second that you let go of the pinned cat and tell ${him} that ${he}'s free to leave, ${he} leaps off your knee,`);
 			if (eventSlave.fetish === "masochist") {
-				t.push(`turns around with tears rolling freely down ${his} cheeks as though to show off how brightly red you've bruised ${his} cheeks, wiggles ${his} beaten bottom, and smiles. ${canTalk(eventSlave) ? `"<span class="devotion inc">T-thank${s} for kicking my as${s},</span> ${title}. I promise I'll, l-like, never nap at work again." It sounds less than authentic as the maso-kitty tugs up ${his} bottoms over ${his} red, furry butt with a wince,` : ` makes a <span class="devotion inc">heart symbol</span> with ${his} hands and presses it against ${his} burning ass so it looks red,`}`);
+				t.push(`turns around with tears rolling freely down ${his} cheeks as though to show off how brightly red you've bruised ${his} cheeks, wiggles ${his} beaten bottom, and smiles.`);
+				if (canTalk(eventSlave)) {
+					t.push(
+						App.UI.DOM.combineNodes(
+							`"`,
+							App.UI.DOM.makeElement("span", Spoken(eventSlave, `T-thanks for kicking my ass,`), ["devotion", "inc"])
+						),
+						Spoken(eventSlave, `${title}. I promise I'll, l-like, never nap at work again."`),
+						`It sounds less than authentic as the maso-kitty tugs up ${his} bottoms over ${his} red, furry butt with a wince,`
+					);
+				} else {
+					t.push(` makes a <span class="devotion inc">heart symbol</span> with ${his} hands and presses it against ${his} burning ass so it looks red,`);
+				}
 				eventSlave.devotion += 4;
 			}
-			t.push(`then scurries off to tend to ${his}<span class="trust dec">bruised and reddened asscheeks.</span>`);
+			t.push(`then scurries off to tend to ${his} <span class="trust dec">bruised and reddened asscheeks.</span>`);
 			App.Events.addParagraph(node, t);
 			t = [];
 
diff --git a/src/Mods/Catmod/events/SoSSniper.js b/src/Mods/Catmod/events/SoSSniper.js
index 160a1d94d60df6dadc3d04d2cc1578b831db8dd5..9753fdc068359d92066d0b6cb1dc6e583b1820fc 100644
--- a/src/Mods/Catmod/events/SoSSniper.js
+++ b/src/Mods/Catmod/events/SoSSniper.js
@@ -33,6 +33,7 @@ App.Events.RESosSniper = class RESosSniper extends App.Events.BaseEvent {
 		slave.weight = random(-20, 30);
 		slave.muscles = random(20, 80);
 		slave.waist = random(10, 80);
+		eyeSurgery(slave, "both", "normal");
 		slave.shouldersTat = either("flowers", "tribal patterns", "asian art");
 		slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
 
diff --git a/src/Mods/Catmod/events/SoSassassin.js b/src/Mods/Catmod/events/SoSassassin.js
index 84d74065bc95964bd22b0001741cbab74ffbb884..e7157f5184baa2749a7395decc281e48a0e5e7d9 100644
--- a/src/Mods/Catmod/events/SoSassassin.js
+++ b/src/Mods/Catmod/events/SoSassassin.js
@@ -72,11 +72,11 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 					slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
 					newSlave(slave);
 				} else if (S.Bodyguard.skill.combat > 0 && V.personalArms < 1) {
-					r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
+					r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
 					cashX(-1000, "event", S.Bodyguard);
 					repX(2500, "event", S.Bodyguard);
 				} else if (S.Bodyguard.skill.combat < 1 && V.personalArms > 0) {
-					r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
+					r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
 				} else {
 					V.gameover = "sons assassinated with bodyguard";
 					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
@@ -119,27 +119,27 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. As the two narrowly avoid each other's attacks, you pull up your handgun, one bullet left in the chamber, carefully lower your aim, and fire into the melee, blasting a hole through the assassin's left thigh. As she cries out in pain and stumbles, your trained bodyguard tackles her to the ground and slams a fist into her face before she can activate whatever suicide method she has. As the security drones arrive, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> you call for a medic and some sedatives. You're about to claim yourself a <span class="green">brand new slave.</span>`);
 				cashX(-1000, "event", S.Bodyguard);
 				repX(2500, "event", S.Bodyguard);
-				const _slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 24, disableDisability: 1});
-				generateSalonModifications(_slave);
-				_slave.face = random(50, 100);
-				_slave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face.";
-				_slave.intelligenceImplant = 30;
-				_slave.career = "an assassin";
-				_slave.skill.combat = 1;
-				_slave.devotion = -100;
-				_slave.trust = random(-20, 10);
-				_slave.weight = random(-20, 30);
-				_slave.muscles = random(20, 80);
-				_slave.waist = random(10, 80);
-				_slave.shouldersTat = either("flowers", "tribal patterns", "asian art");
-				_slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
-				newSlave(_slave);
+				const slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 24, disableDisability: 1});
+				generateSalonModifications(slave);
+				slave.face = random(50, 100);
+				slave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face.";
+				slave.intelligenceImplant = 30;
+				slave.career = "an assassin";
+				slave.skill.combat = 1;
+				slave.devotion = -100;
+				slave.trust = random(-20, 10);
+				slave.weight = random(-20, 30);
+				slave.muscles = random(20, 80);
+				slave.waist = random(10, 80);
+				slave.shouldersTat = either("flowers", "tribal patterns", "asian art");
+				slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
+				newSlave(slave);
 			} else if (S.Bodyguard.skill.combat > 0) {
-				r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
+				r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
 				cashX(-1000, "event", S.Bodyguard);
 				repX(2500, "event", S.Bodyguard);
 			} else if (V.personalArms > 0 && V.PC.skill.warfare >= 60) {
-				r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
+				r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
 			} else {
 				V.gameover = "sons assassinated with bodyguard";
 				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
@@ -150,7 +150,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 			if (V.personalArms > 0 && S.Bodyguard) {
 				r.push(`You pull your handgun out of its holster as ${S.Bodyguard.slaveName} snaps to attention, exchanging fire with the two assailants. A bullet hits you in the shoulder and sends you sprawling back against the ground in agony, but between the two of you you hit both of the attackers and they drop to the ground dead.`);
 			} else if (S.Bodyguard) {
-				r.push(`${S.Bodyguard.slaveName} quickly snaps to attention, pulling ${his} machine pistol from its holster and firing back at the two attackers. A bullet hits you in the arm and sends you sprawling back against the ground in agony, but${S.Bodyguard.slaveName} drops both of the attackers before they can finish the job.`);
+				r.push(`${S.Bodyguard.slaveName} quickly snaps to attention, pulling ${his} machine pistol from its holster and firing back at the two attackers. A bullet hits you in the arm and sends you sprawling back against the ground in agony, but ${S.Bodyguard.slaveName} drops both of the attackers before they can finish the job.`);
 			} else {
 				V.gameover = "shotbysons";
 				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
@@ -161,11 +161,11 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 			if (S.Bodyguard) {
 				r.push(`She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free.`);
 				if (S.Bodyguard.skill.combat > 0) {
-					r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
+					r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration</span>.`);
 					cashX(-1000, "event", S.Bodyguard);
 					repX(2500, "event", S.Bodyguard);
 				} else if (V.personalArms > 0 && V.PC.skill.warfare >= 60) {
-					r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, slashing ${S.Bodyguard.slaveName}'s throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over ${S.Bodyguard.slaveName}'s corpse and approaches you, smiling psychotically.`);
+					r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, slashing ${S.Bodyguard.slaveName}'s throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over ${S.Bodyguard.slaveName}'s corpse and approaches you, smiling psychotically.`);
 					App.Events.addNode(node, r, "div");
 					r = [];
 					r.push(`"Bhalwi al-sham asmik qalbik, dog." The assassin spits, lunging towards you.`);
diff --git a/src/Mods/Catmod/events/nonRandom/projectNComplete.js b/src/Mods/Catmod/events/nonRandom/projectNComplete.js
index bb6b7f5dead540bdfd9f0a9fdcb8e9a3519b52d8..d298a67267f56a35be56a669e559530cd6e3bd43 100644
--- a/src/Mods/Catmod/events/nonRandom/projectNComplete.js
+++ b/src/Mods/Catmod/events/nonRandom/projectNComplete.js
@@ -25,11 +25,11 @@ App.Events.SEProjectNComplete = class SEProjectNComplete extends App.Events.Base
 		slave.career = "an orphan";
 		slave.intelligenceImplant = 0;
 		slave.hColor = "white";
-		slave.override_H_Color = 1;
+		slave.override_H_Color = 1; // TODO: Identifier 'override_H_Color' is not in camel case
 		slave.origHColor = "white";
 		slave.skin = "pure white";
 		slave.origSkin = "pure white";
-		slave.override_Skin = 1;
+		slave.override_Skin = 1; // TODO: Identifier 'override_Skin' is not in camel case
 		slave.teeth = "fangs";
 		slave.devotion = 20;
 		slave.trust = 30;
diff --git a/src/Mods/Catmod/events/nonRandom/projectNSaboteur.js b/src/Mods/Catmod/events/nonRandom/projectNSaboteur.js
index 13dcf2fd53181d04c8e7df76f686851b4d72c924..094bc52ce0591a0cc113f1837e23b01e50462d9b 100644
--- a/src/Mods/Catmod/events/nonRandom/projectNSaboteur.js
+++ b/src/Mods/Catmod/events/nonRandom/projectNSaboteur.js
@@ -28,6 +28,7 @@ App.Events.SEProjectNSaboteur = class SEProjectNSaboteur extends App.Events.Base
 		App.Events.addResponses(node, choices);
 
 		function security() {
+			V.projectN.status = 5;
 			const frag = new DocumentFragment();
 			let r = [];
 			r.push(`You briefly thank your lucky stars that you invested enough in project N to provide for integrated security, then call for the lab's drones to activate. Over the cameras, you smugly watch from your comfortable bed as the security drones tear two of the mysterious saboteurs to shreds, then pin down and apprehend the third. Seems like all they managed to get you today was a <span class="green">brand new slave.</span>`);
diff --git a/src/Mods/Catmod/events/reRecruit/runawayCat.js b/src/Mods/Catmod/events/reRecruit/runawayCat.js
index cf22d2e56bd6475e6826e696c0b5eba206979448..1526605e6eac5f34d4b15fe467901d630740cd85 100644
--- a/src/Mods/Catmod/events/reRecruit/runawayCat.js
+++ b/src/Mods/Catmod/events/reRecruit/runawayCat.js
@@ -5,7 +5,6 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 
 	eventPrerequisites() {
 		return [
-			() => V.seeDicks !== 100,
 			() => V.seeCats !== 0,
 			() => V.projectN.techReleased !== 0,
 			() => ((V.rep/400) > random(1, 100) || V.cheatMode === 1)
@@ -24,10 +23,10 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		r.push(`Coming to your desk in the morning, you see that your assistant has noted that you have a 'pressing' piece of business to attend to. With a wave of your hand, you bring up the notification to see that a runaway slave has apparently been waiting outside your penthouse for the entire night. What's more, ${he}'s owned by a prominent rival arcology owner within the cluster - and a cat${girl}, to boot. Apparently, according to the short, hand-scrawled letter that ${V.assistant.name} has digitized into the notification, ${his} former master regularly beat ${him} both out of frustration and for pleasure, and ${he}'s approached you hoping for a better life in the slavery that's defined ${his} existence.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(`The exclusive and novel nature of catgirls makes ${him} an exceptionally valuable slave, and the genetic modification that created ${him} has ensured that the feline face you look over in the automated overview is particularly attractive, but taking ${him} under your wing away from another wealthy plutocrat would cause a whole score of problems. Deciding it'd be best not to make more enemies than you have to, you call up the rival on your personal phone, who answers after only a few seconds. After you explain the situation, the abusive oligarch chuckles, admits that he hadn't even noticed the cat${girl} leaving, and says he'll formally sell ${him} over to you for "just" twenty thousand credits. Otherwise, he'll give you a little cash to show his appreciation for sending the runaway back home.`);
+		r.push(`The exclusive and novel nature of cat${girl}s makes ${him} an exceptionally valuable slave, and the genetic modification that created ${him} has ensured that the feline face you look over in the automated overview is particularly attractive, but taking ${him} under your wing away from another wealthy plutocrat would cause a whole score of problems. Deciding it'd be best not to make more enemies than you have to, you call up the rival on your personal phone, who answers after only a few seconds. After you explain the situation, the abusive oligarch chuckles, admits that he hadn't even noticed the cat${girl} leaving, and says he'll formally sell ${him} over to you for "just" twenty thousand credits. Otherwise, he'll give you a little cash to show his appreciation for sending the runaway back home.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(App.UI.DOM.makeElement("span", `The other oligarch's offer is a pretty heavy ${cashFormat(20000)}, although his catgirl slave is pretty, young, and seems fairly well-trained. ${He}'s still got a few scars from regular abuse, though, both mental and physical, and despite ${his} offer of self-enslavement seems exceptionally skittish and scared around you.`, "note"));
+		r.push(App.UI.DOM.makeElement("span", `The other oligarch's offer is a pretty heavy ${cashFormat(20000)}, although his cat${girl} slave is pretty, young, and seems fairly well-trained. ${He}'s still got a few scars from regular abuse, though, both mental and physical, and despite ${his} offer of self-enslavement seems exceptionally skittish and scared around you.`, "note"));
 
 		App.Events.addParagraph(node, r);
 		const contractCost = 20000;
@@ -40,7 +39,7 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		}
 		const incomeText = new DocumentFragment();
 		incomeText.append(`This will bring in `, App.UI.DOM.cashFormat(cost), `.`);
-		responses.push(new App.Events.Result(`Sell ${him} immediately`, sell, incomeText));
+		responses.push(new App.Events.Result(`Return ${him} to ${his} owner`, sell, incomeText));
 
 		node.append(App.Desc.longSlave(slave, {market: "generic"}));
 
@@ -66,7 +65,7 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		}
 
 		function makeSlave() {
-			const slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 22, race: "catgirl"});
+			const slave = GenerateNewSlave(null, {minAge: 16, maxAge: 22, race: "catgirl"});
 			slave.face = random(25, 75);
 			slave.origin = "$He was bioengineered by a rival arcology owner. After being mistreated, $he escaped and came to you for protection.";
 			slave.slaveName = setup.catSlaveNames.random();
@@ -91,6 +90,8 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 			slave.eye.right.pupil = "catlike";
 			slave.accent = 2;
 			slave.canRecruit = 0;
+			App.Medicine.Modification.addScar(slave, "back", "whip");
+			slave.behavioralFlaw = "odd";
 			return slave;
 		}
 	}
diff --git a/src/Mods/Catmod/events/scheduled/vatcatboy.js b/src/Mods/Catmod/events/scheduled/vatcatboy.js
index b19e262f2179b734844eaa29b8bb12a893e75814..f2363120629dc4758e1b735c28741c37dfbbb3d4 100644
--- a/src/Mods/Catmod/events/scheduled/vatcatboy.js
+++ b/src/Mods/Catmod/events/scheduled/vatcatboy.js
@@ -44,7 +44,7 @@ App.Events.SEVatCatBoy = class SEVatCatBoy extends App.Events.BaseEvent {
 		slave.canRecruit = 0;
 
 		App.Events.addParagraph(node, [
-			`With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconscious catboy, floating suspended in the tube of thick green liquid you use to grow them. "Looks like he came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. _slave.slaveName is going to make a lovely addition to your little collection."`
+			`With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconscious catboy, floating suspended in the tube of thick green liquid you use to grow them. "Looks like he came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. ${slave.slaveName} is going to make a lovely addition to your little collection."`
 		]);
 
 		App.Events.addResponses(node, [new App.Events.Result(`Bring your new slave back home`, home)]);
diff --git a/src/Mods/Catmod/events/scheduled/vatcatgirl.js b/src/Mods/Catmod/events/scheduled/vatcatgirl.js
index 1bf3bd288d444c3d221d9bc92c1ae4b2aabb0924..4acf7fa5312e92684c412f96c12bed2e7dc21d8e 100644
--- a/src/Mods/Catmod/events/scheduled/vatcatgirl.js
+++ b/src/Mods/Catmod/events/scheduled/vatcatgirl.js
@@ -44,7 +44,7 @@ App.Events.SEVatCatGirl = class SEVatCatGirl extends App.Events.BaseEvent {
 		slave.skill.entertainment = 0;
 		slave.accent = 4;
 		slave.canRecruit = 0;
-		App.Events.addParagraph(node, [`With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconscious catgirl, floating suspended in the tube of thick green liquid you use to grow them. "Looks like she came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. _slave.slaveName is going to make a lovely addition to your little collection."`]);
+		App.Events.addParagraph(node, [`With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconscious catgirl, floating suspended in the tube of thick green liquid you use to grow them. "Looks like she came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. ${slave.slaveName} is going to make a lovely addition to your little collection."`]);
 
 		App.Events.addResponses(node, [new App.Events.Result(`Bring your new slave back home`, home)]);
 
diff --git a/src/Mods/SecExp/buildings/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw
index d1f63a74a1682f7c8aba6f0bc22413160e2b764a..347549a4749142730ded6d450e3efebbb06ffa08 100644
--- a/src/Mods/SecExp/buildings/secBarracks.tw
+++ b/src/Mods/SecExp/buildings/secBarracks.tw
@@ -4,7 +4,7 @@
 
 The Barracks
 <hr>__Upgrades__<br>
-While this a sore sight for many citizens of $arcologies[0].name, the barracks stand proud before you.
+While this is a sore sight for many citizens of $arcologies[0].name, the barracks stand proud before you.
 <<if $SecExp.buildings.barracks.size == 0>>
 	The building is relatively small and able to house a limited number of units.
 <<elseif $SecExp.buildings.barracks.size == 1>>
@@ -387,4 +387,4 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 			<</capture>>
 		<</for>>
 	</div>
-</div>
\ No newline at end of file
+</div>
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/attackOptions.js b/src/Mods/SecExp/events/attackOptions.js
index 6c9ca8efa905e29169e4d042e3ee197ddd564f42..01c1e544e722001aa3ae8a50110ed4d7411a823e 100644
--- a/src/Mods/SecExp/events/attackOptions.js
+++ b/src/Mods/SecExp/events/attackOptions.js
@@ -10,7 +10,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 	execute(node) {
 		/** Display's the deploy menu for the unit.
 		 * @param {FC.SecExp.PlayerHumanUnitData} [input] the unit to be checked.
-		 * @param {string} [type] the class of unit to be checked.
+		 * @param {FC.SecExp.PlayerHumanUnitType} [type] the class of unit to be checked.
 		 * @returns {HTMLDivElement}
 		 */
 		const deployMenu = function(input, type) {
@@ -189,8 +189,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 			V.SecExp.war.commander = "PC";
 		}
 
-		/* leader assignment */
-		options = new App.UI.OptionsGroup();
+		options = new App.UI.OptionsGroup(); // leader assignment
 		option = options.addOption("Leader of the troops", "commander", V.SecExp.war)
 			.addValueList([["You", "PC"], [V.assistant.name, "assistant"]]);
 
@@ -255,7 +254,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 		if (V.SecExp.battles.lastSelection.length > 0) {
 			linkArray.push(
 				App.UI.DOM.link(
-					`Restore saved roster`,
+					`Restore saved`,
 					() => {
 						for (let i = 0; i < V.SecExp.battles.lastSelection.length; i++) {
 							if (V.SecExp.battles.lastSelection[i] === -1) {
@@ -278,12 +277,12 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				)
 			);
 		} else {
-			r.push(`Restore saved roster`);
+			r.push(`Restore saved`);
 		}
 		if (V.SecExp.war.saveValid !== 1) {
 			linkArray.push(
 				App.UI.DOM.link(
-					`Save current roster`,
+					`Save current`,
 					() => {
 						if (App.SecExp.battle.deployedUnits('bots')) {
 							V.SecExp.battles.lastSelection.push(-1);
@@ -302,12 +301,12 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				)
 			);
 		} else {
-			r.push(`Save current roster`);
+			r.push(`Save current`);
 		}
 		if (App.SecExp.battle.deployedUnits() > 0) {
 			linkArray.push(
 				App.UI.DOM.link(
-					`Clear current roster`,
+					`Clear current`,
 					() => {
 						V.SecExp.units.bots.isDeployed = 0;
 						for (const squad of App.SecExp.unit.humanSquads()) {
@@ -320,12 +319,12 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				)
 			);
 		} else {
-			r.push(`Clear current roster`);
+			r.push(`Clear current`);
 		}
 		if (V.SecExp.battles.lastSelection.length > 0) {
 			linkArray.push(
 				App.UI.DOM.link(
-					`Clear saved roster`,
+					`Clear saved`,
 					() => {
 						V.SecExp.battles.lastSelection = [];
 						V.SecExp.war.saveValid = 0;
@@ -335,26 +334,22 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 				)
 			);
 		} else {
-			r.push(`Clear saved roster`);
+			r.push(`Clear saved`);
 		}
-		node.append(App.UI.DOM.generateLinksStrip(linkArray));
+		node.append("Roster: ", App.UI.DOM.generateLinksStrip(linkArray));
 
-		/* troop deployment */
+		// troop deployment
 		if (App.SecExp.battle.deployableUnits() > 0) {
 			r.push(`With your current readiness level you can send an additional`);
 			r.push(App.UI.DOM.makeElement("span", String(App.SecExp.battle.deployableUnits()), "strong"));
 			r.push(`units.`);
 		}
 		node.append(App.SecExp.unit.replenishAll());
-
-		App.UI.tabBar.handlePreSelectedTab(V.tabChoice.Options);
-
 		if (App.SecExp.battle.deployableUnits() === 0) {
 			App.UI.DOM.appendNewElement("div", node, `Unit roster full.`, "strong");
 		}
 
 		const tabBar = new App.UI.Tabs.TabBar("SlaveInteract");
-
 		for (const u of App.SecExp.unit.list()) {
 			if (u !== 'bots' && V.SecExp.units[u].squads.length > 0 || u === 'bots' && V.SecExp.units[u]) {
 				tabBar.addTab(capFirstChar(u), u, unitTab(u));
@@ -364,25 +359,22 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 
 		options = new App.UI.OptionsGroup();
 		option = options.addCustomOption("Send your orders");
-
 		if (App.SecExp.battle.deployedUnits() > 0) {
-			option.addButton(`Send your orders`, () => {
-				V.SecExp.war.result = 4;
+			option.addButton(`Deploy troops`, () => {
+				V.SecExp.war.result = 4; // Sets to a value outside accepted range (-3,3) to avoid evaluation problems
 				V.SecExp.war.foughtThisWeek = 1;
-				/* sets V.SecExp.war.result value outside accepted range (-3, 3) to avoid evaluation problems */
 			}, `conflictHandler`);
 		} else {
 			App.UI.DOM.appendNewElement("div", node, `You need at least a unit in your roster to proceed to battle.`, "red");
 		}
-		option.addButton(`Surrender`, () => {
-			V.SecExp.war.result = -1;
-			V.SecExp.war.foughtThisWeek = 1;
-		}, "attackReport");
-		option.addButton(`Attempt to bribe`, () => {
+		option.addButton(`Attempt to bribe (approximately ${cashFormat(Math.round(App.SecExp.battle.bribeCost() * (1 + either(-1, 1) * random(2) * 0.1)))})`, () => {
 			V.SecExp.war.result = 1;
 			V.SecExp.war.foughtThisWeek = 1;
 		}, `conflictHandler`);
-		option.addComment(`Will cost around ${cashFormat(Math.round(App.SecExp.battle.bribeCost() * (1 + either(-1, 1) * random(2) * 0.1)))} (estimate).`);
+		option.addButton(`Surrender`, () => {
+			V.SecExp.war.result = -1;
+			V.SecExp.war.foughtThisWeek = 1;
+		}, "conflictReport");
 		node.append(options.render());
 
 		return node;
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 094090297be3ab408616eda2e59fcaef65115466..091171aaf0f2ef69539ec68c2cf6085a59606a46 100644
--- a/src/Mods/SecExp/events/conflictHandler.js
+++ b/src/Mods/SecExp/events/conflictHandler.js
@@ -81,6 +81,7 @@ App.Events.conflictHandler = function() {
 	let atkMod = 1;
 	let defMod = 1;
 	let armyMod = V.SecExp.war.attacker.troops / (inBattle ? 80 : 100);
+	const activeSF = V.SF.Toggle && V.SF.Active >= 1;
 	// Battles
 	let militiaMod = (isMajorBattle) ? 1.5 : 1;
 	let slaveMod = (isMajorBattle) ? 1.5 : 1;
@@ -108,14 +109,14 @@ App.Events.conflictHandler = function() {
 				}
 			}
 			showProgress(`${V.SecExp.war.result === 0 ? 'Failed' : 'Successful'}!`, "span");
-			atEnd("attackReport");
+			atEnd("conflictReport");
 			return node;
 		}
 	}
 
 	if (inBattle) {
 		if (isMajorBattle) {
-			if (V.SF.Toggle && V.SF.Active >= 1) {
+			if (activeSF) {
 				if (V.SF.Squad.Firebase >= 7) {
 					atkMod += (V.SF.Squad.Firebase - 6) * 0.05;
 				}
@@ -292,7 +293,7 @@ App.Events.conflictHandler = function() {
 		}
 	}
 
-	if (inBattle && App.SecExp.battle.deployedUnits('bots') || inRebellion && V.SecExp.units.bots.active === 1) {
+	if (App.SecExp.battle.deployedUnits('bots')) {
 		unitData = App.SecExp.getUnit("bots");
 		attack += unitData.attack * atkMod;
 		defense += unitData.defense * defMod;
@@ -310,7 +311,7 @@ App.Events.conflictHandler = function() {
 		}
 	}
 
-	if (V.SF.Toggle && V.SF.Active >= 1 && (inBattle && V.SecExp.war.deploySF || inRebellion)) {
+	if (activeSF && (inBattle && V.SecExp.war.deploySF || inRebellion)) {
 		unitData = App.SecExp.getUnit("SF");
 		attack += unitData.attack;
 		defense += unitData.defense;
@@ -346,21 +347,22 @@ App.Events.conflictHandler = function() {
 		SFMod = Math.clamp(SFMod, 0.5, 1.5);
 	}
 	let moraleTroopMod = Math.clamp(App.SecExp.battle.troopCount() / 100, 1, (inBattle ? 5 : 10));
+	const modifierSF = activeSF ? 1 : 0;
 
 	if (inBattle) {
-		morale += (App.SecExp.BaseDroneUnit.morale * V.SecExp.units.bots.isDeployed + App.SecExp.BaseMilitiaUnit.morale * militiaMod * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.morale * slaveMod * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.morale * mercMod * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.morale * V.SecExp.war.deploySF * SFMod) / (V.SecExp.units.bots.isDeployed + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SecExp.war.deploySF);
+		morale += (App.SecExp.BaseDroneUnit.morale * App.SecExp.battle.deployedUnits('bots') + App.SecExp.BaseMilitiaUnit.morale * militiaMod * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.morale * slaveMod * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.morale * mercMod * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.morale * V.SecExp.war.deploySF * SFMod) / (App.SecExp.battle.deployedUnits('bots') + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SecExp.war.deploySF);
 		if (V.SecExp.buildings.barracks) {
 			morale = morale + morale * V.SecExp.buildings.barracks.luxury * 0.05;	// barracks bonus
 		}
 	} else {
-		morale += (App.SecExp.BaseDroneUnit.morale * V.SecExp.units.bots.active + App.SecExp.BaseMilitiaUnit.morale * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.morale * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.morale * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.morale * V.SF.Active) / (V.SecExp.units.bots.active + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SF.Active);
-		morale += morale * (V.SecExp.buildings.barracks ? V.SecExp.buildings.barracks.luxury * 0.05 : 0);	// barracks bonus
+		morale += (App.SecExp.BaseDroneUnit.morale * App.SecExp.battle.deployedUnits('bots') + App.SecExp.BaseMilitiaUnit.morale * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.morale * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.morale * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.morale * modifierSF) / (App.SecExp.battle.deployedUnits('bots') + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + modifierSF);
+		morale += morale * (V.SecExp.buildings.barracks ? V.SecExp.buildings.barracks.luxury * 0.05 : 1);	// barracks bonus
 	}
 	morale *= moraleTroopMod;
 	if (inBattle) {
-		baseHp = (App.SecExp.BaseDroneUnit.hp * V.SecExp.units.bots.isDeployed + App.SecExp.BaseMilitiaUnit.hp * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.hp * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.hp * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.hp * V.SecExp.war.deploySF) / (V.SecExp.units.bots.isDeployed + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SecExp.war.deploySF);
+		baseHp = (App.SecExp.BaseDroneUnit.hp * App.SecExp.battle.deployedUnits('bots') + App.SecExp.BaseMilitiaUnit.hp * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.hp * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.hp * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.hp * V.SecExp.war.deploySF) / (App.SecExp.battle.deployedUnits('bots') + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SecExp.war.deploySF);
 	} else {
-		baseHp = (App.SecExp.BaseDroneUnit.hp * (V.SecExp.units.bots.active ? V.SecExp.units.bots.active : 0) + App.SecExp.BaseMilitiaUnit.hp * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.hp * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.hp * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.hp * V.SF.Active) / ((V.SecExp.units.bots.active ? V.SecExp.units.bots.active : 0) + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + V.SF.Active);
+		baseHp = (App.SecExp.BaseDroneUnit.hp * App.SecExp.battle.deployedUnits('bots') + App.SecExp.BaseMilitiaUnit.hp * App.SecExp.battle.deployedUnits('militia') + App.SecExp.BaseSlaveUnit.hp * App.SecExp.battle.deployedUnits('slaves') + App.SecExp.BaseMercUnit.hp * App.SecExp.battle.deployedUnits('mercs') + App.SecExp.BaseSpecialForcesUnit.hp * modifierSF) / (App.SecExp.battle.deployedUnits('bots') + App.SecExp.battle.deployedUnits('militia') + App.SecExp.battle.deployedUnits('slaves') + App.SecExp.battle.deployedUnits('mercs') + modifierSF);
 	}
 
 	// calculates opposing army stats
@@ -503,7 +505,7 @@ App.Events.conflictHandler = function() {
 			App.UI.DOM.appendNewElement("div", node, `Slaves morale modifier: +${slaveMod}%`);
 			App.UI.DOM.appendNewElement("div", node, `Militia morale modifier: +${militiaMod}%`);
 			App.UI.DOM.appendNewElement("div", node, `Mercenaries morale modifier: +${mercMod}%`);
-			if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) {
+			if (activeSF && V.SecExp.war.deploySF) {
 				App.UI.DOM.appendNewElement("div", node, `Special Force morale modifier: +${SFMod}%`);
 			}
 			if (V.SecExp.buildings.barracks && V.SecExp.buildings.barracks.luxury >= 1) {
@@ -542,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/rebellionOptions.js b/src/Mods/SecExp/events/rebellionOptions.js
index 3f6b8ba1f415a1a4081297d573c4dfe7f5f68b2a..785332836056a32dbb869895cdca049d2d656ff4 100644
--- a/src/Mods/SecExp/events/rebellionOptions.js
+++ b/src/Mods/SecExp/events/rebellionOptions.js
@@ -9,22 +9,14 @@ App.Events.rebellionOptions = class rebellionOptions extends App.Events.BaseEven
 
 	execute(node) {
 		let r = [];
-
 		V.nextButton = " ";
 		V.encyclopedia = "Battles";
-		const _isSlaveRebellion = V.SecExp.war.type.includes("Slave");
-		let _loyalUnits = App.SecExp.unit.humanSquads().length - V.SecExp.war.rebellingID.length;
+		const isSlaveRebellion = V.SecExp.war.type.includes("Slave");
 
 		App.UI.DOM.appendNewElement("h2", node, `${V.SecExp.war.type}!`);
-
-		r.push(`In the end it happened, the`);
-		if (_isSlaveRebellion) {
-			r.push(`slaves`);
-		} else {
-			r.push(`citizens`);
-		}
+		r.push(`In the end it happened, the ${isSlaveRebellion ? "slaves" : "citizens"}`);
 		r.push(`of your arcology dared took up arms and rose up against their betters. Your penthouse is flooded with reports from all over the arcology of small skirmishes between the rioting slaves and the security forces. It appears <strong>${num(Math.trunc(V.SecExp.war.attacker.troops))}</strong> rebels are in the streets right now, building barricades and`);
-		if (_isSlaveRebellion) {
+		if (isSlaveRebellion) {
 			r.push(`freeing their peers.`);
 		} else {
 			r.push(`destroying your property.`);
@@ -43,55 +35,38 @@ App.Events.rebellionOptions = class rebellionOptions extends App.Events.BaseEven
 		if (V.SecExp.war.irregulars > 0) {
 			r.push(`${num(Math.trunc(V.SecExp.war.irregulars))} of your citizens took up arms to defend their arcology owner.`);
 		}
-		let _count = 0;
 		if (V.SecExp.war.rebellingID.length > 0) {
 			App.Events.addParagraph(node, r);
 			r = [];
-			for (const _squad of App.SecExp.unit.humanSquads()) {
-				if (_squad.active === 1 && (V.SecExp.war.rebellingID.includes(_squad.ID))) {
-					_count++;
-					if (_count < V.SecExp.war.rebellingID.length) {
-						r.push(`${_squad.platoonName},`);
-					} else {
-						r.push(_squad.platoonName);
-					}
+			let rebelling = [];
+			for (const squad of App.SecExp.unit.humanSquads()) {
+				if (squad.active === 1 && (V.SecExp.war.rebellingID.includes(squad.ID))) {
+					rebelling.push(squad.platoonName);
 				}
 			}
-			r.push(`betrayed you and joined the insurrection.`);
+			r.push(`${toSentence(rebelling)} betrayed you and joined the insurrection.`);
 		}
-		_count = 0;
-		let _dualUnits = V.arcologyUpgrade.drones === 1 && V.SF.Toggle && V.SF.Active >= 1;
-		App.Events.addParagraph(node, r);
-		r = [];
+		let defending = [];
 		if (V.arcologyUpgrade.drones === 1) {
-			r.push(`Your security drones`);
+			defending.push(`Your security drones`);
 		}
-		if (_loyalUnits > 0) {
-			r.push(`,`);
-			for (const _squad of App.SecExp.unit.humanSquads()) {
-				if (_squad.active === 1 && (!V.SecExp.war.rebellingID.includes(_squad.ID))) {
-					_count++;
-					if (_count < _loyalUnits) {
-						r.push(`${_squad.platoonName},`);
-					} else {
-						r.push(_squad.platoonName);
-					}
-				}
+		for (const squad of App.SecExp.unit.humanSquads()) {
+			if (squad.active === 1 && (!V.SecExp.war.rebellingID.includes(squad.ID))) {
+				defending.push(squad.platoonName);
 			}
 		}
-		if (V.arcologyUpgrade.drones === 1 || V.SF.Toggle && V.SF.Active >= 1) {
-			if (V.SF.Toggle && V.SF.Active >= 1) {
-				if (_dualUnits || _loyalUnits > 0) {
-					r.push(`and ${V.SF.Lower},`);
-				} else {
-					r.push(capFirstChar(V.SF.Lower));
-				}
-				r.push(`${num(V.SF.ArmySize)} strong`);
-			}
-			r.push(`are called to defend the arcology from this menace.`);
+		if (V.SF.Toggle && V.SF.Active >= 1) {
+			let SFname = defending.length > 0 ? V.SF.Lower : capFirstChar(V.SF.Lower);
+			defending.push(`${SFname}, ${num(V.SF.ArmySize)} strong`);
 		}
-		r.push(`The confined spaces of the arcology and the number of vital yet delicate systems within its walls do not allow a lot of tactical flexibility. This will be a long and strenuous fight, street after street, barricade after barricade.
-		In order to preserve the structural integrity of the building and the lives of our civilians, we will have to limit our firepower.`);
+		if (defending.length > 0) {
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`${toSentence(defending)} are called to defend the arcology from this menace.`);
+		}
+		App.Events.addParagraph(node, r);
+		r = [];
+		r.push(`The confined spaces of the arcology and the number of vital yet delicate systems within its walls do not allow a lot of tactical flexibility. This will be a long and strenuous fight, street after street, barricade after barricade. In order to preserve the structural integrity of the building and the lives of our civilians, we will have to limit our firepower.`);
 		App.Events.addParagraph(node, r);
 
 		let text;
@@ -163,13 +138,13 @@ App.Events.rebellionOptions = class rebellionOptions extends App.Events.BaseEven
 			"Proceed",
 			"conflictHandler",
 			() => {
-				V.SecExp.war.result = 4; // Sets V.SecExp.war.result to a value outside accepted range (-3,3) to avoid evaluation problems
+				V.SecExp.war.result = 4; // Sets to a value outside accepted range (-3,3) to avoid evaluation problems
 				V.SecExp.war.foughtThisWeek = 1;
 			}
 		));
 		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.passageLink(
 			"Surrender",
-			"rebellionReport",
+			"conflictReport",
 			() => {
 				V.SecExp.war.result = -1;
 				V.SecExp.war.foughtThisWeek = 1;
diff --git a/src/Mods/SecExp/events/rebellionReport.js b/src/Mods/SecExp/events/rebellionReport.js
deleted file mode 100644
index 663cea8f7f561fd7184fcf624e1523296eb41471..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 (V.SecExp.units.bots.active === 1) {
-			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/events/secExpSmilingMan2.js b/src/Mods/SecExp/events/secExpSmilingMan2.js
index 4f1f0f9b43d6baaaf4ebfab1c4571899f09aa7cc..8cccd4aadd3ce2fcba345dafe3a550d481e68b0f 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan2.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan2.js
@@ -49,8 +49,8 @@ App.Events.secExpSmilingMan2 = class secExpSmilingMan2 extends App.Events.BaseEv
 
 		if (V.arcologies[0].ownership >= 60) {
 			if (V.SecExp.core.authority <= 10000) {
-				const _cells = V.building.findCells(cell => cell.canBeSold());
-				jsEither(_cells).owner = 0;
+				const cells = V.building.findCells(cell => cell.canBeSold());
+				jsEither(cells).owner = 0;
 				r.push(`Vast amount of data relative to the ownership of the arcology is lost. You lost all legal claims to one of the sectors.`);
 			} else {
 				r.push(`Vast amount of data relative to the ownership of the arcology is lost. You would've run the risk of losing ownership of one of the sectors, but fortunately your authority is so high your citizens do not dare question your claims even in the absence of a valid legal case.`);
diff --git a/src/Mods/SecExp/js/Unit.js b/src/Mods/SecExp/js/Unit.js
index 8d32ff81033eac49554e8d9aab96a1997393d597..3c92e483646da36d4fd43343fa9caea464a5c20a 100644
--- a/src/Mods/SecExp/js/Unit.js
+++ b/src/Mods/SecExp/js/Unit.js
@@ -146,7 +146,8 @@ App.SecExp.unit = (function() {
 	 */
 	function humanUpgradeList(input) {
 		const equipUpgradeCost = 250;
-		let el = document.createElement("div"), options = document.createElement("div");
+		let el = document.createElement("div");
+		let options = document.createElement("div");
 
 		if (input.maxTroops < 50) {
 			options.append(`For ${cashFormat(5000 + 10 * equipUpgradeCost * (input.equip + input.commissars + input.cyber + input.SF))} provide this unit's `);
@@ -258,7 +259,7 @@ App.SecExp.unit = (function() {
 
 		for (const unit of list().slice(1)) {
 			for (const squad of V.SecExp.units[unit].squads) {
-				if (!woundedUnit.contains(unit) && squad.troops < squad.maxTroops && unitFree(unit).can_upgrade()) {
+				if (!woundedUnit.contains(unit) && squad.troops < squad.maxTroops && unitFree(unit).canUpgrade()) {
 					woundedUnit.push(unit);
 				}
 			}
@@ -531,7 +532,7 @@ App.SecExp.unit = (function() {
 		/**
 		 * @returns {boolean}
 		 */
-		function can_upgrade() {
+		function canUpgrade() {
 			switch(type) {
 				case "bots": return V.cash >= 500;
 				case "slaves": return V.menials > 0;
@@ -581,7 +582,7 @@ App.SecExp.unit = (function() {
 		}
 
 		return {
-			print, can_upgrade,
+			print, canUpgrade,
 			add, remove, set
 		};
 	}
diff --git a/src/Mods/SecExp/js/authorityReport.js b/src/Mods/SecExp/js/authorityReport.js
index cf89347fb30b09449712ce35001d987926ffd076..f22585f97a7f4d06223da43e25cd1c3d2b828983 100644
--- a/src/Mods/SecExp/js/authorityReport.js
+++ b/src/Mods/SecExp/js/authorityReport.js
@@ -31,7 +31,7 @@ App.SecExp.authorityReport = function() {
 
 	if (["BlackHat", "escort", "servant", "wealth"].includes(V.PC.career)) {
 		authGrowth -= (10 * random(5, 15));
-	} else if (["slaver", "slaver"].includes(V.PC.career)){
+	} else if (["slaver", "gang"].includes(V.PC.career)){
 		authGrowth += (10 * random(5, 15));
 	}
 
@@ -163,7 +163,8 @@ App.SecExp.authorityReport = function() {
 
 	if (V.SecExp.settings.rebellion.enabled === 1) {
 		const authorityEffects = function(group) {
-			let text, bonus;
+			let text;
+			let bonus;
 			if (V.SecExp.core.authority <= 3000) {
 				text = `Your very low authority allows ${group} to think too freely.`;
 				bonus = 30;
@@ -189,7 +190,8 @@ App.SecExp.authorityReport = function() {
 			return {text, bonus};
 		};
 
-		let slave, citizen;
+		let slave;
+		let citizen;
 		const CSratio = V.ACitizens / V.ASlaves;
 		r.push(`<br><br><strong>Slaves security analysis:</strong>`);
 		r.push(authorityEffects('slaves').text); slave = authorityEffects('slaves').bonus;
@@ -319,7 +321,8 @@ App.SecExp.authorityReport = function() {
 
 		const oldTension = V.SecExp.rebellions.tension;
 		if (rebellionEventFires) { // if there is an advancement selects a random mini event
-			let miniEvent, rand;
+			let miniEvent;
+			let rand;
 			V.SecExp.rebellions[rebellionEventFires + 'Progress'] += random(1, 5);
 			if (V.SecExp.rebellions.tension !== 0) {
 				V.SecExp.rebellions[rebellionEventFires + 'Progress'] *= Math.trunc(random(1, 5) * (V.SecExp.rebellions.tension / 100) * 10); // progress scales with tension
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/Mods/SecExp/js/reportingRelatedFunctions.js b/src/Mods/SecExp/js/reportingRelatedFunctions.js
index c920439c33910a59fa0313f12dcc5f49dd28dffc..6a9aebf546e2ca72cb7f5867aaaef27287b8f068 100644
--- a/src/Mods/SecExp/js/reportingRelatedFunctions.js
+++ b/src/Mods/SecExp/js/reportingRelatedFunctions.js
@@ -1012,7 +1012,8 @@ App.SecExp.upkeep = (function() {
  * @returns {HTMLDivElement}
  */
 App.SecExp.humanLoyaltyChanges = function(input, type) {
-	let loyaltyChange = 0, el = document.createElement("div");
+	let loyaltyChange = 0;
+	let el = document.createElement("div");
 
 	el.append(`${input.platoonName}: `);
 	if (V.SecExp.buildings.barracks && V.SecExp.buildings.barracks.loyaltyMod >= 1) {
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index 215bb2bd1939fb6e9314915f3ff903c9a50db0dd..7f931eecad976f0d7fa3af9b88569a5dd5a40e23 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -137,8 +137,7 @@ App.SecExp.generator = (function() {
 
 			if (V.week < 30) {
 				troops *= random(1, 2); // troops *= Math.trunc(random( (1*(1.01+(V.week/100))), (2*(1.01+(V.week/100))) ))) {
-			}
-			if (V.week < 60) {
+			} else if (V.week < 60) {
 				troops *= random(1, 3); // troops *= Math.trunc(random( (1*(1.01+(V.week/200))), (3*(1.01+(V.week/200))) ))) {
 				equip = random(0, 1);
 			} else if (V.week < 90) {
@@ -402,25 +401,17 @@ App.SecExp.battle = (function() {
 	 * @returns {number} unit count
 	 */
 	function deployedUnits(input = '') {
+		const inBattle = V.SecExp.war.type.includes("Attack");
 		let count = {}; let init = 0;
 		App.SecExp.unit.list().forEach(s => { count[s] = 0; });
-		if (V.SecExp.war.type.includes("Attack")) {
-			if (V.SecExp.units.bots.isDeployed > 0) {
-				count.bots++;
-			}
-			if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) {
-				init++;
-			}
-		} else { // rebellion
-			if (V.SecExp.units.bots.active > 0) {
-				count.bots++;
-			}
-			if (V.SF.Toggle && V.SF.Active >= 1) {
-				init++;
-			}
-			if (V.SecExp.war.irregulars > 0) {
-				count.militia++;
-			}
+		if (App.SecExp.unit.isDeployed(V.SecExp.units.bots)) {
+			count.bots++;
+		}
+		if (V.SF.Toggle && V.SF.Active >= 1 && (inBattle && V.SecExp.war.deploySF || !inBattle)) {
+			init++;
+		}
+		if (!inBattle && V.SecExp.war.irregulars > 0) { // rebellion
+			count.militia++;
 		}
 
 		App.SecExp.unit.list().slice(1).forEach(s => { count[s] += V.SecExp.units[s].squads.filter((u) => App.SecExp.unit.isDeployed(u)).length; });
@@ -436,8 +427,8 @@ App.SecExp.battle = (function() {
 	 * @returns {number} troop count
 	 */
 	function troopCount() {
+		const inBattle = V.SecExp.war.type.includes("Attack");
 		let troops = 0;
-
 		/** @param {function(FC.SecExp.PlayerHumanUnitData) : boolean} pred */
 		function countHumanTroops(pred) {
 			let arrays = [];
@@ -450,27 +441,17 @@ App.SecExp.battle = (function() {
 				}
 			}
 		}
-
-		if (V.SecExp.war.type.includes("Attack")) {
-			if (V.SecExp.units.bots.isDeployed === 1) {
-				troops += V.SecExp.units.bots.troops;
-			}
-			countHumanTroops((u) => u.isDeployed === 1);
-			if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) {
-				troops += App.SecExp.troopsFromSF();
-			}
-		} else {
-			if (V.SecExp.war.irregulars > 0) {
-				troops += V.SecExp.war.irregulars;
-			}
-			if (V.SecExp.units.bots.active === 1) {
-				troops += V.SecExp.units.bots.troops;
-			}
-			countHumanTroops((u) => u.active === 1 && !V.SecExp.war.rebellingID.includes(u.ID));
-			if (V.SF.Toggle && V.SF.Active >= 1) {
-				troops += App.SecExp.troopsFromSF();
-			}
+		
+		if (App.SecExp.battle.deployedUnits('bots') > 0) {
+			troops += V.SecExp.units.bots.troops;
+		}
+		if (V.SF.Toggle && V.SF.Active >= 1 && (inBattle && V.SecExp.war.deploySF || !inBattle)) {
+			troops += App.SecExp.troopsFromSF();
+		}
+		if (!inBattle) {
+			troops += V.SecExp.war.irregulars;
 		}
+		countHumanTroops((u) => App.SecExp.unit.isDeployed(u));
 		return troops;
 	}
 
diff --git a/src/Mods/SecExp/js/securityReport.js b/src/Mods/SecExp/js/securityReport.js
index 62b25f5b6a03f5890895b4d97a3c0c129ce62069..57d321586dc16f376523deeaf7a1e99660a889d7 100644
--- a/src/Mods/SecExp/js/securityReport.js
+++ b/src/Mods/SecExp/js/securityReport.js
@@ -1,6 +1,9 @@
 /** @returns {DocumentFragment} */
 App.SecExp.securityReport = function() {
-	let immigration = 0, emigration = 0, secGrowth = 0, crimeGrowth = 0;
+	let immigration = 0;
+	let emigration = 0;
+	let secGrowth = 0;
+	let crimeGrowth = 0;
 	if (V.ACitizens > V.oldACitizens) {
 		immigration = V.ACitizens - V.oldACitizens;
 	} else {
@@ -332,7 +335,9 @@ App.SecExp.securityReport = function() {
 	if (V.SecExp.edicts.defense.militia >= 1 || activeUnits >= 1) {
 		r.push(`<br><br> <strong>Military</strong>:`);
 		if (V.SecExp.edicts.defense.militia >= 1) {
-			let recruitsMultiplier = 1, recruitLimit = 0, adjst;
+			let recruitsMultiplier = 1;
+			let recruitLimit = 0;
+			let adjst;
 
 			const SF = App.SecExp.assistanceSF('security', 'militia');
 			r.push(SF.text); recruitsMultiplier += SF.bonus;
diff --git a/src/Mods/SecExp/js/tradeReport.js b/src/Mods/SecExp/js/tradeReport.js
index a4f66dce2be442d3c85d86ad77990cb5de4e58a6..56fae46f3fb04064f2a1022961291d2b30c75c88 100644
--- a/src/Mods/SecExp/js/tradeReport.js
+++ b/src/Mods/SecExp/js/tradeReport.js
@@ -1,5 +1,7 @@
 App.SecExp.tradeReport = function() {
-	let r = [], tradeChange = 0, bonus = 0;
+	let r = [];
+	let tradeChange = 0;
+	let bonus = 0;
 	if (V.week < 30) {
 		r.push(`The world economy is in good enough shape to sustain economic growth. Trade flows liberally in all the globe.`);
 		tradeChange += 1;
diff --git a/src/Mods/SpecialForce/FirebaseTour.js b/src/Mods/SpecialForce/FirebaseTour.js
index ef6c3b9be6cc3186313de65eae9f7b814c906a80..6a629077790361e4bdf0c90622a8ff6372136de2 100644
--- a/src/Mods/SpecialForce/FirebaseTour.js
+++ b/src/Mods/SpecialForce/FirebaseTour.js
@@ -93,7 +93,7 @@ App.UI.firebaseTour = function() {
 		r.push(`raises a hand in greeting and nods. She is sprawled on a couch, wearing only her combat suit tank top and fingerless gloves. She's holding a near-empty bottle of strong liquor in her hand and you can see a naked slave ${girlU} kneeling on the floor between her legs. The Colonel has her legs wrapped tightly around the ${girlU}'s head, forcing the ${girlU} to service her if ${heU} wants to breathe. The Colonel is close to her climax then suddenly tenses her lower body, thus gripping the ${girlU} even tighter, and throws her head back in ecstasy as she orgasms. She lets out a long breath before finally releasing the ${girlU}, giving ${himU} a hard smack and shouting at ${himU} to fuck off.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(`The Colonel finishes off her bottle, tossing it over her shoulder then leaning back on the couch and spreading her legs wide. You look down briefly, falling into your habits of inspection. Her pussy is completely devoid of hair with heavy labia with a very large and hard clit peaking out. Beads of moisture, the result of her excitation, are visible, and you can tell from long experience that she would be tight as a vise. You return your gaze to her face to find her smirking at you. "Like what you see, ${App.SF.ColonelStatus()}?" She waves her hand at the plaza around her, "So do they. But you're not here for pussy. You're here to talk business. So, what's up?"`);
+		r.push(`The Colonel finishes off her bottle, tossing it over her shoulder then leaning back on the couch and spreading her legs wide. You look down briefly, falling into your habits of inspection. Her pussy is completely devoid of hair with heavy labia with a very large and hard clit peeking out. Beads of moisture, the result of her excitation, are visible, and you can tell from long experience that she would be tight as a vise. You return your gaze to her face to find her smirking at you. "Like what you see, ${App.SF.ColonelStatus()}?" She waves her hand at the plaza around her, "So do they. But you're not here for pussy. You're here to talk business. So, what's up?"`);
 	} else if (random(0, 100) > 50) {
 		r.push(`is in no condition initially to greet you. She's naked except for one sock that gives you a very good view of her muscled, taut body laid out across the couch with her feet on the table. She is face-down in a drugged-out stupor in the middle of a wide variety of powders and pills. Perhaps sensing your approach, her head suddenly shoots up and looks at you with unfocused, bloodshot eyes. "Sorry, ${App.SF.ColonelStatus()}," she slurs, wiping her face and weakly holding up a hand. "Hold on a second, I need something to help me out here. Long fucking night." She struggles to sit on the couch and bending over the table, loudly snorts up some of the white powder on it. "Ahhh, fuck," she says, breathing heavily.`);
 		App.Events.addParagraph(node, r);
diff --git a/src/Mods/SpecialForce/NamingColonel.js b/src/Mods/SpecialForce/NamingColonel.js
new file mode 100644
index 0000000000000000000000000000000000000000..89561e4f3b379809551c5f39fac47dad22528de1
--- /dev/null
+++ b/src/Mods/SpecialForce/NamingColonel.js
@@ -0,0 +1,221 @@
+App.UI.securityForceNamingColonel = function() {
+	const node = new DocumentFragment();
+	let r = [];
+	V.nextButton = " ";
+	if (V.SF.IntroProgress === -1) {
+		const {
+			heU, himU, hisU
+		} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
+		App.Events.addParagraph(node, [`You instruct ${V.assistant.name} to announce to the arcology's citizenry that you will be making an important announcement in the near future regarding the security situation. Given the damage still present from the Daughters' attack, everyone will be tuning in. You also instruct your assistant to begin quietly investigating potential leadership figures for the force itself. It's been a short while since you told your citizens that you were going to talk to them about their security, and by all accounts, they've turned out in force to watch your address over the arcology's internal communications system. You wake up early, relieve your frustrations on a few slaves woken out of deep sleep, and take position behind your desk. You also call over a slave and push ${himU} under your desk. The unspoken instruction is clear, and ${heU} begins enthusiastically ${(V.PC.dick > 0) ? `sucking your cock, taking it as deep as ${heU} can without gagging.` : `eating you out, pressing ${hisU} face into your pussy and forcing ${hisU} tongue deep inside you.`}`]);
+
+		App.Events.addParagraph(node, [`A blinking light tells you that the channel is open. You take a deep breath, and begin. You greet your citizens and explain that while you believe deeply in the underlying principles of the Free Cities, recent events have forced you to modify some of your views. The old world attack from the outside and the more recent assault by the Daughters of Liberty from within has proven that some form of permanent, organized standing force is needed to ensure the personal safety of the citizen body.`]);
+
+		App.Events.addParagraph(node, [`You tell them that the old world continues to deteriorate. You tell them that it is only a matter of time before the poor, diseased, starving, and unwashed masses try their hand at invading the arcology again. You tell them that such a force would be good for business, securing trade routes and conducting slaving raids far greater in scale than those performed by private slaving corporations. And finally, to quell their greatest fear, you tell them that you would personally support the force financially.`]);
+
+		App.Events.addParagraph(node, [`As you speak, you carefully monitor the citizens' opinions as indicated on their communication devices. It is uniformly positive — they know whom they have to thank for their continued survival and dominance. You also monitor your arousal given the ministrations of your slave. A few small movements on your part communicate to your citizens what is happening without being too obvious. Free Cities business etiquette respects business conducted while being subtly serviced (and your doing so during such a public and important broadcast signals how seriously you are taking it), but a climax would be seen as a serious lack of discipline.`]);
+
+		App.Events.addParagraph(node, [
+			`You finally wrap up your speech, declaring yourself Marshal of the newly-formed`,
+			App.UI.DOM.makeTextBox(V.SF.Lower, (v) => {
+				V.SF.Lower = v;
+				App.UI.reload();
+			})
+		]);
+
+		App.Events.addParagraph(node, [`You close the link to the communication system and read a message from your assistant that appeared during the last moments of your address. In consultation with major figures in the mercenary community, a suitable candidate for day-to-day command of the new unit has been found. Your instructions were to keep you in the dark about them so as to avoid prejudgment. They are waiting outside your office.`]);
+
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Invite them inside",
+			() => {
+				V.SF.IntroProgress = 1;
+			}, [], "Security Force Naming-Colonel",
+		));
+	} else if (V.SF.IntroProgress === 1) {
+		r.push(`The figure that enters is not what you were expecting, given your previous experiences with the mercenary groups that work with the arcology owners of the Free Cities. Most mercenaries you've worked with have been grizzled stout men, veterans of the old world militaries that finally had too much and went private. Instead, a woman walks in.`);
+		if (V.SF.Colonel.Core === "") {
+			r.push(`She strikes you as someone who is likely to be:`);
+			App.Events.addParagraph(node, r);
+			const temperamentMap = new Map([
+				["kind", "Kind"],
+				["cruel", "Cruel and psychopathic"],
+				["brazen", "A brazen warmonger"],
+				["jaded", "Jaded"],
+				["shell shocked", "Shell-shocked"],
+			]);
+
+			for (const [set, title] of temperamentMap) {
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+					title,
+					() => V.SF.Colonel.Core = set,
+					[],
+					"Security Force Naming-Colonel"
+				));
+			}
+		} else {
+			const {
+				HeU,
+				heU, himU, hisU, girlU
+			} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
+			App.Events.addParagraph(node, [
+				`She is likely to be`,
+				App.UI.DOM.makeElement("span", `${V.SF.Colonel.Core}.`, "bold")
+			]);
+			r.push(`She strides in, stopping in front of your desk,`);
+			switch (V.SF.Colonel.Core) {
+				case "kind":
+					r.push(`pulling off a laid-back salute with an easy grin.`);
+					break;
+				case "cruel":
+					r.push(`her eyes flashing a hard glare in an instant before quickly softening into those of someone who wants something you have.`);
+					break;
+				case "brazen":
+					r.push(`snapping off a textbook salute that decades of hard service grills into a veteran.`);
+					break;
+				default:
+					r.push(`not bothering to put on even the semi-military air (complete with salute) that most mercenaries tend to adopt when meeting new clients.`);
+			}
+			r.push(`She is very tall and wearing the pants, boots, gloves, and the tank top undershirt of a standard female combat uniform. Her bare arms and upper body are corded with muscle, and through the tank top's thin fabric you can see both the shape of her muscled abdomen and the curves of her small but perky breasts, complete with what your experience tells you are barbell nipple piercings. Her eyes are alive with intelligence, and you can see her scanning your office, clearly impressed by its opulence. Her hair is shaved close to the scalp, and her ears and nose are heavily pierced. You can make out three long, ugly scars running over top of the mottled tissue of a previous, severe burn along one side of her face, as well as numerous smaller scars and burns on her bare arms. She's been disarmed prior to meeting you; the pistol holster on her hip lies empty, as do at least three knife holsters about her person.`);
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			App.Events.addParagraph(node, [`Returning your gaze to her face, she crosses her arms underneath her chest, pressing her breasts up and forward. You have her measure. Given the generally patriarchal nature of both the mercenary community, and the same nature combined with the heavily sexualized lifestyle of the Free Cities, she's decided to embrace her position rather than fight it.`]);
+
+			r.push(`"So," she begins, "you're the boss." You invite her to sit down. "No thanks, boss. Besides," she`);
+			switch (V.SF.Colonel.Core) {
+				case "kind":
+					r.push(`playfully`);
+					break;
+				case "shell shocked":
+					r.push(`uncomfortably`);
+			}
+			r.push(`indicates the slave under your desk, "you look a little occupied." She nods at the camera across from you. "Saw the speech. Very nice. I'd heard you crazy bastards do business while getting`);
+			if (V.PC.dick > 0) {
+				r.push(`sucked off,`);
+			} else {
+				r.push(`eaten out,`);
+			}
+			r.push(`but I've never seen anyone actually do it. Hell, most of you people don't want to have to have too much to do with a merc like me. I usually get my instructions remotely."`);
+			switch (V.SF.Colonel.Core) {
+				case "brazen":
+				case "jaded":
+					r.push(`A short, harsh laugh escapes her. "But I guess it keeps you focused. Can't have the entire arcology seeing you cum."`);
+					break;
+				case "kind":
+					r.push(`She grins. "That kind of thing doesn't really bother me though."`);
+					break;
+				case "cruel":
+					r.push(`She frowns. "The client always seems to be happier that way."`);
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`She moves a step closer. "Your computer-helper-thing told me you wanted me to be a surprise, so I guess I'll tell you why you want me to run ${V.SF.Lower} for you. I'm a killer, pure and`);
+			if (V.SF.Colonel.Core === "cruel") {
+				r.push(`simple," she smiles, "and`);
+			} else {
+				r.push(`simple, and`);
+			}
+			r.push(`you need that. I looked into those attacks you've suffered. Nasty business. I'll make sure that an attack like that never happens again. I was a soldier out there, in charge of about a thousand men when the Free Cities first started going up, and I knew they were the future. Eventually I deserted, found the first refugee convoy I could, killed the moron protecting it, sold the girls off to slavers, and bought enough gear to start killing for people like you. Ran my own merc crew, did well till we tried to take on a bigger one and everyone died."`);
+			switch (V.SF.Colonel.Core) {
+				case "shell shocked":
+					r.push(`She looks away, caught in her own memories. It takes a solid minute before she starts again.`);
+					break;
+				case "cruel":
+					r.push(`Her smile grows.`);
+					break;
+				default:
+					r.push(`She pauses for a moment.`);
+			}
+			r.push(`"Joined with another big outfit, became the number two, then shit went bad and I had to run. Been a solo fighter and slaver ever since. I know my work, and I know I can make this work."`);
+
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`You feel your climax approaching and hold up a finger. The merc pauses while you grab the slave's head`);
+			if (V.PC.dick > 0) {
+				r.push(`then force your cock roughly down ${hisU} throat while you cum. ${HeU} swallows as much as ${heU} can before pulling`);
+			} else {
+				r.push(`tightly with your thighs, pressing ${hisU} face tightly against your pussy as you cum. When you release ${himU}, ${heU} pulls`);
+			}
+			r.push(`away, coughing.`);
+
+			App.Events.addParagraph(node, r);
+			r = [];
+			if (V.SF.Colonel.Core === "shell shocked") {
+				r.push(`The merc looks away again, letting the ${girlU} settle down before continuing.`);
+			} else {
+				r.push(`The merc laughs again. "I could get used to a place like this."`);
+			}
+			r.push(`She waves her hand around the office. "I bet you want to know why I'd be trustworthy for something like this." You don't correct her. "Thought so." Her demeanor softens, and you can detect a hit of nervousness. "I would say that I've never turned on a client and leave it at that, but this is different. It's getting worse out there. I'm sure you know that." You give her a slight nod. "Four times now I've woken up in the middle of the night and had to kill`);
+			if (V.SF.Colonel.Core === "shell shocked") {
+				r.push(`someone."`);
+			} else {
+				r.push(`someone. Two of them were the people I'd taken to bed. You can't even trust your drunken fucks anymore.`);
+				switch (V.SF.Colonel.Core) {
+					case "kind":
+						r.push(`It's a shame, but that's the world we live in."`);
+						break;
+					case "cruel":
+						r.push(`Then again, who doesn't like a good hard fuck and stab?"`);
+						break;
+					default:
+						r.push(`But what else is new?"`);
+				}
+			}
+
+			App.Events.addParagraph(node, r);
+			r = [];
+			if (V.SF.Colonel.Core === "jaded" || V.SF.Colonel.Core === "shell shocked") {
+				r.push(`"All I know how to do at this point is fight, and that's kept me alive this far.`);
+			} else {
+				r.push(`"I like fighting, but I want to live somewhere where I can relax from life out there.`);
+			}
+			r.push(`You give me the job and a place to live, let me hang up the uncertainty of being a merc, and I'll die for you if it comes to that. I promise the people I recruit will feel the same. Besides," she grins, "I could get used to`);
+
+			switch (V.SF.Colonel.Core) {
+				case "brazen":
+					r.push(`crushing any enemy that looks our way."`);
+					break;
+				case "cruel": {
+					r.push(`having my own stable to abuse as I see fit. A terrified little slave${getNonlocalPronouns(V.seeDicks).noun} locked between my legs, struggling to breathe?"`);
+					break;
+				}
+				default:
+					r.push(`spending my R&R time with a cold beer in one hand, a few lines of coke or a stack of pills in front of me."`);
+			}
+			r.push(`A glint runs through her eyes. "Sounds like a good fucking time."`);
+			App.Events.addParagraph(node, r);
+
+			App.Events.addParagraph(node, [`You quickly decide she'll do. You tap a few commands on your desk's console, assigning her personal quarters on the arcology's higher levels and transferring her first stipend to her new account. You also ask her what title she wants.`]);
+
+			App.Events.addParagraph(node, [`"Title?" Another short laugh. "I guess I do need one, given that I'm all official and shit now." She thinks for a moment. "I was a major before I went freelance, and I think I'd like a promotion. Colonel sounds good." You make a note of this in her file. "You people don't seal contracts with a fuck do you?" Reassuring her you don't, she laughs again. "Good. I make it a point never to fuck the boss. It's bad for business." She turns around. "Well, I guess I'd better get to it. Your helper-thing assigned me space on the lower levels for the firebase. I brought a few squads of guys I know from the old days to start, but we'll grow fast once I put the word out, I guarantee it."`]);
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.passageLink(
+				"Let her leave",
+				"Security Force Naming-Colonel",
+				() => V.SF.IntroProgress = 2
+			));
+		}
+	} else if (V.SF.IntroProgress === 2) {
+		V.nextLink = "RIE Eligibility Check";
+		V.nextButton = "Continue";
+		App.Utils.scheduleSidebarRefresh();
+		delete V.SF.IntroProgress;
+
+		App.Events.addParagraph(node, [`She turns and leaves, and you chase the slave out after her. A few minutes later, a soft chime announces the arrival of a message. It's from The Colonel.`]);
+
+		r.push(`Hey boss, just wanted to mention something else. In your speech you said that you were going to be paying for ${V.SF.Lower}. In my mind that means it's yours, no matter what anyone else here might think. I do what you tell me to do. I make sure the troops behave as you want them to behave. I've worked for some 'nice guys' in the past, and I can do that job if you want. It's boring, but sustainable, and I'll have ${V.SF.Lower} turning a profit and supporting the arcology in good order. But if you let me`);
+		if (V.SF.Colonel.Core === "cruel") {
+			r.push(`off the leash`);
+		} else {
+			r.push(`do what I do`);
+		}
+		r.push(`and throw any old world complaints in the trash where they belong, I promise you'll have money pouring into your coffers, even accounting for the good amounts me and my boys will pocket along the way. You'll have an empire in short order.`);
+		if (V.mercenaries > 1) {
+			r.push(`Either way, I'll keep my hands off those mercs you've already installed. I figure that you've reasons for having two different death squads under contract.`);
+		}
+		App.Events.addNode(node, r, "p", "note");
+
+		App.Events.addNode(node, [`Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arc owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like.`], "p", "note");
+
+		App.Events.addNode(node, [`Talk to you later, boss.`], "p", "note");
+	}
+	return node;
+};
diff --git a/src/Mods/SpecialForce/NamingColonel.tw b/src/Mods/SpecialForce/NamingColonel.tw
deleted file mode 100644
index e4f6de0109dc0cb8306adb9eb2cb4f08a71017e3..0000000000000000000000000000000000000000
--- a/src/Mods/SpecialForce/NamingColonel.tw
+++ /dev/null
@@ -1,150 +0,0 @@
-:: Security Force Naming-Colonel [nobr]
-
-<<set $nextButton = " ">>
-<<if $SF.IntroProgress === -1>>
-	<<setNonlocalPronouns $seeDicks>>
-	You instruct $assistant.name to announce to the arcology's citizenry that you will be making an important announcement in the near future regarding the security situation. Given the damage still present from the Daughters' attack, everyone will be tuning in. You also instruct your assistant to begin quietly investigating potential leadership figures for the force itself.
-	It's been a short while since you told your citizens that you were going to talk to them about their security, and by all accounts, they've turned out in force to watch your address over the arcology's internal communications system. You wake up early, relieve your frustrations on a few slaves woken out of deep sleep, and take position behind your desk. You also call over a slave and push _himU under your desk. The unspoken instruction is clear, and _heU begins enthusiastically
-	<<if $PC.dick > 0>>
-		sucking your cock, taking it as deep as _heU can without gagging.
-	<<else>>
-		eating you out, pressing _hisU face into your pussy and forcing _hisU tongue deep inside you.
-	<</if>>
-
-	<br><br>
-	A blinking light tells you that the channel is open. You take a deep breath, and begin. You greet your citizens and explain that while you believe deeply in the underlying principles of the Free Cities, recent events have forced you to modify some of your views. The old world attack from the outside and the more recent assault by the Daughters of Liberty from within has proven that some form of permanent, organized standing force is needed to ensure the personal safety of the citizen body.
-	<br><br>
-	You tell them that the old world continues to deteriorate. You tell them that it is only a matter of time before the poor, diseased, starving, and unwashed masses try their hand at invading the arcology again. You tell them that such a force would be good for business, securing trade routes and conducting slaving raids far greater in scale than those performed by private slaving corporations. And finally, to quell their greatest fear, you tell them that you would personally support the force financially.
-	<br><br>
-	As you speak, you carefully monitor the citizens' opinions as indicated on their communication devices. It is uniformly positive — they know whom they have to thank for their continued survival and dominance. You also monitor your arousal given the ministrations of your slave. A few small movements on your part communicate to your citizens what is happening without being too obvious. Free Cities business etiquette respects business conducted while being subtly serviced (and your doing so during such a public and important broadcast signals how seriously you are taking it), but a climax would be seen as a serious lack of discipline.
-	<br><br>
-	You finally wrap up your speech, declaring yourself Marshal of the newly-formed <<textbox "$SF.Lower" $SF.Lower "Security Force Naming-Colonel">>
-	<br><br>
-	You close the link to the communication system and read a message from your assistant that appeared during the last moments of your address. In consultation with major figures in the mercenary community, a suitable candidate for day-to-day command of the new unit has been found. Your instructions were to keep you in the dark about them so as to avoid prejudgment. They are waiting outside your office.
-	<br><br>
-	[[Invite them inside|Security Force Naming-Colonel][$SF.IntroProgress = 1]]
-<<elseif $SF.IntroProgress === 1>>
-	The figure that enters is not what you were expecting, given your previous experiences with the mercenary groups that work with the arcology owners of the Free Cities. Most mercenaries you've worked with have been grizzled stout men, veterans of the old world militaries that finally had too much and went private. Instead, a woman walks in.
-	<<if $SF.Colonel.Core === "">>
-		She strikes you as someone who is likely to be:
-		<br><br>[[Kind|Security Force Naming-Colonel][$SF.Colonel.Core = "kind"]]
-		<br>[[Cruel and psychopathic|Security Force Naming-Colonel][$SF.Colonel.Core = "cruel"]]
-		<br>[[A brazen warmonger|Security Force Naming-Colonel][$SF.Colonel.Core = "brazen"]]
-		<br>[[Jaded|Security Force Naming-Colonel][$SF.Colonel.Core = "jaded"]]
-		<br>[[Shell-shocked|Security Force Naming-Colonel][$SF.Colonel.Core = "shell shocked"]]
-	<<else>>
-		<<setNonlocalPronouns $seeDicks>>
-		She is likely to be ''$SF.Colonel.Core''.
-		<br><br>
-		She strides in, stopping in front of your desk,
-		<<switch $SF.Colonel.Core>>
-		<<case "kind">>
-			pulling off a laid-back salute with an easy grin.
-		<<case "cruel">>
-			her eyes flashing a hard glare in an instant before quickly softening into those of someone who wants something you have.
-		<<case "brazen">>
-			snapping off a textbook salute that decades of hard service grills into a veteran.
-		<<default>>
-			not bothering to put on even the semi-military air (complete with salute) that most mercenaries tend to adopt when meeting new clients.
-		<</switch>>
-		She is very tall and wearing the pants, boots, gloves, and the tank top undershirt of a standard female combat uniform. Her bare arms and upper body are corded with muscle, and through the tank top's thin fabric you can see both the shape of her muscled abdomen and the curves of her small but perky breasts, complete with what your experience tells you are barbell nipple piercings. Her eyes are alive with intelligence, and you can see her scanning your office, clearly impressed by its opulence. Her hair is shaved close to the scalp, and her ears and nose are heavily pierced. You can make out three long, ugly scars running over top of the mottled tissue of a previous, severe burn along one side of her face, as well as numerous smaller scars and burns on her bare arms. She's been disarmed prior to meeting you; the pistol holster on her hip lies empty, as do at least three knife holsters about her person.
-		<br><br>
-		Returning your gaze to her face, she crosses her arms underneath her chest, pressing her breasts up and forward. You have her measure. Given the generally patriarchal nature of both the mercenary community, and the same nature combined with the heavily sexualized lifestyle of the Free Cities, she's decided to embrace her position rather than fight it.
-		<br><br>
-		"So," she begins, "you're the boss." You invite her to sit down. "No thanks, boss. Besides," she
-		<<switch $SF.Colonel.Core>>
-			<<case "kind">> playfully
-			<<case "shell shocked">> uncomfortably
-		<</switch>>
-		indicates the slave under your desk, "you look a little occupied." She nods at the camera across from you. "Saw the speech. Very nice. I'd heard you crazy bastards do business while getting
-		<<if $PC.dick > 0>>sucked off<<else>>eaten out<</if>>,
-		but I've never seen anyone actually do it. Hell, most of you people don't want to have to have too much to do with a merc like me. I usually get my instructions remotely."
-		<<switch $SF.Colonel.Core>>
-		<<case "brazen" "jaded">>
-			A short, harsh laugh escapes her. "But I guess it keeps you focused. Can't have the entire arcology seeing you cum."
-		<<case "kind">>
-			She grins. "That kind of thing doesn't really bother me though."
-		<<case "cruel">>
-			She frowns. "The client always seems to be happier that way."
-		<</switch>>
-		<br><br>
-		She moves a step closer. "Your computer-helper-thing told me you wanted me to be a surprise, so I guess I'll tell you why you want me to run $SF.Lower for you. I'm a killer, pure and simple,<<if $SF.Colonel.Core === "cruel">>" she smiles, "<<else>> <</if>>and you need that. I looked into those attacks you've suffered. Nasty business. I'll make sure that an attack like that never happens again. I was a soldier out there, in charge of about a thousand men when the Free Cities first started going up, and I knew they were the future. Eventually I deserted, found the first refugee convoy I could, killed the moron protecting it, sold the girls off to slavers, and bought enough gear to start killing for people like you. Ran my own merc crew, did well till we tried to take on a bigger one and everyone died."
-		<<switch $SF.Colonel.Core>>
-		<<case "shell shocked">>
-			She looks away, caught in her own memories. It takes a solid minute before she starts again.
-		<<case "cruel">>
-			Her smile grows.
-		<<default>>
-			She pauses for a moment.
-		<</switch>>
-		"Joined with another big outfit, became the number two, then shit went bad and I had to run. Been a solo fighter and slaver ever since. I know my work, and I know I can make this work."
-
-		<br><br>
-		You feel your climax approaching and hold up a finger. The merc pauses while you grab the slave's head
-		<<if $PC.dick > 0>>
-			then force your cock roughly down _hisU throat while you cum. _HeU swallows as much as _heU can before pulling
-		<<else>>
-			tightly with your thighs, pressing _hisU face tightly against your pussy as you cum. When you release _himU, _heU pulls
-		<</if>>
-		away, coughing.
-
-		<br><br>
-		<<if $SF.Colonel.Core === "shell shocked">>
-			The merc looks away again, letting the _girlU settle down before continuing.
-		<<else>>
-			The merc laughs again. "I could get used to a place like this."
-		<</if>>
-		She waves her hand around the office. "I bet you want to know why I'd be trustworthy for something like this." You don't correct her. "Thought so." Her demeanor softens, and you can detect a hit of nervousness. "I would say that I've never turned on a client and leave it at that, but this is different. It's getting worse out there. I'm sure you know that." You give her a slight nod. "Four times now I've woken up in the middle of the night and had to kill
-		<<if $SF.Colonel.Core == "shell shocked">>
-			someone."
-		<<else>>
-			someone. Two of them were the people I'd taken to bed. You can't even trust your drunken fucks anymore.
-			<<switch $SF.Colonel.Core>>
-			<<case "kind">>
-				It's a shame, but that's the world we live in."
-			<<case "cruel">>
-				Then again, who doesn't like a good hard fuck and stab?"
-			<<default>>
-				But what else is new?"
-			<</switch>>
-		<</if>>
-
-		<br><br>
-		<<if $SF.Colonel.Core == "jaded" || $SF.Colonel.Core == "shell shocked">>
-			"All I know how to do at this point is fight, and that's kept me alive this far.
-		<<else>>
-			"I like fighting, but I want to live somewhere where I can relax from life out there.
-		<</if>>
-		You give me the job and a place to live, let me hang up the uncertainty of being a merc, and I'll die for you if it comes to that. I promise the people I recruit will feel the same. Besides," she grins, "I could get used to
-		<<switch $SF.Colonel.Core>>
-		<<case "brazen">>
-			crushing any enemy that looks our way."
-		<<case "cruel">>
-			<<setNonlocalPronouns $seeDicks>>
-			having my own stable to abuse as I see fit. A terrified little slave<<= _girlU>> locked between my legs, struggling to breathe?"
-		<<default>>
-			spending my R&R time with a cold beer in one hand, a few lines of coke or a stack of pills in front of me."
-		<</switch>>
-		A glint runs through her eyes. "Sounds like a good fucking time."
-		<br><br>
-		You quickly decide she'll do. You tap a few commands on your desk's console, assigning her personal quarters on the arcology's higher levels and transferring her first stipend to her new account. You also ask her what title she wants.
-		<br><br>
-		"Title?" Another short laugh. "I guess I do need one, given that I'm all official and shit now." She thinks for a moment. "I was a major before I went freelance, and I think I'd like a promotion. Colonel sounds good." You make a note of this in her file. "You people don't seal contracts with a fuck do you?" Reassuring her you don't, she laughs again. "Good. I make it a point never to fuck the boss. It's bad for business." She turns around. "Well, I guess I'd better get to it. Your helper-thing assigned me space on the lower levels for the firebase. I brought a few squads of guys I know from the old days to start, but we'll grow fast once I put the word out, I guarantee it."
-		<br><br>
-		[[Let her leave|Security Force Naming-Colonel][$SF.IntroProgress = 2]]
-	<</if>>
-<<elseif $SF.IntroProgress === 2>>
-	<<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">>
-	<<run delete $SF.IntroProgress>>
-
-	She turns and leaves, and you chase the slave out after her. A few minutes later, a soft chime announces the arrival of a message. It's from The Colonel.
-	<br><br>
-	//Hey boss, just wanted to mention something else. In your speech you said that you were going to be paying for $SF.Lower. In my mind that means it's yours, no matter what anyone else here might think. I do what you tell me to do. I make sure the troops behave as you want them to behave. I've worked for some 'nice guys' in the past, and I can do that job if you want. It's boring, but sustainable, and I'll have $SF.Lower turning a profit and supporting the arcology in good order. But if you let me <<if $SF.Colonel.Core === "cruel">>off the leash<<else>>do what I do<</if>> and throw any old world complaints in the trash where they belong, I promise you'll have money pouring into your coffers, even accounting for the good amounts me and my boys will pocket along the way. You'll have an empire in short order.
-	<<if $mercenaries > 1>>
-		Either way, I'll keep my hands off those mercs you've already installed. I figure that you've reasons for having two different death squads under contract.
-	<</if>>
-	<br><br>
-	Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arc owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like.
-	<br><br>
-	Talk to you later, boss.//
-<</if>>
diff --git a/src/Mods/SpecialForce/Proposal.js b/src/Mods/SpecialForce/Proposal.js
index 2c5aeacf882351e9f0136c4400963481ed0b8cc1..b82e8581b093949bf83074dc52b799ca9c94f421 100644
--- a/src/Mods/SpecialForce/Proposal.js
+++ b/src/Mods/SpecialForce/Proposal.js
@@ -9,7 +9,7 @@ App.Events.SecurityForceProposal = class SecurityForceProposal extends App.Event
 
 	execute(node) {
 		V.nextButton = " ";
-		let _price = 20000;
+		let price = 20000;
 		App.Events.addParagraph(node, [`The Free Cities were founded on the principles of unrestrained anarcho-capitalism. To those with such beliefs, the very idea of possessing an armed force, a key tool of government control, or weapons at all, was anathema.`]);
 
 		App.Events.addParagraph(node, [`In the period since, however, your citizens have seen the value in weaponry. They watched on their news-feed as some Free Cities were sacked by the armies and mobs of the old world, driven by their hatred of the citizens' luxurious lifestyles. They've seen other Cities toppled from within, by slave conspiracies or infighting among citizen groupings with differing beliefs. They've witnessed the distressingly rapid rise of fanatical anti-slavery organizations, who would like nothing more than to see them slowly bled by their own chattel. They are learned people, and they know what happens to slaveowners who lose their power.`]);
@@ -24,16 +24,16 @@ App.Events.SecurityForceProposal = class SecurityForceProposal extends App.Event
 		]);
 
 		if (V.PC.skill.warfare >= 100) {
-			_price *= 0.5;
+			price *= 0.5;
 		} else if (V.PC.skill.warfare >= 50 || V.PC.career === "arcology owner") {
-			_price *= 0.75;
+			price *= 0.75;
 		}
 
 		const choices = [];
 		choices.push(new App.Events.Result(`Prepare for an announcement`, announce,
 			App.Events.makeNode([
 				`Initial costs are`,
-				App.UI.DOM.makeElement("span", cashFormat(_price), ["cash", "inc"]),
+				App.UI.DOM.cashFormat(price),
 				`and upon establishment the force will have significant support costs until it is self-sufficient.`
 			])
 		));
@@ -45,7 +45,7 @@ App.Events.SecurityForceProposal = class SecurityForceProposal extends App.Event
 			V.SF.Active = 1;
 			V.SF.IntroProgress = -1;
 			App.SF.Init();
-			cashX(forceNeg(_price), "specialForcesCap");
+			cashX(forceNeg(price), "specialForcesCap");
 			Engine.play("Security Force Naming-Colonel");
 			return ``;
 		}
diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js
index c79e4080ed8a800982d04b27a33f8d89a28bc8e8..633404b9f0966c154ecd5730bfba950b74fc0bce 100644
--- a/src/Mods/SpecialForce/SpecialForce.js
+++ b/src/Mods/SpecialForce/SpecialForce.js
@@ -186,7 +186,7 @@ App.SF.fsIntegration = (function() {
 		menu,
 		flavourText,
 		badOutcome,
-		badOutcome_Firebase
+		badOutcomeFirebase
 	};
 
 	function list() {
@@ -207,13 +207,27 @@ App.SF.fsIntegration = (function() {
 	}
 
 	function selectedFSText(x) {
-		let gift, dec, foods, media,
-			slaves, cages, commonArea,
-			barracks, armory, commandCenter,
-			drugLab, personalItems, droneBay,
-			garage, vehicle, hangar,
-			aircraft, luxuries, perimeter,
-			roleplaying, colonel;
+		let gift;
+		let dec;
+		let foods;
+		let media;
+		let slaves;
+		let cages;
+		let commonArea;
+		let barracks;
+		let armory;
+		let commandCenter;
+		let drugLab;
+		let personalItems;
+		let droneBay;
+		let garage;
+		let vehicle;
+		let hangar;
+		let aircraft;
+		let luxuries;
+		let perimeter;
+		let roleplaying;
+		let colonel;
 		switch(x) {
 			case 'Repopulation':
 				const hyperPreg0 = V.seeHyperPreg > 0 ? 'hyper-' : '';
@@ -1146,7 +1160,7 @@ App.SF.fsIntegration = (function() {
 		return r;
 	}
 
-	function badOutcome_Firebase(){
+	function badOutcomeFirebase(){
 		const x = `Visiting the Firebase just takes you to`;
 		switch (V.SF.FS.BadOutcome) {
 			case 'MIGRATION':
diff --git a/src/Mods/SpecialForce/TrickShotNight.js b/src/Mods/SpecialForce/TrickShotNight.js
index c8ffdc81188bab43edaa74c34c443cdab451e5f0..d596ae01d4b03d56b8418b2057376d2e9e9285b5 100644
--- a/src/Mods/SpecialForce/TrickShotNight.js
+++ b/src/Mods/SpecialForce/TrickShotNight.js
@@ -118,7 +118,7 @@ App.Events.TrickShotNight = class TrickShotNight extends App.Events.BaseEvent {
 						cashX(-buyIn, "event");
 					} else {
 						soldier.clothes = "no clothing";
-						App.Event.refreshEventArt(soldier);
+						App.Events.refreshEventArt(soldier);
 						r.push(`For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck has rendered you the victor. A silence falls over the room as the result is declared, but after some time your opponent breaks the hush by joking that life as your slave is probably easier than fighting for ${V.arcologies[0].name}. After some awkward laughter the night continues, and at the end your former mercenary joins you on your trip back to the penthouse to submit to processing and to begin ${his} new life as your sexual servant. ${He}'s not young, but ${he}'s tough and not distrusting of you due to ${his} service in ${V.SF.Lower}.`);
 						r.push(App.UI.newSlaveIntro(soldier));
 					}
diff --git a/src/Mods/SpecialForce/editSF.js b/src/Mods/SpecialForce/editSF.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc4c3a9ffaa6a160a3445ac45ed9571953452176
--- /dev/null
+++ b/src/Mods/SpecialForce/editSF.js
@@ -0,0 +1,92 @@
+App.UI.editSF = function() {
+	const node = new DocumentFragment();
+
+	for (let i in V.SF.Squad) {
+		const v = String([i]);
+		if (V.SF.Squad[i] > App.SF.upgrades.currentUnitMax(v)) {
+			V.SF.Squad[i] = App.SF.upgrades.currentUnitMax(v);
+		}
+	}
+
+	const max = App.SF.upgrades.max();
+	const T1 = App.SF.unlocked.secondTier();
+	const size = App.SF.upgrades.total();
+
+	let options = new App.UI.OptionsGroup();
+
+	App.UI.DOM.appendNewElement("h2", node, `Upgrades: ${size}/${max} (${(100 * size / max).toFixed(2)}%)`);
+
+	options.addOption(`Firebase`, "Firebase", V.SF.Squad).showTextBox()
+		.addComment(`current max ${App.SF.upgrades.currentUnitMax('Firebase')}`);
+	options.addOption(`Armoury`, "Armoury", V.SF.Squad).showTextBox()
+		.addComment(`current max ${App.SF.upgrades.currentUnitMax('Armoury')}`);
+	options.addOption(`Drugs`, "Drugs", V.SF.Squad).showTextBox()
+		.addComment(`current max ${App.SF.upgrades.currentUnitMax('Drugs')}`);
+
+	if (V.SF.Squad.Firebase >= 2) {
+		options.addOption(`Drones`, "Drones", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('Drones')}`);
+	}
+
+	if (App.SF.unlocked.garage()) {
+		options.addCustom(App.UI.DOM.makeElement("h2", `Garage`));
+		options.addOption(`Attack Vehicles`, "AV", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('AV')}`);
+		options.addOption(`Transport Vehicles`, "TV", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('TV')}`);
+		if (T1) {
+			options.addOption(`Prototype Goliath Tank`, "PGT", V.SF.Squad).showTextBox()
+				.addComment(`current max ${App.SF.upgrades.currentUnitMax('PGT')}`);
+		}
+	}
+
+	if (App.SF.unlocked.hangar()) {
+		options.addCustom(App.UI.DOM.makeElement("h2", `Hangar`));
+		options.addOption(`Attack Planes`, "AA", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('AA')}`);
+		options.addOption(`Transport Planes`, "TA", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('TA')}`);
+		if (T1) {
+			options.addOption(`Spaceplane`, "SpacePlane", V.SF.Squad).showTextBox()
+				.addComment(`current max ${App.SF.upgrades.currentUnitMax('SpacePlane')}`);
+			options.addOption(`Gunship`, "GunS", V.SF.Squad).showTextBox()
+				.addComment(`current max ${App.SF.upgrades.currentUnitMax('GunS')}`);
+		}
+	}
+
+	if (App.SF.unlocked.launchBay()) {
+		options.addCustom(App.UI.DOM.makeElement("h2", `Launch Bay`));
+		options.addOption(`Satellite`, "Satellite", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('Satellite')}`);
+		if (V.terrain !== "oceanic") {
+			options.addOption(`Giant Robot`, "GiantRobot", V.SF.Squad).showTextBox()
+				.addComment(`current max ${App.SF.upgrades.currentUnitMax('GiantRobot')}`);
+		}
+		options.addOption(`Cruise Missile`, "MissileSilo", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('MissileSilo')}`);
+	}
+
+	if (App.SF.unlocked.navalYard()) {
+		options.addCustom(App.UI.DOM.makeElement("h2", `Naval Yard`));
+		options.addOption(`Aircraft Carrier`, "AircraftCarrier", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('AircraftCarrier')}`);
+		options.addOption(`Submarine`, "Sub", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('Sub')}`);
+		options.addOption(`Amphibious Transport`, "HAT", V.SF.Squad).showTextBox()
+			.addComment(`current max ${App.SF.upgrades.currentUnitMax('HAT')}`);
+	}
+
+	node.append(options.render());
+
+	if (V.SF.FS.Tension !== -1) {
+		App.Events.addParagraph(node, [
+			`The Colonel's current Tension:`,
+			App.UI.DOM.makeTextBox(V.SF.FS.Tension, (v) => {
+				V.SF.FS.Tension = v;
+				App.UI.reload();
+			})
+		]);
+	}
+
+	return node;
+};
diff --git a/src/Mods/SpecialForce/editSF.tw b/src/Mods/SpecialForce/editSF.tw
deleted file mode 100644
index f66a5b9a515cbc7a2ea05c952afabf8487f74b92..0000000000000000000000000000000000000000
--- a/src/Mods/SpecialForce/editSF.tw
+++ /dev/null
@@ -1,59 +0,0 @@
-:: editSF [nobr]
-
-<<script>>
-for (let i in V.SF.Squad) {
-	const v = String([i]);
-	if (V.SF.Squad[i] > App.SF.upgrades.currentUnitMax(v)) {
-		V.SF.Squad[i] = App.SF.upgrades.currentUnitMax(v);
-	}
-}
-<</script>>
-
-<<set _max = App.SF.upgrades.max(), _T1 = App.SF.unlocked.secondTier(), _size = App.SF.upgrades.total(),
-$nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", _options = new App.UI.OptionsGroup()>>
-
-__Upgrades__: _size/_max(<<= (_size/_max).toFixed(2)>>%)
-<<run _options.addOption("<strong>Firebase:</strong> (current max <<= App.SF.upgrades.currentUnitMax('Firebase')>>)", "Firebase", V.SF.Squad).showTextBox()>>
-<<run _options.addOption("<strong>Armoury: </strong (current max <<= App.SF.upgrades.currentUnitMax('Armoury')>>)", "Armoury", V.SF.Squad).showTextBox()>>
-<<run _options.addOption("<strong>Drugs: </strong (current max <<= App.SF.upgrades.currentUnitMax('Drugs')>>)", "Drugs", V.SF.Squad).showTextBox()>>
-
-<<if $SF.Squad.Firebase >= 2>>
-	<<run _options.addOption("<strong>Drones: </strong (current max <<= App.SF.upgrades.currentUnitMax('Drones')>>)", "Drones", V.SF.Squad).showTextBox()>>
-<</if>>
-
-<<if App.SF.unlocked.garage()>>
-	<<run _options.addOption("<strong>Garage:</strong><br>&nbsp;&nbsp;<strong>Attack Vehicles: </strong (current max <<= App.SF.upgrades.currentUnitMax('AV')>>)", "AV", V.SF.Squad).showTextBox()>>
-	<<run _options.addOption("&nbsp;&nbsp;<strong>Transport Vehicles: </strong (current max <<= App.SF.upgrades.currentUnitMax('TV')>>)", "TV", V.SF.Squad).showTextBox()>>
-	<<if _T1>>
-		<<run _options.addOption("&nbsp;<strong>Prototype Goliath Tank: </strong (current max <<= App.SF.upgrades.currentUnitMax('PGT')>>)", "PGT", V.SF.Squad).showTextBox()>>
-	<</if>>
-<</if>>
-
-<<if App.SF.unlocked.hangar()>>
-	<<run _options.addOption("<strong>Hangar:</strong><br>&nbsp;&nbsp;<strong>Attack Planes: </strong (current max <<= App.SF.upgrades.currentUnitMax('AA')>>)", "AA", V.SF.Squad).showTextBox()>>
-	<<run _options.addOption("&nbsp;&nbsp;<strong>Transport Planes: </strong (current max <<= App.SF.upgrades.currentUnitMax('TA')>>)", "TA", V.SF.Squad).showTextBox()>>
-	<<if _T1>>
-		<<run _options.addOption("&nbsp;<strong>Spaceplane: </strong (current max <<= App.SF.upgrades.currentUnitMax('SpacePlane')>>)", "SpacePlane", V.SF.Squad).showTextBox()>>
-		<<run _options.addOption("&nbsp;<strong>Gunship: </strong (current max <<= App.SF.upgrades.currentUnitMax('GunS')>>)", "GunS", V.SF.Squad).showTextBox()>>
-	<</if>>
-<</if>>
-
-<<if App.SF.unlocked.launchBay()>>
-	<<run _options.addOption("<strong>Launch Bay:</strong><br>&nbsp;<strong>Satellite: </strong (current max <<= App.SF.upgrades.currentUnitMax('Satellite')>>)", "Satellite", V.SF.Squad).showTextBox()>>
-	<<if $terrain != "oceanic">>
-		<<run _options.addOption("&nbsp;<strong>Giant Robot: </strong (current max <<= App.SF.upgrades.currentUnitMax('GiantRobot')>>)", "GiantRobot", V.SF.Squad).showTextBox()>>
-	<</if>>
-	<<run _options.addOption("&nbsp;<strong>Cruise Missile: </strong (current max <<= App.SF.upgrades.currentUnitMax('MissileSilo')>>)", "MissileSilo", V.SF.Squad).showTextBox()>>
-<</if>>
-
-<<if App.SF.unlocked.navalYard()>>
-	<<run _options.addOption("<br><br><strong>Naval Yard:</strong><br>&nbsp;<strong>Aircraft Carrier: </strong (current max <<= App.SF.upgrades.currentUnitMax('AircraftCarrier')>>)", "AircraftCarrier", V.SF.Squad).showTextBox()>>
-	<<run _options.addOption("&nbsp;<strong>Submarine: </strong (current max <<= App.SF.upgrades.currentUnitMax('Sub')>>)", "Sub", V.SF.Squad).showTextBox()>>
-	<<run _options.addOption("&nbsp;<strong>Amphibious Transport: </strong (current max <<= App.SF.upgrades.currentUnitMax('HAT')>>)", "HAT", V.SF.Squad).showTextBox()>>
-<</if>>
-
-<<includeDOM _options.render()>>
-
-<<if $SF.FS.Tension !== -1>>
-	<br><br>The Colonel's current Tension: <<textbox "$SF.FS.Tension" $SF.FS.Tension "editSF">>
-<</if>>
diff --git a/src/art/artJS.js b/src/art/artJS.js
index bdf0b497057589f907150f6571a98fa80d95c92e..6c759a847392041f847cbc25748d82db073d8641 100644
--- a/src/art/artJS.js
+++ b/src/art/artJS.js
@@ -13,7 +13,7 @@ Macro.add("SlaveArt", {
 App.Art.SlaveArtBatch = class {
 	/** Prepare to render art in the same format for multiple slaves within a single passage context.
 	 * Do not persist this object across passage contexts.
-	 * @param {number[]} artSlaveIDs
+	 * @param {Iterable<number>} artSlaveIDs
 	 * @param {number} artSize Image size/center:
 	 * * 3: Large, right. Example: long slave description.
 	 * * 2: Medium, right. Example: random events.
@@ -151,9 +151,6 @@ App.Art.errorHandler = function(event, message) {
 		case 3:
 			App.Art.webglErrorMessage = "Version mismatch.\nUpdate the assets using the link in Game Options.";
 			break;
-		case 4: // temporary option
-			App.Art.webglErrorMessage = "Could not find art assets.\nOlder versions need to be updated using\nthe download link in Game Options.";
-			break;
 	}
 
 	// fire event to art elements
@@ -183,7 +180,7 @@ App.Art.webglInitialize = function() {
 
 			// start Webgl engine, textures are streamed asynchronously
 			App.Art.engine = new App.Art.Engine();
-			App.Art.engine.bind(sceneData, scene);
+			App.Art.engine.bind(sceneData, scene, "");
 			App.Art.engineReady = true;
 
 			// when ready, fire event to art elements to start rendering
@@ -204,7 +201,7 @@ App.Art.webglInitialize = function() {
 	let load = document.createElement("script");
 	load.onload = function() {
 		// but only if version is correct
-		if (App.Art.version === "1.3") {
+		if (App.Art.version === "1.5") {
 			document.head.appendChild(script);
 		} else {
 			App.Art.errorHandler("engineFailed", 3);
@@ -212,7 +209,7 @@ App.Art.webglInitialize = function() {
 		}
 	};
 	load.onerror = function() {
-		App.Art.errorHandler("engineFailed", 4); // temporary display different message until next update
+		App.Art.errorHandler("engineFailed", 2);
 		LoadScreen.unlock(loadLockID);
 	};
 	load.src = "resources/webgl/load.js";
@@ -234,19 +231,20 @@ App.Art.webglArtElement = function(slave, artSize) {
 		// when engine is ready, attach default scene to new slaves
 		if (!(slave.ID in App.Art.scenes)) {
 			App.Art.scenes[slave.ID] = JSON.parse(JSON.stringify(App.Art.defaultScene));
+			App.Art.Frame(slave, App.Art.scenes[slave.ID]);
 		}
 		let scene = App.Art.scenes[slave.ID];
 
 		// apply the model transforms
-		App.Art.applyFigures(slave, scene);
-		App.Art.applySurfaces(slave, scene);
-		App.Art.applyMaterials(slave, scene);
-		App.Art.applyMorphs(slave, scene);
-		App.Art.Frame(slave, scene);
+		let p = App.Art.getArtParams();
+		App.Art.applyFigures(slave, scene, p);
+		App.Art.applySurfaces(slave, scene, p);
+		App.Art.applyMaterials(slave, scene, p);
+		App.Art.applyMorphs(slave, scene, p);
 
 		// create UI and render based on active view
 		container.innerText = "";
-		App.Art.createWebglUI(container, slave, artSize, scene);
+		App.Art.createWebglUI(container, slave, artSize, scene, p);
 	});
 
 	container.addEventListener("engineFailed", function() {
@@ -546,7 +544,7 @@ globalThis.extractColor = (function() {
 		["seagreen", "#2e8b57"],
 		["seashell", "#fff5ee"],
 		["sienna", "#a0522d"],
-		["skyblue", "#87ceeb"],
+		["sky-blue", "#87ceeb"],
 		["slateblue", "#6a5acd"],
 		["slategray", "#708090"],
 		["snow", "#fffafa"],
diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js
index ca812876a7b47b147b6bddc006d00adf52b0b8da..507ed00a944e734503190c94e0e5c5bbe7b50e32 100644
--- a/src/art/vector/VectorArtJS.js
+++ b/src/art/vector/VectorArtJS.js
@@ -1,3 +1,4 @@
+/* eslint-disable one-var */
 /**
  * @param {App.Entity.SlaveState} slave
  * @param {number} artSize
@@ -1324,7 +1325,7 @@ App.Art.vectorArtElement = (function() {
 
 	function ArtVectorBelly() {
 		if (slave.belly >= 2000) {
-			/* TODO: add check in penis control. do not draw penis atop belly if _art_belly_scale_factor > 1. */
+			/* TODO: add check in penis control. do not draw penis atop belly if art_belly_scale_factor > 1. */
 			if (slave.navelPiercing === 1) {
 				svgQueue.add("Art_Vector_Belly_Pregnant_Piercing");
 			} else if (slave.navelPiercing === 2) {
diff --git a/src/art/vector_revamp/vectorRevampedArtControl.js b/src/art/vector_revamp/vectorRevampedArtControl.js
index d5b937dee5f2fb92aa79aac1f7a7ec89f24c31ef..74ea16cde9e8929f85ea677a91a19dd33e9509a9 100644
--- a/src/art/vector_revamp/vectorRevampedArtControl.js
+++ b/src/art/vector_revamp/vectorRevampedArtControl.js
@@ -1,3 +1,7 @@
+/* eslint-disable camelcase */
+/* eslint-disable eqeqeq */
+/* eslint-disable one-var */
+/* eslint-disable no-unused-vars */
 /**
  * @param {App.Entity.SlaveState} slave
  * @returns {{styleClass: string, styleCSS: string}} style parameters to pass on to the renderer, and CSS string
@@ -672,7 +676,7 @@ class ArtStyleControl {
 class ClothingControl {
 	constructor() {
 		// slave info used in clothing selection
-		this.slave;
+		this.slave; // TODO: Expected an assignment or function call and instead saw an expression
 		// Bellylevel and torsoSize are calculated after clothingForSlave is called with slave info
 		this.bellyLevel = 0;
 		this.bellyMaskOpa = 1;
@@ -1068,7 +1072,7 @@ class ClothingControl {
 			bellyLevel = 0;
 		}
 
-		//bellyLevel = this.randomItem([0,1,2,3,4,5,6,7,8,9],0); // OVERWRITE TO SEE BELLY!!!
+		// bellyLevel = this.randomItem([0,1,2,3,4,5,6,7,8,9],0); // OVERWRITE TO SEE BELLY!!!
 
 		// Overwrite belly size if wearing a corset
 		if (this.slave.bellyAccessory === "a corset" ||
diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js
index de7563b633f0e7f45705ad533374ae474143fecb..f69d851b86a5f1248f5468bd8b1f133cc5afe6fd 100644
--- a/src/art/webgl/art.js
+++ b/src/art/webgl/art.js
@@ -1,3 +1,17 @@
+
+App.Art.hexToRgb = function(hex) {
+	hex = hex.replace('#', '');
+	let r = parseInt(hex.substring(0, 2), 16);
+	let g = parseInt(hex.substring(2, 4), 16);
+	let b = parseInt(hex.substring(4, 6), 16);
+	return [r/255, g/255, b/255];
+};
+
+App.Art.random = function(seed) {
+	let x = Math.sin(seed+1) * 10000;
+	return x - Math.floor(x);
+};
+
 App.Art.getMaterialById = function(scene, id) {
 	for (const material of scene.materials) {
 		if(material.matId === id) {
@@ -43,42 +57,519 @@ App.Art.resetMorphs = function(scene) {
 	}
 };
 
-App.Art.applyFigures = function(slave, scene) {
+
+App.Art.getArtParams = function() {
+	let p = {};
+
+	p.hideDick = false;
+	p.hideVagina = false;
+	p.hideHair = false;
+	p.applyNipples = true;
+	p.applyPumps = false;
+	p.applyExtremeHeels = false;
+	p.applyExtremeHeels2 = false;
+
+	return p;
+};
+
+App.Art.applyFigures = function(slave, scene, p) {
 	let figures = [];
 
-	figures.push("Genesis8Female");
-	figures.push("Geometry Shell 3");
-	figures.push("Futalicious Shell");
-	figures.push("Genesis8FemaleEyelashes");
+	switch(slave.clothes) {
+		/* case "leather pants and a tube top":
+			figures.push("Dark Princess Bodysuit", "Dark Princess Boots");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.applyPumps = true;
+			break;*/
+		case "attractive lingerie":
+			figures.push("AS2_Body1", "AS2_Socks");
+			p.hideDick = true;
+			p.applyNipples = false;
+			break;
+		case "attractive lingerie for a pregnant woman":
+			figures.push("AS2_Babydoll2", "AS2_Pantie", "AS2_Socks_5506");
+			p.hideDick = true;
+			p.applyNipples = false;
+			break;
+		/* case "stretch pants and a crop-top":
+			figures.push("Jogging_BodySuit", "Jogging_Sneakers");
+			p.hideDick = true;
+			p.applyNipples = false;
+			break;*/
+		case "a slutty klan robe":
+			figures.push("Slutty Klan Robe");
+			p.hideDick = true;
+			p.hideHair = true;
+			p.applyNipples = false;
+			break;
+		case "a klan robe":
+			figures.push("Klan Robe");
+			p.hideDick = true;
+			p.hideHair = true;
+			p.applyNipples = false;
+			break;
+		case "a bunny outfit":
+			figures.push("Bunny Suit", "Bunny Gloves", "Bunny Chocker", "Bunny Shoes", "Bunny Stocking", "Bunny Ears");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.applyPumps = true;
+			break;
+		case "a penitent nuns habit":
+			figures.push("Nun_Outfit");
+			p.hideDick = true;
+			p.hideHair = true;
+			p.applyNipples = false;
+			break;
+		case "a fallen nuns habit":
+			figures.push("NUN OUTFIT", "NUN HAT", "NUN PANTIES", "NUN STOCKINGS");
+			p.hideDick = true;
+			p.hideHair = true;
+			p.applyNipples = false;
+			break;
+		case "an apron":
+			figures.push("Apron");
+			p.hideDick = true;
+			p.applyNipples = false;
+			break;
+		case "a burkini":
+			figures.push("Burkini");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = true;
+			break;
+		case "a burqa":
+			figures.push("Burqa");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = true;
+			break;
+		case "harem gauze":
+			figures.push("Harem Gauze Shocks", "Harem Gauze Slutty Blouse", "Harem Gauze Underpant", "Harem Gauze Vail");
+			p.hideDick = true;
+			p.applyNipples = false;
+			break;
+		case "a mounty outfit":
+			figures.push("Mounty Hat", "Mounty Jacket", "Mounty Pants");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = true;
+			break;
+		case "a hijab and abaya":
+			figures.push("Hijab And Abaya");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = true;
+			break;
+		case "uncomfortable straps":
+			figures.push("Uncomfortable Straps", "Uncomfortable Bracelets", "Uncomfortable LegsBracelets");
+			p.hideDick = false;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "a toga":
+			figures.push("Toga");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a schutzstaffel uniform":
+			figures.push("Schutzstaffel Uniform");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a slutty schutzstaffel uniform":
+			figures.push("Slutty Schutzstaffel Uniform");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a slave gown":
+			figures.push("Slave Gown");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a long qipao":
+			figures.push("Long Qipao");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a maternity dress":
+			figures.push("Maternity Dress");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a nice nurse outfit":
+			figures.push("Nurse Uniform", "Nurse Hat");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a slutty nurse outfit":
+			figures.push("Slutty Nurse Bra", "Slutty Nurse Dress", "Slutty Nurse Necklace", "Slutty Nurse Underwear", "Slutty Nurse Boots", "Slutty Nurse Cap");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			p.applyPumps = true;
+			break;
+		case "a slutty maid outfit":
+			figures.push("Slutty Maid Dress", "Slutty Maid Bands", "Slutty Maid Neck Bow", "Slutty Maid Shoes", "Slutty Maid Headband");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			p.applyPumps = true;
+			break;
+		case "a nice maid outfit":
+			figures.push("Maid Band", "Maid Corset", "Maid Collar", "Maid Panty", "Maid Skirt", "Maid Sleeve Left", "Maid Sleeve Right", "Maid Stocking Left", "Maid Stocking Right", "Maid Top");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a police uniform":
+			figures.push("Police Cap", "Police Outfit", "Police Shoes", "Police Belt", "Police Gun");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a biyelgee costume":
+			figures.push("Biyelgee Dress", "Biyelgee Hat");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a one-piece swimsuit":
+			figures.push("Swimsuit");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a sports bra":
+			figures.push("Sports Bra");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a striped bra":
+			figures.push("Bra");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a sweater":
+			figures.push("Sweater");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a sweater and cutoffs":
+			figures.push("Sweater", "Cutoffs");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a sweater and panties":
+			figures.push("Sweater", "Panties");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a t-shirt":
+			figures.push("Shirt");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a t-shirt and jeans":
+			figures.push("Shirt", "Jeans");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a t-shirt and panties":
+			figures.push("Shirt", "Panties");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a t-shirt and thong":
+			figures.push("Shirt", "Thong");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a tank-top":
+			figures.push("Tank Top");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a tank-top and panties":
+			figures.push("Tank Top", "Panties");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a thong":
+			figures.push("Thong");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "a tube top":
+			figures.push("Tube Top");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a tube top and thong":
+			figures.push("Tube Top", "Thong");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "an oversized t-shirt":
+			figures.push("Oversized Shirt");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "an oversized t-shirt and boyshorts":
+			figures.push("Oversized Shirt", "Boy Shorts");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "boyshorts":
+			figures.push("Boy Shorts");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "panties":
+			figures.push("Panties");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "pasties":
+			figures.push("Pasties Left", "Pasties Right");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "panties and pasties":
+			figures.push("Pasties Left", "Pasties Right", "Panties");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "spats and a tank top":
+			figures.push("Spats", "Tank Top");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "sport shorts":
+			figures.push("Sports Shorts");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "sport shorts and a sports bra":
+			figures.push("Sports Shorts", "Sports Bra");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "sport shorts and a t-shirt":
+			figures.push("Sports Shorts", "Shirt");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "stretch pants and a crop-top":
+			figures.push("Stretch Pants", "Crop Top");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "leather pants and a tube top":
+			figures.push("Leather Pants", "Tube Top");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "leather pants and pasties":
+			figures.push("Leather Pants", "Pasties Left", "Pasties Right");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "leather pants":
+			figures.push("Leather Pants");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "striped panties":
+			figures.push("Panties");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "striped underwear":
+			figures.push("Panties");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "cutoffs":
+			figures.push("Cutoffs");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "cutoffs and a t-shirt":
+			figures.push("Cutoffs", "Shirt");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "jeans":
+			figures.push("Jeans");
+			p.hideDick = true;
+			p.applyNipples = true;
+			p.hideHair = false;
+			break;
+		case "a button-up shirt":
+			figures.push("Buttonup Shirt");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a button-up shirt and panties":
+			figures.push("Buttonup Shirt", "Panties");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a bra":
+			figures.push("Bra");
+			p.hideDick = false;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "a skimpy loincloth":
+			figures.push("Loincloth Skirt");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = false;
+			break;
+		case "battlearmor":
+			figures.push("Battle Armor");
+			p.hideDick = true;
+			p.applyNipples = false;
+			p.hideHair = true;
+			break;
+	}
 
-	switch(slave.hStyle) {
-		case "afro": figures.push("prae-yarahair_174011"); break;
-		case "cornrows": figures.push("TIGER BRAIDS_163349"); break;
-		case "bun": figures.push("Adia Hair_26615"); break;
-		case "neat": figures.push("SamiraHair_103927"); break;
-		case "strip": figures.push("ValRebelH_12512"); break;
-		case "tails": figures.push("LLF-DazStudioFemaleHair_758"); break;
-		case "up": figures.push("Pina Hair Gen8 8_93350"); break;
-		case "ponytail": figures.push("ElitePonytail"); break;
-		case "braided": figures.push("LLF-MishkaGeBase1_31774"); break;
-		case "dreadlocks": figures.push("Dreads_197696"); break;
-		case "permed": figures.push("IchigoHair_77918"); break;
-		case "curled": figures.push("aprilyshHavanaHair_32519"); break;
-		case "luxurious": figures.push("SW_BaronessHR_33121"); break;
-		case "messy bun": figures.push("KrayonHair_47547"); break;
-		case "messy": figures.push("MessyHair_35245"); break;
-		case "eary": figures.push("GeorginaHair_72382"); break;
-		case "undercut": figures.push("EditHairGN2Female_112247"); break;
-		case "bangs": figures.push("Neko Hair Genesis 3 Female_131369"); break;
-		case "hime": figures.push("Nyohair_141863"); break;
-		case "drills": figures.push("LLF-BunnyCurls-G8_111356"); break;
-		case "bald": break;
-		case "shaved": break;
-		case "buzzcut": break;
-		case "trimmed": break;
+	if(slave.chastityAnus && slave.chastityVagina) {
+		figures.push("Chastity Belt Base", "Chastity Belt Vaginal Cap with Holes", "Chastity Belt Anal Cap with Hole");
+		p.hideDick = true;
+	}
+	if(!slave.chastityAnus && slave.chastityVagina) {
+		figures.push("Chastity Belt Base", "Chastity Belt Vaginal Cap with Holes");
+		p.hideDick = true;
+	}
+	if(slave.chastityAnus && !slave.chastityVagina) {
+		figures.push("Chastity Belt Base", "Chastity Belt Anal Cap with Hole");
+		p.hideDick = true;
+	}
+
+	switch(slave.bellyAccessory) {
+		// case "a corset": figures.push("Corset A_80240"); break;
+		// case "an extreme corset": figures.push("corset1_112951"); break;
 		default: break;
 	}
 
+	switch(slave.faceAccessory) {
+		case "porcelain mask":
+			figures.push("Porcelain Mask");
+			break;
+	}
+
+	switch(slave.collar) {
+		case "preg biometrics":
+			figures.push("Pregnancy Collar");
+			break;
+	}
+
+	switch(slave.shoes) {
+		case "extreme heels":
+			figures.push("Extreme Heels"); p.applyExtremeHeels = true;
+			break;
+		case "extreme platform heels":
+			figures.push("Extreme Heels 2"); p.applyExtremeHeels2 = true;
+			break;
+	}
+
+	switch(slave.eyewear) {
+		case "glasses":
+			figures.push("Glasses");
+			break;
+	}
+
+	if (!hasLeftArm(slave) && slave.PLimb > 0) {
+		figures.push("Amputee Cap Arm Left");
+	}
+	if (!hasRightArm(slave) && slave.PLimb > 0) {
+		figures.push("Amputee Cap Arm Right");
+	}
+
+	figures.push("Genesis 8 Female");
+	figures.push("Genesis 8 Female Eyelashes");
+
+	if (!p.hideVagina) {
+		figures.push("New Genitalia For Victoria 8 - Color Layer");
+	}
+	if (!p.hideDick) {
+		figures.push("Futalicious Shell");
+	}
+
+	if (!p.hideHair) {
+		switch(slave.hStyle) {
+			case "afro": figures.push("Yara Hair"); break;
+			case "cornrows": figures.push("HR TIGER BRAIDS G2F"); break;
+			case "bun": figures.push("Adia Hair"); break;
+			case "neat": figures.push("Samira Hair"); break;
+			case "strip": figures.push("Rebel Hair"); break;
+			case "tails": figures.push("Kinley Hair G8"); break;
+			case "up": figures.push("Pina Hair G8F"); break;
+			case "ponytail": figures.push("Ponytail"); break;
+			case "braided": figures.push("LLF-MishkaGeBase1"); break;
+			case "dreadlocks": figures.push("Dreads"); break;
+			case "permed": figures.push("IchigoHair"); break;
+			case "curled": figures.push("Havana Hair"); break;
+			case "luxurious": figures.push("BaronessHR"); break;
+			case "messy bun": figures.push("Krayon Hair"); break;
+			case "messy": figures.push("MessyHairG3"); break;
+			case "eary": figures.push("GeorginaHair"); break;
+			case "undercut": figures.push("Edit Female Hair"); break;
+			case "bangs": figures.push("Neko Hair Genesis 8 Female"); break;
+			case "hime": figures.push("Nyohair"); break;
+			case "drills": figures.push("LLF-BunnyCurls-G3"); break;
+			case "bald": break;
+			case "shaved": break;
+			case "buzzcut": break;
+			case "trimmed": break;
+			default: break;
+		}
+	}
+
 	for (let i=0; i < scene.models[0].figures.length; i++) {
 		scene.models[0].figures[i].visible = false;
 		for (let j =0; j < figures.length; j++) {
@@ -89,10 +580,32 @@ App.Art.applyFigures = function(slave, scene) {
 	}
 };
 
-App.Art.applySurfaces = function(slave, scene) {
+App.Art.applySurfaces = function(slave, scene, p) {
+	let glansFutaliciousShellLayers = [];
+	let shaftFutaliciousShellLayers = [];
+	let testiclesFutaliciousShellLayers = [];
+	let torsoFrontFutaliciousShellLayers = [];
+	let torsoMiddleFutaliciousShellLayers = [];
+	let torsoBackFutaliciousShellLayers = [];
+	let rectumFutaliciousShellLayers = [];
+	let torsoFrontLayers = [];
+	let torsoMiddleLayers = [];
+	let torsoBackLayers = [];
+	let genitaliaLayers = [];
+	let anusLayers = [];
+	let torsoLayers = [];
+	let faceLayers = [];
+	let lipsLayers = [];
+	let earsLayers = [];
+	let legsLayers = [];
+	let armsLayers = [];
+	let eyesocketLayers = [];
+	let toenailsLayers = [];
+	let fingernailsLayers = [];
+
 	let surfaces = [];
 
-	if (slave.dick !== 0 || (!(slave.scrotum <= 0 || slave.balls <= 0))) {
+	if ((slave.dick !== 0 || (!(slave.scrotum <= 0 || slave.balls <= 0))) && !p.hideDick) {
 		surfaces.push(["Futalicious_Genitalia_G8F_Shaft_Futalicious_Shell", "visible", true]);
 		surfaces.push(["Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "visible", true]);
 		surfaces.push(["Futalicious_Genitalia_G8F_Testicles_Futalicious_Shell", "visible", true]);
@@ -126,168 +639,217 @@ App.Art.applySurfaces = function(slave, scene) {
 		surfaces.push(["new_gens_V8_1840_Anus", "visible", true]);
 	}
 
-	// surfaces.push(["Arms", "visible", hasBothArms(slave)]);
-	// surfaces.push(["Fingernails", "visible", hasBothArms(slave)]);
-	// surfaces.push(["Legs", "visible", hasBothLegs(slave)]);
-	// surfaces.push(["Toenails", "visible", hasBothLegs(slave)]);
-
 	let cockSkin;
 	let skin;
 
-	switch (slave.skin) {
-		case "pure white":
-		case "ivory":
-		case "white":
-			cockSkin = "White";
-			skin = "Ceridwen";
-			break;
-		case "extremely pale":
-		case "very pale":
-			cockSkin = "White";
-			skin = "Celinette";
-			break;
-		case "pale":
-		case "extremely fair":
-			cockSkin = "White";
-			skin = "Kimmy";
-			break;
-		case "very fair":
-		case "fair":
-			cockSkin = "Light";
-			skin = "Saffron";
-			break;
-		case "light":
-		case "light olive":
-			cockSkin = "Light";
-			skin = "FemaleBase";
-			break;
-		case "sun tanned":
-		case "spray tanned":
-		case "tan":
-			cockSkin = "Light";
-			skin = "Reagan";
-			break;
-		case "olive":
-			cockSkin = "Mid";
-			skin = "Kathy";
-			break;
-		case "bronze":
-			cockSkin = "Mid";
-			skin = "Mylou";
-			break;
-		case "dark olive":
-			cockSkin = "Mid";
-			skin = "Adaline";
-			break;
-		case "dark":
-			cockSkin = "Mid";
-			skin = "Daphne";
-			break;
-		case "light beige":
-			cockSkin = "Mid";
-			skin = "Minami";
-			break;
-		case "beige":
-			cockSkin = "Mid";
-			skin = "Tara";
-			break;
-		case "dark beige":
-		case "light brown":
-			cockSkin = "Dark";
-			skin = "Topmodel";
-			break;
-		case "brown":
-		case "dark brown":
-			cockSkin = "Dark";
-			skin = "Angelica";
-			break;
-		case "black":
-		case "ebony":
-		case "pure black":
-			cockSkin = "Dark";
-			skin = "DarkSkin";
-			break;
-		default:
-			cockSkin = "Light";
-			skin = "FemaleBase";
+	let O =  App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
+
+	let A = [207/255, 198/255, 195/255];
+	let B = [201/255, 157/255, 134/255];
+	let C = [174/255, 128/255, 100/255];
+	let D = [112/255, 78/255, 62/255];
+
+	let sqAO = (A[0] - O[0])**2 + (A[1] - O[1])**2 + (A[2] - O[2])**2;
+	let sqBO = (B[0] - O[0])**2 + (B[1] - O[1])**2 + (B[2] - O[2])**2;
+	let sqCO = (C[0] - O[0])**2 + (C[1] - O[1])**2 + (C[2] - O[2])**2;
+	let sqDO = (D[0] - O[0])**2 + (D[1] - O[1])**2 + (D[2] - O[2])**2;
+
+	if (sqAO < sqBO && sqAO < sqCO && sqAO < sqDO) {
+		skin = "WhiteTone";
+		cockSkin = "White";
+	} else if (sqBO < sqAO && sqBO < sqCO && sqBO < sqDO) {
+		skin = "LightTone";
+		cockSkin = "Light";
+	} else if (sqCO < sqBO && sqCO < sqAO && sqCO < sqDO) {
+		skin = "MidTone";
+		cockSkin = "Mid";
+	} else if (sqDO < sqBO && sqDO < sqCO && sqDO < sqAO) {
+		skin = "DarkTone";
+		cockSkin = "Dark";
 	}
 
-	surfaces.push(["Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	surfaces.push(["Futalicious_Genitalia_G8F_Shaft_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	surfaces.push(["Futalicious_Genitalia_G8F_Testicles_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	// surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	surfaces.push(["Futalicious_Genitalia_G8F_Torso_Middle_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	surfaces.push(["Futalicious_Genitalia_G8F_Torso_Back_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	surfaces.push(["Futalicious_Genitalia_G8F_Rectum_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
-	// surfaces.push(["Torso_Front", "matIds", [skin + "Torso"]]);
-	surfaces.push(["Torso_Middle", "matIds", [skin + "Torso"]]);
-	surfaces.push(["Torso_Back", "matIds", [skin + "Torso"]]);
+	glansFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	shaftFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	testiclesFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	torsoFrontFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	torsoMiddleFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	torsoBackFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	rectumFutaliciousShellLayers.push(cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell");
+	torsoFrontLayers.push(skin + "Torso", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	torsoMiddleLayers.push(skin + "Torso", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	torsoBackLayers.push(skin + "Torso", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	genitaliaLayers.push(skin + "Genitalia", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	anusLayers.push(skin + "Anus", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	torsoLayers.push(skin + "Torso", "skindetail_blotches_torso", "skindetail_pores_torso", "skindetail_fine_torso", "skindetail_veins_torso");
+	faceLayers.push(skin + "Face", "skindetail_blotches_face", "skindetail_pores_face", "skindetail_fine_face", "skindetail_veins_face");
+	lipsLayers.push(skin + "Lips");
+	earsLayers.push(skin + "Ears", "skindetail_blotches_face", "skindetail_pores_face", "skindetail_fine_face", "skindetail_veins_face");
+	legsLayers.push(skin + "Legs", "skindetail_blotches_legs", "skindetail_pores_legs", "skindetail_fine_legs", "skindetail_veins_legs");
+	armsLayers.push(skin + "Arms", "skindetail_blotches_arms", "skindetail_pores_arms", "skindetail_fine_arms", "skindetail_veins_arms");
+	eyesocketLayers.push(skin + "Face");
+	toenailsLayers.push(skin + "Toenails");
+	fingernailsLayers.push(skin + "Fingernails");
 
 	switch(slave.hStyle) {
 		case "buzzcut":
 		case "trimmed":
-			surfaces.push(["Torso", "matIds", [skin + "Torso", "shaved_torso"]]);
-			surfaces.push(["Face", "matIds", [skin + "Face", "shaved_face"]]);
+			torsoLayers.push("shaved_torso");
+			faceLayers.push("shaved_face");
 			break;
 		case "bald":
 		case "shaved":
 		default:
-			surfaces.push(["Torso", "matIds", [skin + "Torso"]]);
-			surfaces.push(["Face", "matIds", [skin + "Face"]]);
 			break;
 	}
 
-	surfaces.push(["Lips", "matIds", [skin + "Lips"]]);
-	surfaces.push(["Ears", "matIds", [skin + "Ears"]]);
-	surfaces.push(["Legs", "matIds", [skin + "Legs"]]);
-	surfaces.push(["Arms", "matIds", [skin + "Arms"]]);
-	surfaces.push(["EyeSocket", "matIds", [skin + "Face"]]);
-	surfaces.push(["Toenails", "matIds", [skin + "Toenails"]]);
-	surfaces.push(["Fingernails", "matIds", [skin + "Fingernails"]]);
-	// surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia"]);
-	surfaces.push(["Anus", "matIds", [skin + "Anus"]]);
+	switch(slave.eyebrowFullness) {
+		case "bald":
+		case "shaved":
+			break;
+		case "pencil-thin":
+			faceLayers.push("eyebrow_pencil");
+			break;
+		case "thin":
+			faceLayers.push("eyebrow_thin");
+			break;
+		case "threaded":
+			faceLayers.push("eyebrow_threaded");
+			break;
+		case "natural":
+			faceLayers.push("eyebrow_natural");
+			break;
+		case "tapered":
+			faceLayers.push("eyebrow_tapered");
+			break;
+		case "thick":
+			faceLayers.push("eyebrow_thick");
+			break;
+		case "bushy":
+			faceLayers.push("eyebrow_bushy");
+			break;
+	}
 
+	switch (slave.makeup) {
+		case 1:
+			// Nice
+			faceLayers.push("makeup_nice_eyes");
+			break;
+		case 2:
+			// Gorgeous
+			faceLayers.push("makeup_gorgeous_eyes");
+			faceLayers.push("makeup_gorgeous_blush");
+			break;
+		case 3:
+			// Hair coordinated
+			faceLayers.push("makeup_nice_eyes");
+			break;
+		case 4:
+			// Slutty
+			faceLayers.push("makeup_slutty_eyes");
+			faceLayers.push("makeup_slutty_blush");
+			break;
+		case 5:
+			// Neon
+			faceLayers.push("makeup_neon_eyes");
+			break;
+		case 6:
+			// Neon hair coordinated
+			faceLayers.push("makeup_neon_eyes");
+			break;
+		case 7:
+			// Metallic
+			faceLayers.push("makeup_metallic_eyes");
+			break;
+		case 8:
+			// Metallic hair coordinated
+			faceLayers.push("makeup_metallic_eyes");
+			break;
+	}
+
+	let pubicStyle = "";
 	switch (slave.pubicHStyle) {
 		case "hairless":
 		case "waxed":
 		case "bald":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
 			break;
 		case "neat":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia", "PubicNeat"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso", "PubicNeat"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "PubicNeat"]]);
+			pubicStyle = "PubicNeat";
 			break;
 		case "in a strip":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia", "PubicStrip"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso", "PubicStrip"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "PubicStrip"]]);
+			pubicStyle = "PubicStrip";
 			break;
 		case "bushy":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia", "PubicBushy"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso", "PubicBushy"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "PubicBushy"]]);
-
+			pubicStyle = "PubicBushy";
 			break;
 		case "very bushy":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia", "PubicVeryBushy"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso", "PubicVeryBushy"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "PubicVeryBushy"]]);
+			pubicStyle = "PubicVeryBushy";
 			break;
 		case "bushy in the front and neat in the rear":
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia", "PubicBushyFront"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso", "PubicBushyFront"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "PubicBushyFront"]]);
+			pubicStyle = "PubicBushyFront";
 			break;
 		default:
-			surfaces.push(["Genitalia",	"matIds", [skin + "Genitalia"]]);
-			surfaces.push(["Torso_Front", "matIds", [skin + "Torso"]]);
-			surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", [cockSkin + "Futalicious_Genitalia_G8F_Glans_Futalicious_Shell"]]);
 			break;
 	}
 
+	if(pubicStyle !== "") {
+		torsoLayers.push(pubicStyle);
+		genitaliaLayers.push(pubicStyle);
+		torsoFrontLayers.push(pubicStyle);
+		torsoMiddleLayers.push(pubicStyle);
+		torsoFrontFutaliciousShellLayers.push(pubicStyle);
+		torsoMiddleFutaliciousShellLayers.push(pubicStyle);
+	}
+
+	switch(slave.markings) {
+		case "beauty mark":
+			torsoLayers.push("skindetail_beauty_marks_torso");
+			genitaliaLayers.push("skindetail_beauty_marks_torso");
+			faceLayers.push("skindetail_beauty_marks_face");
+			armsLayers.push("skindetail_beauty_marks_arms");
+			legsLayers.push("skindetail_beauty_marks_legs");
+			break;
+		case "freckles":
+			torsoLayers.push("skindetail_freckles_torso");
+			genitaliaLayers.push("skindetail_freckles_torso");
+			faceLayers.push("skindetail_freckles_face");
+			armsLayers.push("skindetail_freckles_arms");
+			legsLayers.push("skindetail_freckles_legs");
+			break;
+		case "heavily freckled":
+			torsoLayers.push("skindetail_heavy_freckles_torso");
+			genitaliaLayers.push("skindetail_heavy_freckles_torso");
+			faceLayers.push("skindetail_heavy_freckles_face");
+			armsLayers.push("skindetail_heavy_freckles_arms");
+			legsLayers.push("skindetail_heavy_freckles_legs");
+			break;
+		case "birthmark":
+			torsoLayers.push("skindetail_birthmarks_torso");
+	}
+
+	torsoLayers.push("nipple_mask");
+
+	surfaces.push(["Futalicious_Genitalia_G8F_Shaft_Futalicious_Shell", "matIds", shaftFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Glans_Futalicious_Shell", "matIds", glansFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Testicles_Futalicious_Shell", "matIds", testiclesFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Torso_Front_Futalicious_Shell", "matIds", torsoFrontFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Torso_Middle_Futalicious_Shell", "matIds", torsoMiddleFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Torso_Back_Futalicious_Shell", "matIds", torsoBackFutaliciousShellLayers]);
+	surfaces.push(["Futalicious_Genitalia_G8F_Rectum_Futalicious_Shell", "matIds", rectumFutaliciousShellLayers]);
+	surfaces.push(["Torso_Front", "matIds", torsoFrontLayers]);
+	surfaces.push(["Torso_Middle", "matIds", torsoMiddleLayers]);
+	surfaces.push(["Torso_Back", "matIds", torsoBackLayers]);
+	surfaces.push(["Genitalia",	"matIds", genitaliaLayers]);
+	surfaces.push(["Anus", "matIds", anusLayers]);
+	surfaces.push(["Torso", "matIds", torsoLayers]);
+	surfaces.push(["Face", "matIds", faceLayers]);
+	surfaces.push(["Lips", "matIds", lipsLayers]);
+	surfaces.push(["Ears", "matIds", earsLayers]);
+	surfaces.push(["Legs", "matIds", legsLayers]);
+	surfaces.push(["Arms", "matIds", armsLayers]);
+	surfaces.push(["EyeSocket", "matIds", eyesocketLayers]);
+	surfaces.push(["Toenails", "matIds", toenailsLayers]);
+	surfaces.push(["Fingernails", "matIds", fingernailsLayers]);
+
 	for (let i=0, count=0; i < scene.models[0].figures.length; i++) {
 		for (let j=0; j < scene.models[0].figures[i].surfaces.length; j++, count++) {
 			for (let h =0; h < surfaces.length; h++) {
@@ -299,20 +861,14 @@ App.Art.applySurfaces = function(slave, scene) {
 	}
 };
 
-App.Art.applyMaterials = function(slave, scene) {
+App.Art.applyMaterials = function(slave, scene, p) {
 	let materials = [];
 
-	function hexToRgb(hex) {
-		hex = hex.replace('#', '');
-		let r = parseInt(hex.substring(0, 2), 16);
-		let g = parseInt(hex.substring(2, 4), 16);
-		let b = parseInt(hex.substring(4, 6), 16);
-		return [r/255, g/255, b/255];
-	}
+	let hairColor = App.Art.hexToRgb(extractColor(slave.hColor));
+	let lipsColor = App.Art.hexToRgb(skinColorCatcher(slave).lipsColor);
+	let areolaColor = App.Art.hexToRgb(skinColorCatcher(slave).areolaColor);
 
-	let hairColor = hexToRgb(extractColor(slave.hColor));
-	let lipsColor = hexToRgb(skinColorCatcher(slave).lipsColor);
-	// let lipsColor = hexToRgb("#ffffff");
+	hairColor = [hairColor[0], hairColor[1], hairColor[2]];
 
 	let makeupColor;
 	let makeupOpacity;
@@ -374,7 +930,7 @@ App.Art.applyMaterials = function(slave, scene) {
 			break;
 	}
 
-	makeupColor = hexToRgb(makeupColor);
+	makeupColor = App.Art.hexToRgb(makeupColor);
 	lipsColor[0] = makeupColor[0] * makeupOpacity + lipsColor[0] * (1 - makeupOpacity);
 	lipsColor[1] = makeupColor[1] * makeupOpacity + lipsColor[1] * (1 - makeupOpacity);
 	lipsColor[2] = makeupColor[2] * makeupOpacity + lipsColor[2] * (1 - makeupOpacity);
@@ -389,6 +945,10 @@ App.Art.applyMaterials = function(slave, scene) {
 			// bright and glittery
 			nailColor = "#ff0000";
 			break;
+		case 5:
+			// very long and garish
+			nailColor = "#ff0000";
+			break;
 		case 6:
 			// neon
 			nailColor = "#DC143C";
@@ -410,7 +970,7 @@ App.Art.applyMaterials = function(slave, scene) {
 			break;
 	}
 
-	nailColor = hexToRgb(nailColor);
+	nailColor = App.Art.hexToRgb(nailColor);
 
 	switch(slave.hStyle) {
 		case "afro":
@@ -520,132 +1080,194 @@ App.Art.applyMaterials = function(slave, scene) {
 		default: break;
 	}
 
+	let eyebrowColor = App.Art.hexToRgb(extractColor(slave.eyebrowHColor));
+
+	switch(slave.eyebrowFullness) {
+		case "bald":
+		case "shaved":
+			break;
+		case "pencil-thin":
+			materials.push(["eyebrow_pencil", "Kd", eyebrowColor]);
+			break;
+		case "thin":
+			materials.push(["eyebrow_thin", "Kd", eyebrowColor]);
+			break;
+		case "threaded":
+			materials.push(["eyebrow_threaded", "Kd", eyebrowColor]);
+			break;
+		case "natural":
+			materials.push(["eyebrow_natural", "Kd", eyebrowColor]);
+			break;
+		case "tapered":
+			materials.push(["eyebrow_tapered", "Kd", eyebrowColor]);
+			break;
+		case "thick":
+			materials.push(["eyebrow_thick", "Kd", eyebrowColor]);
+			break;
+		case "bushy":
+			materials.push(["eyebrow_bushy", "Kd", eyebrowColor]);
+			break;
+	}
+
+	if(slave.face < -66) {
+		materials.push(["Eyelashes", "map_D", "base2/eyelash/EyeLash_0.jpg"]);
+	}else if(slave.face < -33) {
+		materials.push(["Eyelashes", "map_D", "base2/eyelash/EyeLash_1.jpg"]);
+	}else if(slave.face < 0) {
+		materials.push(["Eyelashes", "map_D", "base/G8FBaseEyelashes_1006.jpg"]);
+	}else if(slave.face < 33) {
+		materials.push(["Eyelashes", "map_D", "base2/eyelash/EyeLash_2.jpg"]);
+	}else if(slave.face < 66) {
+		materials.push(["Eyelashes", "map_D", "base2/eyelash/EyeLash_3.jpg"]);
+	}else {
+		materials.push(["Eyelashes", "map_D", "base2/eyelash/EyeLash_4.jpg"]);
+	}
+
 	let irisColor;
 	let scleraColor;
 
 	if (hasAnyEyes(slave)) {
-		irisColor = hexToRgb(extractColor(hasLeftEye(slave) ? extractColor(slave.eye.left.iris) : extractColor(slave.eye.right.iris)));
-		scleraColor = hexToRgb(extractColor(hasLeftEye(slave) ? extractColor(slave.eye.left.sclera) : extractColor(slave.eye.right.sclera)));
+		irisColor = App.Art.hexToRgb(extractColor(hasLeftEye(slave) ? extractColor(slave.eye.left.iris) : extractColor(slave.eye.right.iris)));
+		scleraColor = App.Art.hexToRgb(extractColor(hasLeftEye(slave) ? extractColor(slave.eye.left.sclera) : extractColor(slave.eye.right.sclera)));
 	} else {
-		irisColor = hexToRgb(extractColor("black"));
-		scleraColor = hexToRgb(extractColor("black"));
+		irisColor = App.Art.hexToRgb(extractColor("black"));
+		scleraColor = App.Art.hexToRgb(extractColor("black"));
 	}
 
-	materials.push(["Irises", "d", 3.8]);
-	materials.push(["Irises", "Kd", [irisColor[0] * 0.8, irisColor[1] * 0.8, irisColor[2] * 0.8]]);
-	materials.push(["Sclera", "Kd", [scleraColor[0] * 1.2, scleraColor[1] * 1.2, scleraColor[2] * 1.2]]);
-
-	switch (slave.skin) {
-		case "pure white":
-		case "ivory":
-		case "white":
-			materials.push(["CeridwenFingernails", "Kd", nailColor]);
-			materials.push(["CeridwenLips", "Kd", lipsColor]);
-			materials.push(["CeridwenLips", "Ns", lipsGloss]);
-			materials.push(["WhiteFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.05, 1, 1]]);
-			break;
-		case "extremely pale":
-		case "very pale":
-			materials.push(["CelinetteFingernails", "Kd", nailColor]);
-			materials.push(["CelinetteLips", "Kd", lipsColor]);
-			materials.push(["CelinetteLips", "Ns", lipsGloss]);
-			materials.push(["WhiteFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.05, 1, 1]]);
-			break;
-		case "pale":
-		case "extremely fair":
-			materials.push(["KimmyFingernails", "Kd", nailColor]);
-			materials.push(["KimmyLips", "Kd", lipsColor]);
-			materials.push(["KimmyLips", "Ns", lipsGloss]);
-			materials.push(["WhiteFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1, 0.95, 0.91]]);
-			break;
-		case "very fair":
-		case "fair":
-			materials.push(["SaffronFingernails", "Kd", nailColor]);
-			materials.push(["SaffronLips", "Kd", lipsColor]);
-			materials.push(["SaffronLips", "Ns", lipsGloss]);
-			materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.1, 1.1, 1.1]]);
-			break;
-		case "light":
-		case "light olive":
-			materials.push(["FemaleBaseFingernails", "Kd", nailColor]);
-			materials.push(["FemaleBaseLips", "Kd", lipsColor]);
-			materials.push(["FemaleBaseLips", "Ns", lipsGloss]);
-			materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.0, 1.0, 1.0]]);
-			break;
-		case "sun tanned":
-		case "spray tanned":
-		case "tan":
-			materials.push(["ReaganFingernails", "Kd", nailColor]);
-			materials.push(["ReaganLips", "Kd", lipsColor]);
-			materials.push(["ReaganLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.97, 0.95, 0.95]]);
-			break;
-		case "olive":
-			materials.push(["KathyFingernails", "Kd", nailColor]);
-			materials.push(["KathyLips", "Kd", lipsColor]);
-			materials.push(["KathyLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.95, 0.92, 0.92]]);
-			break;
-		case "bronze":
-			materials.push(["MylouFingernails", "Kd", nailColor]);
-			materials.push(["MylouLips", "Kd", lipsColor]);
-			materials.push(["MylouLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.91, 0.95, 0.98]]);
-			break;
-		case "dark olive":
-			materials.push(["AdalineFingernails", "Kd", nailColor]);
-			materials.push(["AdalineLips", "Kd", lipsColor]);
-			materials.push(["AdalineLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.90, 0.90, 0.90]]);
-			break;
-		case "dark":
-			materials.push(["DaphneFingernails", "Kd", nailColor]);
-			materials.push(["DaphneLips", "Kd", lipsColor]);
-			materials.push(["DaphneLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.88, 0.93, 0.96]]);
-			break;
-		case "light beige":
-			materials.push(["MinamiFingernails", "Kd", nailColor]);
-			materials.push(["MinamiLips", "Kd", lipsColor]);
-			materials.push(["MinamiLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.68, 0.74, 0.8]]);
-			break;
-		case "beige":
-			materials.push(["TaraFingernails", "Kd", nailColor]);
-			materials.push(["TaraLips", "Kd", lipsColor]);
-			materials.push(["TaraLips", "Ns", lipsGloss]);
-			materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.77, 0.77, 0.77]]);
-			break;
-		case "dark beige":
-		case "light brown":
-			materials.push(["TopmodelFingernails", "Kd", nailColor]);
-			materials.push(["TopmodelLips", "Kd", lipsColor]);
-			materials.push(["TopmodelLips", "Ns", lipsGloss]);
-			materials.push(["DarkFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.7, 1.75, 1.75]]);
-			break;
-		case "brown":
-		case "dark brown":
-			materials.push(["AngelicaFingernails", "Kd", nailColor]);
-			materials.push(["AngelicaLips", "Kd", lipsColor]);
-			materials.push(["AngelicaLips", "Ns", lipsGloss]);
-			materials.push(["DarkFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.85, 0.85, 0.85]]);
-			break;
-		case "black":
-		case "ebony":
-		case "pure black":
-			materials.push(["DarkSkinFingernails", "Kd", nailColor]);
-			materials.push(["DarkSkinLips", "Kd", lipsColor]);
-			materials.push(["DarkSkinLips", "Ns", lipsGloss]);
-			materials.push(["DarkFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [0.7, 0.7, 0.77]]);
-			break;
-		default:
-			materials.push(["FemaleBaseFingernails", "Kd", nailColor]);
-			materials.push(["FemaleBaseLips", "Kd", lipsColor]);
-			materials.push(["FemaleBaseLips", "Ns", lipsGloss]);
-			materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [1.0, 1.0, 1.0]]);
+	materials.push(["Irises", "Kd", [irisColor[0], irisColor[1], irisColor[2]]]);
+	materials.push(["Sclera", "Kd", [scleraColor[0] * 0.6, scleraColor[1] * 0.6, scleraColor[2] * 0.56]]);
+
+	// expected skin color
+	let O =  App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
+
+	// average color of skintone texture
+	let A = [207/255, 198/255, 195/255];
+	let B = [201/255, 157/255, 134/255];
+	let C = [174/255, 128/255, 100/255];
+	let D = [112/255, 78/255, 62/255];
+
+	// find nearest skintone texture
+	let sqAO = (A[0] - O[0])**2 + (A[1] - O[1])**2 + (A[2] - O[2])**2;
+	let sqBO = (B[0] - O[0])**2 + (B[1] - O[1])**2 + (B[2] - O[2])**2;
+	let sqCO = (C[0] - O[0])**2 + (C[1] - O[1])**2 + (C[2] - O[2])**2;
+	let sqDO = (D[0] - O[0])**2 + (D[1] - O[1])**2 + (D[2] - O[2])**2;
+
+	// factor to multiply skintone texture to get expected skin color
+	let mA = [O[0]/A[0]*0.92, O[1]/A[1]*0.88, O[2]/A[2]*0.88];
+	let mB = [O[0]/B[0], O[1]/B[1], O[2]/B[2]];
+	let mC = [O[0]/C[0], O[1]/C[1], O[2]/C[2]];
+	let mD = [O[0]/D[0], O[1]/D[1], O[2]/D[2]];
+
+	let lA = [lipsColor[0]/A[0], lipsColor[1]/A[1], lipsColor[2]/A[2]];
+	let lB = [lipsColor[0]/A[0], lipsColor[1]/A[1], lipsColor[2]/A[2]];
+	let lC = [lipsColor[0]/A[0], lipsColor[1]/A[1], lipsColor[2]/A[2]];
+	let lD = [lipsColor[0]/A[0], lipsColor[1]/A[1], lipsColor[2]/A[2]];
+
+	let S = [0.6, 0.6, 0.6];
+
+	if (sqAO < sqBO && sqAO < sqCO && sqAO < sqDO) {
+		materials.push(["WhiteToneTorso", "Kd", mA]);
+		materials.push(["WhiteToneTorso", "Ks", S]);
+		materials.push(["WhiteToneArms", "Kd", mA]);
+		materials.push(["WhiteToneArms", "Ks", S]);
+		materials.push(["WhiteToneLegs", "Kd", mA]);
+		materials.push(["WhiteToneLegs", "Ks", S]);
+		materials.push(["WhiteToneFace", "Kd", mA]);
+		materials.push(["WhiteToneFace", "Ks", S]);
+		materials.push(["WhiteToneEars", "Kd", mA]);
+		materials.push(["WhiteToneEars", "Ks", S]);
+		materials.push(["WhiteToneLips", "Kd", [lA[0]*0.9, lA[1]*0.9, lA[2]*0.9]]);
+		materials.push(["WhiteToneLips", "Ns", lipsGloss]);
+		materials.push(["WhiteToneFingernails", "Kd", nailColor]);
+		materials.push(["WhiteToneFingernails", "Ks", S]);
+		materials.push(["WhiteToneToenails", "Kd", nailColor]);
+		materials.push(["WhiteToneToenails", "Ks", S]);
+		materials.push(["WhiteToneAnus", "Kd", mA]);
+		materials.push(["WhiteToneAnus", "Ks", S]);
+		materials.push(["WhiteToneGenitalia", "Kd", mA]);
+		materials.push(["WhiteToneGenitalia", "Ks", S]);
+		materials.push(["WhiteFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mA[0]*0.8, mA[1]*0.8, mA[2]*0.8]]);
+		materials.push(["WhiteFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Ks", S]);
+		materials.push(["nipple_mask", "Kd", [areolaColor[0]*0.7/A[0], areolaColor[1]*0.7/A[1], areolaColor[2]*0.7/A[2]]]);
+		materials.push(["nipple_mask", "map_Kd", "base2/skin/torso white.jpg"]);
+	} else if (sqBO < sqAO && sqBO < sqCO && sqBO < sqDO) {
+		materials.push(["LightToneTorso", "Kd", mB]);
+		materials.push(["LightToneTorso", "Ks", S]);
+		materials.push(["LightToneArms", "Kd", mB]);
+		materials.push(["LightToneArms", "Ks", S]);
+		materials.push(["LightToneLegs", "Kd", mB]);
+		materials.push(["LightToneLegs", "Ks", S]);
+		materials.push(["LightToneFace", "Kd", mB]);
+		materials.push(["LightToneFace", "Ks", S]);
+		materials.push(["LightToneEars", "Kd", mB]);
+		materials.push(["LightToneEars", "Ks", S]);
+		materials.push(["LightToneLips", "Kd", lB]);
+		materials.push(["LightToneLips", "Ns", lipsGloss]);
+		materials.push(["LightToneFingernails", "Kd", nailColor]);
+		materials.push(["LightToneFingernails", "Ks", S]);
+		materials.push(["LightToneToenails", "Kd", nailColor]);
+		materials.push(["LightToneToenails", "Ks", S]);
+		materials.push(["LightToneAnus", "Kd", mB]);
+		materials.push(["LightToneAnus", "Ks", S]);
+		materials.push(["LightToneGenitalia", "Kd", mB]);
+		materials.push(["LightToneGenitalia", "Ks", S]);
+		materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mB[0]*0.8, mB[1]*0.77, mB[2]*0.80]]);
+		materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Ks", S]);
+		materials.push(["nipple_mask", "Kd", [areolaColor[0]*0.8/B[0], areolaColor[1]*0.8/B[1], areolaColor[2]*0.8/B[2]]]);
+		materials.push(["nipple_mask", "map_Kd", "base2/skin/torso light.jpg"]);
+	} else if (sqCO < sqBO && sqCO < sqAO && sqCO < sqDO) {
+		materials.push(["MidToneTorso", "Kd", mC]);
+		materials.push(["MidToneTorso", "Ks", S]);
+		materials.push(["MidToneArms", "Kd", mC]);
+		materials.push(["MidToneArms", "Ks", S]);
+		materials.push(["MidToneLegs", "Kd", mC]);
+		materials.push(["MidToneLegs", "Ks", S]);
+		materials.push(["MidToneFace", "Kd", mC]);
+		materials.push(["MidToneFace", "Ks", S]);
+		materials.push(["MidToneEars", "Kd", mC]);
+		materials.push(["MidToneEars", "Ks", S]);
+		materials.push(["MidToneLips", "Kd", [lC[0]*0.7, lC[1]*0.7, lC[2]*0.7]]);
+		materials.push(["MidToneLips", "Ns", lipsGloss]);
+		materials.push(["MidToneFingernails", "Kd", nailColor]);
+		materials.push(["MidToneFingernails", "Ks", S]);
+		materials.push(["MidToneToenails", "Kd", nailColor]);
+		materials.push(["MidToneToenails", "Ks", S]);
+		materials.push(["MidToneAnus", "Kd", mC]);
+		materials.push(["MidToneAnus", "Ks", S]);
+		materials.push(["MidToneGenitalia", "Kd", mC]);
+		materials.push(["MidToneGenitalia", "Ks", S]);
+		materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mC[0]*0.65, mC[1]*0.65, mC[2]*0.65]]);
+		materials.push(["MidFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Ks", S]);
+		materials.push(["nipple_mask", "Kd", [areolaColor[0]/C[0], areolaColor[1]/C[1], areolaColor[2]/C[2]]]);
+		materials.push(["nipple_mask", "map_Kd", "base2/skin/torso mid.jpg"]);
+	} else if (sqDO < sqBO && sqDO < sqCO && sqDO < sqAO) {
+		materials.push(["DarkToneTorso", "Kd", mD]);
+		materials.push(["DarkToneTorso", "Ks", S]);
+		materials.push(["DarkToneArms", "Kd", mD]);
+		materials.push(["DarkToneArms", "Ks", S]);
+		materials.push(["DarkToneLegs", "Kd", mD]);
+		materials.push(["DarkToneLegs", "Ks", S]);
+		materials.push(["DarkToneFace", "Kd", mD]);
+		materials.push(["DarkToneFace", "Ks", S]);
+		materials.push(["DarkToneEars", "Kd", mD]);
+		materials.push(["DarkToneEars", "Ks", S]);
+		materials.push(["DarkToneLips", "Kd", [lD[0]*0.7, lD[1]*0.7, lD[2]*0.7]]);
+		materials.push(["DarkToneLips", "Ns", lipsGloss]);
+		materials.push(["DarkToneFingernails", "Kd", nailColor]);
+		materials.push(["DarkToneFingernails", "Ks", S]);
+		materials.push(["DarkToneToenails", "Kd", nailColor]);
+		materials.push(["DarkToneToenails", "Ks", S]);
+		materials.push(["DarkToneAnus", "Kd", mD]);
+		materials.push(["DarkToneAnus", "Ks", S]);
+		materials.push(["DarkToneGenitalia", "Kd", mD]);
+		materials.push(["DarkToneGenitalia", "Ks", S]);
+		materials.push(["DarkFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mD[0]*0.75, mD[1]*0.75, mD[2]*0.75]]);
+		materials.push(["DarkFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Ks", S]);
+		materials.push(["nipple_mask", "Kd", [areolaColor[0]/D[0], areolaColor[1]/D[1], areolaColor[2]/D[2]]]);
+		materials.push(["nipple_mask", "map_Kd", "base2/skin/torso dark.jpg"]);
 	}
 
-	let pubicColor = hexToRgb(extractColor(slave.pubicHColor));
+	let pubicColor = App.Art.hexToRgb(extractColor(slave.pubicHColor));
 	switch (slave.pubicHStyle) {
 		case "hairless":
 		case "waxed":
@@ -670,12 +1292,86 @@ App.Art.applyMaterials = function(slave, scene) {
 			break;
 	}
 
+	switch (slave.vaginaLube) {
+		case 0:
+			materials.push(["new_gens_V8_1840_Genitalia", "Ns", 100]);
+			break;
+		case 1:
+			materials.push(["new_gens_V8_1840_Genitalia", "Ns", 5]);
+			break;
+		case 2:
+			materials.push(["new_gens_V8_1840_Genitalia", "Ns", 0]);
+			break;
+	}
+
+	let blotchesDetail = 0.5;
+	let poresDetail = 0.5;
+	let fineDetail = 0.4;
+	let veins = 1;
+
+	materials.push(["skindetail_blotches_torso", "d", blotchesDetail]);
+	materials.push(["skindetail_blotches_face", "d", blotchesDetail]);
+	materials.push(["skindetail_blotches_arms", "d", blotchesDetail]);
+	materials.push(["skindetail_blotches_legs", "d", blotchesDetail]);
+
+	materials.push(["skindetail_pores_torso", "d", poresDetail]);
+	materials.push(["skindetail_pores_face", "d", poresDetail]);
+	materials.push(["skindetail_pores_arms", "d", poresDetail]);
+	materials.push(["skindetail_pores_legs", "d", poresDetail]);
+
+	materials.push(["skindetail_fine_torso", "d", fineDetail]);
+	materials.push(["skindetail_fine_face", "d", fineDetail]);
+	materials.push(["skindetail_fine_arms", "d", fineDetail]);
+	materials.push(["skindetail_fine_legs", "d", fineDetail]);
+
+	materials.push(["skindetail_veins_torso", "d", veins]);
+	materials.push(["skindetail_veins_face", "d", veins]);
+	materials.push(["skindetail_veins_arms", "d", veins]);
+	materials.push(["skindetail_veins_legs", "d", veins]);
+
+	switch(slave.markings) {
+		case "beauty mark":
+			materials.push(["skindetail_beauty_marks_torso", "d", 1]);
+			materials.push(["skindetail_beauty_marks_face", "d", 1]);
+			materials.push(["skindetail_beauty_marks_arms", "d", 1]);
+			materials.push(["skindetail_beauty_marks_legs", "d", 1]);
+			break;
+		case "freckles":
+			materials.push(["skindetail_freckles_torso", "d", 0.7]);
+			materials.push(["skindetail_freckles_face", "d", 0.8]);
+			materials.push(["skindetail_freckles_arms", "d", 0.7]);
+			materials.push(["skindetail_freckles_legs", "d", 0.7]);
+			break;
+		case "heavily freckled":
+			materials.push(["skindetail_heavy_freckles_torso", "d", 0.7]);
+			materials.push(["skindetail_heavy_freckles_face", "d", 0.8]);
+			materials.push(["skindetail_heavy_freckles_arms", "d", 0.7]);
+			materials.push(["skindetail_heavy_freckles_legs", "d", 0.7]);
+			break;
+		case "birthmark":
+			materials.push(["skindetail_birthmarks_torso", "d", 1]);
+			materials.push(["skindetail_birthmarks_torso", "Kd", [O[0]+0.2, O[1]+0.2, O[2]+0.2]]);
+	}
+
 	let torso = App.Art.getMatIdsBySurface(scene, "Torso")[0];
 
 	if (slave.scar.hasOwnProperty("belly") && slave.scar.belly["c-section"] > 0) {
-		materials.push([torso, "map_Kn", scene.textureMap["Victoria8_Torso_CNM_1002.jpg"]]);
+		materials.push([torso, "map_Kn", "base/Victoria8_Torso_CNM_1002.jpg"]);
 	} else {
-		materials.push([torso, "map_Kn", scene.textureMap["Victoria8_Torso_NM_1002.jpg"]]);
+		materials.push([torso, "map_Kn", "base/Victoria8_Torso_NM_1002.jpg"]);
+	}
+
+	if (slave.collar === "preg biometrics") {
+		if (slave.preg > 0) {
+			materials.push(["pregnancy_collar_screen", "map_Ke", "dummy1"]);
+		} else {
+			materials.push(["pregnancy_collar_screen", "map_Ke", "dummy0"]);
+		}
+	}
+
+	if ("glassesColor" in slave) {
+		materials.push(["glasses_frame", "Kd", App.Art.hexToRgb(slave.glassesColor)]);
+		materials.push(["porcelain_mask_mask", "Kd", App.Art.hexToRgb(slave.glassesColor)]);
 	}
 
 	for (let i =0; i < scene.materials.length; i++) {
@@ -687,18 +1383,28 @@ App.Art.applyMaterials = function(slave, scene) {
 	}
 };
 
-App.Art.applyMorphs = function(slave, scene) {
+App.Art.applyMorphs = function(slave, scene, p) {
 	let morphs = [];
 
 	function convertRange(sourceMin, sourceMax, targetMin, targetMax, value) {
 		return (targetMax-targetMin)/(sourceMax-sourceMin)*(value-sourceMin)+targetMin;
 	}
 
-	function random(seed) {
-		let x = Math.sin(seed+1) * 10000;
-		return x - Math.floor(x);
+	if (slave.dick !== 0 || (!(slave.scrotum <= 0 || slave.balls <= 0))) {
+		morphs.push(["futaGenFix", 1]);
 	}
 
+	if (p.applyPumps) {
+		morphs.push(["posesHeels", 1]);
+	}
+
+	if (p.applyExtremeHeels) {
+		morphs.push(["posesExtremeHeels", 1]);
+	}
+
+	if (p.applyExtremeHeels2) {
+		morphs.push(["posesExtremeHeels2", 1]);
+	}
 
 	if(hasBothArms(slave) && hasBothLegs(slave)) {
 		if (scene.inspectView) {
@@ -721,8 +1427,8 @@ App.Art.applyMorphs = function(slave, scene) {
 
 	// used for interpolating mixed race based on slave ID
 	let races = ["raceWhite", "raceAsian", "raceLatina", "raceBlack", "racePacific", "raceEuropean", "raceAmerindian", "raceSemitic", "raceEastern", "raceAryan", "raceLatina", "raceMalay"];
-	let index1 = Math.floor(random(slave.ID+1) * races.length);
-	let index2 = Math.floor(random(slave.ID-1) * (races.length-1));
+	let index1 = Math.floor(App.Art.random(slave.ID+1) * races.length);
+	let index2 = Math.floor(App.Art.random(slave.ID-1) * (races.length-1));
 
 	switch (slave.race) {
 		case "white":
@@ -753,7 +1459,180 @@ App.Art.applyMorphs = function(slave, scene) {
 			morphs.push([races[index2], 0.5]);
 			break;
 	}
-
+	/*
+	switch (slave.race) {
+		case "white":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceEurope1", 1]); break;
+				case "masculine":
+					morphs.push(["raceEurope10", 1]); break;
+				case "androgynous":
+					morphs.push(["raceEurope15", 1]); break;
+				case "cute":
+					morphs.push(["raceEurope16", 1]); break;
+				case "sensual":
+					morphs.push(["raceEurope17", 1]); break;
+				case "exotic":
+					morphs.push(["raceEurope14", 1]); break;
+			} break;
+		case "asian":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAsia1", 1]); break;
+				case "masculine":
+					morphs.push(["raceAsia17", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAsia10", 1]); break;
+				case "cute":
+					morphs.push(["raceAsia14", 1]); break;
+				case "sensual":
+					morphs.push(["raceAsia15", 1]); break;
+				case "exotic":
+					morphs.push(["raceAsia16", 1]); break;
+			} break;
+		case "latina":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAfrica4", 1]); break;
+				case "masculine":
+					morphs.push(["raceAfrica6", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAfrica1", 1]); break;
+				case "cute":
+					morphs.push(["raceAfrica5", 1]); break;
+				case "sensual":
+					morphs.push(["raceAfrica10", 1]); break;
+				case "exotic":
+					morphs.push(["raceAfrica2", 1]); break;
+			} break;
+		case "black":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAfrica3", 1]); break;
+				case "masculine":
+					morphs.push(["raceAfrica6", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAfrica1", 1]); break;
+				case "cute":
+					morphs.push(["raceAfrica7", 1]); break;
+				case "sensual":
+					morphs.push(["raceAfrica8", 1]); break;
+				case "exotic":
+					morphs.push(["raceAfrica9", 1]); break;
+			} break;
+		case "pacific islander":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAsia8", 1]); break;
+				case "masculine":
+					morphs.push(["raceAsia9", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAsia6", 1]); break;
+				case "cute":
+					morphs.push(["raceAsia7", 1]); break;
+				case "sensual":
+					morphs.push(["raceAsia19", 1]); break;
+				case "exotic":
+					morphs.push(["raceAsia5", 1]); break;
+			} break;
+		case "southern european":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceEurope11", 1]); break;
+				case "masculine":
+					morphs.push(["raceEurope12", 1]); break;
+				case "androgynous":
+					morphs.push(["raceEurope3", 1]); break;
+				case "cute":
+					morphs.push(["raceEurope2", 1]); break;
+				case "sensual":
+					morphs.push(["raceEurope18", 1]); break;
+				case "exotic":
+					morphs.push(["raceEurope13", 1]); break;
+			} break;
+		case "amerindian":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAfrica4", 1]); break;
+				case "masculine":
+					morphs.push(["raceAfrica6", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAfrica1", 1]); break;
+				case "cute":
+					morphs.push(["raceAfrica5", 1]); break;
+				case "sensual":
+					morphs.push(["raceAfrica10", 1]); break;
+				case "exotic":
+					morphs.push(["raceAfrica2", 1]); break;
+			} break;
+		case "semitic":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAfrica3", 1]); break;
+				case "masculine":
+					morphs.push(["raceAfrica6", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAfrica1", 1]); break;
+				case "cute":
+					morphs.push(["raceAfrica7", 1]); break;
+				case "sensual":
+					morphs.push(["raceAfrica8", 1]); break;
+				case "exotic":
+					morphs.push(["raceAfrica9", 1]); break;
+			} break;
+		case "middle eastern":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceEurope6", 1]); break;
+				case "masculine":
+					morphs.push(["raceEurope4", 1]); break;
+				case "androgynous":
+					morphs.push(["raceEurope8", 1]); break;
+				case "cute":
+					morphs.push(["raceEurope5", 1]); break;
+				case "sensual":
+					morphs.push(["raceEurope9", 1]); break;
+				case "exotic":
+					morphs.push(["raceEurope7", 1]); break;
+			} break;
+		case "indo-aryan":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAsia3", 1]); break;
+				case "masculine":
+					morphs.push(["raceAsia20", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAsia18", 1]); break;
+				case "cute":
+					morphs.push(["raceAsia4", 1]); break;
+				case "sensual":
+					morphs.push(["raceAsia12", 1]); break;
+				case "exotic":
+					morphs.push(["raceAsia11", 1]); break;
+			} break;
+		case "malay":
+			switch (slave.faceShape) {
+				case "normal":
+					morphs.push(["raceAsia2", 1]); break;
+				case "masculine":
+					morphs.push(["raceAsia13", 1]); break;
+				case "androgynous":
+					morphs.push(["raceAsia6", 1]); break;
+				case "cute":
+					morphs.push(["raceAsia7", 1]); break;
+				case "sensual":
+					morphs.push(["raceAsia19", 1]); break;
+				case "exotic":
+					morphs.push(["raceAsia5", 1]); break;
+			} break;
+		case "mixed race":
+			//morphs.push([races[index1], 0.5]);
+			//races.splice(index1, index1);
+			//morphs.push([races[index2], 0.5]);
+			break;
+	}
+*/
 	if (slave.lips < 10) {
 		morphs.push(["lipsShapeThin", 1]);
 	} else if (slave.lips < 20) {
@@ -769,19 +1648,19 @@ App.Art.applyMorphs = function(slave, scene) {
 	}
 
 	let eyeShape = ["eyeShapeNormal", "eyeShapeWide", "eyeShapeRound", "eyeShapeSmall", "eyeShapeSlit", "eyeShapeCute", "eyeShapeOpen"];
-	let eye = Math.floor(random(slave.ID+3) * eyeShape.length);
+	let eye = Math.floor(App.Art.random(slave.ID+3) * eyeShape.length);
 	if (eye > 0) {
 		morphs.push(eyeShape[eye], 1);
 	}
 
 	let noseShape = ["noseShapeNormal", "noseShapeWide", "noseShapeForward", "noseShapeFlat", "noseShapeTriangular", "noseShapeSmall"];
-	let nose = Math.floor(random(slave.ID+4) * noseShape.length);
+	let nose = Math.floor(App.Art.random(slave.ID+4) * noseShape.length);
 	if (nose > 0) {
 		morphs.push(noseShape[nose], 1);
 	}
 
 	let foreheadShape = ["foreheadShapeNormal", "foreheadShapeRound", "foreheadShapeSmall"];
-	let forehead = Math.floor(random(slave.ID+5) * foreheadShape.length);
+	let forehead = Math.floor(App.Art.random(slave.ID+5) * foreheadShape.length);
 	if (forehead > 0) {
 		morphs.push(foreheadShape[forehead], 1);
 	}
@@ -806,58 +1685,55 @@ App.Art.applyMorphs = function(slave, scene) {
 	} else {
 		switch (slave.boobShape) {
 			case "normal":
-				morphs.push(["boobShapeNormal", (Math.sqrt(slave.boobs-600)/70)]); break;
+				morphs.push(["boobShapeNormal", ((slave.boobs-600)**(1/3)/17) * (175/slave.height)]); break;
 			case "perky":
-				morphs.push(["boobShapePerky", (Math.sqrt(slave.boobs-600)/125)]); break;
+				morphs.push(["boobShapePerky", ((slave.boobs-600)**(1/3)/30) * (175/slave.height)]); break;
 			case "saggy":
-				morphs.push(["boobShapeSaggy", (Math.sqrt(slave.boobs-600)/55)]); break;
+				morphs.push(["boobShapeSaggy", ((slave.boobs-600)**(1/3)/28) * (175/slave.height)]); break;
 			case "torpedo-shaped":
-				morphs.push(["boobShapeTorpedo", (Math.sqrt(slave.boobs-600)/35)]); break;
+				morphs.push(["boobShapeTorpedo", ((slave.boobs-600)**(1/3)/8) * (175/slave.height)]); break;
 			case "downward-facing":
-				// special case to make nipple work
-				if (slave.nipples === "flat" || slave.nipples === "inverted") {
-					morphs.push(["boobShapeDownward", (Math.sqrt(slave.boobs-600)/80)]); break;
-				} else {
-					morphs.push(["boobShapeDownwardNippleFix", (Math.sqrt(slave.boobs-600)/80)]); break;
-				}
+				morphs.push(["boobShapeDownward", ((slave.boobs-600)**(1/3)/16) * (175/slave.height)]); break;
 			case "wide-set":
-				morphs.push(["boobShapeWide", (Math.sqrt(slave.boobs-600)/40)]); break;
+				morphs.push(["boobShapeWide", ((slave.boobs-600)**(1/3)/9) * (175/slave.height)]); break;
 			case "spherical":
 				// special case to make nipple work
-				if (slave.nipples === "flat" || slave.nipples === "inverted") {
-					morphs.push(["boobShapeSpherical", (Math.sqrt(slave.boobs-600)/80)]); break;
+				if (slave.nipples === "flat" || slave.nipples === "inverted" || !p.applyNipples) {
+					morphs.push(["boobShapeSpherical", ((slave.boobs-600)**(1/3)/15) * (175/slave.height)]); break;
 				} else {
-					morphs.push(["boobShapeSphericalNippleFix", (Math.sqrt(slave.boobs-600)/80)]); break;
+					morphs.push(["boobShapeSphericalNippleFix", ((slave.boobs-600)**(1/3)/15) * (175/slave.height)]); break;
 				}
 		}
 	}
 
-	switch (slave.nipples) {
-		case "flat":
-			break;
-		case "huge":
-			morphs.push(["nipplesHuge", Math.sqrt(slave.boobs)/40 + 0.5]); break;
-		case "tiny":
-			morphs.push(["nipplesHuge", Math.sqrt(slave.boobs)/90 + 0.1]); break;
-		case "cute":
-			morphs.push(["nipplesHuge", Math.sqrt(slave.boobs)/60 + 0.25]); break;
-		case "puffy":
-			morphs.push(["nipplesPuffy", Math.sqrt(slave.boobs)/35 + 0.5]); break;
-		case "inverted":
-			break;
-		case "partially inverted":
-			morphs.push(["nipplesPuffy", Math.sqrt(slave.boobs)/50 + 0.25]); break;
-		case "fuckable":
-			morphs.push(["nipplesHuge", Math.sqrt(slave.boobs)/25 + 0.6]); break;
+	if (p.applyNipples) {
+		switch (slave.nipples) {
+			case "flat":
+				break;
+			case "huge":
+				morphs.push(["nipplesHuge", (slave.boobs**(1/3)/10 + 0.5) * (175/slave.height)]); break;
+			case "tiny":
+				morphs.push(["nipplesHuge", (slave.boobs**(1/3)/30 + 0.1) * (175/slave.height)]); break;
+			case "cute":
+				morphs.push(["nipplesHuge", (slave.boobs**(1/3)/20 + 0.25) * (175/slave.height)]); break;
+			case "puffy":
+				morphs.push(["nipplesPuffy", (slave.boobs**(1/3)/10 + 0.5) * (175/slave.height)]); break;
+			case "inverted":
+				break;
+			case "partially inverted":
+				morphs.push(["nipplesPuffy", (slave.boobs**(1/3)/20 + 0.25) * (175/slave.height)]); break;
+			case "fuckable":
+				morphs.push(["nipplesHuge", (slave.boobs**(1/3)/5 + 0.6) * (175/slave.height)]); break;
+		}
 	}
 
-	if (slave.foreskin !== 0) {
+	if (slave.foreskin !== 0 && !scene.inspectView) {
 		morphs.push(["foreskin", 1]);
 	}
 	if (slave.dick === 0 && !(slave.scrotum <= 0 || slave.balls <= 0)) {
 		morphs.push(["dickRemove", 1]);
 	} else if (slave.dick !== 0) {
-		morphs.push(["dick", (slave.dick / 8) -1]);
+		morphs.push(["dick", (slave.dick * (175/slave.height) / 4.2) -1.05]);
 	}
 	if (slave.vagina === -1) {
 		morphs.push(["vaginaRemove", 1]);
@@ -866,27 +1742,23 @@ App.Art.applyMorphs = function(slave, scene) {
 		morphs.push(["ballsRemove", 1]);
 	} else {
 		if (slave.balls <= 2) {
-			morphs.push(["balls", convertRange(0, 2, -1, 0, slave.balls)]);
+			morphs.push(["balls", convertRange(0, 2, -1, 0, slave.balls * (175/slave.height))]);
 		} else {
-			morphs.push(["balls", convertRange(2, 10, 0, 1.5, slave.balls)]);
+			morphs.push(["balls", convertRange(2, 10, 0, 1.5, slave.balls * (175/slave.height))]);
 		}
 		if (slave.scrotum > 2) {
-			morphs.push(["scrotum", convertRange(2, 10, 0, 0.75, slave.scrotum)]);
+			morphs.push(["scrotum", convertRange(2, 10, 0, 0.75, slave.scrotum * (175/slave.height))]);
 		}
 	}
 
-	morphs.push(["areolae", convertRange(0, 4, 0, 5, slave.areolae)]);
+	morphs.push(["areolae", convertRange(0, 4, -1, 5, slave.areolae)]);
 	morphs.push(["shoulders", slave.shoulders/1.2]);
 	scene.models[0].transform.scale = slave.height/175; // height by object transform
 	if (slave.muscles > 0) {
 		morphs.push(["muscles", slave.muscles/33]);
 	}
 
-	if(slave.belly < 15000 ) {
-		morphs.push(["belly", Math.sqrt(slave.belly)/122.5]);
-	} else {
-		morphs.push(["belly", 1 + (Math.sqrt(slave.belly)-122.5)/150]);
-	}
+	morphs.push(["belly", slave.belly**(1/3)/24.6]);
 
 	morphs.push(["hips", slave.hips/2]);
 
@@ -909,9 +1781,9 @@ App.Art.applyMorphs = function(slave, scene) {
 	}
 
 	if (slave.visualAge < 20) {
-		morphs.push(["physicalAgeYoung", -(slave.visualAge-20)/20]);
+		morphs.push(["physicalAgeYoung", -(slave.visualAge-20)/10]);
 	} else {
-		morphs.push(["physicalAgeOld", (slave.visualAge-20)/66]);
+		morphs.push(["physicalAgeOld", (slave.visualAge-20)/52]);
 	}
 
 	if (!hasLeftArm(slave)) {
diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js
index 555fcf2b6fa600bc3cc86a85823ecfa937c4b50e..4b4e5608758fe14393430ba9dbc97c06e5e4d0fa 100644
--- a/src/art/webgl/engine.js
+++ b/src/art/webgl/engine.js
@@ -52,21 +52,21 @@ App.Art.Engine = class {
 
                 out vec2 textureCoord;
                 out vec3 normal;
-                out vec4 pos;
+                out vec3 pos;
                 out mat3 TBN;
 
                 void main() {
                     gl_Position = matProj * matView * matTrans * matScale * matRot * vec4(vertexPosition + vertexPositionMorph, 1.0);
                     normal = normalize((matRot * vec4(vertexNormal + vertexNormalMorph, 1.0)).xyz);
 
-                    vec3 T = normalize(vec3(matTrans * matRot * vec4(vertexTangent, 0.0)));
-                    vec3 N = normalize(vec3(matTrans * matRot * vec4(vertexNormal + vertexNormalMorph, 0.0)));
+                    vec3 T = normalize((matRot * vec4(vertexTangent, 1.0)).xyz);
+                    vec3 N = normalize((matRot * vec4(vertexNormal + vertexNormalMorph, 1.0)).xyz);
                     T = normalize(T - dot(T, N) * N);
                     vec3 B = cross(N, T);
                     TBN = mat3(T, B, N);
 
                     textureCoord = textureCoordinate;
-                    pos = matTrans * matScale * matRot * vec4(vertexPosition + vertexPositionMorph, 1.0);
+                    pos = (matTrans * matScale * matRot * vec4(vertexPosition + vertexPositionMorph, 1.0)).xyz;
                 }`;
 	}
 
@@ -91,6 +91,7 @@ App.Art.Engine = class {
                 uniform vec3 Ka;
                 uniform vec3 Kd;
                 uniform vec3 Ks;
+				uniform vec3 Ke;
                 uniform float d;
                 uniform float Ns;
 
@@ -98,18 +99,20 @@ App.Art.Engine = class {
                 uniform float sAmbient;
                 uniform float sDiffuse;
                 uniform float sSpecular;
+				uniform float sEmission;
                 uniform float sAlpha;
                 uniform float sGamma;
                 uniform float sReinhard;
                 uniform float sNormal;
+				uniform float sColorBurn;
                 
                 uniform vec3 lookDir;
 
-                uniform sampler2D textSampler[6];
+                uniform sampler2D textSampler[7];
 
                 in vec2 textureCoord;
                 in vec3 normal;
-                in vec4 pos;
+                in vec3 pos;
                 in mat3 TBN;
 
                 out vec4 outputColor;
@@ -119,6 +122,7 @@ App.Art.Engine = class {
                     vec3 map_Ka = vec3(0.0,0.0,0.0);
                     vec3 map_Kd = vec3(0.0,0.0,0.0);
                     vec3 map_Ks = vec3(0.0,0.0,0.0);
+					vec3 map_Ke = vec3(0.0,0.0,0.0);
                     float map_Ns = 0.0;
                     float map_d = 1.0;
 
@@ -139,36 +143,59 @@ App.Art.Engine = class {
                         map_Ns = Ns * texture(textSampler[3], textureCoord.st).r;
                     }
 
+					if (sEmission == 1.0) {
+                        map_Ke = Ke * texture(textSampler[6], textureCoord.st).rgb;
+                    }
+
                     if (sAlpha == 1.0)
                         map_d = d * texture(textSampler[4], textureCoord.st).r;
 
+					if (map_d < 0.05)
+						discard;
+
                     vec3 Ld = vec3(0.0,0.0,0.0);
                     vec3 Ls = vec3(0.0,0.0,0.0);
                     vec3 La = vec3(0.0,0.0,0.0);
+					vec3 Le = map_Ke;
+
+					if (sColorBurn == 1.0) {
+						float l1 = dot(map_Kd, vec3(0.2126,0.7152,0.0722));
+						float l2 = dot(map_Kd * map_Kd, vec3(0.2126,0.7152,0.0722));
+						map_Kd = l1/(l2+0.0001) * map_Kd * map_Kd;
+					}
+
+					map_Ka = map_Kd * map_Ka;
+					
                     for (int i = 0; i < ${dl}; i++) {
                         float angle = max(dot(-lightVect[i], new_normal),0.0);
                         vec3 reflection = reflect(-lightVect[i], new_normal);
                         float specular = pow(max(dot(reflection, lookDir),0.0), (0.0001+map_Ns));
 
                         Ld += map_Kd * lightInt[i] * angle * lightColor[i];
-                        Ls += map_Ks * lightInt[i] * specular * lightColor[i];
-                        La += map_Ka * lightInt[i] * lightAmb[i] * lightColor[i];
+                        Ls += map_Ks * lightInt[i] * specular * angle * lightColor[i];
+                        La += map_Ka * lightInt[i] * (1.0-angle) * lightAmb[i] * lightColor[i];
                     }
 
                     for (int i = 0; i < ${pl}; i++) {
-                        vec3 pointLightDir = normalize(pos.xyz - pointLightPos[i]);
+                        vec3 pointLightDir = normalize(pos - pointLightPos[i]);
                         float angle = max(dot(-pointLightDir, new_normal),0.0);
                         vec3 reflection = reflect(-pointLightDir, new_normal);
                         float specular = pow(max(dot(reflection, lookDir),0.0), (0.0001+map_Ns));
 
                         Ld += map_Kd * pointLightInt[i] * angle * pointLightColor[i];
-                        Ls += map_Ks * pointLightInt[i] * specular * pointLightColor[i];
-                        La += map_Ka * pointLightInt[i] * pointLightAmb[i] * pointLightColor[i];
+                        Ls += map_Ks * pointLightInt[i] * specular * angle * pointLightColor[i];
+                        La += map_Ka * pointLightInt[i] * (1.0-angle) * pointLightAmb[i] * pointLightColor[i];
                     }
 
-                    vec3 vLighting = Ld + Ls + La;
-                    vec3 c = map_Kd * vLighting;
+                    vec3 vLighting = Ld + Ls + La + Le;
+                    vec3 c = vLighting;
 
+					if (sGamma == 1.0) {
+                        c.r = pow(c.r, (1.0/gammaY));
+                        c.g = pow(c.g, (1.0/gammaY));
+                        c.b = pow(c.b, (1.0/gammaY));
+                    }
+					
                     if (sReinhard == 1.0) {
                         float l_old = 0.2126*c.r+0.7152*c.g+0.0722*c.b;
                         float numerator = l_old * (1.0 + (l_old / (whiteM*whiteM)));
@@ -176,12 +203,6 @@ App.Art.Engine = class {
                         c = c * (l_new / l_old);
                     }
 
-                    if (sGamma == 1.0) {
-                        c.r = pow(c.r, (1.0/gammaY));
-                        c.g = pow(c.g, (1.0/gammaY));
-                        c.b = pow(c.b, (1.0/gammaY));
-                    }
-
                     if (sNormals == 1.0) {
                         c = new_normal;
                     }
@@ -190,7 +211,7 @@ App.Art.Engine = class {
                 }`;
 	}
 
-	initBuffers(sceneData) {
+	initBuffers(sceneData, dir) {
 		// init buffer containers
 		this.buffers = new class {};
 		this.buffers.models = [];
@@ -258,11 +279,11 @@ App.Art.Engine = class {
 				}
 			}
 
-			this.initMorphs(modelBuffers, modelData);
+			this.initMorphs(modelBuffers, modelData, dir);
 		}
 	}
 
-	initMorphs(modelBuffers, modelData) {
+	initMorphs(modelBuffers, modelData, dir) {
 		window.sceneBlocks = {}; // automatically populated during loading of morphs
 
 		let promisedMorphs = [];
@@ -280,12 +301,11 @@ App.Art.Engine = class {
 			}
 
 			// stream real morphs
-			promisedMorphs[f] = this.loadMorph(modelBuffers, f, modelData.figures[f].morphs);
+			promisedMorphs[f] = this.loadMorph(modelBuffers, f, modelData.figures[f].morphs, dir);
 		}
 
 		Promise.all(promisedMorphs).then((values) => {
 			if (values.length > 2) { // promise triggers twice (?)
-				window.sceneBlocks = null; // let garbage collector clean
 				if (App.Art.engineReady) { // re-send loaded event after morphs finish streaming
 					modelBuffers.oldMorphValues = null;
 					let containers = document.getElementsByClassName("artContainer");
@@ -297,12 +317,12 @@ App.Art.Engine = class {
 		});
 	}
 
-	loadMorph(modelBuffers, m, path) {
+	loadMorph(modelBuffers, m, path, dir) {
 		let engine = this;
 		return new Promise(function(resolve, reject) {
 			let script = document.createElement("script");
 			script.onload = function() {
-				let morph = window.sceneBlocks[path];
+				let morph = window.sceneBlocks[path.split("/").slice(-1)[0]];
 
 				for (let i=0; i < morph.length; i+=3) {
 					modelBuffers.vertexPositionMorphs[m][i/3] = engine.base64ToFloat(morph[i+0]);
@@ -310,25 +330,31 @@ App.Art.Engine = class {
 					// reconstruct compressed indices
 					modelBuffers.vertexIndexMorphs[m][i/3] = engine.base64ToInt(morph[i+2]).map((sum => value => sum += value)(0));
 				}
+
+				morph = null; // let garbage collector clean
 				resolve();
 			};
 			script.onerror = function(e) {
 				reject(e, script);
 			};
-			script.src = path;
+			script.src = dir + path;
 			document.head.appendChild(script);
 		});
 	}
 
-	initTextures(sceneData) {
+	initTextures(sceneData, dir) {
 		// load model textures
-		this.textures = [];
+		this.textures = {};
 		let promisedTextures = [];
-		for (let i=0; i < sceneData.textures.length; i++) {
-			const {texture, promise} = this.loadTexture(this.gl, sceneData.textures[i]);
-			this.textures[i] = texture;
-			promisedTextures[i] = promise;
+		for (let key in sceneData.textures) {
+			let texture = this.gl.createTexture();
+			this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
+			this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, 1, 1, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, new Uint8Array([255, 255, 255, 255]));
+			this.textures[key] = texture;
+
+			promisedTextures.push(this.loadTexture(this.gl, texture, sceneData.textures[key], dir));
 		}
+
 		Promise.all(promisedTextures).then(() => {
 			if (App.Art.engineReady) { // re-send loaded event after textures finish streaming
 				let containers = document.getElementsByClassName("artContainer");
@@ -339,28 +365,60 @@ App.Art.Engine = class {
 		});
 	}
 
-	loadTexture(gl, url) {
-		// return dummy texture right now
-		let texture = gl.createTexture();
-		gl.bindTexture(gl.TEXTURE_2D, texture);
-		gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 255, 255, 255]));
-
-		// promise that real textures will stream in the future
-		let promise = fetch(url)
-			.then(response => response.blob())
-			.then(blob => createImageBitmap(blob))
-			.then(bitmap => {
-				gl.bindTexture(gl.TEXTURE_2D, texture);
-				gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-				gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-				gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-				gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-				gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, bitmap);
-
-				return texture;
-			});
-
-		return {texture, promise};
+	loadTexture(gl, texture, path, dir) {
+		return new Promise(function(resolve, reject) {
+			let script = document.createElement("script");
+			script.onload = function() {
+				let url = window.sceneBlocks[path.split("/").slice(-1)[0]][0];
+
+				let img = document.createElement("img");
+				img.onload = function() {
+					// resize
+					let width = img.width;
+					let height = img.height;
+					let aspect = parseFloat(height / width);
+
+					let textureSize = 1024;
+					if(typeof V.setTextureResolution !== "undefined") {
+						textureSize = V.setTextureResolution;
+					}
+
+					if (width > textureSize || height > textureSize) {
+						if (width > textureSize) {
+							width = textureSize;
+							height = parseInt(width * aspect);
+						}
+						if (height > textureSize) {
+							height = textureSize;
+							width = parseInt(width / aspect);
+						}
+
+						let canvas = document.createElement("canvas");
+						let ctx = canvas.getContext("2d");
+						canvas.width = width;
+						canvas.height = height;
+						ctx.drawImage(img, 0, 0, width, height);
+						img = canvas;
+					}
+
+					gl.bindTexture(gl.TEXTURE_2D, texture);
+					gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+					gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+					gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+					gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
+					gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img);
+
+					url = null; // let garbage collector clean
+					resolve();
+				};
+				img.src = url;
+			};
+			script.onerror = function(e) {
+				reject(e, script);
+			};
+			script.src = dir + path;
+			document.head.appendChild(script);
+		});
 	}
 
 	initShaders(sceneParams) {
@@ -416,20 +474,18 @@ App.Art.Engine = class {
 		this.gl.enableVertexAttribArray(this.vertexPositionMorphAttribute);
 	}
 
-	bind(sceneData, sceneParams) {
+	bind(sceneData, sceneParams, dir) {
 		this.offscreenCanvas = document.createElement("canvas");
 		this.gl = this.offscreenCanvas.getContext("webgl2", {alpha:true, premultipliedAlpha: true});
 
-		this.gl.enable(this.gl.CULL_FACE);
-		this.gl.cullFace(this.gl.BACK);
 		this.gl.enable(this.gl.DEPTH_TEST);
 		this.gl.depthFunc(this.gl.LEQUAL);
 		this.gl.enable(this.gl.BLEND);
 		this.gl.blendEquation( this.gl.FUNC_ADD );
 		this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
 
-		this.initBuffers(sceneData);
-		this.initTextures(sceneData);
+		this.initBuffers(sceneData, dir);
+		this.initTextures(sceneData, dir);
 		this.initShaders(sceneParams);
 	}
 
@@ -439,6 +495,14 @@ App.Art.Engine = class {
 		this.offscreenCanvas.height = sceneParams.settings.rheight;
 		this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);
 
+		// set culling
+		if (V.setFaceCulling) {
+			this.gl.enable(this.gl.CULL_FACE);
+			this.gl.cullFace(this.gl.BACK);
+		} else {
+			this.gl.disable(this.gl.CULL_FACE);
+		}
+
 		// draw background
 		this.gl.clearColor(0, 0, 0, 0);
 		this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
@@ -491,16 +555,23 @@ App.Art.Engine = class {
 		let matView = this.matrixInverse(matCamera);
 
 		// set scene uniforms
+		let sColorBurn = true;
+		if(typeof V.setColorBurn !== "undefined") {
+			sColorBurn = V.setColorBurn;
+		}
+
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sNormals"), sceneParams.settings.normals);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sAmbient"), sceneParams.settings.ambient);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sDiffuse"), sceneParams.settings.diffuse);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sSpecular"), sceneParams.settings.specular);
+		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sEmission"), sceneParams.settings.emission);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sNormal"), sceneParams.settings.normal);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sAlpha"), sceneParams.settings.alpha);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sReinhard"), sceneParams.settings.reinhard);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sGamma"), sceneParams.settings.gamma);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "whiteM"), sceneParams.settings.whiteM);
 		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "gammaY"), sceneParams.settings.gammaY);
+		this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sColorBurn"), Number(sColorBurn));
 
 		for (let i = 0; i < sceneParams.directionalLights.length; i++) {
 			let lightVect = this.polarToCart(this.degreeToRad(sceneParams.directionalLights[i].yr), this.degreeToRad(sceneParams.directionalLights[i].xr));
@@ -582,33 +653,38 @@ App.Art.Engine = class {
 
 						if (mat.d > 0 && visible) {
 							this.gl.activeTexture(this.gl.TEXTURE0);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_Ka)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Ka]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[0]"), 0);
 
 							this.gl.activeTexture(this.gl.TEXTURE1);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_Kd)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Kd]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[1]"), 1);
 
 							this.gl.activeTexture(this.gl.TEXTURE2);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_Ks)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Ks]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[2]"), 2);
 
 							this.gl.activeTexture(this.gl.TEXTURE3);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_Ns)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Ns]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[3]"), 3);
 
 							this.gl.activeTexture(this.gl.TEXTURE4);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_D)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_D]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[4]"), 4);
 
 							this.gl.activeTexture(this.gl.TEXTURE5);
-							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[parseInt(mat.map_Kn)]);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Kn]);
 							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[5]"), 5);
 
+							this.gl.activeTexture(this.gl.TEXTURE6);
+							this.gl.bindTexture(this.gl.TEXTURE_2D, this.textures[mat.map_Ke]);
+							this.gl.uniform1i(this.gl.getUniformLocation(this.shaderProgram, "textSampler[6]"), 6);
+
 							this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "d"), mat.d);
 							this.gl.uniform3fv(this.gl.getUniformLocation(this.shaderProgram, "Ka"), mat.Ka);
 							this.gl.uniform3fv(this.gl.getUniformLocation(this.shaderProgram, "Kd"), mat.Kd);
 							this.gl.uniform3fv(this.gl.getUniformLocation(this.shaderProgram, "Ks"), mat.Ks);
+							this.gl.uniform3fv(this.gl.getUniformLocation(this.shaderProgram, "Ke"), mat.Ke);
 							this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "Ns"), mat.Ns);
 
 							// draw materials
diff --git a/src/art/webgl/ui.js b/src/art/webgl/ui.js
index 7a132f37a123e83f8bbb1db05d7bd360235d6843..2f6d90315a4bbe8aba6aed2b0f332413eab21f5a 100644
--- a/src/art/webgl/ui.js
+++ b/src/art/webgl/ui.js
@@ -1,6 +1,6 @@
 App.Art.isDraggingCanvas = false;
 
-App.Art.createWebglUI = function(container, slave, artSize, scene) {
+App.Art.createWebglUI = function(container, slave, artSize, scene, p) {
 	let lockViewDisabled = "resources/webgl/ui/lockViewDisabled.png";
 	let lockViewEnabled = "resources/webgl/ui/lockViewEnabled.png";
 	let faceViewDisabled = "resources/webgl/ui/faceViewDisabled.png";
@@ -51,7 +51,7 @@ App.Art.createWebglUI = function(container, slave, artSize, scene) {
 		btnInspectView.src = inspectViewDisabled;
 
 		scene.models[0].transform.yr = 180;
-		App.Art.applyMorphs(slave, scene);
+		App.Art.applyMorphs(slave, scene, p);
 		App.Art.Frame(slave, scene);
 		App.Art.engine.render(scene, cvs);
 	};
@@ -73,7 +73,7 @@ App.Art.createWebglUI = function(container, slave, artSize, scene) {
 		scene.models[0].transform.yr = 0;
 		scene.camera.xr = -6;
 		scene.camera.z = -slave.height/3.85;
-		App.Art.applyMorphs(slave, scene);
+		App.Art.applyMorphs(slave, scene, p);
 		App.Art.engine.render(scene, cvs);
 	};
 
@@ -86,7 +86,7 @@ App.Art.createWebglUI = function(container, slave, artSize, scene) {
 		btnInspectView.src = inspectViewEnabled;
 
 		scene.models[0].transform.yr = App.Art.defaultScene.models[0].transform.yr;
-		App.Art.applyMorphs(slave, scene);
+		App.Art.applyMorphs(slave, scene, p);
 		App.Art.Frame(slave, scene);
 		App.Art.engine.render(scene, cvs);
 	};
@@ -174,8 +174,9 @@ App.Art.createWebglUI = function(container, slave, artSize, scene) {
 			break;
 	}
 
-	cvs.width = sz[0];
-	cvs.height = sz[1];
+	let zoom = Math.max(1, window.devicePixelRatio);
+	cvs.width = sz[0] * zoom;
+	cvs.height = sz[1] * zoom;
 	container.setAttribute("style", "position: relative; width: " + sz[0] + "px; height: " + sz[1] + "px;");
 
 	if(typeof V.setSuperSampling === "undefined") {
@@ -185,28 +186,75 @@ App.Art.createWebglUI = function(container, slave, artSize, scene) {
 	scene.settings.rwidth = cvs.width * V.setSuperSampling;
 	scene.settings.rheight = cvs.height * V.setSuperSampling;
 
-	// render based on active view
-	if (scene.faceView) {
-		btnFaceView.click();
-	} else if (scene.inspectView) {
-		btnInspectView.click();
-	} else {
-		btnResetView.click();
+	scene.settings.gamma = false;
+	scene.settings.gammaY = 1.0;
+
+	scene.settings.reinhard = true;
+	scene.settings.whiteM = 1.20;
+
+	if (!V.setColorBurn) {
+		scene.settings.whiteM = 1.30;
+		scene.directionalLights[0].intensity = 1.15;
 	}
+
+	App.Art.engine.render(scene, cvs);
+
+	/*
+	if (artSize === 3) {
+		let cvs2 = document.createElement("canvas");
+		cvs2.setAttribute("style", "position: absolute; top: 530px; border: 4px; border-color: #151515; border-style: solid; margin-top: 15px;");
+
+		let cvs3 = document.createElement("canvas");
+		cvs3.setAttribute("style", "position: absolute; top: 530px; left: 156px; border: 4px; border-color: #151515; border-style: solid; margin-top: 15px;");
+
+		let oldYr = scene.models[0].transform.yr;
+		// let oldCamera = scene.camera;
+
+		scene.camera.y = slave.height * 8 / 10;
+		scene.camera.z = -65 - (Math.sqrt(slave.boobs)/10);
+
+		cvs2.width = 150;
+		cvs2.height = 150;
+		scene.settings.rwidth = cvs2.width * V.setSuperSampling;
+		scene.settings.rheight = cvs2.height * V.setSuperSampling;
+		App.Art.engine.render(scene, cvs2);
+
+		scene.camera.y = slave.height * 5.5 / 10;
+		scene.camera.z = -65;
+		scene.models[0].transform.yr = -180;
+
+		cvs3.width = 150;
+		cvs3.height = 150;
+		scene.settings.rwidth = cvs3.width * V.setSuperSampling;
+		scene.settings.rheight = cvs3.height * V.setSuperSampling;
+		App.Art.engine.render(scene, cvs3);
+
+		container.appendChild(cvs2);
+		container.appendChild(cvs3);
+
+		App.Art.Frame(slave, scene);
+
+		scene.settings.rwidth = cvs.width * V.setSuperSampling;
+		scene.settings.rheight = cvs.height * V.setSuperSampling;
+		scene.models[0].transform.yr = oldYr;
+		// scene.camera = oldCamera;
+	}*/
 };
 
 App.Art.Frame = function(slave, scene) {
-	if (slave.height > 185) {
-		App.Art.AutoFrame(scene, slave.height, 127);
+	let offset = scene.models[0].transform.y;
+
+	if ((slave.height + offset) > 185) {
+		App.Art.AutoFrame(scene, slave.height, 123, offset);
 	} else {
 		App.Art.FixedFrame(scene);
 	}
 };
 
-App.Art.AutoFrame = function(scene, slaveHeight, cameraHeight) {
+App.Art.AutoFrame = function(scene, slaveHeight, cameraHeight, offset) {
 	// auto-frame based on camera height and FoV
-	let n = Math.max(slaveHeight * 1.05 - cameraHeight, 1);
-	let m = cameraHeight * 1.065;
+	let n = Math.max((slaveHeight + offset) * 1.06 - cameraHeight, 1);
+	let m = cameraHeight * 1.12;
 	let fov = scene.camera.fov;
 
 	let a = fov * (Math.PI/180);
@@ -233,7 +281,7 @@ App.Art.AutoFrame = function(scene, slaveHeight, cameraHeight) {
 };
 
 App.Art.FixedFrame = function(scene) {
-	scene.camera.z = -275;
-	scene.camera.y = 127;
+	scene.camera.z = -282;
+	scene.camera.y = 123;
 	scene.camera.xr = -6;
 };
diff --git a/src/budget/costsBudget.js b/src/budget/costsBudget.js
index cdb27938280afd09a22c0b6d7ac8c89f998810b4..3a44531d671c0555394ad8eb8110f7dac17ce7e6 100644
--- a/src/budget/costsBudget.js
+++ b/src/budget/costsBudget.js
@@ -68,13 +68,13 @@ App.Budget.costs = function() {
 		const r = [];
 		r.push("The current score is");
 		if (V.localEcon > 100) {
-			let _econPercent = Math.trunc(1000 - 100000 / V.localEcon) / 10;
-			r.push(`reducing prices by <span class="cash inc">${_econPercent}%.</span>`);
+			let econPercent = Math.trunc(1000 - 100000 / V.localEcon) / 10;
+			r.push(`reducing prices by <span class="cash inc">${econPercent}%.</span>`);
 		} else if (V.localEcon === 100) {
 			r.push("equal to the base score. There are no price modifications.");
 		} else {
-			let _econPercent = Math.trunc(100000 / V.localEcon - 1000) / 10;
-			r.push(`increasing prices by <span class="cash dec">${_econPercent}%.</span>`);
+			let econPercent = Math.trunc(100000 / V.localEcon - 1000) / 10;
+			r.push(`increasing prices by <span class="cash dec">${econPercent}%.</span>`);
 		}
 		$(p).append(...App.Events.spaceSentences(r));
 
@@ -88,10 +88,10 @@ App.Budget.costs = function() {
 		const p = document.createElement("p");
 		App.UI.DOM.appendNewElement("div", p, "Your weekly costs are as follows:", "detail");
 
-		let _options = new App.UI.OptionsGroup();
-		_options.addOption("", "costsBudget", V.showAllEntries)
+		let options = new App.UI.OptionsGroup();
+		options.addOption("", "costsBudget", V.showAllEntries)
 			.addValue("Normal", 0).on().addValue("Show Empty Entries", 1);
-		p.append(_options.render());
+		p.append(options.render());
 
 		return p;
 	}
diff --git a/src/budget/repBudget.js b/src/budget/repBudget.js
index c46216dbd4f686cc1e1aecd4249661a9d966e285..5cbad0d806633f704e6b387965a0688422160165 100644
--- a/src/budget/repBudget.js
+++ b/src/budget/repBudget.js
@@ -31,10 +31,10 @@ App.Budget.rep = function() {
 		const p = document.createElement("p");
 		App.UI.DOM.appendNewElement("div", p, "Your weekly reputation changes are as follows:", "detail");
 
-		let _options = new App.UI.OptionsGroup();
-		_options.addOption("", "repBudget", V.showAllEntries)
+		let options = new App.UI.OptionsGroup();
+		options.addOption("", "repBudget", V.showAllEntries)
 			.addValue("Normal", 0).on().addValue("Show Empty Entries", 1);
-		p.append(_options.render());
+		p.append(options.render());
 
 		return p;
 	}
diff --git a/src/cheats/cheatEditNeightbors.js b/src/cheats/cheatEditNeightbors.js
index 57235cafa24a2aaff64ddae7ee62c5970ef39b87..0e8535a2deb410a3c3276dad3eb198b5a63aa5f8 100644
--- a/src/cheats/cheatEditNeightbors.js
+++ b/src/cheats/cheatEditNeightbors.js
@@ -3,8 +3,8 @@ App.UI.Cheat.neighbors = function() {
 	const r = [];
 
 	if (V.arcologies.length > 1) {
-		const _neighbors = V.arcologies.length - 1;
-		r.push(`Your arcology has ${_neighbors} ${(_neighbors === 1) ? `neighbor.` : `neighbors.`}`);
+		const neighbors = V.arcologies.length - 1;
+		r.push(`Your arcology has ${neighbors} ${(neighbors === 1) ? `neighbor.` : `neighbors.`}`);
 	} else {
 		r.push(`Your arcology has no neighbors.`);
 	}
@@ -18,12 +18,12 @@ App.UI.Cheat.neighbors = function() {
 				for (const arc of V.arcologies) {
 					compass.delete(arc.direction);// remove directions already in use
 				}
-				const _govTypes = [
+				const govTypes = [
 					"a committee", "a corporation", "an individual", "an oligarchy", "direct democracy", "elected officials"
 				];
 				/** @type {FC.ArcologyState} */
 				const activeArcology = {
-					name: "Arcology X-", direction: compass.random(), government: _govTypes.random(), honeymoon: 0, prosperity: 50, ownership: 50, minority: 20, PCminority: 0, demandFactor: 0, FSSupremacist: "unset", FSSupremacistRace: 0, FSSubjugationist: "unset", FSSubjugationistRace: 0, FSGenderRadicalist: "unset", FSGenderFundamentalist: "unset", FSPaternalist: "unset", FSDegradationist: "unset", FSIntellectualDependency: "unset", FSSlaveProfessionalism: "unset", FSBodyPurist: "unset", FSTransformationFetishist: "unset", FSYouthPreferentialist: "unset", FSMaturityPreferentialist: "unset", FSStatuesqueGlorification: "unset", FSPetiteAdmiration: "unset", FSSlimnessEnthusiast: "unset", FSAssetExpansionist: "unset", FSPastoralist: "unset", FSPhysicalIdealist: "unset", FSChattelReligionist: "unset", FSRomanRevivalist: "unset", FSAztecRevivalist: "unset", FSEgyptianRevivalist: "unset", FSEdoRevivalist: "unset", FSArabianRevivalist: "unset", FSChineseRevivalist: "unset", FSNull: "unset", FSRepopulationFocus: "unset", FSHedonisticDecadence: "unset", FSCummunism: "unset", FSIncestFetishist: "unset", FSRestart: "unset", embargo: 1, embargoTarget: -1, influenceTarget: -1, influenceBonus: 0, rival: 0
+					name: "Arcology X-", direction: compass.random(), government: govTypes.random(), honeymoon: 0, prosperity: 50, ownership: 50, minority: 20, PCminority: 0, demandFactor: 0, FSSupremacist: "unset", FSSupremacistRace: 0, FSSubjugationist: "unset", FSSubjugationistRace: 0, FSGenderRadicalist: "unset", FSGenderFundamentalist: "unset", FSPaternalist: "unset", FSDegradationist: "unset", FSIntellectualDependency: "unset", FSSlaveProfessionalism: "unset", FSBodyPurist: "unset", FSTransformationFetishist: "unset", FSYouthPreferentialist: "unset", FSMaturityPreferentialist: "unset", FSStatuesqueGlorification: "unset", FSPetiteAdmiration: "unset", FSSlimnessEnthusiast: "unset", FSAssetExpansionist: "unset", FSPastoralist: "unset", FSPhysicalIdealist: "unset", FSChattelReligionist: "unset", FSRomanRevivalist: "unset", FSAztecRevivalist: "unset", FSEgyptianRevivalist: "unset", FSEdoRevivalist: "unset", FSArabianRevivalist: "unset", FSChineseRevivalist: "unset", FSNull: "unset", FSRepopulationFocus: "unset", FSHedonisticDecadence: "unset", FSCummunism: "unset", FSIncestFetishist: "unset", FSRestart: "unset", embargo: 1, embargoTarget: -1, influenceTarget: -1, influenceBonus: 0, rival: 0
 				};
 
 				if (V.arcologies.length < 4) {
diff --git a/src/cheats/cheatEditSlave.js b/src/cheats/cheatEditSlave.js
index 947078459efa500de28a2e6d6aeee60b10459093..396bbc382216d1c1f8f2fa1f3e9285bf464b1919 100644
--- a/src/cheats/cheatEditSlave.js
+++ b/src/cheats/cheatEditSlave.js
@@ -15,7 +15,7 @@ App.UI.SlaveInteract.cheatEditSlave = function(slave) {
 	tabBar.addTab("Upper", "upper", App.StartingGirls.upper(V.tempSlave, true));
 	tabBar.addTab("Lower", "lower", App.StartingGirls.lower(V.tempSlave, true));
 	if (V.tempSlave.womb.length > 0) {
-		tabBar.addTab(`Fetus${V.tempSlave.womb.length > 1 ? 'es' : ''}`, "fetuses", analyzePregnancies(V.tempSlave, true));
+		tabBar.addTab(V.tempSlave.womb.length > 1 ? 'Fetuses' : 'Fetus', "fetuses", analyzePregnancies(V.tempSlave, true));
 	}
 	tabBar.addTab("Genes", "genes", genes());
 	tabBar.addTab("Mental", "mental", App.StartingGirls.mental(V.tempSlave, true));
diff --git a/src/cheats/neighborArcologyCheatDatatypeCleanup.js b/src/cheats/neighborArcologyCheatDatatypeCleanup.js
index b6ae454ded73eb150069a0f59cdd27e9b3c378b1..d03b0a7b7a2fcc9c3cb983f2136e72cf10571520 100644
--- a/src/cheats/neighborArcologyCheatDatatypeCleanup.js
+++ b/src/cheats/neighborArcologyCheatDatatypeCleanup.js
@@ -1,9 +1,9 @@
 App.UI.Cheat.neighborArcologyCheatDatatypeCleanup = function() {
 	const node = new DocumentFragment();
 
-	const _clean = App.Update.arcologiesDatatypeCleanup();
-	if (_clean) {
-		App.UI.DOM.appendNewElement("p", node, _clean);
+	const clean = App.Update.arcologiesDatatypeCleanup();
+	if (clean) {
+		App.UI.DOM.appendNewElement("p", node, clean);
 	}
 
 	App.UI.DOM.appendNewElement("p", node, "You have CHEATED your way to influencing the neighboring arcologies. They have been unscrupulously directed according to your CHEAT whims.");
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 8ad295203cc975b9bf62a36845150606129e3306..2656ee346d81b4379813914a0587ac62db25ff5d 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -323,14 +323,6 @@ App.Update.globalVariables = function(node) {
 	// Pit
 	App.Facilities.Pit.BC();
 
-	if (V.killChoice) {
-		delete V.killChoice;
-	}
-
-	if (V.foodCrisis) {
-		delete V.foodCrisis;
-	}
-
 	App.SecExp.generalBC();
 	App.SF.BC();
 
diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js
index 2edf67c71237a0f6a0d1580c9f836bba08d5d997..468e070aafe771687413089cda7e443890742383 100644
--- a/src/data/backwardsCompatibility/updateSlaveObject.js
+++ b/src/data/backwardsCompatibility/updateSlaveObject.js
@@ -360,10 +360,10 @@ App.Update.Slave = function(slave, genepool = false) {
 	}
 
 	if (slave.underArmHColor === "slave.hColor") {
-		slave.underArmHColor === slave.hColor;
+		slave.underArmHColor = slave.hColor;
 	}
 	if (slave.eyebrowHColor === "slave.hColor") {
-		slave.eyebrowHColor === slave.hColor;
+		slave.eyebrowHColor = slave.hColor;
 	}
 
 	if (slave.genes === undefined) {
diff --git a/src/debugging/debugJS.js b/src/debugging/debugJS.js
index 503a6f8b0d8425c1f6f9295d05e342b396fa56d7..9e7c48e295ee64db09ab703d1a710d207cf83def 100644
--- a/src/debugging/debugJS.js
+++ b/src/debugging/debugJS.js
@@ -2,7 +2,7 @@
 /* eslint-disable no-var */
 /*
 Given an object, this will return an array where for each property of the original object, we include the object
-{variable: property, oldVal: _oldDiff.property, newVal: _newDiff.property}
+{variable: property, oldVal: oldDiff.property, newVal: newDiff.property}
 */
 globalThis.generateDiffArray = function(obj) {
 	let diffArray = Object.keys(obj).map(function(key) {
diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js
index 23e97ae9262b14a70d32993a795b059113eecef7..62074f39a70242b10c98322a32f683b099667aba 100644
--- a/src/descriptions/arcologyDescription.js
+++ b/src/descriptions/arcologyDescription.js
@@ -466,7 +466,7 @@ App.Desc.playerArcology = function(lastElement) {
 				}
 				if (V.seePreg === 1) {
 					if (V.clubAdsPreg === 1) {
-						buffer.push(`Most of strippers have firm, rounded bellies.`);
+						buffer.push(`Most of the strippers have firm, rounded bellies.`);
 					} else if (V.clubAdsPreg === -1) {
 						buffer.push(`Most of the strippers have firm, flat bellies.`);
 					} else {
diff --git a/src/endWeek/economics/arcmgmt.js b/src/endWeek/economics/arcmgmt.js
index ba08a18315ebd863f2d4c5b5513cf4cc7611d18c..60e8b70996a0abda268a9e49a01b71e5725575bc 100644
--- a/src/endWeek/economics/arcmgmt.js
+++ b/src/endWeek/economics/arcmgmt.js
@@ -2,25 +2,25 @@ App.EndWeek.arcManagement = function() {
 	const el = new DocumentFragment();
 	const secExpImmigrationBonus = App.SecExp.propagandaEffects("immigration");
 	let r;
-	let _enslaved;
-	let _crime;
-	let _terrain;
-	let _transportHub;
-	let _honeymoon;
-	let _LCD;
-	let _SCD;
-	let _LSCD;
-	let _MCD;
-	let _UCD;
-	let _TCD;
-	let _rentMultiplier;
-	let _AWeekGrowth;
-	let _econMult;
+	let enslaved;
+	let crime;
+	let terrain;
+	let transportHub;
+	let honeymoon;
+	let LCD;
+	let SCD;
+	let LSCD;
+	let MCD;
+	let UCD;
+	let TCD;
+	let rentMultiplier;
+	let AWeekGrowth;
+	let econMult;
 
 	if (V.useTabs === 0) {
 		App.UI.DOM.appendNewElement("h2", el, "Arcology Management");
 	}
-	const _schools = App.Utils.schoolCounter();
+	const schoolNumber = App.Utils.schoolCounter();
 
 	App.UI.DOM.appendNewElement("p", el, ownershipReport(false));
 
@@ -49,31 +49,31 @@ App.EndWeek.arcManagement = function() {
 	More elite citizens require their own slaves and will cause the population of slaves to increase as they move in. FS and policies will impact how many slaves they desire and how productive they are. The PC's menials also compete for labor within the arcology. Slaves can now 'expire', speed depends on FS and policies. Default lifespan for menials is an average of ~4 years. */
 
 	V.oldACitizens = V.ACitizens;
-	let _FSScore = 0; /* FS progress for tourism */
-	let	_slaveDemandU = 1; /* Changes to upperClass slave demand */
-	let	_slaveDemandT = 1; /* Changes to topClass slave demand */
-	let	_expirationFS = 0.005; /* Changes to likelihood of slave death */
-	let _expirationLC = 0.003; /* Changes to likelihood of lowerClass death */
-	let _expirationMC = 0.002; /* Changes to likelihood of middleClass death */
-	let _expirationUC = 0.001; /* Changes to likelihood of upperClass death */
-	let _expirationTC = 0.001; /* Changes to likelihood of topClass death */
-	let	_slaveProductivity = 0.8; /* Changes to slave productivity*/
-	let	_lowerClass = 0; /* Fixed amount of changes to lowerClass interest to move in*/
-	let	_lowerClassP = 1; /* Scaling changes to lowerClass interest ("stacking bonus")*/
-	let	_welfareFS = 0.004; /* Changes to likelihood of lowerClass getting enslaved*/
-	let	_middleClass = 0; /* See lowerClass examples for the rest of these*/
-	let	_middleClassP = 1;
-	let	_upperClass = 0;
-	let	_upperClassP = 1;
-	let	_topClass = 0;
-	let	_topClassP = 1;
+	let FSScore = 0; /* FS progress for tourism */
+	let	slaveDemandU = 1; /* Changes to upperClass slave demand */
+	let	slaveDemandT = 1; /* Changes to topClass slave demand */
+	let	expirationFS = 0.005; /* Changes to likelihood of slave death */
+	let expirationLC = 0.003; /* Changes to likelihood of lowerClass death */
+	let expirationMC = 0.002; /* Changes to likelihood of middleClass death */
+	let expirationUC = 0.001; /* Changes to likelihood of upperClass death */
+	let expirationTC = 0.001; /* Changes to likelihood of topClass death */
+	let	slaveProductivity = 0.8; /* Changes to slave productivity*/
+	let	lowerClass = 0; /* Fixed amount of changes to lowerClass interest to move in*/
+	let	lowerClassP = 1; /* Scaling changes to lowerClass interest ("stacking bonus")*/
+	let	welfareFS = 0.004; /* Changes to likelihood of lowerClass getting enslaved*/
+	let	middleClass = 0; /* See lowerClass examples for the rest of these*/
+	let	middleClassP = 1;
+	let	upperClass = 0;
+	let	upperClassP = 1;
+	let	topClass = 0;
+	let	topClassP = 1;
 
 	el.append(fsImpact());
 	el.append(policiesImpact());
 
 	const schoolSubsidy = Array.from(App.Data.misc.schools.keys()).reduce((acc, current) => acc + V[current].subsidize, 0);
-	_middleClass += (schoolSubsidy) * 40;
-	_middleClassP *= 1 + (schoolSubsidy) * 0.005;
+	middleClass += (schoolSubsidy) * 40;
+	middleClassP *= 1 + (schoolSubsidy) * 0.005;
 
 	r = [];
 	r.push(slaveRetirement());
@@ -83,13 +83,13 @@ App.EndWeek.arcManagement = function() {
 
 	citizenToSlave();
 
-	V.GDP = Math.trunc(((V.NPCSlaves + V.menials) * 0.35 * _slaveProductivity) + (V.lowerClass * 0.35) + (V.middleClass * 0.75) + (V.upperClass * 2) + (V.topClass * 10)) / 10;
+	V.GDP = Math.trunc(((V.NPCSlaves + V.menials) * 0.35 * slaveProductivity) + (V.lowerClass * 0.35) + (V.middleClass * 0.75) + (V.upperClass * 2) + (V.topClass * 10)) / 10;
 
 	/* formula to calculate localEcon effect */
 	if (V.localEcon >= 100) {
-		_econMult = (1 + 1.15 * (Math.trunc(1000-100000/200)/8.5)/100);
+		econMult = (1 + 1.15 * (Math.trunc(1000-100000/200)/8.5)/100);
 	} else {
-		_econMult = (1/(1 + 5 * Math.sqrt(Math.trunc(100000/50-1000)/8.5)/100));
+		econMult = (1/(1 + 5 * Math.sqrt(Math.trunc(100000/50-1000)/8.5)/100));
 	}
 
 	if (!isFrozen()) {
@@ -105,12 +105,12 @@ App.EndWeek.arcManagement = function() {
 	}
 	V.ACitizens = V.lowerClass + V.middleClass + V.upperClass + V.topClass;
 	if (V.cheatMode === 1 || V.debugMode === 1) {
-		appendDiv(`${V.arcologies[0].prosperity} Prosperity | ${_FSScore} FS Score | ${_honeymoon} Honeymoon | ${_transportHub} Transporthub | ${_terrain} Terrain | ${_crime} Crime`);
-		appendDiv(`${num(_LSCD)} Lower + Slave Class Demand | ${num(_SCD)} Slave Class Demand | ${num(_slaveProductivity)} Slave Productivity`);
-		appendDiv(`${num(_LCD)} Lower Class Demand | ${num(_lowerClassP)} LC Multiplier`);
-		appendDiv(`${num(_MCD)} Middle Class Demand | ${num(_middleClassP)} MC Multiplier`);
-		appendDiv(`${num(_UCD)} Upper Class Demand | ${num(_upperClassP)} UC Multiplier`);
-		appendDiv(`${num(_TCD)} Top Class Demand | ${num(_topClassP)} TC Multiplier`);
+		appendDiv(`${V.arcologies[0].prosperity} Prosperity | ${FSScore} FS Score | ${honeymoon} Honeymoon | ${transportHub} Transporthub | ${terrain} Terrain | ${crime} Crime`);
+		appendDiv(`${num(LSCD)} Lower + Slave Class Demand | ${num(SCD)} Slave Class Demand | ${num(slaveProductivity)} Slave Productivity`);
+		appendDiv(`${num(LCD)} Lower Class Demand | ${num(lowerClassP)} LC Multiplier`);
+		appendDiv(`${num(MCD)} Middle Class Demand | ${num(middleClassP)} MC Multiplier`);
+		appendDiv(`${num(UCD)} Upper Class Demand | ${num(upperClassP)} UC Multiplier`);
+		appendDiv(`${num(TCD)} Top Class Demand | ${num(topClassP)} TC Multiplier`);
 	}
 	const percOfPop = (n) => Math.trunc((n / (V.ACitizens + V.ASlaves)) * 1000) / 10;
 	appendDiv(`${V.arcologies[0].name} is home to the following:`);
@@ -225,122 +225,122 @@ App.EndWeek.arcManagement = function() {
 	App.Events.addParagraph(el, r);
 	r = [];
 
-	_rentMultiplier = 1;
+	rentMultiplier = 1;
 	if (V.arcologies[0].FSPaternalistLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Tenants who can prove that they abstain from certain practices are given a reduction to their rent.`);
 	}
 	if (V.arcologies[0].FSYouthPreferentialistLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Younger citizens are offered subsidized rent to encourage young people to join the free population of your arcology.`);
 	} else if (V.arcologies[0].FSMaturityPreferentialistLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Older citizens are offered subsidized rent to encourage mature people to join the free population of your arcology.`);
 	}
 	if (V.arcologies[0].FSPetiteAdmirationLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Citizens are offered subsidized rent to take drastically shorter partners and harem members.`);
 	} else if (V.arcologies[0].FSStatuesqueGlorificationLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Tall citizens are offered rent subsidies, at the expense of short citizens, to encourage more statuesque individuals to join the free population of your arcology.`);
 	}
 	if (V.arcologies[0].FSRepopulationFocusLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Pregnant citizens are offered subsidized rent to encourage free women to become pregnant and pregnant women to join the free population of your arcology.`);
 	} else if (V.arcologies[0].FSRestartLaw === 1) {
-		_rentMultiplier *= 1.05;
+		rentMultiplier *= 1.05;
 		r.push(`Non-Elite citizens who refuse to be sterilized face a moderate tax and the looming possibility of expulsion or enslavement.`);
 	}
 	if (V.arcologies[0].FSHedonisticDecadenceLaw === 1) {
-		_rentMultiplier *= 0.95;
+		rentMultiplier *= 0.95;
 		r.push(`Food vendors are offered subsidized rent and operating expenses to set up shop in your arcology.`);
 	}
 	if (V.secExpEnabled > 0) {
 		if (V.SecExp.edicts.alternativeRents === 1) { // A silly policy
 			r.push(`Your citizens are allowed to pay their rents in slaves rather than cash and a few financially challenged individuals make use of this.`);
-			_rentMultiplier *= 0.95;
-			const _movement = random(0, 3);
-			V.menials += _movement;
-			V.NPCSlaves -= _movement;
+			rentMultiplier *= 0.95;
+			const movement = random(0, 3);
+			V.menials += movement;
+			V.NPCSlaves -= movement;
 		}
 		if (V.SecExp.edicts.defense.discountMercenaries === 1) {
 			r.push(`Mercenaries willing to come to your arcology are given a discount on rent.`);
-			_rentMultiplier *= 0.98;
+			rentMultiplier *= 0.98;
 		}
 		if (V.SecExp.edicts.defense.privilege.militiaSoldier === 1) {
 			r.push(`Citizens in the militia are exempt from rent payment.`);
-			_rentMultiplier *= 0.98;
+			rentMultiplier *= 0.98;
 		}
 	}
 	if (V.arcologies[0].FSArabianRevivalistLaw === 1) {
-		_rentMultiplier *= 1.05;
+		rentMultiplier *= 1.05;
 		r.push(`Those of your citizens who have not yet subscribed to the society you are building are permitted to live and do business here, but must pay a moderate jizya tax for the privilege as part of their rent.`);
 	}
 	if (V.arcologies[0].FSNeoImperialistLaw2 === 1) {
-		_rentMultiplier *= 1.05;
+		rentMultiplier *= 1.05;
 		r.push(`Your Barons, equipped with golden bands as a symbol of office, flit about their assigned sections of the arcology to personally check up on businesses and punish petty criminals. They make any evasion of your rent extraordinarily difficult, and consistently earn you more than they take.`);
 	}
 	App.Events.addParagraph(el, r);
 	r = [];
-	_rentMultiplier *= 1 + (5 - V.baseDifficulty) / 20;
-	const _rents = Math.trunc((V.lowerClass * V.rent.lowerClass + V.middleClass * V.rent.middleClass + V.upperClass * V.rent.upperClass + V.topClass * V.rent.topClass) * _rentMultiplier / 25);
-	if (!Number.isInteger(_rents)) {
+	rentMultiplier *= 1 + (5 - V.baseDifficulty) / 20;
+	const rents = Math.trunc((V.lowerClass * V.rent.lowerClass + V.middleClass * V.rent.middleClass + V.upperClass * V.rent.upperClass + V.topClass * V.rent.topClass) * rentMultiplier / 25);
+	if (!Number.isInteger(rents)) {
 		appendDiv(`<span class="red">Error: rents is outside accepted range, please report this issue</span>`);
 	} else {
-		cashX(_rents, "rents");
+		cashX(rents, "rents");
 	}
 
-	r.push(`This week, rents from ${V.arcologies[0].name} came to <span class="yellowgreen">${cashFormat(_rents)}.</span>`);
+	r.push(`This week, rents from ${V.arcologies[0].name} came to <span class="yellowgreen">${cashFormat(rents)}.</span>`);
 	if (V.difficultySwitch === 0) {
 		if (V.localEcon < 100) {
-			let _bribes = (V.week * 100) + random(-100, 100);
+			let bribes = (V.week * 100) + random(-100, 100);
 			if (V.cash > 1000) {
-				_bribes += Math.trunc(V.cash * 0.02);
+				bribes += Math.trunc(V.cash * 0.02);
 			}
-			r.push(`The <span class="red">degenerating world economy</span> makes supplying and maintaining ${V.arcologies[0].name} extremely difficult. This week, bribes and other costs to keep it running came to <span class="yellowgreen">${cashFormat(_bribes)}.</span>`);
-			cashX(forceNeg(_bribes), "rents");
+			r.push(`The <span class="red">degenerating world economy</span> makes supplying and maintaining ${V.arcologies[0].name} extremely difficult. This week, bribes and other costs to keep it running came to <span class="yellowgreen">${cashFormat(bribes)}.</span>`);
+			cashX(forceNeg(bribes), "rents");
 		}
 	}
 
 	if (V.menials + V.menialBioreactors + V.fuckdolls > 0) {
-		let _menialEarnings = 0;
-		let _bioreactorEarnings = 0;
-		let _fuckdollsEarnings = 0;
+		let menialEarnings = 0;
+		let bioreactorEarnings = 0;
+		let fuckdollsEarnings = 0;
 		r.push(`You own`);
 		if (V.menials > 0) {
-			if (V.menials > Math.trunc(_LSCD / _slaveProductivity - _SCD)) {
-				_menialEarnings += Math.max(Math.trunc(_LSCD / _slaveProductivity - _SCD) * 10, 0);
+			if (V.menials > Math.trunc(LSCD / slaveProductivity - SCD)) {
+				menialEarnings += Math.max(Math.trunc(LSCD / slaveProductivity - SCD) * 10, 0);
 				r.push(`<span class="red">more menial slaves than there was work,</span> consider selling some.`);
-				if (_menialEarnings === 0) {
+				if (menialEarnings === 0) {
 					r.push(`Actually, consider selling them all...demand for labor is so low that <span class="red">none of them made any money</span> this week.`);
 				}
 				r.push(`<br> You own`);
 			} else {
-				_menialEarnings = V.menials * 10;
+				menialEarnings = V.menials * 10;
 				if (V.Sweatshops > 0) {
 					if (V.Sweatshops * 500 <= V.menials) {
-						_menialEarnings += V.Sweatshops * 7000;
-						_menialEarnings += (V.menials - V.Sweatshops * 500) * 10;
+						menialEarnings += V.Sweatshops * 7000;
+						menialEarnings += (V.menials - V.Sweatshops * 500) * 10;
 					} else {
-						_menialEarnings += V.menials * 14;
+						menialEarnings += V.menials * 14;
 					}
 				}
 			}
 			if (V.illegalDeals.menialDrug === 1) {
-				_menialEarnings = Math.trunc(_menialEarnings * 1.5);
+				menialEarnings = Math.trunc(menialEarnings * 1.5);
 			}
 			if (V.menials > 1) {
 				r.push(`${num(V.menials)} menial slaves${((V.menialBioreactors > 0) && (V.fuckdolls === 0)) ? ` and` : `,`}`);
 			} else {
 				r.push(`one menial slave${((V.menialBioreactors > 0) && (V.fuckdolls === 0)) ? ` and` : `,`}`);
 			}
-			cashX(_menialEarnings, "menialTrades");
+			cashX(menialEarnings, "menialTrades");
 		}
 
 		if (V.menialBioreactors > 0) {
-			_bioreactorEarnings = V.menialBioreactors * (10 + (10 * V.arcologies[0].FSPastoralistLaw));
+			bioreactorEarnings = V.menialBioreactors * (10 + (10 * V.arcologies[0].FSPastoralistLaw));
 			if (V.dairy && V.dairyUpgradeMenials) {
-				_bioreactorEarnings += V.menialBioreactors * 5;
+				bioreactorEarnings += V.menialBioreactors * 5;
 			}
 			if (V.menialBioreactors > 1) {
 				r.push(`${num(V.menialBioreactors)} standard bioreactors,`);
@@ -350,44 +350,44 @@ App.EndWeek.arcManagement = function() {
 			if (V.fuckdolls > 0) {
 				r.push(`and`);
 			}
-			cashX(_bioreactorEarnings, "menialBioreactors");
+			cashX(bioreactorEarnings, "menialBioreactors");
 		}
 
 
 		if (V.fuckdolls > 0) {
 			const arcadeFreeSpace = V.arcade - App.Entity.facilities.arcade.employeesIDs().size;
-			const _fuckdollsArcade = arcadeFreeSpace > 0 ? Math.min(arcadeFreeSpace, V.fuckdolls) : 0;
-			let _arcadeUpgradeInjectors;
+			const fuckdollsArcade = arcadeFreeSpace > 0 ? Math.min(arcadeFreeSpace, V.fuckdolls) : 0;
+			let arcadeUpgradeInjectors;
 			if (V.arcadeUpgradeInjectors === 0) {
-				_arcadeUpgradeInjectors = 0;
+				arcadeUpgradeInjectors = 0;
 			} else if (V.arcadeUpgradeInjectors === 1) {
-				_arcadeUpgradeInjectors = 1;
+				arcadeUpgradeInjectors = 1;
 			} else {
-				_arcadeUpgradeInjectors = 1.5;
+				arcadeUpgradeInjectors = 1.5;
 			}
-			_fuckdollsEarnings = Math.trunc(((V.fuckdolls - _fuckdollsArcade) * 140 + _fuckdollsArcade * (175 + 35 * _arcadeUpgradeInjectors)) * (V.arcadePrice - 0.5) / 10);
+			fuckdollsEarnings = Math.trunc(((V.fuckdolls - fuckdollsArcade) * 140 + fuckdollsArcade * (175 + 35 * arcadeUpgradeInjectors)) * (V.arcadePrice - 0.5) / 10);
 			/* The "/ 10" at the end is just there to keep the price in line with other current prices, hopefully prices will get to a spot where this can be dropped*/
 			if (V.fuckdolls > 1) {
 				r.push(`${num(V.fuckdolls)} standard Fuckdolls,`);
 			} else if (V.fuckdolls === 1) {
 				r.push(`one Fuckdoll,`);
 			}
-			if (_fuckdollsArcade > 1) {
-				r.push(`${num(_fuckdollsArcade)} of which are stationed in the arcade,`);
-			} else if (_fuckdollsArcade === 1 && V.fuckdolls > 1) {
+			if (fuckdollsArcade > 1) {
+				r.push(`${num(fuckdollsArcade)} of which are stationed in the arcade,`);
+			} else if (fuckdollsArcade === 1 && V.fuckdolls > 1) {
 				r.push(`one of which is stationed in the arcade,`);
-			} else if (_fuckdollsArcade === 1) {
+			} else if (fuckdollsArcade === 1) {
 				r.push(`which is stationed in the arcade,`);
 			}
 			if (V.policies.publicFuckdolls === 1) {
-				repX(_fuckdollsEarnings / 5, "fuckdolls");
-				_fuckdollsEarnings = Math.trunc(V.fuckdolls * -0.5);
+				repX(fuckdollsEarnings / 5, "fuckdolls");
+				fuckdollsEarnings = Math.trunc(V.fuckdolls * -0.5);
 				/* The upkeep of a Fuckdoll*/
 			}
-			cashX(_fuckdollsEarnings, "fuckdolls");
+			cashX(fuckdollsEarnings, "fuckdolls");
 		}
 
-		const totalEarnings = _menialEarnings + _bioreactorEarnings + _fuckdollsEarnings;
+		const totalEarnings = menialEarnings + bioreactorEarnings + fuckdollsEarnings;
 		if (totalEarnings > 0) {
 			r.push(`earning you <span class="yellowgreen">${cashFormat(totalEarnings)}.</span>`);
 		} else if (totalEarnings === 0) {
@@ -400,222 +400,222 @@ App.EndWeek.arcManagement = function() {
 		}
 	}
 
-	_AWeekGrowth = V.AGrowth;
-	if (_AWeekGrowth + V.arcologies[0].prosperity > V.AProsperityCap) {
+	AWeekGrowth = V.AGrowth;
+	if (AWeekGrowth + V.arcologies[0].prosperity > V.AProsperityCap) {
 		r.push(`<span class="yellow">${V.arcologies[0].name} is at its maximum prosperity, so rents will not increase until it is improved.</span>`);
-	} else if ((2 * _AWeekGrowth) + V.arcologies[0].prosperity >= V.AProsperityCap) {
+	} else if ((2 * AWeekGrowth) + V.arcologies[0].prosperity >= V.AProsperityCap) {
 		r.push(`<span class="yellow">Your arcology is nearly at its maximum prosperity.</span>`);
-		V.arcologies[0].prosperity += _AWeekGrowth;
+		V.arcologies[0].prosperity += AWeekGrowth;
 	} else {
 		if (V.arcologies[0].ownership >= 100) {
 			r.push(`Your controlling interest in ${V.arcologies[0].name} allows you to lead it economically, <span class="green">supercharging growth.</span>`);
-			_AWeekGrowth += 3;
+			AWeekGrowth += 3;
 		} else if (V.arcologies[0].ownership >= random(40, 100)) {
 			r.push(`Your interest in ${V.arcologies[0].name} allows you to lead it economically, <span class="green">boosting growth.</span>`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		}
 		if (V.arcologies[0].prosperity < (V.rep / 100)) {
 			r.push(`Your impressive reputation relative to ${V.arcologies[0].name}'s prosperity <span class="green">drives an increase in business.</span>`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		} else if (V.rep > 18000) { // no growth penalty if PC is at high rep, no matter how high prosperity goes
 		} else if (V.arcologies[0].prosperity > (V.rep / 60)) {
 			r.push(`Your low reputation relative to ${V.arcologies[0].name}'s prosperity <span class="red">seriously impedes business growth.</span>`);
-			_AWeekGrowth -= 2;
+			AWeekGrowth -= 2;
 		} else if (V.arcologies[0].prosperity > (V.rep / 80)) {
 			r.push(`Your unimpressive reputation relative to ${V.arcologies[0].name}'s prosperity <span class="yellow">slows business growth.</span>`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 		}
 		if (V.secExpEnabled > 0) {
 			if (V.SecExp.core.trade <= 20) {
-				_AWeekGrowth += 1;
+				AWeekGrowth += 1;
 			} else if (V.SecExp.core.trade <= 40) {
-				_AWeekGrowth += 2;
+				AWeekGrowth += 2;
 			} else if (V.SecExp.core.trade <= 60) {
-				_AWeekGrowth += 3;
+				AWeekGrowth += 3;
 			} else if (V.SecExp.core.trade <= 80) {
-				_AWeekGrowth += 4;
+				AWeekGrowth += 4;
 			} else {
-				_AWeekGrowth += 5;
+				AWeekGrowth += 5;
 			}
 
 			if (V.SecExp.smilingMan.progress === 10) {
 				r.push(`The ex-criminal known to the world as The Smiling Man puts her impressive skills to work, improving the financial situation of the arcology with ease.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			}
 		}
 		if (V.personalAttention === "business") {
 			if ((V.PC.skill.trading >= 100) || (V.PC.career === "arcology owner")) {
 				r.push(`Your <span class="skill player">business focus and your experience</span> allow you to greatly assist in advancing the arcology's prosperity.`);
-				_AWeekGrowth += 2;
+				AWeekGrowth += 2;
 			} else {
 				r.push(`Your business focus allows you to help improve the arcology's prosperity.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			}
 			if (V.PC.actualAge >= 50) {
 				if (V.arcologies[0].FSMaturityPreferentialistLaw === 1) {
 					r.push(`You are able to leverage your long seniority in the business community using the arcology's favorable laws to further advance prosperity.`);
-					_AWeekGrowth++;
+					AWeekGrowth++;
 				}
 			} else if (V.PC.actualAge < 35) {
 				if (V.arcologies[0].FSYouthPreferentialistLaw === 1) {
 					r.push(`You are able to leverage your freshness in the business community using the arcology's favorable laws to further advance prosperity.`);
-					_AWeekGrowth++;
+					AWeekGrowth++;
 				}
 			}
 		}
 		if (V.arcologies[0].FSNull !== "unset") {
 			r.push(`Your cultural openness is a powerful driver of economic activity.`);
-			_AWeekGrowth += Math.max(1, Math.trunc(V.arcologies[0].FSNull / 25));
+			AWeekGrowth += Math.max(1, Math.trunc(V.arcologies[0].FSNull / 25));
 		}
 		if (V.arcologies[0].FSRestart !== "unset") {
 			r.push(`Your powerful connections open many avenues of economic expansion.`);
-			_AWeekGrowth += Math.max(1, Math.trunc(V.arcologies[0].FSRestart / 10));
+			AWeekGrowth += Math.max(1, Math.trunc(V.arcologies[0].FSRestart / 10));
 		}
 		if (V.arcologies[0].FSPaternalist >= random(1, 100)) {
 			r.push(`This week, the careful attention to slave welfare your new society emphasizes has been a driver of prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		}
 		if (V.arcologies[0].FSHedonisticDecadence >= random(1, 100)) {
 			r.push(`This week, several new businesses opened local branches or broke ground, greatly increasing prosperity.`);
-			_AWeekGrowth += 2;
+			AWeekGrowth += 2;
 		}
 		if (V.arcologies[0].FSChattelReligionistCreed === 1) {
 			if (V.nicaea.focus === "owners") {
 				r.push(`The focus on slaveowners' whims in the creed of ${V.nicaea.name} interests the rich and powerful, increasing prosperity.`);
-				_AWeekGrowth += V.nicaea.power;
+				AWeekGrowth += V.nicaea.power;
 			}
 		}
 		if (V.arcologies[0].FSSlaveProfessionalismLaw === 1) {
 			r.push(`The concentrated intelligence of the free population finds innovative ways to spur prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		}
 		if (V.arcologies[0].FSRomanRevivalist >= random(1, 100)) {
 			r.push(`This week, intense interest in your project to revive Roman values has driven prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		} else if (V.arcologies[0].FSNeoImperialist >= random(1, 100)) {
 			r.push(`This week, your tightly hierarchical Imperial society's efficient organization has attracted traders and increased prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		} else if (V.arcologies[0].FSChineseRevivalist !== "unset") {
 			if ((V.HeadGirlID !== 0) && (V.RecruiterID !== 0) && (V.BodyguardID !== 0)) {
 				r.push(`This week, your imperial administration, staffed with a Head Girl, a Recruiter, and a Bodyguard, has improved prosperity.`);
-				_AWeekGrowth += 2;
+				AWeekGrowth += 2;
 			}
 		}
 		if (V.PC.skill.trading >= 100) {
 			r.push(`Your <span class="skill player">business skills</span> drive increased prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		} else if (V.PC.career === "arcology owner") {
 			r.push(`Your <span class="skill player">experience in the Free Cities</span> helps increase prosperity.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		}
-		if (_schools === 1) {
+		if (schoolNumber === 1) {
 			r.push(`The presence of a slave school in the arcology improves the local economy.`);
-		} else if (_schools > 0) {
+		} else if (schoolNumber > 0) {
 			r.push(`The presence of slave schools in the arcology greatly improves the local economy.`);
 		} else if (V.arcologies[0].prosperity > 80) {
 			r.push(`The lack of a branch campus from a reputable slave school is slowing further development of the local economy.`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 		}
-		_AWeekGrowth += _schools;
+		AWeekGrowth += schoolNumber;
 		if (V.arcologies[0].FSDegradationistLaw === 1) {
 			r.push(`Requiring menials to be given time to fuck human sex toys in the arcade reduces labor efficiency, slowing growth and costs money for each menial slave you own.`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 			cashX(forceNeg(V.menials * 3 * V.arcadePrice), "fuckdolls");
 		}
 		if (V.arcologies[0].FSBodyPuristLaw === 1) {
 			r.push(`The drug surcharge used to fund the purity regime reduces growth.`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 		}
 		if (V.arcologies[0].FSPastoralistLaw === 1) {
 			r.push(`Prosperity improvement is slowed by the regulations on animal products.`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 		}
 		if (V.arcologies[0].FSPaternalistSMR === 1) {
 			r.push(`Your slave market regulations slow the flow of chattel through the arcology.`);
-			_AWeekGrowth--;
+			AWeekGrowth--;
 		}
 
 		// deactivated with sec Exp as they are modifiers for the trade mechanic
 		if (V.secExpEnabled === 0) {
 			if (V.terrain === "urban") {
 				r.push(`Since your arcology is located in the heart of an urban area, its commerce is naturally vibrant.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			}
 			if (V.terrain === "ravine") {
 				r.push(`Since your arcology is located in the heart of a ravine, its commerce is hindered by a lack of accessibility.`);
-				_AWeekGrowth--;
+				AWeekGrowth--;
 			}
 		}
 
 		if (V.arcologies[0].embargoTarget && V.arcologies[0].embargoTarget !== -1) {
 			r.push(`The local economy is hurt by the double edged sword of your economic warfare.`);
-			_AWeekGrowth -= V.arcologies[0].embargo * 2;
+			AWeekGrowth -= V.arcologies[0].embargo * 2;
 		}
 
-		let _desc = [];
-		let _descNeg = [];
+		let desc = [];
+		let descNeg = [];
 		for (const arcology of V.arcologies) {
-			const _opinion = App.Neighbor.opinion(V.arcologies[0], arcology);
-			if (_opinion >= 100) {
-				_desc.push(arcology.name);
-			} else if (_opinion <= -100) {
-				_descNeg.push(arcology.name);
+			const opinion = App.Neighbor.opinion(V.arcologies[0], arcology);
+			if (opinion >= 100) {
+				desc.push(arcology.name);
+			} else if (opinion <= -100) {
+				descNeg.push(arcology.name);
 			}
 		}
-		if (_desc.length > 0) {
+		if (desc.length > 0) {
 			r.push(`Your arcology's economy benefits from close social alignment with`);
-			if (_descNeg.length > 0) {
-				r.push(`${toSentence(_desc)}, but`);
+			if (descNeg.length > 0) {
+				r.push(`${toSentence(desc)}, but`);
 			} else {
-				r.push(`${toSentence(_desc)}.`);
+				r.push(`${toSentence(desc)}.`);
 			}
-			_AWeekGrowth += _desc.length;
+			AWeekGrowth += desc.length;
 		}
-		if (_descNeg.length > 0) {
-			if (_desc.length === 0) {
+		if (descNeg.length > 0) {
+			if (desc.length === 0) {
 				r.push(`Your arcology's economy is`);
 			}
-			r.push(`hindered by social conflicts with ${toSentence(_descNeg)}.`);
-			_AWeekGrowth -= _descNeg.length;
+			r.push(`hindered by social conflicts with ${toSentence(descNeg)}.`);
+			AWeekGrowth -= descNeg.length;
 		}
 		if (V.policies.alwaysSubsidizeGrowth === 1) {
 			r.push(`Growth was subsidized as planned.`);
-			_AWeekGrowth++;
+			AWeekGrowth++;
 		}
 		if (V.secExpEnabled > 0) {
 			App.Events.addParagraph(el, r);
 			r = [];
 			if (V.SecExp.core.authority > 18000) {
 				r.push(`Your authority is so high it discourages new business, slowing down the economic growth of the arcology.`);
-				_AWeekGrowth--;
+				AWeekGrowth--;
 			}
 			if (V.SecExp.core.security > 80) {
 				r.push(`Your arcology is extremely safe and stable. Many businesses are attracted to it because of this.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			} else if (V.SecExp.core.security < 20) {
 				r.push(`Your arcology's low security is an instability factor simply too dangerous to be ignored. Many businesses avoid your arcology because of this.`);
-				_AWeekGrowth--;
+				AWeekGrowth--;
 			}
 
 			if (V.SecExp.edicts.weaponsLaw === 3) {
 				r.push(`The free flow of weapons in your arcology has a positive impact on its economy.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			} else if (V.SecExp.edicts.weaponsLaw === 2) {
 				r.push(`The fairly liberal flow of weapons in your arcology has a positive impact on its economy.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			}
 			if (V.SecExp.buildings.propHub && V.SecExp.buildings.propHub.upgrades.controlLeaks > 0) {
 				r.push(`The authenticity department prepares extremely accurate, but false financial reports, misleading many of your competitors, allowing your arcology more space to grow undisturbed.`);
-				_AWeekGrowth++;
+				AWeekGrowth++;
 			}
 			if (V.SecExp.smilingMan.progress >= 2) {
 				if (V.SecExp.smilingMan.globalCrisisWeeks && V.SecExp.smilingMan.globalCrisisWeeks > 0) {
 					r.push(`The great global crisis ignited by The Smiling Man plan is a great weight on the shoulders of everyone, causing great harm to the prosperity of the arcology.`);
-					_AWeekGrowth -= random(2, 4);
+					AWeekGrowth -= random(2, 4);
 					V.SecExp.smilingMan.globalCrisisWeeks--;
 				} else if (V.SecExp.smilingMan.progress >= 3) {
 					r.push(`With the global economy recovering from the great crisis unleashed by the Smiling Man, there is plenty of room to grow. Your arcology's prosperity benefits from this greatly.`);
-					_AWeekGrowth++;
+					AWeekGrowth++;
 				}
 				if ((V.SecExp.smilingMan.globalCrisisWeeks) && V.SecExp.smilingMan.globalCrisisWeeks === 0) {
 					delete V.SecExp.smilingMan.globalCrisisWeeks;
@@ -623,18 +623,18 @@ App.EndWeek.arcManagement = function() {
 			}
 			const reactorDamaged = App.SecExp.updateFacilityDamage("reactor");
 			r.push(reactorDamaged.text);
-			_AWeekGrowth -= reactorDamaged.growth;
+			AWeekGrowth -= reactorDamaged.growth;
 
 			const secExpTrade = App.SecExp.tradeReport();
 			r.push(secExpTrade.text);
-			_AWeekGrowth += secExpTrade.bonus;
+			AWeekGrowth += secExpTrade.bonus;
 			App.Events.addParagraph(el, r);
 			r = [];
 		}
-		_AWeekGrowth = Math.trunc(0.5 * _AWeekGrowth);
-		if (_AWeekGrowth > 0) {
+		AWeekGrowth = Math.trunc(0.5 * AWeekGrowth);
+		if (AWeekGrowth > 0) {
 			r.push(`Since ${V.arcologies[0].name} can support more citizens and more activity, <span class="green">its prosperity improved this week.</span>`);
-		} else if (_AWeekGrowth === 0) {
+		} else if (AWeekGrowth === 0) {
 			r.push(`Though ${V.arcologies[0].name} can support more citizens and more activity, <span class="yellow">growth was moribund this week.</span>`);
 		} else {
 			r.push(`Though ${V.arcologies[0].name} can support more citizens and more activity, <span class="red">it lost prosperity this week.</span>`);
@@ -643,67 +643,67 @@ App.EndWeek.arcManagement = function() {
 		App.Events.addNode(el, r);
 		r = [];
 
-		if (isNaN(_AWeekGrowth)) {
+		if (isNaN(AWeekGrowth)) {
 			App.UI.DOM.appendElement("div", el, `Error: AWeekGrowth is NaN`, "red");
 		} else {
-			V.arcologies[0].prosperity += _AWeekGrowth;
+			V.arcologies[0].prosperity += AWeekGrowth;
 		}
 	}
 
-	if (_schools > 0) {
+	if (schoolNumber > 0) {
 		el.append(schools());
 	}
 
 	if (V.assistant.market && V.assistant.market.limit > 0) {
-		let _popCap = menialPopCap();
-		let _menialSlaveValue = menialSlaveCost();
+		let popCap = menialPopCap();
+		let menialSlaveValue = menialSlaveCost();
 		const {HeM, heM} = getPronouns(assistant.pronouns().market).appendSuffix('M');
 		r.push(`Your <span class="bold">business assistant</span> manages the menial slave market.`);
-		if (_menialSlaveValue <= 900 + V.assistant.market.aggressiveness) { /* BUY */
-			let _bulkMax = _popCap.value - V.menials - V.fuckdolls - V.menialBioreactors;
-			if (_bulkMax <= 0) {
+		if (menialSlaveValue <= 900 + V.assistant.market.aggressiveness) { /* BUY */
+			let bulkMax = popCap.value - V.menials - V.fuckdolls - V.menialBioreactors;
+			if (bulkMax <= 0) {
 				r.push(`There is no room in the parts of your arcology you own for more menial slaves.`);
 			} else {
-				if (V.cash > V.assistant.market.limit + _menialSlaveValue) {
-					let _menialBulkPremium = Math.trunc(1 + Math.clamp((V.cash - V.assistant.market.limit) / _menialSlaveValue, 0, _bulkMax) / 400);
+				if (V.cash > V.assistant.market.limit + menialSlaveValue) {
+					let menialBulkPremium = Math.trunc(1 + Math.clamp((V.cash - V.assistant.market.limit) / menialSlaveValue, 0, bulkMax) / 400);
 					r.push(`${HeM} acquires more chattel, since it's a buyers' market.`);
 					if (V.arcologies[0].FSPastoralist !== "unset" && V.arcologies[0].FSPaternalist === "unset") {
-						V.menialBioreactors += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium - 100), 0, _bulkMax));
-						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium - 100), 0, _bulkMax));
-						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium - 100), 0, _bulkMax)) * (_menialSlaveValue + _menialBulkPremium - 100)), "menialBioreactorsTransferA");
+						V.menialBioreactors += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium - 100), 0, bulkMax));
+						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium - 100), 0, bulkMax));
+						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium - 100), 0, bulkMax)) * (menialSlaveValue + menialBulkPremium - 100)), "menialBioreactorsTransferA");
 					} else if (V.arcologies[0].FSDegradationist !== "unset") {
-						V.fuckdolls += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((_menialSlaveValue + _menialBulkPremium) * 2), 0, _bulkMax));
-						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((_menialSlaveValue + _menialBulkPremium) * 2), 0, _bulkMax));
-						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((_menialSlaveValue + _menialBulkPremium) * 2), 0, _bulkMax)) * ((_menialSlaveValue + _menialBulkPremium) * 2)), "fuckdollsTransferA");
+						V.fuckdolls += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((menialSlaveValue + menialBulkPremium) * 2), 0, bulkMax));
+						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((menialSlaveValue + menialBulkPremium) * 2), 0, bulkMax));
+						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / ((menialSlaveValue + menialBulkPremium) * 2), 0, bulkMax)) * ((menialSlaveValue + menialBulkPremium) * 2)), "fuckdollsTransferA");
 					} else {
-						V.menials += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium), 0, _bulkMax));
-						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium), 0, _bulkMax));
-						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (_menialSlaveValue + _menialBulkPremium), 0, _bulkMax) * (_menialSlaveValue + _menialBulkPremium))), "menialTransferA");
+						V.menials += Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium), 0, bulkMax));
+						V.menialSupplyFactor -= Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium), 0, bulkMax));
+						cashX(forceNeg(Math.trunc(Math.clamp((V.cash - V.assistant.market.limit) / (menialSlaveValue + menialBulkPremium), 0, bulkMax) * (menialSlaveValue + menialBulkPremium))), "menialTransferA");
 					}
 				}
 			}
-		} else if (_menialSlaveValue >= 1100 - V.assistant.market.aggressiveness) { /* SELL */
+		} else if (menialSlaveValue >= 1100 - V.assistant.market.aggressiveness) { /* SELL */
 			if (V.menials + V.fuckdolls + V.menialBioreactors > 0) {
 				r.push(`${HeM} liquidates your chattel holdings, since it's a sellers' market.`);
 			}
-			let _cashX;
+			let cost;
 			if (V.menials > 0) {
-				_cashX = V.menials * (menialSlaveCost(-V.menials));
+				cost = V.menials * (menialSlaveCost(-V.menials));
 				V.menialDemandFactor -= V.menials;
 				V.menials = 0;
-				cashX(_cashX, "menialTransferA");
+				cashX(cost, "menialTransferA");
 			}
 			if (V.fuckdolls > 0) {
-				_cashX = V.fuckdolls * (menialSlaveCost(-V.fuckdolls) * 2);
+				cost = V.fuckdolls * (menialSlaveCost(-V.fuckdolls) * 2);
 				V.menialDemandFactor -= V.fuckdolls;
 				V.fuckdolls = 0;
-				cashX(_cashX, "fuckdollsTransferA");
+				cashX(cost, "fuckdollsTransferA");
 			}
 			if (V.menialBioreactors > 0) {
-				_cashX = V.menialBioreactors * (menialSlaveCost(-V.menialBioreactors) - 100);
+				cost = V.menialBioreactors * (menialSlaveCost(-V.menialBioreactors) - 100);
 				V.menialDemandFactor -= V.menialBioreactors;
 				V.menialBioreactors = 0;
-				cashX(_cashX, "menialBioreactorsTransferA");
+				cashX(cost, "menialBioreactorsTransferA");
 			}
 		} else {
 			r.push(`Prices are average, so ${heM} does not make any significant moves.`);
@@ -727,338 +727,338 @@ App.EndWeek.arcManagement = function() {
 		const r = [];
 
 		if (V.arcologies[0].FSSupremacist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSSupremacist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -0.004;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.004;
+			FSScore += Math.min(V.arcologies[0].FSSupremacist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -0.004;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSupremacist, 100) / 20) * 0.004;
 			r.push(`Your racial policies are concentrating power in the hands of ${V.arcologies[0].FSSupremacistRace} people.`); /* perhaps too obvious to bother with printing? */
 		}
 		if (V.arcologies[0].FSSubjugationist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSSubjugationist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -0.004;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.004;
+			FSScore += Math.min(V.arcologies[0].FSSubjugationist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -0.004;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSubjugationist, 100) / 20) * 0.004;
 			r.push(`Your racial policies are stripping all power from the ${V.arcologies[0].FSSubjugationistRace} people.`); /* perhaps too obvious to bother with printing? */
 		}
 		if (V.arcologies[0].FSGenderRadicalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSGenderRadicalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * -40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * -0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20);
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.002;
+			FSScore += Math.min(V.arcologies[0].FSGenderRadicalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * -40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * -0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20);
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderRadicalist, 100) / 20) * 0.002;
 			r.push(`Your radical views on gender are scaring away the more traditionally minded.`);
 		}
 		if (V.arcologies[0].FSGenderFundamentalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSGenderFundamentalist, 100);
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * -1;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * -0.002;
+			FSScore += Math.min(V.arcologies[0].FSGenderFundamentalist, 100);
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * -1;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSGenderFundamentalist, 100) / 20) * -0.002;
 			r.push(`Your traditional views on gender are comforting to many, unimaginative to some.`);
 		}
 		if (V.arcologies[0].FSPaternalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSPaternalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.05;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.15;
-			_slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.02;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.004;
-			_welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.002;
+			FSScore += Math.min(V.arcologies[0].FSPaternalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.05;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.15;
+			slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.02;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.004;
+			welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * 0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.002;
 			r.push(`Poor citizens can rely on their better-off peers in ${V.arcologies[0].name}.`);
 		}
 		if (V.arcologies[0].FSDegradationist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSDegradationist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.05;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.2;
-			_slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.01;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -0.004;
-			_welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.1;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.004;
+			FSScore += Math.min(V.arcologies[0].FSDegradationist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.05;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.2;
+			slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.01;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -0.004;
+			welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.1;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSDegradationist, 100) / 20) * 0.004;
 			r.push(`The arcology is a cutthroat place in which falling into slavery is very easy.`);
 		}
 		if (V.arcologies[0].FSIntellectualDependency !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSIntellectualDependency, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.03;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.04;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 20;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.002;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 10;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.003;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * -3;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * -0.020;
+			FSScore += Math.min(V.arcologies[0].FSIntellectualDependency, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.03;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.04;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 20;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.002;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 10;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * 0.003;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * -3;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSIntellectualDependency, 100) / 20) * -0.020;
 			r.push(`It's always a party in ${V.arcologies[0].name}, giving it a strong appeal to those unable to host such an event.`);
 		}
 		if (V.arcologies[0].FSSlaveProfessionalism !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSSlaveProfessionalism, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.1;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.125;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -20;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.001;
+			FSScore += Math.min(V.arcologies[0].FSSlaveProfessionalism, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.1;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.125;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -20;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSSlaveProfessionalism, 100) / 20) * 0.001;
 			r.push(`The intelligent atmosphere of ${V.arcologies[0].name} makes it an attractive place for those with the brains to define their place in the world.`);
 		}
 		if (V.arcologies[0].FSBodyPurist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSBodyPurist, 100);
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * 0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.001;
+			FSScore += Math.min(V.arcologies[0].FSBodyPurist, 100);
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * 0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.001;
 			r.push(`Body purist fashion standards comfort the poor as they stand out less from their more fortunate neighbors.`);
 		}
 		if (V.arcologies[0].FSTransformationFetishist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSTransformationFetishist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * -40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001;
+			FSScore += Math.min(V.arcologies[0].FSTransformationFetishist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * -40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001;
 			r.push(`The lower class fear the kind of transformations could be forced on them if they ever end up enslaved, whereas the rich enjoy wielding such power.`);
 		}
 		if (V.arcologies[0].FSYouthPreferentialist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSYouthPreferentialist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.002;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * -8;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * -0.002;
+			FSScore += Math.min(V.arcologies[0].FSYouthPreferentialist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * 0.002;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * -8;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSYouthPreferentialist, 100) / 20) * -0.002;
 			r.push(`Preference for youth makes the young poor in your arcology feel appreciated despite their lack of wealth.`);
 		}
 		if (V.arcologies[0].FSMaturityPreferentialist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSMaturityPreferentialist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * -40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * -0.002;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 8;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.002;
+			FSScore += Math.min(V.arcologies[0].FSMaturityPreferentialist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * -40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * -0.002;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 8;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSMaturityPreferentialist, 100) / 20) * 0.002;
 			r.push(`Preference for maturity makes the middle class of your arcology feel like their experience is finally properly appreciated.`);
 		}
 		if (V.arcologies[0].FSPetiteAdmiration !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSPetiteAdmiration, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPetiteAdmiration, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPetiteAdmiration, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSPetiteAdmiration, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPetiteAdmiration, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPetiteAdmiration, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSStatuesqueGlorification !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSStatuesqueGlorification, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSStatuesqueGlorification, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSStatuesqueGlorification, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSStatuesqueGlorification, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSStatuesqueGlorification, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSStatuesqueGlorification, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSSlimnessEnthusiast, 100);
+			FSScore += Math.min(V.arcologies[0].FSSlimnessEnthusiast, 100);
 		}
 		if (V.arcologies[0].FSAssetExpansionist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSAssetExpansionist, 100);
+			FSScore += Math.min(V.arcologies[0].FSAssetExpansionist, 100);
 			if (V.arcologies[0].FSBodyPurist !== "unset") {
-				_expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSAssetExpansionist, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.1));
+				expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSAssetExpansionist, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSBodyPurist, 100) / 20) * -0.1));
 			} else {
-				_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAssetExpansionist, 100) / 20) * 0.05;
+				expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAssetExpansionist, 100) / 20) * 0.05;
 			}
 		}
 		if (V.arcologies[0].FSPastoralist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSPastoralist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05;
+			FSScore += Math.min(V.arcologies[0].FSPastoralist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05;
 			if (V.arcologies[0].FSPaternalist !== "unset") {
-				_expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1));
+				expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1));
 			} else {
-				_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05;
-			}
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * -80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * -0.004;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.001;
+				expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.05;
+			}
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * -80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * -0.004;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPastoralist, 100) / 20) * 0.001;
 			r.push(`The pastoralization of ${V.arcologies[0].name} spurs a whole industry around human produce.`);
 		}
 		if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSPhysicalIdealist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.025;
-			_slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.01;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * -40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.001;
+			FSScore += Math.min(V.arcologies[0].FSPhysicalIdealist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.025;
+			slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.01;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * -40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSPhysicalIdealist, 100) / 20) * 0.001;
 			r.push(`Fit slaves and citizens are more productive! However, your arcology's poor do not look forward to even more toil and sweat.`);
 		}
 		if (V.arcologies[0].FSChattelReligionist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSChattelReligionist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * -40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 2.7;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.001;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.001;
+			FSScore += Math.min(V.arcologies[0].FSChattelReligionist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * -40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 2.7;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.001;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChattelReligionist, 100) / 20) * 0.001;
 			r.push(`Chattel Religionism helps some poor citizens see slavery as a spiritually pure fate.`);
 		}
 		if (V.arcologies[0].FSRomanRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSRomanRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.025;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.1;
-			_welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.00;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20);
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.002;
+			FSScore += Math.min(V.arcologies[0].FSRomanRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.025;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.1;
+			welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * 0.00;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20);
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRomanRevivalist, 100) / 20) * -0.002;
 			r.push(`Your citizens take pride in looking after each other.`);
 		}
 		if (V.arcologies[0].FSNeoImperialist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSNeoImperialist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.05;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.030;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.06;
-			_welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.025;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -20;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.002;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.004;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.5;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.002;
+			FSScore += Math.min(V.arcologies[0].FSNeoImperialist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.05;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.030;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.06;
+			welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.025;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -20;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * -0.002;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.004;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.5;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNeoImperialist, 100) / 20) * 0.002;
 			r.push(`Your new Imperium creates a staunchly hierarchical society, and while your elites and soldiers enjoy social prestige and luxury, the lower classes are often unhappy about being made to grovel.`);
 		}
 		if (V.arcologies[0].FSEgyptianRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSEgyptianRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.025;
-			_welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * -0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20);
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * -0.002;
+			FSScore += Math.min(V.arcologies[0].FSEgyptianRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.025;
+			welfareFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * -0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20);
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEgyptianRevivalist, 100) / 20) * -0.002;
 			r.push(`Egyptian Revivalism is benevolent in some ways, and charity is common here.`);
 		}
 		if (V.arcologies[0].FSEdoRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSEdoRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEdoRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEdoRevivalist, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSEdoRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEdoRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSEdoRevivalist, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSArabianRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSArabianRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSArabianRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSArabianRevivalist, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSArabianRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSArabianRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSArabianRevivalist, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSChineseRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSChineseRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChineseRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChineseRevivalist, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSChineseRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChineseRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSChineseRevivalist, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSAztecRevivalist !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSAztecRevivalist, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAztecRevivalist, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAztecRevivalist, 100) / 20) * 0.025;
+			FSScore += Math.min(V.arcologies[0].FSAztecRevivalist, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAztecRevivalist, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSAztecRevivalist, 100) / 20) * 0.025;
 		}
 		if (V.arcologies[0].FSNull !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSNull, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.1;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.125;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 400;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 0.016;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 64;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 0.008;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -21.6;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.008;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -8;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.016;
+			FSScore += Math.min(V.arcologies[0].FSNull, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.1;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.125;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 400;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 0.016;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 64;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * 0.008;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -21.6;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.008;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -8;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSNull, 100) / 20) * -0.016;
 			r.push(`Your arcology's vibrant, open culture helps everyone succeed, preventing many struggling citizens from falling into slavery.`);
 		}
 		if (V.arcologies[0].FSRepopulationFocus !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSRepopulationFocus, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05;
-			_slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.01;
+			FSScore += Math.min(V.arcologies[0].FSRepopulationFocus, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05;
+			slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.01;
 			if (V.arcologies[0].FSPaternalist !== "unset") {
-				_expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1));
+				expirationFS *= 1 + (Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05) * (1 + (Math.trunc(Math.min(V.arcologies[0].FSPaternalist, 100) / 20) * -0.1));
 			} else {
-				_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05;
-			}
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.004;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.004;
+				expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.05;
+			}
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.004;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * 0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRepopulationFocus, 100) / 20) * -0.004;
 			r.push(`You've made repopulation a priority and the less fortunate hope all these new children will make their lives easier in the future, but the wealthy are wary.`);
 		}
 		if (V.arcologies[0].FSRestart !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSRestart, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.04;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.05;
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -80;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -0.004;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 2;
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.004;
+			FSScore += Math.min(V.arcologies[0].FSRestart, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.04;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.05;
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -80;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -0.004;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 2;
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSRestart, 100) / 20) * 0.004;
 			r.push(`Highly restricted breeding pleases the powerful, but the less fortunate may seek reproductive freedom elsewhere.`);
 		}
 		if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-			_FSScore += Math.min(V.arcologies[0].FSHedonisticDecadence, 100);
-			_slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.02;
-			_slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.025;
-			_slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.01;
-			_expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.1; /* too high?*/
-			_lowerClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 40;
-			_lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.002;
-			_middleClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -16;
-			_middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.002;
-			_upperClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -5.4;
-			_upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.002;
-			_topClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20);
-			_topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.002;
+			FSScore += Math.min(V.arcologies[0].FSHedonisticDecadence, 100);
+			slaveDemandU *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.02;
+			slaveDemandT *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.025;
+			slaveProductivity += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.01;
+			expirationFS *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.1; /* too high?*/
+			lowerClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 40;
+			lowerClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.002;
+			middleClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -16;
+			middleClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.002;
+			upperClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -5.4;
+			upperClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * -0.002;
+			topClass += Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20);
+			topClassP *= 1 + Math.trunc(Math.min(V.arcologies[0].FSHedonisticDecadence, 100) / 20) * 0.002;
 			r.push(`Your citizens enjoy the pleasures of life to their fullest, but some prefer to earn these pleasures.`);
 		}
 		if (r.length > 0) {
@@ -1072,125 +1072,125 @@ App.EndWeek.arcManagement = function() {
 		const el = new DocumentFragment();
 		const r = [];
 		if (V.policies.retirement.menial2Citizen === 1) {
-			_slaveDemandU *= 0.8;
-			_slaveDemandT *= 0.75;
-			_slaveProductivity += 0.05;
-			_expirationFS *= 0.8;
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_middleClass += 80;
-			_middleClassP *= 1.01;
-			_upperClass += -27;
-			_upperClassP *= 0.99;
-			_topClass += -5;
-			_topClassP *= 0.99;
+			slaveDemandU *= 0.8;
+			slaveDemandT *= 0.75;
+			slaveProductivity += 0.05;
+			expirationFS *= 0.8;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			middleClass += 80;
+			middleClassP *= 1.01;
+			upperClass += -27;
+			upperClassP *= 0.99;
+			topClass += -5;
+			topClassP *= 0.99;
 		}
 		if (V.policies.proRefugees === 1) {
-			_slaveDemandU *= 1.1;
-			_slaveDemandT *= 1.125;
+			slaveDemandU *= 1.1;
+			slaveDemandT *= 1.125;
 			r.push(`Some desperate people filtered into the arcology during the week: as owner, you were able to enslave a handful of them.`);
 		}
 		if (V.policies.immigrationCash === 1) {
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_middleClass += 40;
-			_middleClassP *= 1.005;
-			_upperClass += -13.5;
-			_upperClassP *= 0.995;
-			_topClass += -5;
-			_topClassP *= 0.99;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			middleClass += 40;
+			middleClassP *= 1.005;
+			upperClass += -13.5;
+			upperClassP *= 0.995;
+			topClass += -5;
+			topClassP *= 0.99;
 			r.push(`The rent promotion for new immigrants brings new citizens to the arcology.`);
 		}
 		if (V.policies.immigrationRep === 1) {
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_middleClass += 40;
-			_middleClassP *= 1.005;
-			_upperClass += -13.5;
-			_upperClassP *= 0.995;
-			_topClass += -5;
-			_topClassP *= 0.99;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			middleClass += 40;
+			middleClassP *= 1.005;
+			upperClass += -13.5;
+			upperClassP *= 0.995;
+			topClass += -5;
+			topClassP *= 0.99;
 			r.push(`Your welcome program for new citizens helps encourage wealthy people from the old world to immigrate, but <span class="red">annoys some longstanding citizens.</span>`);
 			repX(forceNeg(100), "policies");
 		}
 		if (V.policies.immigrationCash === -1) {
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_middleClass += -40;
-			_middleClassP *= 0.995;
-			_upperClass += 13.5;
-			_upperClassP *= 1.005;
-			_topClass += 5;
-			_topClassP *= 1.01;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			middleClass += -40;
+			middleClassP *= 0.995;
+			upperClass += 13.5;
+			upperClassP *= 1.005;
+			topClass += 5;
+			topClassP *= 1.01;
 			r.push(`You covertly <span class="yellowgreen">sell</span> the private information of potential arcology immigrants on the old world black market.`);
 			cashX(random(500, 1500), "policies");
 		}
 		if (V.policies.immigrationRep === -1) {
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_middleClass += -40;
-			_middleClassP *= 0.995;
-			_upperClass += 13.5;
-			_upperClassP *= 1.005;
-			_topClass += 5;
-			_topClassP *= 1.01;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			middleClass += -40;
+			middleClassP *= 0.995;
+			upperClass += 13.5;
+			upperClassP *= 1.005;
+			topClass += 5;
+			topClassP *= 1.01;
 			r.push(`You allow citizens input on potential immigrants, a <span class="green">popular</span> program.`);
 			repX(100, "policies");
 		}
 		if (V.policies.enslavementCash === 1) {
-			_slaveDemandU *= 1.1;
-			_slaveDemandT *= 1.125;
-			_lowerClass += -200;
-			_lowerClassP *= .99;
-			_topClass += 5;
-			_topClassP *= 1.01;
+			slaveDemandU *= 1.1;
+			slaveDemandT *= 1.125;
+			lowerClass += -200;
+			lowerClassP *= .99;
+			topClass += 5;
+			topClassP *= 1.01;
 			r.push(`You <span class="yellowgreen">take kickbacks</span> for ignoring enslavement of citizens.`);
 			cashX(random(500, 1500), "policies");
 		}
 		if (V.policies.enslavementRep === 1) {
-			_slaveDemandU *= 1.1;
-			_slaveDemandT *= 1.125;
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_topClass += 5;
-			_topClassP *= 1.01;
+			slaveDemandU *= 1.1;
+			slaveDemandT *= 1.125;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			topClass += 5;
+			topClassP *= 1.01;
 			r.push(`You <span class="green">make friends</span> by tacitly supporting enslavement of upstart citizens.`);
 			repX(100, "policies");
 		}
 		if (V.policies.enslavementCash === -1) {
-			_slaveDemandU *= 0.9;
-			_slaveDemandT *= 0.875;
-			_lowerClass += 200;
-			_lowerClassP *= 1.02;
-			_topClass += -5;
-			_topClassP *= 0.98;
+			slaveDemandU *= 0.9;
+			slaveDemandT *= 0.875;
+			lowerClass += 200;
+			lowerClassP *= 1.02;
+			topClass += -5;
+			topClassP *= 0.98;
 			r.push(`Your charity purse prevents a few citizens from falling into slavery.`);
 		}
 		if (V.policies.enslavementRep === -1) {
-			_slaveDemandU *= 0.9;
-			_slaveDemandT *= 0.875;
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_topClass += -5;
-			_topClassP *= 0.99;
+			slaveDemandU *= 0.9;
+			slaveDemandT *= 0.875;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			topClass += -5;
+			topClassP *= 0.99;
 			r.push(`You use your personal influence to help struggling citizens.`);
 			repX(forceNeg(100), "policies");
 		}
 		if (V.arcologies[0].FSSupremacistLawME === 1) {
-			_slaveDemandU *= 2.2;
-			_slaveDemandT *= 2.5;
-			_lowerClass += -400;
-			_lowerClassP *= 0.98;
-			_middleClass += -80;
-			_middleClassP *= 0.99;
-			_upperClass += 27;
-			_upperClassP *= 1.01;
-			_topClass += 10;
-			_topClassP *= 1.02;
+			slaveDemandU *= 2.2;
+			slaveDemandT *= 2.5;
+			lowerClass += -400;
+			lowerClassP *= 0.98;
+			middleClass += -80;
+			middleClassP *= 0.99;
+			upperClass += 27;
+			upperClassP *= 1.01;
+			topClass += 10;
+			topClassP *= 1.02;
 			if (V.FSSupLawTrigger === 1) {
-				const _slavesSupLaw = Math.trunc((V.lowerClass + V.middleClass + V.upperClass) * 0.65);
-				V.NPCSlaves += Math.trunc(_slavesSupLaw * 0.7);
-				V.menials += Math.trunc(_slavesSupLaw * 0.2);
+				const slavesSupLaw = Math.trunc((V.lowerClass + V.middleClass + V.upperClass) * 0.65);
+				V.NPCSlaves += Math.trunc(slavesSupLaw * 0.7);
+				V.menials += Math.trunc(slavesSupLaw * 0.2);
 				V.lowerClass = Math.trunc(V.lowerClass * 0.35);
 				V.middleClass = Math.trunc(V.middleClass * 0.35);
 				V.upperClass = Math.trunc(V.upperClass * 0.35);
@@ -1198,20 +1198,20 @@ App.EndWeek.arcManagement = function() {
 			}
 		}
 		if (V.arcologies[0].FSSubjugationistLawME === 1) {
-			_slaveDemandU *= 1.24;
-			_slaveDemandT *= 1.3;
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_middleClass += -40;
-			_middleClassP *= 0.995;
-			_upperClass += 13.5;
-			_upperClassP *= 1.005;
-			_topClass += 5;
-			_topClassP *= 1.01;
+			slaveDemandU *= 1.24;
+			slaveDemandT *= 1.3;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			middleClass += -40;
+			middleClassP *= 0.995;
+			upperClass += 13.5;
+			upperClassP *= 1.005;
+			topClass += 5;
+			topClassP *= 1.01;
 			if (V.FSSubLawTrigger === 1) {
-				const _slavesSubLaw = Math.trunc((V.lowerClass + V.middleClass + V.upperClass) * 0.2);
-				V.NPCSlaves += Math.trunc(_slavesSubLaw * 0.7);
-				V.menials += Math.trunc(_slavesSubLaw * 0.2);
+				const slavesSubLaw = Math.trunc((V.lowerClass + V.middleClass + V.upperClass) * 0.2);
+				V.NPCSlaves += Math.trunc(slavesSubLaw * 0.7);
+				V.menials += Math.trunc(slavesSubLaw * 0.2);
 				V.lowerClass = Math.trunc(V.lowerClass * 0.8);
 				V.middleClass = Math.trunc(V.middleClass * 0.8);
 				V.upperClass = Math.trunc(V.upperClass * 0.8);
@@ -1219,81 +1219,81 @@ App.EndWeek.arcManagement = function() {
 			}
 		}
 		if (V.arcologies[0].FSRepopulationFocusLaw === 1) {
-			_lowerClass += 100;
-			_lowerClassP *= 1.005;
-			_topClass += -2.5;
-			_topClassP *= 0.995;
+			lowerClass += 100;
+			lowerClassP *= 1.005;
+			topClass += -2.5;
+			topClassP *= 0.995;
 			r.push(`The rent promotion for pregnant women attracts several gravid ladies and a few girls eager to become mothers to enroll as citizens in your arcology.`);
 		}
 		if (V.arcologies[0].FSRestartLaw === 1) {
-			_lowerClass += -100;
-			_lowerClassP *= 0.99;
-			_topClass += 2.5;
-			_topClassP *= 1.01;
+			lowerClass += -100;
+			lowerClassP *= 0.99;
+			topClass += 2.5;
+			topClassP *= 1.01;
 			r.push(`Your sterilization program drives several disloyal citizens out of the arcology.`);
 		}
 		if (V.arcologies[0].FSHedonisticDecadenceLaw === 1) {
-			_middleClass += 80;
-			_middleClassP *= 1.01;
+			middleClass += 80;
+			middleClassP *= 1.01;
 		}
 		if (V.arcologies[0].FSDegradationistLaw === 1) {
-			_slaveProductivity += -0.05;
+			slaveProductivity += -0.05;
 		}
 		if (V.arcologies[0].FSPaternalistLaw === 1) {
-			_slaveDemandU *= 0.9;
-			_slaveDemandT *= 0.875;
-			_upperClass += -13.5;
-			_upperClassP *= 1.005;
-			_topClass += -2.5;
-			_topClassP *= 1.005;
+			slaveDemandU *= 0.9;
+			slaveDemandT *= 0.875;
+			upperClass += -13.5;
+			upperClassP *= 1.005;
+			topClass += -2.5;
+			topClassP *= 1.005;
 		}
 		if (V.arcologies[0].FSYouthPreferentialistLaw === 1) {
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_middleClass += -80;
-			_middleClassP *= 0.99;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			middleClass += -80;
+			middleClassP *= 0.99;
 		}
 		if (V.arcologies[0].FSMaturityPreferentialistLaw === 1) {
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_middleClass += 80;
-			_middleClassP *= 1.01;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			middleClass += 80;
+			middleClassP *= 1.01;
 		}
 		if (V.arcologies[0].FSPetiteAdmirationLaw === 1) {
-			_lowerClass += -200;
-			_lowerClassP *= 0.99;
-			_middleClass += 80;
-			_middleClassP *= 1.01;
+			lowerClass += -200;
+			lowerClassP *= 0.99;
+			middleClass += 80;
+			middleClassP *= 1.01;
 		}
 		if (V.arcologies[0].FSStatuesqueGlorificationLaw === 1) {
-			_lowerClass += -400;
-			_lowerClassP *= 0.95;
-			_middleClass += 40;
-			_middleClassP *= 1.01;
-			_upperClass += -10;
-			_upperClassP *= .99;
+			lowerClass += -400;
+			lowerClassP *= 0.95;
+			middleClass += 40;
+			middleClassP *= 1.01;
+			upperClass += -10;
+			upperClassP *= .99;
 		}
 		if (V.arcologies[0].FSIntellectualDependencyLaw === 1) {
-			_slaveDemandU *= 1.24;
-			_slaveDemandT *= 1.3;
-			_lowerClass += -50;
-			_lowerClassP *= 0.90;
-			_middleClass += -40;
-			_middleClassP *= 0.90;
-			_upperClass += -1;
-			_upperClassP *= .99;
+			slaveDemandU *= 1.24;
+			slaveDemandT *= 1.3;
+			lowerClass += -50;
+			lowerClassP *= 0.90;
+			middleClass += -40;
+			middleClassP *= 0.90;
+			upperClass += -1;
+			upperClassP *= .99;
 		}
 		if (V.arcologies[0].FSSlaveProfessionalismLaw === 1) {
-			_slaveDemandU *= 1.4;
-			_slaveDemandT *= 1.5;
-			_lowerClass += -300;
-			_lowerClassP *= 0.95;
-			_middleClass += -40;
-			_middleClassP *= 0.995;
-			_upperClass += -5;
-			_upperClassP *= .99;
-			_topClass += 7;
-			_topClassP *= 1.05;
+			slaveDemandU *= 1.4;
+			slaveDemandT *= 1.5;
+			lowerClass += -300;
+			lowerClassP *= 0.95;
+			middleClass += -40;
+			middleClassP *= 0.995;
+			upperClass += -5;
+			upperClassP *= .99;
+			topClass += 7;
+			topClassP *= 1.05;
 			if (V.FSSlaveProfLawTrigger === 1) {
 				V.lowerClass = Math.trunc(V.lowerClass * 0.8);
 				V.middleClass = Math.trunc(V.middleClass * 0.8);
@@ -1303,62 +1303,62 @@ App.EndWeek.arcManagement = function() {
 		}
 		if (V.arcologies[0].FSChattelReligionistCreed === 1) {
 			if (V.nicaea.focus === "slaves") {
-				_slaveDemandU *= 1 + V.nicaea.power * -0.05;
-				_slaveDemandT *= 1 + V.nicaea.power * -0.0625;
-				_slaveProductivity += V.nicaea.power * 0.025;
-				_expirationFS *= 1 + V.nicaea.power * -0.125;
-				_lowerClass += V.nicaea.power * 100;
-				_lowerClassP *= 1 + V.nicaea.power * 0.005;
-				_topClass += V.nicaea.power * -2.5;
-				_topClassP *= 1 + V.nicaea.power * -0.005;
+				slaveDemandU *= 1 + V.nicaea.power * -0.05;
+				slaveDemandT *= 1 + V.nicaea.power * -0.0625;
+				slaveProductivity += V.nicaea.power * 0.025;
+				expirationFS *= 1 + V.nicaea.power * -0.125;
+				lowerClass += V.nicaea.power * 100;
+				lowerClassP *= 1 + V.nicaea.power * 0.005;
+				topClass += V.nicaea.power * -2.5;
+				topClassP *= 1 + V.nicaea.power * -0.005;
 			} else if (V.nicaea.focus === "owners") {
-				_slaveDemandU *= 1 + V.nicaea.power * 0.05;
-				_slaveDemandT *= 1 + V.nicaea.power * 0.0625;
-				_lowerClass += V.nicaea.power * -100;
-				_lowerClassP *= 1 + V.nicaea.power * -0.005;
-				_middleClass += V.nicaea.power * -20;
-				_middleClassP *= 1 + V.nicaea.power * -0.0025;
-				_upperClass += V.nicaea.power * 6.75;
-				_upperClassP *= 1 + V.nicaea.power * 0.0025;
-				_topClass += V.nicaea.power * 2.5;
-				_topClassP *= 1 + V.nicaea.power * 0.005;
+				slaveDemandU *= 1 + V.nicaea.power * 0.05;
+				slaveDemandT *= 1 + V.nicaea.power * 0.0625;
+				lowerClass += V.nicaea.power * -100;
+				lowerClassP *= 1 + V.nicaea.power * -0.005;
+				middleClass += V.nicaea.power * -20;
+				middleClassP *= 1 + V.nicaea.power * -0.0025;
+				upperClass += V.nicaea.power * 6.75;
+				upperClassP *= 1 + V.nicaea.power * 0.0025;
+				topClass += V.nicaea.power * 2.5;
+				topClassP *= 1 + V.nicaea.power * 0.005;
 			}
 			if (V.nicaea.assignment === "whore") {
-				_upperClass += V.nicaea.power * 6.75;
-				_upperClassP *= 1 + V.nicaea.power * 0.0025;
-				_topClass += V.nicaea.power * 1.25;
-				_topClassP *= 1 + V.nicaea.power * 0.0025;
+				upperClass += V.nicaea.power * 6.75;
+				upperClassP *= 1 + V.nicaea.power * 0.0025;
+				topClass += V.nicaea.power * 1.25;
+				topClassP *= 1 + V.nicaea.power * 0.0025;
 			} else if (V.nicaea.assignment === "serve the public") {
-				_lowerClass += V.nicaea.power * 50;
-				_lowerClassP *= 1 + V.nicaea.power * 0.0025;
-				_middleClass += V.nicaea.power * 20;
-				_middleClassP *= 1 + V.nicaea.power * 0.0025;
+				lowerClass += V.nicaea.power * 50;
+				lowerClassP *= 1 + V.nicaea.power * 0.0025;
+				middleClass += V.nicaea.power * 20;
+				middleClassP *= 1 + V.nicaea.power * 0.0025;
 			} else {
-				_slaveDemandU *= 1 + V.nicaea.power * 0.05;
-				_slaveDemandT *= 1 + V.nicaea.power * 0.0625;
-				_lowerClass += V.nicaea.power * -50;
-				_lowerClassP *= 1 + V.nicaea.power * -0.0025;
-				_middleClass += V.nicaea.power * -20;
-				_middleClassP *= 1 + V.nicaea.power * -0.0025;
-				_upperClass += V.nicaea.power * 13.5;
-				_upperClassP *= 1 + V.nicaea.power * 0.005;
-				_topClass += V.nicaea.power * 2.5;
-				_topClassP *= 1 + V.nicaea.power * 0.005;
+				slaveDemandU *= 1 + V.nicaea.power * 0.05;
+				slaveDemandT *= 1 + V.nicaea.power * 0.0625;
+				lowerClass += V.nicaea.power * -50;
+				lowerClassP *= 1 + V.nicaea.power * -0.0025;
+				middleClass += V.nicaea.power * -20;
+				middleClassP *= 1 + V.nicaea.power * -0.0025;
+				upperClass += V.nicaea.power * 13.5;
+				upperClassP *= 1 + V.nicaea.power * 0.005;
+				topClass += V.nicaea.power * 2.5;
+				topClassP *= 1 + V.nicaea.power * 0.005;
 			}
 			if (V.nicaea.achievement === "slaves") {
-				_slaveDemandU *= 1 + V.nicaea.power * 0.2;
-				_slaveDemandT *= 1 + V.nicaea.power * 0.25;
-				_lowerClass += V.nicaea.power * -200;
-				_lowerClassP *= 1 + V.nicaea.power * -0.01;
+				slaveDemandU *= 1 + V.nicaea.power * 0.2;
+				slaveDemandT *= 1 + V.nicaea.power * 0.25;
+				lowerClass += V.nicaea.power * -200;
+				lowerClassP *= 1 + V.nicaea.power * -0.01;
 			}
 		}
 		if (V.arcologies[0].FSAztecRevivalistLaw === 1) {
-			_lowerClass += 200;
-			_lowerClassP *= 1.01;
-			_middleClass += -40;
-			_middleClassP *= 0.995;
-			_upperClass += -13.5;
-			_upperClassP *= 0.995;
+			lowerClass += 200;
+			lowerClassP *= 1.01;
+			middleClass += -40;
+			middleClassP *= 0.995;
+			upperClass += -13.5;
+			upperClassP *= 0.995;
 		}
 		if (r.length > 0) {
 			App.UI.DOM.appendNewElement("h3", el, "Policies");
@@ -1421,41 +1421,41 @@ App.EndWeek.arcManagement = function() {
 
 	function isFrozen() {
 		/* during bad weather and without appropriate upgrades, transport (including visitors and immigration/emigration) will be halted */
-		let _weatherFreeze = 0;
+		let weatherFreeze = 0;
 		if (V.weatherToday.severity > 3) {
 			if (V.secExpEnabled > 0 && V.SecExp.buildings.transportHub) {
 				if (V.SecExp.buildings.transportHub.surfaceTransport < 4) {
-					_weatherFreeze = 1;
+					weatherFreeze = 1;
 				}
 			} else if (V.antiWeatherFreeze < 2) {
-				_weatherFreeze = 1;
+				weatherFreeze = 1;
 			}
 		} else if (V.weatherToday.severity > 2) {
 			if (V.secExpEnabled > 0 && V.SecExp.buildings.transportHub) {
 				if (V.SecExp.buildings.transportHub.surfaceTransport < 3) {
-					_weatherFreeze = 1;
+					weatherFreeze = 1;
 				}
 			} else if (V.antiWeatherFreeze < 1) {
-				_weatherFreeze = 1;
+				weatherFreeze = 1;
 			}
 		}
-		if (_weatherFreeze) {
+		if (weatherFreeze) {
 			const warning = App.UI.DOM.combineNodes(`The terrible weather is `, App.UI.DOM.makeElement("span", `preventing people from entering or leaving`, "red"), ` your arcology. Improving your transport infrastructure will prevent this from happening.`);
 			App.UI.DOM.appendNewElement("div", el, warning, "note");
 			V.weatherAwareness = 1;
 		}
-		return _weatherFreeze;
+		return weatherFreeze;
 	}
 
 	function enslavement() {
-		if (_enslaved > 0) {
-			const _enslavedPC = Math.max(Math.trunc(_enslaved / 4), 1);
-			const _enslavedNPC = _enslaved - _enslavedPC;
-			V.menials += _enslavedPC;
-			V.NPCSlaves += _enslavedNPC;
-			if (_enslaved > 1) {
-				appendDiv(`In total <span class="green">${num(_enslaved)} lower class citizens</span> were enslaved for failing to pay their debts.`);
-				appendDiv(`<span class="green">You enslaved ${num(_enslavedPC)}</span> of them while other debtholders in the arcology enslaved the remaining ${num(_enslavedNPC)}.`);
+		if (enslaved > 0) {
+			const enslavedPC = Math.max(Math.trunc(enslaved / 4), 1);
+			const enslavedNPC = enslaved - enslavedPC;
+			V.menials += enslavedPC;
+			V.NPCSlaves += enslavedNPC;
+			if (enslaved > 1) {
+				appendDiv(`In total <span class="green">${num(enslaved)} lower class citizens</span> were enslaved for failing to pay their debts.`);
+				appendDiv(`<span class="green">You enslaved ${num(enslavedPC)}</span> of them while other debtholders in the arcology enslaved the remaining ${num(enslavedNPC)}.`);
 			} else {
 				appendDiv(`<span class="green">As arcology owner you claimed the slave.</span>`);
 			}
@@ -1463,148 +1463,148 @@ App.EndWeek.arcManagement = function() {
 	}
 
 	function transport() {
-		_FSScore = _FSScore / V.FSCreditCount;
-		_transportHub = 1;
-		_crime = 0.8;
+		FSScore = FSScore / V.FSCreditCount;
+		transportHub = 1;
+		crime = 0.8;
 		if (V.secExpEnabled > 0) {
-			_transportHub = 0.7;
+			transportHub = 0.7;
 			if (V.SecExp.buildings.transportHub) {
-				_transportHub += V.SecExp.buildings.transportHub.airport / 10 + V.SecExp.buildings.transportHub.surfaceTransport / 10;
+				transportHub += V.SecExp.buildings.transportHub.airport / 10 + V.SecExp.buildings.transportHub.surfaceTransport / 10;
 			}
-			_crime = (100 - V.SecExp.core.crimeLow) / 100 + 0.2;
+			crime = (100 - V.SecExp.core.crimeLow) / 100 + 0.2;
 			const waterwayDamaged = App.SecExp.updateFacilityDamage("waterway");
 			appendDiv(waterwayDamaged.text);
 		}
 		if (V.terrain === "urban") {
-			_terrain = 1.2;
+			terrain = 1.2;
 		} else if (V.terrain === "rural" || V.terrain === "marine") {
-			_terrain = 1;
+			terrain = 1;
 		} else {
-			_terrain = 0.8;
+			terrain = 0.8;
 		}
 
-		_honeymoon = 0;
+		honeymoon = 0;
 		if (V.arcologies[0].honeymoon > 0) {
-			_honeymoon = 10 * V.arcologies[0].honeymoon;
+			honeymoon = 10 * V.arcologies[0].honeymoon;
 		}
-		const _oldVisitors = V.visitors;
-		V.visitors = Math.trunc(((V.arcologies[0].prosperity + _FSScore * 5 + _honeymoon) * _transportHub * _terrain * _crime) * _econMult);
+		const oldVisitors = V.visitors;
+		V.visitors = Math.trunc(((V.arcologies[0].prosperity + FSScore * 5 + honeymoon) * transportHub * terrain * crime) * econMult);
 
 		if (V.visitors < 50) {
 			V.visitors = normalRandInt(50, 2);
 		}
 		if (isNaN(V.visitors)) {
 			appendDiv(`<span class="red">Visitors is NaN, report this issue!</span>`);
-			V.visitors = _oldVisitors;
+			V.visitors = oldVisitors;
 		}
 		appendDiv(`<span class="green">${num(V.visitors)} traders and tourists</span> visited your arcology this week.`);
 		appendDiv(App.SecExp.propagandaEffects("enslavement").text);
-		_enslaved += App.SecExp.propagandaEffects("enslavement").effect;
+		enslaved += App.SecExp.propagandaEffects("enslavement").effect;
 
 		/* slaves*/
 		/* Slaves getting retired*/
 		if (V.policies.retirement.menial2Citizen === 1) {
-			let _weeklyRetiredMenials = V.menials / ((V.customMenialRetirementAge - 15) * 52);
-			let _weeklyRetiredNPCMenials = V.NPCSlaves / ((V.customMenialRetirementAge - 15) * 52);
+			let weeklyRetiredMenials = V.menials / ((V.customMenialRetirementAge - 15) * 52);
+			let weeklyRetiredNPCMenials = V.NPCSlaves / ((V.customMenialRetirementAge - 15) * 52);
 			/* This implies a minimum menial age of 15. Even if the player sets minimum ages lower, there's no point having a 3 year old menial slave. 15 seems alright while being nice and round. This also implies ages are distributed evenly, no easy way around that.*/
-			if (_weeklyRetiredMenials > 1) {
-				_weeklyRetiredMenials = Math.trunc(_weeklyRetiredMenials);
-				if (_weeklyRetiredMenials > 1) {
-					appendDiv(`<span class="red">${num(_weeklyRetiredMenials)} of your menial slaves</span> retired as free citizens this week.`);
+			if (weeklyRetiredMenials > 1) {
+				weeklyRetiredMenials = Math.trunc(weeklyRetiredMenials);
+				if (weeklyRetiredMenials > 1) {
+					appendDiv(`<span class="red">${num(weeklyRetiredMenials)} of your menial slaves</span> retired as free citizens this week.`);
 				} else {
 					appendDiv(`<span class="red">One of your menial slaves</span> retired as a free citizen this week.`);
 				}
 			} else {
-				_weeklyRetiredMenials *= 100;
-				if (_weeklyRetiredMenials > random(1, 100)) {
-					_weeklyRetiredMenials = 1;
+				weeklyRetiredMenials *= 100;
+				if (weeklyRetiredMenials > random(1, 100)) {
+					weeklyRetiredMenials = 1;
 					appendDiv(`<span class="red">One of your menial slaves</span> retired as a free citizen this week.`);
 				} else {
-					_weeklyRetiredMenials = 0;
+					weeklyRetiredMenials = 0;
 				}
 			}
-			if (_weeklyRetiredNPCMenials > 1) {
-				_weeklyRetiredNPCMenials = Math.trunc(_weeklyRetiredNPCMenials);
-				if (_weeklyRetiredNPCMenials > 1) {
-					appendDiv(`<span class="red">${num(_weeklyRetiredNPCMenials)} menial slaves</span> were retired as free citizens by other slave owners in your arcology this week.`);
+			if (weeklyRetiredNPCMenials > 1) {
+				weeklyRetiredNPCMenials = Math.trunc(weeklyRetiredNPCMenials);
+				if (weeklyRetiredNPCMenials > 1) {
+					appendDiv(`<span class="red">${num(weeklyRetiredNPCMenials)} menial slaves</span> were retired as free citizens by other slave owners in your arcology this week.`);
 				} else {
 					appendDiv(`<span class="red">One menial slave</span> was retired as a free citizen by another slave owner in your arcology this week.`);
 				}
 			} else {
-				_weeklyRetiredNPCMenials *= 100;
-				if (_weeklyRetiredNPCMenials > random(1, 100)) {
-					_weeklyRetiredNPCMenials = 1;
+				weeklyRetiredNPCMenials *= 100;
+				if (weeklyRetiredNPCMenials > random(1, 100)) {
+					weeklyRetiredNPCMenials = 1;
 					appendDiv(`<span class="red">One menial slave</span> was retired as a free citizen by another slave owner in your arcology this week.`);
 				} else {
-					_weeklyRetiredNPCMenials = 0;
+					weeklyRetiredNPCMenials = 0;
 				}
 			}
-			V.menials -= _weeklyRetiredMenials;
-			V.NPCSlaves -= _weeklyRetiredNPCMenials;
-			V.lowerClass += _weeklyRetiredMenials + _weeklyRetiredNPCMenials;
+			V.menials -= weeklyRetiredMenials;
+			V.NPCSlaves -= weeklyRetiredNPCMenials;
+			V.lowerClass += weeklyRetiredMenials + weeklyRetiredNPCMenials;
 		}
 		/* Demand for simple labor*/
-		_LSCD = Math.trunc((V.LSCBase * _econMult) + (V.arcologies[0].prosperity * 4) + ((V.middleClass + V.visitors * 0.6) * 1.5) + ((V.upperClass + V.visitors * 0.2) * 3.5) + (V.topClass * 18));
+		LSCD = Math.trunc((V.LSCBase * econMult) + (V.arcologies[0].prosperity * 4) + ((V.middleClass + V.visitors * 0.6) * 1.5) + ((V.upperClass + V.visitors * 0.2) * 3.5) + (V.topClass * 18));
 		/* Demand for owning slaves*/
-		_SCD = Math.trunc((V.upperClass * (2 + _slaveDemandU)) + (V.topClass * (12 + _slaveDemandT)));
-		if (isNaN(_LSCD)) {
+		SCD = Math.trunc((V.upperClass * (2 + slaveDemandU)) + (V.topClass * (12 + slaveDemandT)));
+		if (isNaN(LSCD)) {
 			appendDiv(`<span class="red">LSCD is NaN, report this issue!</span>`);
-		} else if (isNaN(_SCD)) {
+		} else if (isNaN(SCD)) {
 			appendDiv(`<span class="red">SCD is NaN, report this issue!</span>`);
 		} else {
 			/* More slaves than they know what to do with*/
-			if (V.NPCSlaves > _SCD * 1.6) {
-				const _NPCSlavesSold = V.NPCSlaves - Math.trunc(_SCD * 1.6);
-				V.menialDemandFactor -= _NPCSlavesSold;
-				V.NPCSlaves = Math.trunc(_SCD * 1.6);
-				if (_NPCSlavesSold > 1) {
-					appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`);
-				} else if (_NPCSlavesSold > 0) {
+			if (V.NPCSlaves > SCD * 1.6) {
+				const NPCSlavesSold = V.NPCSlaves - Math.trunc(SCD * 1.6);
+				V.menialDemandFactor -= NPCSlavesSold;
+				V.NPCSlaves = Math.trunc(SCD * 1.6);
+				if (NPCSlavesSold > 1) {
+					appendDiv(`<span class="red">${num(NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`);
+				} else if (NPCSlavesSold > 0) {
 					appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They've got more than enough of them already.`);
 				}
 				/* More slaves than there is work*/
-			} else if (V.NPCSlaves > (_LSCD / _slaveProductivity) - V.menials + _SCD) {
-				const _NPCSlavesSold = V.NPCSlaves - Math.trunc(_LSCD / _slaveProductivity - V.menials + _SCD);
-				V.menialDemandFactor -= _NPCSlavesSold;
-				V.NPCSlaves = Math.trunc(_LSCD / _slaveProductivity);
-				if (_NPCSlavesSold > 1) {
-					appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. There was so little work that they failed to earn their keep.`);
-				} else if (_NPCSlavesSold > 0) {
+			} else if (V.NPCSlaves > (LSCD / slaveProductivity) - V.menials + SCD) {
+				const NPCSlavesSold = V.NPCSlaves - Math.trunc(LSCD / slaveProductivity - V.menials + SCD);
+				V.menialDemandFactor -= NPCSlavesSold;
+				V.NPCSlaves = Math.trunc(LSCD / slaveProductivity);
+				if (NPCSlavesSold > 1) {
+					appendDiv(`<span class="red">${num(NPCSlavesSold)}</span> slaves were sold by your inhabitants. There was so little work that they failed to earn their keep.`);
+				} else if (NPCSlavesSold > 0) {
 					appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. There was so little work that it failed to earn its keep.`);
 				}
 				/* Cutting back on slaves*/
-			} else if (V.NPCSlaves > _SCD * 1.4) {
+			} else if (V.NPCSlaves > SCD * 1.4) {
 				if (V.slaveCostFactor > 0.95) {
-					const _NPCSlavesSold = Math.trunc((V.NPCSlaves - _SCD) * 0.4);
-					V.menialDemandFactor -= _NPCSlavesSold;
-					V.NPCSlaves -= _NPCSlavesSold;
-					if (_NPCSlavesSold > 1) {
-						appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`);
-					} else if (_NPCSlavesSold > 0) {
+					const NPCSlavesSold = Math.trunc((V.NPCSlaves - SCD) * 0.4);
+					V.menialDemandFactor -= NPCSlavesSold;
+					V.NPCSlaves -= NPCSlavesSold;
+					if (NPCSlavesSold > 1) {
+						appendDiv(`<span class="red">${num(NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`);
+					} else if (NPCSlavesSold > 0) {
 						appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They've got more than enough of them already.`);
 					}
 				}
 				/* Selling excess slaves for profit*/
-			} else if (V.NPCSlaves > _SCD * 1.2) {
+			} else if (V.NPCSlaves > SCD * 1.2) {
 				if (V.slaveCostFactor > 1.1) {
-					const _NPCSlavesSold = Math.trunc((V.NPCSlaves - _SCD) * 0.4);
-					V.menialDemandFactor -= _NPCSlavesSold;
-					V.NPCSlaves -= _NPCSlavesSold;
-					if (_NPCSlavesSold > 1) {
-						appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> were sold by your inhabitants. They saw an opportunity for profit.`);
-					} else if (_NPCSlavesSold > 0) {
+					const NPCSlavesSold = Math.trunc((V.NPCSlaves - SCD) * 0.4);
+					V.menialDemandFactor -= NPCSlavesSold;
+					V.NPCSlaves -= NPCSlavesSold;
+					if (NPCSlavesSold > 1) {
+						appendDiv(`<span class="red">${num(NPCSlavesSold)}</span> were sold by your inhabitants. They saw an opportunity for profit.`);
+					} else if (NPCSlavesSold > 0) {
 						appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They saw an opportunity for profit.`);
 					}
 				}
 			}
 			/* Buying slaves because they are really cheap*/
 			if (V.slaveCostFactor < 0.8) {
-				if (V.NPCSlaves < _SCD * 1.5) {
-					const _NPCSlavesBought = Math.trunc(_SCD * 0.05);
-					V.menialSupplyFactor -= _NPCSlavesBought;
-					V.NPCSlaves += _NPCSlavesBought;
-					if (_NPCSlavesBought > 1) {
-						appendDiv(`<span class="green">${num(_NPCSlavesBought)} slaves</span> were bought by your inhabitants. They were too cheap to pass up on.`);
+				if (V.NPCSlaves < SCD * 1.5) {
+					const NPCSlavesBought = Math.trunc(SCD * 0.05);
+					V.menialSupplyFactor -= NPCSlavesBought;
+					V.NPCSlaves += NPCSlavesBought;
+					if (NPCSlavesBought > 1) {
+						appendDiv(`<span class="green">${num(NPCSlavesBought)} slaves</span> were bought by your inhabitants. They were too cheap to pass up on.`);
 					} /* there's no way this ever ends up needing a 1 slave version*/
 				}
 			}
@@ -1612,14 +1612,14 @@ App.EndWeek.arcManagement = function() {
 
 		/* Lower Class Citizens*/
 		/* Work left for lower class citizens*/
-		_LCD = Math.trunc(((V.LSCBase * _econMult) + (V.arcologies[0].prosperity * 4) + _lowerClass + ((V.middleClass + V.visitors * 0.6) * 1.5) + ((V.upperClass + V.visitors * 0.2) * 3.5) + (V.topClass * 18) - (V.NPCSlaves + V.menials) * _slaveProductivity) * V.rentEffectL * _lowerClassP);
+		LCD = Math.trunc(((V.LSCBase * econMult) + (V.arcologies[0].prosperity * 4) + lowerClass + ((V.middleClass + V.visitors * 0.6) * 1.5) + ((V.upperClass + V.visitors * 0.2) * 3.5) + (V.topClass * 18) - (V.NPCSlaves + V.menials) * slaveProductivity) * V.rentEffectL * lowerClassP);
 		if (V.classSatisfied.lowerClass !== 0) {
-			_LCD *= 1 + V.classSatisfied.lowerClass * 0.06;
+			LCD *= 1 + V.classSatisfied.lowerClass * 0.06;
 		}
-		if (_LCD < 0) {
-			_LCD = 0;
+		if (LCD < 0) {
+			LCD = 0;
 		}
-		if (isNaN(_LCD)) {
+		if (isNaN(LCD)) {
 			appendDiv(`<span class="red">LCD is NaN, report this issue!</span>`);
 		} else { /* Changing population depending on work available*/
 			if (V.classSatisfied.lowerClass < 0) {
@@ -1628,48 +1628,48 @@ App.EndWeek.arcManagement = function() {
 				appendDiv(`Your lower class is <span class="green">sexually satiated</span> and their happiness attracts others.`);
 			}
 			r = [];
-			if (V.lowerClass < _LCD) {
-				let _LCImmigration = Math.trunc((_LCD - V.lowerClass) * (0.3 * _terrain)) + 1 + secExpImmigrationBonus.effect;
+			if (V.lowerClass < LCD) {
+				let LCImmigration = Math.trunc((LCD - V.lowerClass) * (0.3 * terrain)) + 1 + secExpImmigrationBonus.effect;
 				if (V.arcologies[0].FSIntellectualDependencyLaw === 1) { /* Enslaving the dumb lower class immigrants*/
-					const _intellectualDependencyEnslaved = Math.trunc(_LCImmigration * 0.25);
-					_LCImmigration -= _intellectualDependencyEnslaved;
-					_enslaved += _intellectualDependencyEnslaved;
-					r.push(`<span class="green">${num(_intellectualDependencyEnslaved)} dumb immigrants</span> were enslaved for their own good.`);
+					const intellectualDependencyEnslaved = Math.trunc(LCImmigration * 0.25);
+					LCImmigration -= intellectualDependencyEnslaved;
+					enslaved += intellectualDependencyEnslaved;
+					r.push(`<span class="green">${num(intellectualDependencyEnslaved)} dumb immigrants</span> were enslaved for their own good.`);
 				}
 
-				V.lowerClass += _LCImmigration;
-				if (_LCImmigration > 1) {
-					r.push(`<span class="green">${num(_LCImmigration)} lower class citizens</span> moved to your arcology.`);
-				} else if (_LCImmigration > 0) {
+				V.lowerClass += LCImmigration;
+				if (LCImmigration > 1) {
+					r.push(`<span class="green">${num(LCImmigration)} lower class citizens</span> moved to your arcology.`);
+				} else if (LCImmigration > 0) {
 					r.push(`<span class="green">One lower class citizen</span> moved to your arcology.`);
 				}
-			} else if (V.lowerClass > _LCD) {
-				const _LCEmigration = Math.trunc((V.lowerClass - _LCD) * 0.4);
+			} else if (V.lowerClass > LCD) {
+				const LCEmigration = Math.trunc((V.lowerClass - LCD) * 0.4);
 				const enslaveChance = 0.2;
-				const _enslavedEmigrants = Math.trunc(_LCEmigration * enslaveChance * (1.0 - getBanishRatio()));
-				V.lowerClass -= _LCEmigration;
-				_enslaved += _enslavedEmigrants;
-				if (_LCEmigration > 1) {
-					r.push(`<span class="red">${num(_LCEmigration)} lower class citizens</span> had no work and tried to leave your arcology.`);
-					if (_enslavedEmigrants > 1) {
-						r.push(`<span class="green">${num(_enslavedEmigrants)} of them were enslaved instead.</span>`);
-					} else if (_enslavedEmigrants > 0) {
+				const enslavedEmigrants = Math.trunc(LCEmigration * enslaveChance * (1.0 - getBanishRatio()));
+				V.lowerClass -= LCEmigration;
+				enslaved += enslavedEmigrants;
+				if (LCEmigration > 1) {
+					r.push(`<span class="red">${num(LCEmigration)} lower class citizens</span> had no work and tried to leave your arcology.`);
+					if (enslavedEmigrants > 1) {
+						r.push(`<span class="green">${num(enslavedEmigrants)} of them were enslaved instead.</span>`);
+					} else if (enslavedEmigrants > 0) {
 						r.push(`<span class="green">One of them was enslaved instead.</span>`);
 					}
-				} else if (_LCEmigration > 0) {
+				} else if (LCEmigration > 0) {
 					r.push(`<span class="red">One lower class citizen</span> left your arcology due to a lack of work.`);
 				}
 			}
 			App.Events.addNode(el, r, "div");
 			enslavement();
 			/* Need more slaves still*/
-			if (V.NPCSlaves < _SCD) {
-				const _NPCSlavesBought = Math.trunc((_SCD - V.NPCSlaves) * 0.75) + 1;
-				V.menialSupplyFactor -= _NPCSlavesBought;
-				V.NPCSlaves += _NPCSlavesBought;
-				if (_NPCSlavesBought > 1) {
-					appendDiv(`<span class="green">${num(_NPCSlavesBought)} slaves</span> were bought by your inhabitants. They did not have enough of them to satisfy their needs.`);
-				} else if (_NPCSlavesBought > 0) {
+			if (V.NPCSlaves < SCD) {
+				const NPCSlavesBought = Math.trunc((SCD - V.NPCSlaves) * 0.75) + 1;
+				V.menialSupplyFactor -= NPCSlavesBought;
+				V.NPCSlaves += NPCSlavesBought;
+				if (NPCSlavesBought > 1) {
+					appendDiv(`<span class="green">${num(NPCSlavesBought)} slaves</span> were bought by your inhabitants. They did not have enough of them to satisfy their needs.`);
+				} else if (NPCSlavesBought > 0) {
 					appendDiv(`<span class="green">One slave</span> was bought by your inhabitants. They did not quite have enough of them to satisfy their needs.`);
 				}
 			}
@@ -1677,14 +1677,14 @@ App.EndWeek.arcManagement = function() {
 
 		/* Middle Class Citizens*/
 		/* Demand for Middle Class*/
-		_MCD = Math.trunc(((V.MCBase * _econMult) + V.arcologies[0].prosperity + _middleClass + (V.NPCSlaves * 0.15) + (V.lowerClass * 0.1) + ((V.upperClass + V.visitors * 0.2) * 0.5) + (V.topClass * 2.5)) * V.rentEffectM * _middleClassP);
+		MCD = Math.trunc(((V.MCBase * econMult) + V.arcologies[0].prosperity + middleClass + (V.NPCSlaves * 0.15) + (V.lowerClass * 0.1) + ((V.upperClass + V.visitors * 0.2) * 0.5) + (V.topClass * 2.5)) * V.rentEffectM * middleClassP);
 		if (V.classSatisfied.middleClass !== 0) {
-			_MCD *= 1 + V.classSatisfied.middleClass * 0.06;
+			MCD *= 1 + V.classSatisfied.middleClass * 0.06;
 		}
-		if (_MCD < 200) {
-			_MCD = 200;
+		if (MCD < 200) {
+			MCD = 200;
 		}
-		if (isNaN(_MCD)) {
+		if (isNaN(MCD)) {
 			appendDiv(`<span class="red">MCD is NaN, report this issue!</span>`);
 		} else {
 			/* Middle Class Citizens immigrating*/
@@ -1693,21 +1693,21 @@ App.EndWeek.arcManagement = function() {
 			} else if (V.classSatisfied.middleClass > 0) {
 				appendDiv(`Your middle class is <span class="green">sexually satiated</span> and their happiness attracts others.`);
 			}
-			if (V.middleClass < _MCD) {
-				const _MCImmigration = Math.trunc((_MCD - V.middleClass) * (0.3 * _terrain)) + 1 + secExpImmigrationBonus.effect;
-				V.middleClass += _MCImmigration;
-				if (_MCImmigration > 1) {
-					appendDiv(`<span class="green">${num(_MCImmigration)} middle class citizens</span> moved to your arcology.`);
-				} else if (_MCImmigration > 0) {
+			if (V.middleClass < MCD) {
+				const MCImmigration = Math.trunc((MCD - V.middleClass) * (0.3 * terrain)) + 1 + secExpImmigrationBonus.effect;
+				V.middleClass += MCImmigration;
+				if (MCImmigration > 1) {
+					appendDiv(`<span class="green">${num(MCImmigration)} middle class citizens</span> moved to your arcology.`);
+				} else if (MCImmigration > 0) {
 					appendDiv(`<span class="green">One middle class citizen</span> moved to your arcology.`);
 				}
 				/* Middle Class Citizens emigrating*/
-			} else if (V.middleClass > _MCD) {
-				const _MCEmigration = Math.trunc((V.middleClass - _MCD) * 0.4);
-				V.middleClass -= _MCEmigration;
-				if (_MCEmigration > 1) {
-					appendDiv(`<span class="red">${num(_MCEmigration)} middle class citizens</span> left your arcology.`);
-				} else if (_MCEmigration > 0) {
+			} else if (V.middleClass > MCD) {
+				const MCEmigration = Math.trunc((V.middleClass - MCD) * 0.4);
+				V.middleClass -= MCEmigration;
+				if (MCEmigration > 1) {
+					appendDiv(`<span class="red">${num(MCEmigration)} middle class citizens</span> left your arcology.`);
+				} else if (MCEmigration > 0) {
 					appendDiv(`<span class="red">One middle class citizen</span> left your arcology.`);
 				}
 			}
@@ -1715,14 +1715,14 @@ App.EndWeek.arcManagement = function() {
 
 		/* Upper Class Citizens*/
 		/* Demand for Upper Class*/
-		_UCD = Math.trunc(((V.UCBase * _econMult) + (V.arcologies[0].prosperity * 0.2) + _upperClass + (V.NPCSlaves * 0.02) + (V.lowerClass * 0.025) + ((V.middleClass + V.visitors * 0.6) * 0.05) + (V.topClass * 0.3)) * V.rentEffectU * _upperClassP);
+		UCD = Math.trunc(((V.UCBase * econMult) + (V.arcologies[0].prosperity * 0.2) + upperClass + (V.NPCSlaves * 0.02) + (V.lowerClass * 0.025) + ((V.middleClass + V.visitors * 0.6) * 0.05) + (V.topClass * 0.3)) * V.rentEffectU * upperClassP);
 		if (V.classSatisfied.upperClass !== 0) {
-			_UCD *= 1 + V.classSatisfied.upperClass * 0.06;
+			UCD *= 1 + V.classSatisfied.upperClass * 0.06;
 		}
-		if (_UCD < 50) {
-			_UCD = 50;
+		if (UCD < 50) {
+			UCD = 50;
 		}
-		if (isNaN(_UCD)) {
+		if (isNaN(UCD)) {
 			appendDiv(`<span class="red">UCD is NaN, report this issue!</span>`);
 		} else {
 			/* Upper Class Citizens immigrating*/
@@ -1731,21 +1731,21 @@ App.EndWeek.arcManagement = function() {
 			} else if (V.classSatisfied.upperClass > 0) {
 				appendDiv(`Your upper class is <span class="green">sexually satiated</span> and their happiness attracts others.`);
 			}
-			if (V.upperClass < _UCD) {
-				const _UCImmigration = Math.trunc((_UCD - V.upperClass) * (0.3 * _terrain)) + 1 + secExpImmigrationBonus.effect;
-				V.upperClass += _UCImmigration;
-				if (_UCImmigration > 1) {
-					appendDiv(`<span class="green">${num(_UCImmigration)} upper class citizens</span> moved to your arcology.`);
-				} else if (_UCImmigration > 0) {
+			if (V.upperClass < UCD) {
+				const UCImmigration = Math.trunc((UCD - V.upperClass) * (0.3 * terrain)) + 1 + secExpImmigrationBonus.effect;
+				V.upperClass += UCImmigration;
+				if (UCImmigration > 1) {
+					appendDiv(`<span class="green">${num(UCImmigration)} upper class citizens</span> moved to your arcology.`);
+				} else if (UCImmigration > 0) {
 					appendDiv(`<span class="green">One upper class citizen</span> moved to your arcology.`);
 				}
 				/* Upper Class Citizens Emigrating*/
-			} else if (V.upperClass > _UCD) {
-				const _UCEmigration = Math.trunc((V.upperClass - _UCD) * 0.4);
-				V.upperClass -= _UCEmigration;
-				if (_UCEmigration > 1) {
-					appendDiv(`<span class="red">${num(_UCEmigration)} upper class citizens</span> left your arcology.`);
-				} else if (_UCEmigration > 0) {
+			} else if (V.upperClass > UCD) {
+				const UCEmigration = Math.trunc((V.upperClass - UCD) * 0.4);
+				V.upperClass -= UCEmigration;
+				if (UCEmigration > 1) {
+					appendDiv(`<span class="red">${num(UCEmigration)} upper class citizens</span> left your arcology.`);
+				} else if (UCEmigration > 0) {
 					appendDiv(`<span class="red">One upper class citizen</span> left your arcology.`);
 				}
 			}
@@ -1755,18 +1755,18 @@ App.EndWeek.arcManagement = function() {
 		/* Top Class Interest in living in your arcology*/
 		if (V.eliteFailTimer > 0) {
 			/* when you fail the eugenics Elite and they leave this triggers*/
-			_TCD = Math.trunc((V.GDP / 15 + _topClass) * V.rentEffectT * _topClassP + V.TCBase - (V.eliteFail / 15 * V.eliteFailTimer));
+			TCD = Math.trunc((V.GDP / 15 + topClass) * V.rentEffectT * topClassP + V.TCBase - (V.eliteFail / 15 * V.eliteFailTimer));
 			V.eliteFailTimer -= 1;
 		} else {
-			_TCD = Math.trunc((V.GDP / 15 + _topClass) * V.rentEffectT * _topClassP + V.TCBase);
+			TCD = Math.trunc((V.GDP / 15 + topClass) * V.rentEffectT * topClassP + V.TCBase);
 		}
 		if (V.classSatisfied.topClass !== 0) {
-			_TCD *= 1 + V.classSatisfied.topClass * 0.06;
+			TCD *= 1 + V.classSatisfied.topClass * 0.06;
 		}
-		if (_TCD < 15) {
-			_TCD = 15;
+		if (TCD < 15) {
+			TCD = 15;
 		}
-		if (isNaN(_TCD)) {
+		if (isNaN(TCD)) {
 			appendDiv(`<span class="red">TCD is NaN, report this issue!</span>`);
 		} else {
 			/* Top Class Citizens immigrating*/
@@ -1775,21 +1775,21 @@ App.EndWeek.arcManagement = function() {
 			} else if (V.classSatisfied.topClass > 0) {
 				appendDiv(`Your millionaires are <span class="green">sexually satiated</span> and their happiness attracts others.`);
 			}
-			if (V.topClass < _TCD) {
-				const _TCImmigration = Math.trunc((_TCD - V.topClass) * (0.3 * _terrain)) + 1 + secExpImmigrationBonus.effect;
-				V.topClass += _TCImmigration;
-				if (_TCImmigration > 1) {
-					appendDiv(`<span class="green">${num(_TCImmigration)} millionaires</span> moved to your arcology.`); /* Fat Cat? One-Percenter? */
-				} else if (_TCImmigration > 0) {
+			if (V.topClass < TCD) {
+				const TCImmigration = Math.trunc((TCD - V.topClass) * (0.3 * terrain)) + 1 + secExpImmigrationBonus.effect;
+				V.topClass += TCImmigration;
+				if (TCImmigration > 1) {
+					appendDiv(`<span class="green">${num(TCImmigration)} millionaires</span> moved to your arcology.`); /* Fat Cat? One-Percenter? */
+				} else if (TCImmigration > 0) {
 					appendDiv(`<span class="green">One millionaire</span> moved to your arcology.`);
 				}
 				/* Top Class Citizens emigrating*/
-			} else if (V.topClass > _TCD) {
-				const _TCEmigration = Math.trunc((V.topClass - _TCD) * 0.4) + 1;
-				V.topClass -= _TCEmigration;
-				if (_TCEmigration > 1) {
-					appendDiv(`<span class="red">${num(_TCEmigration)} millionaires</span> left your arcology.`);
-				} else if (_TCEmigration > 0) {
+			} else if (V.topClass > TCD) {
+				const TCEmigration = Math.trunc((V.topClass - TCD) * 0.4) + 1;
+				V.topClass -= TCEmigration;
+				if (TCEmigration > 1) {
+					appendDiv(`<span class="red">${num(TCEmigration)} millionaires</span> left your arcology.`);
+				} else if (TCEmigration > 0) {
 					appendDiv(`<span class="red">One millionaire</span> left your arcology.`);
 				}
 			}
@@ -1802,29 +1802,29 @@ App.EndWeek.arcManagement = function() {
 		const r = [];
 		/* Slave retirement trigger pulled (one time only)*/
 		if (V.citizenRetirementTrigger === 1) {
-			let _citizenRetirementImpact;
+			let citizenRetirementImpact;
 			if (V.customMenialRetirementAge >= 65) {
-				_citizenRetirementImpact = 0.475 - Math.clamp(V.customMenialRetirementAge / 200, 0.325, 0.475);
+				citizenRetirementImpact = 0.475 - Math.clamp(V.customMenialRetirementAge / 200, 0.325, 0.475);
 			} else {
-				_citizenRetirementImpact = 0.9 - Math.clamp(V.customMenialRetirementAge / 100, 0.2, 0.65);
+				citizenRetirementImpact = 0.9 - Math.clamp(V.customMenialRetirementAge / 100, 0.2, 0.65);
 			}
 			if (V.arcologies[0].FSSupremacistLawME + V.arcologies[0].FSSubjugationistLawME > 0) {
-				_citizenRetirementImpact *= 2 / 3;
+				citizenRetirementImpact *= 2 / 3;
 			}
-			V.lowerClass += Math.trunc((V.NPCSlaves + V.menials) * (0.05 + _citizenRetirementImpact));
-			const _menialsRetirement = Math.trunc(V.menials * (0.05 + _citizenRetirementImpact));
-			V.menials = Math.trunc(V.menials * (0.95 - _citizenRetirementImpact));
-			const _ASlavesRetirement = Math.trunc(V.NPCSlaves * (0.05 + _citizenRetirementImpact));
-			V.NPCSlaves = Math.trunc(V.NPCSlaves * (0.95 - _citizenRetirementImpact));
+			V.lowerClass += Math.trunc((V.NPCSlaves + V.menials) * (0.05 + citizenRetirementImpact));
+			const menialsRetirement = Math.trunc(V.menials * (0.05 + citizenRetirementImpact));
+			V.menials = Math.trunc(V.menials * (0.95 - citizenRetirementImpact));
+			const ASlavesRetirement = Math.trunc(V.NPCSlaves * (0.05 + citizenRetirementImpact));
+			V.NPCSlaves = Math.trunc(V.NPCSlaves * (0.95 - citizenRetirementImpact));
 			V.citizenRetirementTrigger = 2;
 			r.push(`You have enacted citizen retirement, the slaves of eligible age are granted freedom.`);
-			if (_menialsRetirement > 1) {
-				r.push(`<span class="red">${num(_menialsRetirement)} of your menial slaves</span> were retired.`);
-			} else if (_menialsRetirement > 0) {
+			if (menialsRetirement > 1) {
+				r.push(`<span class="red">${num(menialsRetirement)} of your menial slaves</span> were retired.`);
+			} else if (menialsRetirement > 0) {
 				r.push(`<span class="red">One of your menial slaves</span> was retired.`);
 			}
-			if (_ASlavesRetirement > 1) {
-				r.push(`<span class="red">${num(_ASlavesRetirement)} slaves</span> in your arcology were given a citizen retirement.`);
+			if (ASlavesRetirement > 1) {
+				r.push(`<span class="red">${num(ASlavesRetirement)} slaves</span> in your arcology were given a citizen retirement.`);
 			}
 			/* I could bother with a single slave retirement message, but that's never going to get used*/
 		}
@@ -1837,49 +1837,49 @@ App.EndWeek.arcManagement = function() {
 		const r = [];
 		/* Citizen expiration */
 		let z = [];
-		const _deathsLC = Math.trunc(V.lowerClass * _expirationLC);
-		const _deathsMC = Math.trunc(V.middleClass * _expirationMC);
-		const _deathsUC = Math.trunc(V.upperClass * _expirationUC);
-		const _deathsTC = Math.trunc(V.topClass * _expirationTC);
-		V.lowerClass -= _deathsLC;
-		V.middleClass -= _deathsMC;
-		V.upperClass -= _deathsUC;
-		V.lowerClass -= _deathsTC;
-		if (_deathsLC > 0) {
-			z.push(numberWithPluralOne(_deathsLC, "lower class citizen"));
-		}
-		if (_deathsMC > 0) {
-			z.push(numberWithPluralOne(_deathsMC, "middle class citizen"));
-		}
-		if (_deathsUC > 0) {
-			z.push(numberWithPluralOne(_deathsUC, "upper class citizen"));
-		}
-		if (_deathsTC > 0) {
-			z.push(numberWithPluralOne(_deathsTC, "millionaire"));
-		}
-		if (_deathsLC > 0 || _deathsMC > 0 || _deathsUC > 0 || _deathsTC > 0) {
+		const deathsLC = Math.trunc(V.lowerClass * expirationLC);
+		const deathsMC = Math.trunc(V.middleClass * expirationMC);
+		const deathsUC = Math.trunc(V.upperClass * expirationUC);
+		const deathsTC = Math.trunc(V.topClass * expirationTC);
+		V.lowerClass -= deathsLC;
+		V.middleClass -= deathsMC;
+		V.upperClass -= deathsUC;
+		V.lowerClass -= deathsTC;
+		if (deathsLC > 0) {
+			z.push(numberWithPluralOne(deathsLC, "lower class citizen"));
+		}
+		if (deathsMC > 0) {
+			z.push(numberWithPluralOne(deathsMC, "middle class citizen"));
+		}
+		if (deathsUC > 0) {
+			z.push(numberWithPluralOne(deathsUC, "upper class citizen"));
+		}
+		if (deathsTC > 0) {
+			z.push(numberWithPluralOne(deathsTC, "millionaire"));
+		}
+		if (deathsLC > 0 || deathsMC > 0 || deathsUC > 0 || deathsTC > 0) {
 			r.push(App.UI.DOM.makeElement("span", `${capFirstChar(toSentence(z))} passed away due to natural causes.`, "red"));
 		}
 
 		/* Slave expiration*/
-		const _expirationPC = Math.trunc(V.menials * _expirationFS);
-		const _expirationFD = Math.trunc(V.fuckdolls * _expirationFS);
-		const _expirationBR = Math.trunc(V.menialBioreactors * _expirationFS);
-		const _expirationNPC = Math.trunc(V.NPCSlaves * _expirationFS);
-		const _expiration = _expirationPC + _expirationNPC + _expirationFD + _expirationBR;
-		V.NPCSlaves -= _expirationNPC;
-		V.menials -= _expirationPC;
-		V.fuckdolls -= _expirationFD;
-		V.menialBioreactors -= _expirationBR;
-		if (_expiration > 0) {
-			if (_expirationFS <= 0.5) {
-				r.push(`<span class="red">${capFirstChar(numberWithPluralOne(_expiration, "slave"))} passed away</span> due to natural causes.`);
+		const expirationPC = Math.trunc(V.menials * expirationFS);
+		const expirationFD = Math.trunc(V.fuckdolls * expirationFS);
+		const expirationBR = Math.trunc(V.menialBioreactors * expirationFS);
+		const expirationNPC = Math.trunc(V.NPCSlaves * expirationFS);
+		const expiration = expirationPC + expirationNPC + expirationFD + expirationBR;
+		V.NPCSlaves -= expirationNPC;
+		V.menials -= expirationPC;
+		V.fuckdolls -= expirationFD;
+		V.menialBioreactors -= expirationBR;
+		if (expiration > 0) {
+			if (expirationFS <= 0.5) {
+				r.push(`<span class="red">${capFirstChar(numberWithPluralOne(expiration, "slave"))} passed away</span> due to natural causes.`);
 			} else {
-				r.push(`<span class="red">${capFirstChar(numberWithPluralOne(_expiration, "slave"))} died</span> due to the tough working conditions in your arcology.`);
+				r.push(`<span class="red">${capFirstChar(numberWithPluralOne(expiration, "slave"))} died</span> due to the tough working conditions in your arcology.`);
 			}
-			if (_expirationPC > 1) {
-				r.push(`Of which <span class="red">${num(_expirationPC)} were yours.</span>`);
-			} else if (_expirationPC > 0) {
+			if (expirationPC > 1) {
+				r.push(`Of which <span class="red">${num(expirationPC)} were yours.</span>`);
+			} else if (expirationPC > 0) {
 				r.push(`<span class="red">One of them was yours.</span>`);
 			}
 		}
@@ -1892,26 +1892,26 @@ App.EndWeek.arcManagement = function() {
 		/* increases lowerclass attraction based on number of dense apartments */
 		let el = new DocumentFragment();
 		let r = [];
-		let _count = 0;
+		let count = 0;
 		V.building.findCells(cell => !(cell instanceof App.Arcology.Cell.Penthouse))
 			.forEach(cell => {
 				if (cell instanceof App.Arcology.Cell.Apartment) {
 					if (cell.type === 3) {
-						_count += 1;
-						_lowerClass += 40;
+						count += 1;
+						lowerClass += 40;
 					}
 				}
 			});
-		if (_count > 9) {
+		if (count > 9) {
 			r.push(App.UI.DOM.makeElement("span", `A great amount of lower class citizens`, "green"));
 			r.push(`were attracted by the sectors filled with dense apartments.`);
-		} else if (_count > 5) {
+		} else if (count > 5) {
 			r.push(App.UI.DOM.makeElement("span", `A large amount of lower class citizens`, "green"));
 			r.push(`were attracted by your sprawling blocks of dense apartments.`);
-		} else if (_count > 2) {
+		} else if (count > 2) {
 			r.push(App.UI.DOM.makeElement("span", `A moderate amount of lower class citizens`, "green"));
 			r.push(`were attracted by your dense apartment complexes`);
-		} else if (_count > 0) {
+		} else if (count > 0) {
 			r.push(App.UI.DOM.makeElement("span", `A small amount of lower class citizens`, "green"));
 			r.push(`were attracted by your dense apartments.`);
 		}
@@ -1922,28 +1922,28 @@ App.EndWeek.arcManagement = function() {
 	function getBanishRatio() {
 		/* Some proportion of newly-enslaved citizens might instead be banished, if you don't keep old menials.
 		 * This should probably use an actuarial age distribution instead of this piecewise function. */
-		let _banishedRatio = 0.0;
+		let banishedRatio = 0.0;
 		if (V.policies.retirement.menial2Citizen === 1) {
 			if (V.customMenialRetirementAge >= 65) {
-				_banishedRatio = 0.475 - Math.clamp(V.customMenialRetirementAge / 200, 0.325, 0.475);
+				banishedRatio = 0.475 - Math.clamp(V.customMenialRetirementAge / 200, 0.325, 0.475);
 			} else {
-				_banishedRatio = 0.9 - Math.clamp(V.customMenialRetirementAge / 100, 0.2, 0.65);
+				banishedRatio = 0.9 - Math.clamp(V.customMenialRetirementAge / 100, 0.2, 0.65);
 			}
 			if (V.arcologies[0].FSSupremacistLawME + V.arcologies[0].FSSubjugationistLawME > 0) {
-				_banishedRatio *= 2 / 3;
+				banishedRatio *= 2 / 3;
 			}
-			_banishedRatio += 0.05; // not sure what the extra 5% is for...
+			banishedRatio += 0.05; // not sure what the extra 5% is for...
 		}
-		return _banishedRatio;
+		return banishedRatio;
 	}
 
 	function citizenToSlave() {
 		/* Citizens turning into slaves, or being banished because they can't be */
-		const _banished = Math.trunc((V.lowerClass * _welfareFS) * getBanishRatio());
-		_enslaved = Math.trunc(V.lowerClass * _welfareFS) - _banished;
-		V.lowerClass -= (_enslaved + _banished);
-		if (_banished > 0) {
-			appendDiv(`<span class="red">${_banished} citizens were banished</span> from your arcology; they committed enslavable offenses, but were too old to be enslaved.`);
+		const banished = Math.trunc((V.lowerClass * welfareFS) * getBanishRatio());
+		enslaved = Math.trunc(V.lowerClass * welfareFS) - banished;
+		V.lowerClass -= (enslaved + banished);
+		if (banished > 0) {
+			appendDiv(`<span class="red">${banished} citizens were banished</span> from your arcology; they committed enslavable offenses, but were too old to be enslaved.`);
 		}
 	}
 
diff --git a/src/endWeek/economics/corporationDevelopments.js b/src/endWeek/economics/corporationDevelopments.js
index 39916afcea47616c3078e697f7906710435c6ff0..6838a3b77c91b83dde123b062eb9b3a422d52bf2 100644
--- a/src/endWeek/economics/corporationDevelopments.js
+++ b/src/endWeek/economics/corporationDevelopments.js
@@ -9,52 +9,53 @@ App.EndWeek.corporationDevelopments = function() {
 	App.UI.DOM.appendNewElement("h1", el, "Corporation Management");
 	App.UI.DOM.appendNewElement("h2", el, "Operational Results");
 	/* Divisions doing their thing*/
-	const _weekLedger = App.Corporate.endWeek();
-	for (const i in _weekLedger.divisionLedgers) {
-		const _d = _weekLedger.divisionLedgers[i];
-		const _div = _d.division;
+	const weekLedger = App.Corporate.endWeek();
+	for (const i in weekLedger.divisionLedgers) {
+		const d = weekLedger.divisionLedgers[i];
+		const division = d.division;
 		let r;
 		/* Reporting on number of slaves being processed or completed processing */
-		App.Events.addNode(el, [`${_div.name}: The division ${_div.message_endWeek_Slaves(_d)}`], "div");
+		App.UI.DOM.appendNewElement("h3", el, division.name);
+		App.Events.addNode(el, [`The division ${division.message_endWeek_Slaves(d)}`], "div");
 
 		r = [];
-		if (_d.market.originalBuy != null) {
-			if (_d.market.buy === 0) {
-				r.push(`It couldn't purchase ${numberWithPlural(_d.market.originalBuy, "slave")} to replenish its stock from the market because it couldn't afford to purchase price.`);
+		if (d.market.originalBuy != null) {
+			if (d.market.buy === 0) {
+				r.push(`It couldn't purchase ${numberWithPlural(d.market.originalBuy, "slave")} to replenish its stock from the market because it couldn't afford to purchase price.`);
 			} else {
-				r.push(`It needed to replenish its slave stock of ${numberWithPlural(_d.market.originalBuy, "slave")}, but couldn't afford to buy all of them. It bought ${numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket)} for ${cashFormatColor(_d.market.finalPurchase, true)}.`);
+				r.push(`It needed to replenish its slave stock of ${numberWithPlural(d.market.originalBuy, "slave")}, but couldn't afford to buy all of them. It bought ${numberWithPlural(d.market.buy, division.nounSlaveFromMarket)} for ${cashFormatColor(d.market.finalPurchase, true)}.`);
 			}
-		} else if (_d.market.buy > 0) {
-			r.push(`It replenished its slave stock and bought ${numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket)} from the market for ${cashFormatColor(_d.market.finalPurchase, true)}.`);
+		} else if (d.market.buy > 0) {
+			r.push(`It replenished its slave stock and bought ${numberWithPlural(d.market.buy, division.nounSlaveFromMarket)} from the market for ${cashFormatColor(d.market.finalPurchase, true)}.`);
 		}
 		App.Events.addNode(el, r, "div");
 
-		if (_d.transfer.total > 0) {
-			for (const i in _d.transfer.divisions) {
-				const _nextDivLedger = _d.transfer.divisions[i];
-				const _nextDiv = _nextDivLedger.division;
-				const _slavesToNext = _nextDivLedger.fill;
-				App.Events.addNode(el, [`It moved ${numberWithPlural(_slavesToNext, "slave")} to the ${_nextDiv.name} Division.`], "div");
+		if (d.transfer.total > 0) {
+			for (const i in d.transfer.divisions) {
+				const nextDivLedger = d.transfer.divisions[i];
+				const nextDiv = nextDivLedger.division;
+				const slavesToNext = nextDivLedger.fill;
+				App.Events.addNode(el, [`It moved ${numberWithPlural(slavesToNext, "slave")} to the ${nextDiv.name} Division.`], "div");
 			}
 		}
-		if (_div.toMarket) {
+		if (division.toMarket) {
 			r = [];
-			if (_div.heldSlaves === 0) {
-				if (_d.market.sell > 0) {
-					r.push(`It immediately sold ${numberWithPlural(_d.market.sell, _div.nounFinishedSlave)} to the market and made ${cashFormatColor(_d.market.finalSale)}.`);
+			if (division.heldSlaves === 0) {
+				if (d.market.sell > 0) {
+					r.push(`It immediately sold ${numberWithPlural(d.market.sell, division.nounFinishedSlave)} to the market and made ${cashFormatColor(d.market.finalSale)}.`);
 				}
 			} else {
-				r.push(`It holds <span class="positive">${numberWithPlural(_div.heldSlaves, _div.nounFinishedSlave)}</span> at the end of the`);
-				if (_d.market.sell > 0) {
-					r.push(`week, but it ran out of storage space and had to sell <span class="red">${numberWithPlural(_d.market.sell, "slave")}</span> and made ${cashFormatColor(_d.market.finalSale)}.`);
+				r.push(`It holds <span class="positive">${numberWithPlural(division.heldSlaves, division.nounFinishedSlave)}</span> at the end of the`);
+				if (d.market.sell > 0) {
+					r.push(`week, but it ran out of storage space and had to sell <span class="red">${numberWithPlural(d.market.sell, "slave")}</span> and made ${cashFormatColor(d.market.finalSale)}.`);
 				} else {
 					r.push(`week.`);
 				}
 			}
 			App.Events.addNode(el, r, "div");
 		}
-		if (_d.revenue.value > 0) {
-			App.Events.addNode(el, [`It earned ${cashFormatColor(_d.revenue.value)} in revenue.`], "div");
+		if (d.revenue.value > 0) {
+			App.Events.addNode(el, [`It earned ${cashFormatColor(d.revenue.value)} in revenue.`], "div");
 		}
 	}
 
@@ -62,12 +63,12 @@ App.EndWeek.corporationDevelopments = function() {
 	el.append(App.Corporate.writeLedger(App.Corporate.ledger.current, V.week));
 
 	/* Division Expansion Tokens*/
-	if (_weekLedger.canExpandNow) {
+	if (weekLedger.canExpandNow) {
 		App.UI.DOM.appendNewElement("div", el, "Your corporation is ready to start an additional division!", "majorText");
 	}
 
 	/* Specializations tokens*/
-	if (_weekLedger.canSpecializeNow) {
+	if (weekLedger.canSpecializeNow) {
 		App.UI.DOM.appendNewElement("div", el, "Your corporation is ready to specialize its slaves further!", "majorText");
 	}
 
@@ -86,20 +87,20 @@ App.EndWeek.corporationDevelopments = function() {
 
 	if (App.Corporate.dividend > 0) {
 		r = [];
-		if (_weekLedger.hasDividend) {
-			r.push(`It reserved ${cashFormatColor(_weekLedger.dividend)} this week.`);
+		if (weekLedger.hasDividend) {
+			r.push(`It reserved ${cashFormatColor(weekLedger.dividend)} this week.`);
 		}
 		r.push(`A total of ${cashFormatColor(App.Corporate.dividend)} has been put aside for its shareholders.`);
 		App.Events.addNode(el, r, "div");
 	}
 
-	if (_weekLedger.hasPayout) {
-		App.Events.addNode(el, [`This week the dividends were paid out, you received ${cashFormatColor(_weekLedger.payout)}.`], "div");
+	if (weekLedger.hasPayout) {
+		App.Events.addNode(el, [`This week the dividends were paid out, you received ${cashFormatColor(weekLedger.payout)}.`], "div");
 	}
 
 	/* Bankrupted the Corporation*/
 	if (App.Corporate.value < 0) {
-		App.Corporation.Dissolve();
+		App.Corporate.dissolve();
 		App.UI.DOM.appendNewElement("div", el, "Your corporation went bankrupt.", "red");
 	}
 	/* This needs to be at the very end of the financials*/
diff --git a/src/endWeek/economics/neighborsDevelopment.js b/src/endWeek/economics/neighborsDevelopment.js
index 00da298345c76a57338c7bd02600d0abf81e9048..ea9b60c11841df8f52ea0e3f1aaf8c52160ce126 100644
--- a/src/endWeek/economics/neighborsDevelopment.js
+++ b/src/endWeek/economics/neighborsDevelopment.js
@@ -1718,15 +1718,15 @@ App.EndWeek.neighborsDevelopment = function() {
 								adoptRivalFS("FSPetiteAdmiration");
 								return;
 							case "Slimness Enthusiasm":
-								r.push(`${desc} loves boobs, the bigger, the better, leading the arcology to <span class="yellow">adopt Asset Expansionism.</span>`);
+								r.push(`${desc} obsessed with boobs, the bigger, the better, leading the arcology to <span class="yellow">adopt Asset Expansionism.</span>`);
 								adoptRivalFS("FSAssetExpansionist");
 								return;
 							case "Asset Expansionism":
-								r.push(`${desc} loves a slim slave with tight holes, leading the arcology to <span class="yellow">adopt Slimness Enthusiasm.</span>`);
+								r.push(`${desc} partial to a slim slave with tight holes, leading the arcology to <span class="yellow">adopt Slimness Enthusiasm.</span>`);
 								adoptRivalFS("FSSlimnessEnthusiast");
 								return;
 							case "Pastoralism":
-								r.push(`${desc} loves cum, leading the arcology to <span class="yellow">adopt Cummunism.</span>`);
+								r.push(`${desc} obsessed with cum, leading the arcology to <span class="yellow">adopt Cummunism.</span>`);
 								adoptRivalFS("FSCummunism");
 								return;
 							case "Cummunism":
@@ -1888,13 +1888,13 @@ App.EndWeek.neighborsDevelopment = function() {
 						}
 						if (V.arcologies[0].FSSlimnessEnthusiast > random(5, 60)) {
 							if (validFSes.includes("FSAssetExpansionist")) {
-								r.push(`${desc} loves boobs, the bigger, the better, leading the arcology to <span class="yellow">adopt Asset Expansionism.</span>`);
+								r.push(`${desc} obsessed with boobs, the bigger, the better, leading the arcology to <span class="yellow">adopt Asset Expansionism.</span>`);
 								arc.FSAssetExpansionist = 5;
 								return;
 							}
 						} else if (V.arcologies[0].FSAssetExpansionist > random(5, 60)) {
 							if (validFSes.includes("FSSlimnessEnthusiast")) {
-								r.push(`${desc} loves a slim slave with tight holes, leading the arcology to <span class="yellow">adopt Slimness Enthusiasm.</span>`);
+								r.push(`${desc} partial to a slim slave with tight holes, leading the arcology to <span class="yellow">adopt Slimness Enthusiasm.</span>`);
 								arc.FSSlimnessEnthusiast = 5;
 								return;
 							}
diff --git a/src/endWeek/economics/personalNotes.js b/src/endWeek/economics/personalNotes.js
index 08a9bea9f6a532bfd78b2f4a358d1e3768a84f4c..cfe1d1cf05574914c7ab4b2d6154a84186e72067 100644
--- a/src/endWeek/economics/personalNotes.js
+++ b/src/endWeek/economics/personalNotes.js
@@ -97,7 +97,7 @@ App.EndWeek.personalNotes = function() {
 			}
 		}
 		if (V.PC.preg >= V.PC.pregData.normalBirth / 4) {
-			const gigantomastiaMod = V.PC.geneticQuirks.gigantomastia === 2 ? (V.PC.geneticQuirks.macromastia === 2 ? 3 : 2) : 1;
+			const gigantomastiaMod = V.PC.geneticQuirks.gigantomastia === 2 ? (V.PC.geneticQuirks.macromastia === 2 ? 3 : 2) : 1; // TODO: 'gigantomastiaMod' is assigned a value but never used
 			/* trim this down */
 			let boobTarget;
 			if (V.PC.geneMods.NCS === 1) {
@@ -302,7 +302,7 @@ App.EndWeek.personalNotes = function() {
 				if (V.PC.pregAdaptation < 500) {
 					miscarriageChance = -10;
 					miscarriageChance += ((V.PC.bellyPreg / 1000) - V.PC.pregAdaptation);
-					r.push(` // this could use to not be linear`);
+					// this could use to not be linear
 					if (V.PC.inflation > 0) {
 						miscarriageChance += 10;
 					}
@@ -423,12 +423,12 @@ App.EndWeek.personalNotes = function() {
 				}
 				if (V.seeExtreme === 1) {
 					if (miscarriage !== 1 && V.PC.bellyPreg >= 100000 && V.PC.geneMods.rapidCellGrowth !== 1) {
-						r.push(` // If ${he} can't relieve the pressure that way, will ${he} hold?`);
+						// If he can't relieve the pressure that way, will he hold?
 						if (V.PC.bellyPreg >= 500000 || V.PC.wombImplant !== "restraint") {
 							if ((V.PC.belly > (V.PC.pregAdaptation * 3200)) || V.PC.bellyPreg >= 500000) {
 								burstChance = -80;
 								burstChance += ((V.PC.belly / 1000) - V.PC.pregAdaptation);
-								r.push(` // this could use to not be linear`);
+								// this could use to not be linear
 								if (V.PC.health.health < -20) {
 									burstChance -= (V.PC.health.health);
 								} else if (V.PC.health.health > 80) {
diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js
index c1d2254ba2b12a865f0957668092498078968107..959245f7f432d31f0c6b53c327e3844d9fa030ed 100644
--- a/src/endWeek/economics/reputation.js
+++ b/src/endWeek/economics/reputation.js
@@ -4,7 +4,7 @@
 App.EndWeek.reputation = function() {
 	const el = document.createElement("p");
 	let r = [];
-	let _repLoss;
+	let repLoss;
 
 	if (V.useTabs === 0) {
 		App.UI.DOM.appendNewElement("h2", el, `Reputation`);
@@ -49,101 +49,101 @@ App.EndWeek.reputation = function() {
 		}
 	}
 
-	let _repDecay = 0.05;
-	let _enduringRep = V.enduringRep;
+	let repDecay = 0.05;
+	let enduringRep = V.enduringRep;
 	if (V.arcologies[0].FSChattelReligionistLaw === 1) {
-		_enduringRep = Math.min(_enduringRep + 2000, 12000);
+		enduringRep = Math.min(enduringRep + 2000, 12000);
 	}
 	if (V.arcologies[0].FSRestartDecoration === 100) {
-		_enduringRep = Math.min(_enduringRep + 2000, 13000);
+		enduringRep = Math.min(enduringRep + 2000, 13000);
 		/* that 13000 is not a typo, it allows for some stacking of FSRestart and FSChattel */
 	}
-	if (V.rep > _enduringRep) {
+	if (V.rep > enduringRep) {
 		if (V.arcologies[0].FSMaturityPreferentialistLaw === 1) {
 			if (V.PC.actualAge >= 65) {
 				r.push(`Since you're getting on in years and have an impressive list of accomplishments, and ${V.arcologies[0].name}'s society respects age, your reputation degrades quite slowly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay - 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay - 0.0125));
 			} else if (V.PC.actualAge >= 50) {
 				r.push(`Since you're well into middle age and have an impressive list of accomplishments, and ${V.arcologies[0].name}'s society respects age, your reputation degrades quite slowly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay - 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay - 0.0125));
 			} else if (V.PC.actualAge < 35) {
 				r.push(`Since you're unusually young for an arcology owner, and ${V.arcologies[0].name}'s society respects age, your reputation degrades quite quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay + 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay + 0.0125));
 			} else {
 				r.push(`Since you're only entering middle age, and ${V.arcologies[0].name}'s society respects age, your reputation degrades fairly quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay));
 			}
 		} else if (V.arcologies[0].FSYouthPreferentialistLaw === 1) {
 			if (V.PC.actualAge >= 65) {
 				r.push(`Since you're getting on in years and have an impressive list of accomplishments, but ${V.arcologies[0].name}'s society is coming to prefer youth to experience, so your reputation degrades fairly quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay + 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay + 0.0125));
 			} else if (V.PC.actualAge >= 50) {
 				r.push(`You're well into middle age and have an impressive list of accomplishments, but ${V.arcologies[0].name}'s society is coming to prefer youth to experience, so your reputation degrades fairly quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay + 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay + 0.0125));
 			} else if (V.PC.actualAge < 35) {
 				r.push(`You're unusually young for an arcology owner, but ${V.arcologies[0].name}'s society doesn't mind.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay));
 			} else {
 				r.push(`Since you're entering middle age, and ${V.arcologies[0].name}'s society respects youth, your reputation degrades fairly quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay + 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay + 0.0125));
 			}
 		} else {
 			if (V.PC.actualAge >= 65) {
 				r.push(`Since you're getting on in years and have an impressive list of accomplishments, and ${V.arcologies[0].name}'s society respects age, your reputation degrades quite slowly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay - 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay - 0.0125));
 			} else if (V.PC.actualAge >= 50) {
 				r.push(`Since you're well into middle age and have an impressive list of accomplishments, your reputation degrades fairly slowly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay - 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay - 0.0125));
 			} else if (V.PC.actualAge < 35) {
 				r.push(`Since you're unusually young for an arcology owner, your reputation degrades fairly quickly.`);
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay + 0.0125));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay + 0.0125));
 			} else {
-				_repLoss = Math.trunc((V.rep - _enduringRep) * (_repDecay));
+				repLoss = Math.trunc((V.rep - enduringRep) * (repDecay));
 			}
 		}
 		if (V.arcologies[0].FSChattelReligionistLaw === 1) {
-			if (_repLoss > 100) {
-				_repLoss -= 100;
+			if (repLoss > 100) {
+				repLoss -= 100;
 				V.PC.degeneracy = 0;
 			} else {
-				_repLoss = 0;
+				repLoss = 0;
 				V.PC.degeneracy = 0;
 			}
 			r.push(`Since you are the Prophet, your reputation degrades less.`);
 		}
 		if (V.arcologies[0].FSRestartDecoration === 100) {
-			if (_repLoss > 100) {
-				_repLoss -= 100;
+			if (repLoss > 100) {
+				repLoss -= 100;
 				V.PC.degeneracy = 0;
 			} else {
-				_repLoss = 100;
+				repLoss = 100;
 				V.PC.degeneracy = 0;
 			}
 			r.push(`Since you are an established member of the Societal Elite, your public reputation degrades less.`);
 		}
-		if (_enduringRep > 8000) {
+		if (enduringRep > 8000) {
 			r.push(`However, you have been a figure of renown for so long that much of your reputation has become permanent.`);
-		} else if (_enduringRep > 5000) {
+		} else if (enduringRep > 5000) {
 			r.push(`However, you have been a figure of repute for enough time that part of your reputation has become permanent.`);
-		} else if (_enduringRep > 2000) {
+		} else if (enduringRep > 2000) {
 			r.push(`However, you have been a figure of regard for long enough that some of your reputation has become permanent.`);
 		}
-		if (_repLoss > 500 * (1 - (5 - V.baseDifficulty) / 10)) {
-			_repLoss = 500 * (1 - (5 - V.baseDifficulty) / 10);
-		} else if (_repLoss < 0) {
-			_repLoss = 0;
+		if (repLoss > 500 * (1 - (5 - V.baseDifficulty) / 10)) {
+			repLoss = 500 * (1 - (5 - V.baseDifficulty) / 10);
+		} else if (repLoss < 0) {
+			repLoss = 0;
 		}
-		V.enduringRep += Math.trunc(1 + Math.pow((10000 - V.enduringRep) / 5770, 2) * _repLoss * 0.1);
+		V.enduringRep += Math.trunc(1 + Math.pow((10000 - V.enduringRep) / 5770, 2) * repLoss * 0.1);
 	} else {
 		if (V.arcologies[0].FSChattelReligionistLaw === 1 || V.arcologies[0].FSRestartDecoration === 100) {
 			V.PC.degeneracy = 0;
 		}
-		_repLoss = 0;
-		if (_enduringRep > 8000) {
+		repLoss = 0;
+		if (enduringRep > 8000) {
 			r.push(`You have been a figure of renown for so long that your reputation does not decay past its present level.`);
-		} else if (_enduringRep > 5000) {
+		} else if (enduringRep > 5000) {
 			r.push(`You have been a figure of repute for enough time that your reputation does not decay past its present level.`);
-		} else if (_enduringRep > 2000) {
+		} else if (enduringRep > 2000) {
 			r.push(`You have been a figure of regard for long enough that your reputation does not decay past its present level.`);
 		}
 	}
@@ -153,7 +153,7 @@ App.EndWeek.reputation = function() {
 		V.rep += Math.abs(V.lastWeeksRepExpenses.overflow);
 		V.lastWeeksRepExpenses.overflow = 0;
 	}
-	repX(forceNeg(_repLoss), "multiplier");
+	repX(forceNeg(repLoss), "multiplier");
 
 	if (V.weatherAwareness === 0 && V.weatherCladding === 2) {
 		r.push(`The public <span class="green">is awestruck</span> by the beautiful weather hardening you have applied to the arcology's exterior, though they do not understand why you would waste so much money first ruining your arcology's appearance by doing this.`);
@@ -163,12 +163,12 @@ App.EndWeek.reputation = function() {
 		repX(-100, "architecture");
 	}
 
-	_enduringRep = V.enduringRep;
+	enduringRep = V.enduringRep;
 	if (V.arcologies[0].FSRestartDecoration === 100) {
 		r.push(`As a member of the Societal Elite, your appearance has no bearing on your reputation.`);
 	} else {
 		if (V.PC.dick === 0 && V.PC.boobs >= 300 && V.PC.title === 0) {
-			if (V.rep > 18000 - _enduringRep) {
+			if (V.rep > 18000 - enduringRep) {
 				r.push(`Your reputation is so well-established that society has accepted your notoriously feminine appearance despite how unusual it is for a prominent slaveowner to look like you do.`);
 				if (V.arcologies[0].FSGenderRadicalist > 30) {
 					r.push(`Indeed, society sees you as entirely male, since you are powerful, and <span class="green">strongly approves</span> of your nonconformity; this advances the redefinition of gender around power.`);
@@ -191,7 +191,7 @@ App.EndWeek.reputation = function() {
 				}
 			}
 		} else if ((V.PC.boobs >= 300) || V.PC.title === 0) {
-			if (V.rep > 15000 - _enduringRep) {
+			if (V.rep > 15000 - enduringRep) {
 				r.push(`Your reputation is so strong that society has accepted your feminine appearance despite how unusual it is for a prominent slaveowner to look like you do.`);
 				if (V.arcologies[0].FSGenderRadicalist > 30) {
 					r.push(`Indeed, society sees you as entirely male, since you are powerful, and <span class="green">strongly approves</span> of your nonconformity; this advances the redefinition of gender around power.`);
@@ -214,7 +214,7 @@ App.EndWeek.reputation = function() {
 				}
 			}
 		} else if ((V.PC.dick === 0) || (V.PC.vagina !== -1)) {
-			if (V.rep > 15000 - _enduringRep) {
+			if (V.rep > 15000 - enduringRep) {
 				r.push(`Your reputation is so strong that society has accepted your unorthodox arrangement downstairs, for an arcology owner.`);
 				if (V.arcologies[0].FSGenderRadicalist > 30) {
 					r.push(`Indeed, society sees you as entirely male, since you are powerful, and <span class="green">strongly approves</span> of your nonconformity; this advances the redefinition of gender around power.`);
@@ -245,7 +245,7 @@ App.EndWeek.reputation = function() {
 		/* already handled above */
 	} else if (V.arcologies[0].FSIntellectualDependency !== "unset") {
 		if (V.PC.intelligence + V.PC.intelligenceImplant < -10) {
-			if (V.rep > 18000 - _enduringRep) {
+			if (V.rep > 18000 - enduringRep) {
 				r.push(`You've somehow built such a reputation for yourself that your lack of a brain is no longer a societal concern.`);
 			} else {
 				repX(forceNeg(Math.min((V.rep * 0.025), 100)), "PCappearance");
@@ -254,7 +254,7 @@ App.EndWeek.reputation = function() {
 		}
 	} else if (V.arcologies[0].FSSlaveProfessionalism !== "unset") {
 		if (V.PC.intelligence + V.PC.intelligenceImplant < 100) {
-			if (V.rep > 18000 - _enduringRep) {
+			if (V.rep > 18000 - enduringRep) {
 				r.push(`You've built such a reputation for yourself that you not being a genius is no longer a societal concern.`);
 			} else {
 				repX(forceNeg(Math.min((V.rep * 0.05), 750)), "PCappearance");
@@ -263,14 +263,14 @@ App.EndWeek.reputation = function() {
 			}
 		}
 	} else if (V.PC.intelligence + V.PC.intelligenceImplant <= 10) {
-		if (V.rep > 18000 - _enduringRep) {
+		if (V.rep > 18000 - enduringRep) {
 			r.push(`You've managed to build such a reputation for yourself that your lack of intelligence is no longer a societal concern.`);
 		} else {
 			repX(forceNeg(Math.min((V.rep * 0.05), 750)), "PCappearance");
 			r.push(`Society <span class="red">is uncomfortable</span> being led by someone not smart. Your lack of intelligence brings your every action under scrutiny.`);
 		}
 	} else if (V.PC.intelligence + V.PC.intelligenceImplant <= 50) {
-		if (V.rep > 12000 - _enduringRep) {
+		if (V.rep > 12000 - enduringRep) {
 			r.push(`You've built such a reputation for yourself that your lack of intelligence is no longer a societal concern.`);
 		} else {
 			repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCappearance");
@@ -283,7 +283,7 @@ App.EndWeek.reputation = function() {
 			/* already handled above */
 		} else {
 			if (V.arcologies[0].FSGenderRadicalist !== "unset") {
-				if (V.rep > 18000 - _enduringRep) {
+				if (V.rep > 18000 - enduringRep) {
 					r.push(`You are so well regarded that society has acquiesced that getting penetrated is not a sure sign of femininity.`);
 				} else {
 					r.push(`Society views getting fucked as sign of femininity and is <span class="red">strongly against your sexual preferences.</span>`);
@@ -291,7 +291,7 @@ App.EndWeek.reputation = function() {
 					repX(-1000, "PCactions");
 				}
 			} else if (V.arcologies[0].FSGenderFundamentalist !== "unset" && V.PC.vagina !== -1 && V.PC.title === 0) {
-				if (V.rep > 10000 - _enduringRep) {
+				if (V.rep > 10000 - enduringRep) {
 					r.push(`Society has grown accustomed to your efforts enough to not care that you enjoy slave dick. In fact, it even <span class="green">strengthens</span> traditional gender roles, even though you insist on breaking them.`);
 					FutureSocieties.Change("Gender Fundamentalist", 1);
 				} else {
@@ -300,7 +300,7 @@ App.EndWeek.reputation = function() {
 					repX(-1000, "PCactions");
 				}
 			} else {
-				if (V.rep > 15000 - _enduringRep) {
+				if (V.rep > 15000 - enduringRep) {
 					r.push(`You are so well liked that society has accepted that you enjoy taking everything a slave has to offer.`);
 				} else {
 					r.push(`Society finds your penchant for taking slave dick <span class="red">very distasteful</span> for a slaveowner.`);
@@ -332,13 +332,13 @@ App.EndWeek.reputation = function() {
 		}
 		sfArray.push(`portion of ${V.SF.Lower} to <span class="green">undercover work, slightly boosts your reputation.</span>`);
 		App.Events.addNode(el, sfArray, "div");
-		let _value;
+		let value;
 		if (V.SF.UC.Assign === 1) {
-			_value = V.SF.ArmySize * 0.05;
+			value = V.SF.ArmySize * 0.05;
 		} else {
-			_value = V.SF.ArmySize * 0.25;
+			value = V.SF.ArmySize * 0.25;
 		}
-		repX(_value, "specialForces");
+		repX(value, "specialForces");
 	} else if (V.SF.FS.BadOutcome === "ISOLATION") {
 		r.push(App.UI.DOM.makeElement("div", `Your citizens are <span class="red">very displeased</span> that you are hosting a legion of heavily armed squatters in your basement.`));
 		repX(forceNeg(V.SF.ArmySize + App.SF.upgrades.total()), "specialForces");
@@ -351,7 +351,7 @@ App.EndWeek.reputation = function() {
 		}
 	} else if (V.arcologies[0].FSSubjugationist !== "unset") {
 		if (V.PC.race === V.arcologies[0].FSSubjugationistRace) {
-			if (V.rep > 15000 - _enduringRep) {
+			if (V.rep > 15000 - enduringRep) {
 				r.push(`Your reputation is so strong that society has accepted your ${V.PC.race}ness despite you being an inferior race.`);
 			} else {
 				r.push(`Society <span class="red">loathes;</span> being lead by an inferior ${V.PC.race}, believing that any other race would make a far better leader than you.`);
@@ -509,7 +509,7 @@ App.EndWeek.reputation = function() {
 				r.push(`penetration.`);
 			}
 			repX(10, "PCappearance");
-		} else if (V.rep < 20000 - _enduringRep) {
+		} else if (V.rep < 20000 - enduringRep) {
 			r.push(`You have carved out such a name for yourself that society has come to terms with being led by a woman with child.`);
 		} else {
 			r.push(`Most prominent female owners avoid being penetrated on`);
@@ -523,7 +523,7 @@ App.EndWeek.reputation = function() {
 		}
 	}
 
-	if ((V.PC.career === "escort" || V.PC.career === "prostitute") && V.rep < 16000 - _enduringRep) {
+	if ((V.PC.career === "escort" || V.PC.career === "prostitute") && V.rep < 16000 - enduringRep) {
 		r.push(`Society <span class="red">frowns</span> over being run by an ex-whore.`);
 		if (V.PC.career === "escort") {
 			r.push(`The presence of porn of you on the net doesn't aid your reputation either.`);
@@ -532,7 +532,7 @@ App.EndWeek.reputation = function() {
 	} else if (V.PC.career === "escort" || V.PC.career === "prostitute") {
 		r.push(`Your reputation is so strong that society has accepted your previous endeavors despite how unusual it is for a prominent slaveowner to have once nearly been a slave.`);
 	}
-	if (V.PC.career === "child prostitute" && V.rep < 22000 - _enduringRep) {
+	if (V.PC.career === "child prostitute" && V.rep < 22000 - enduringRep) {
 		r.push(`Society <span class="red">is mortified</span> over being run by a sex-addled child whore.`);
 		if (V.PC.visualAge < V.minimumSlaveAge) {
 			r.push(`The fact that you appear underage only makes the thought worse.`);
@@ -541,7 +541,7 @@ App.EndWeek.reputation = function() {
 	} else if (V.PC.career === "child prostitute") {
 		r.push(`Your reputation is so strong that society has finally accepted your previous life as a child whore.`);
 	}
-	if ((V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") && V.rep < 12000 - _enduringRep) {
+	if ((V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") && V.rep < 12000 - enduringRep) {
 		r.push(`Society <span class="red">frowns</span> over being run by an ex-`);
 		if (V.PC.title === 1) {
 			r.push(`butler,`);
@@ -553,22 +553,22 @@ App.EndWeek.reputation = function() {
 	} else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") {
 		r.push(`Your reputation is so strong that society has accepted your previous vocation despite how unusual it is for a prominent slaveowner to have once been nothing more than a lowly servant.`);
 	}
-	if (V.PC.career === "gang" && V.rep < 15000 - _enduringRep) {
+	if (V.PC.career === "gang" && V.rep < 15000 - enduringRep) {
 		r.push(`Society <span class="red">frowns</span> over being run by an ex-gang leader, no matter how strong they might have been.`);
 		repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions");
-	} else if (V.PC.career === "hoodlum" && V.rep < 16000 - _enduringRep) {
+	} else if (V.PC.career === "hoodlum" && V.rep < 16000 - enduringRep) {
 		r.push(`Society <span class="red">dislikes</span> being run by some low-life thug, no matter how much "street cred" they may have once held.`);
 		repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions");
-	} else if (V.PC.career === "street urchin" && V.rep < 20000 - _enduringRep) {
+	} else if (V.PC.career === "street urchin" && V.rep < 20000 - enduringRep) {
 		r.push(`Society <span class="red">hates</span> being run by some homeless street rat; how you even managed to get this far baffles them.`);
 		repX(forceNeg(Math.min((V.rep * 0.06), 500)), "PCactions");
-	} else if (V.PC.career === "BlackHat" && V.rep < 15000 - _enduringRep) {
+	} else if (V.PC.career === "BlackHat" && V.rep < 15000 - enduringRep) {
 		r.push(`Society <span class="red">dislikes</span> being run by someone so capable of dredging up secrets, especially when they used to do it for the highest bidder.`);
 		repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions");
-	} else if (V.PC.career === "hacker" && V.rep < 16000 - _enduringRep) {
+	} else if (V.PC.career === "hacker" && V.rep < 16000 - enduringRep) {
 		r.push(`Society <span class="red">dislikes</span> being run by someone so capable of dredging up secrets, especially when they do it for fun.`);
 		repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions");
-	} else if (V.PC.career === "script kiddy" && V.rep < 18000 - _enduringRep) {
+	} else if (V.PC.career === "script kiddy" && V.rep < 18000 - enduringRep) {
 		r.push(`Society <span class="red">dislikes</span> being run by someone with such a reckless and disruptive idea of fun.`);
 		repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions");
 	} else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin" || V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") {
@@ -661,8 +661,8 @@ App.EndWeek.reputation = function() {
 			FutureSocieties.Change("Neo-Imperialist", 2);
 		}
 	} else if (V.arcologies[0].FSEgyptianRevivalist !== "unset") {
-		const _racialVarieties = new Set(V.slaves.map((s) => s.race));
-		if (_racialVarieties.size > 4) {
+		const racialVarieties = new Set(V.slaves.map((s) => s.race));
+		if (racialVarieties.size > 4) {
 			r.push(`Society <span class="green">strongly approves</span> of how you own a cornucopia of different races, which advances the ancient Egyptian ideal of cosmopolitan sex slavery.`);
 			FutureSocieties.Change("Egyptian Revivalist", 5);
 		}
@@ -671,8 +671,8 @@ App.EndWeek.reputation = function() {
 			FutureSocieties.Change("Egyptian Revivalist", -2);
 		}
 	} else if (V.arcologies[0].FSEdoRevivalist !== "unset") {
-		const _threshold = Math.trunc(V.rep / 2000);
-		if (V.slaves.filter(s => [Job.CLUB, Job.DJ, Job.PUBLIC].includes(s.assignment) || (s.assignment === Job.RECRUITER && V.recruiterTarget === "other arcologies" && V.arcologies[0].influenceTarget !== -1)).length <= _threshold) {
+		const threshold = Math.trunc(V.rep / 2000);
+		if (V.slaves.filter(s => [Job.CLUB, Job.DJ, Job.PUBLIC].includes(s.assignment) || (s.assignment === Job.RECRUITER && V.recruiterTarget === "other arcologies" && V.arcologies[0].influenceTarget !== -1)).length <= threshold) {
 			r.push(`Society <span class="red">disapproves</span> of your failure to provide for cultural development by offering public servants or club slaves in a number that befits your reputation.`);
 			FutureSocieties.Change("Edo Revivalist", -2);
 		} else {
@@ -723,25 +723,25 @@ App.EndWeek.reputation = function() {
 		}
 	}
 
-	let _noEugenics;
-	let _yesEugenics;
+	let noEugenics;
+	let yesEugenics;
 	if (V.arcologies[0].FSRepopulationFocus !== "unset") {
 		if (policies.countEugenicsSMRs() > 0) {
 			r.push(`Society <span class="red">disapproves</span> of your policies sterilizing potential mothers. Your insistence on eugenics hinders adoption of your new society.`);
-			_noEugenics = -1 * policies.countEugenicsSMRs();
-			FutureSocieties.Change("Repopulationist", _noEugenics);
+			noEugenics = -1 * policies.countEugenicsSMRs();
+			FutureSocieties.Change("Repopulationist", noEugenics);
 		}
 	} else if (V.arcologies[0].FSPaternalist !== "unset") {
 		if (policies.countEugenicsSMRs() > 0) {
 			r.push(`Society <span class="red">disapproves</span> of your policies forcefully sterilizing slaves, especially when they snuff out the life growing within them.`);
-			_noEugenics = -1 * policies.countEugenicsSMRs();
-			FutureSocieties.Change("Paternalist", _noEugenics);
+			noEugenics = -1 * policies.countEugenicsSMRs();
+			FutureSocieties.Change("Paternalist", noEugenics);
 		}
 	} else if ((V.arcologies[0].FSRestart !== "unset") && V.arcologies[0].FSPaternalist === "unset") {
 		if (policies.countEugenicsSMRs() > 0 && V.arcologies[0].FSRestartSMR !== 1) {
 			r.push(`Society <span class="green"> approves</span> of your slave eugenics policies, easing them into more thorough eugenics.`);
-			_yesEugenics = policies.countEugenicsSMRs();
-			FutureSocieties.Change("Eugenics", _yesEugenics);
+			yesEugenics = policies.countEugenicsSMRs();
+			FutureSocieties.Change("Eugenics", yesEugenics);
 			V.failedElite -= (1 * policies.countEugenicsSMRs());
 		} else if (V.arcologies[0].FSRestartSMR === 1) {
 			V.failedElite -= (2 * policies.countEugenicsSMRs());
@@ -817,20 +817,20 @@ App.EndWeek.reputation = function() {
 		r.push(`your support for marriage between citizens and slaves.`);
 	}
 
-	let _care;
+	let care;
 	if (V.citizenOrphanageTotal > 0) {
 		if (V.arcologies[0].FSPaternalist !== "unset") {
 			r.push(`The public <span class="green">approves</span> of the way you're providing for ${V.citizenOrphanageTotal} of your slaves' children to be raised as citizens.`);
 			FutureSocieties.Change("Paternalist", V.citizenOrphanageTotal);
 			if (V.privateOrphanageTotal > 0) {
 				r.push(`Raising ${num(V.privateOrphanageTotal)} of your slaves' children privately is considered even more <span class="green">impressive.</span>`);
-				_care = V.privateOrphanageTotal * 2;
-				FutureSocieties.Change("Paternalist", _care);
+				care = V.privateOrphanageTotal * 2;
+				FutureSocieties.Change("Paternalist", care);
 			}
 		} else if (V.arcologies[0].FSDegradationist !== "unset") {
 			r.push(`The public <span class="red">disapproves</span> of the way you're providing for ${V.citizenOrphanageTotal} of your slaves' children to be raised as citizens.`);
-			_care = -V.citizenOrphanageTotal;
-			FutureSocieties.Change("Degradationist", _care);
+			care = -V.citizenOrphanageTotal;
+			FutureSocieties.Change("Degradationist", care);
 			if (V.privateOrphanageTotal > 0) {
 				r.push(`Fortunately your raising slaves' children privately is not publicly known.`);
 			}
@@ -838,16 +838,16 @@ App.EndWeek.reputation = function() {
 	} else if (V.privateOrphanageTotal > 0) {
 		if (V.arcologies[0].FSPaternalist !== "unset") {
 			r.push(`Raising ${num(V.privateOrphanageTotal)} of your slaves' children privately is considered extremely <span class="green">impressive.</span>`);
-			_care = V.privateOrphanageTotal * 2;
-			FutureSocieties.Change("Paternalist", _care);
+			care = V.privateOrphanageTotal * 2;
+			FutureSocieties.Change("Paternalist", care);
 		} else if (V.arcologies[0].FSDegradationist !== "unset") {
 			r.push(`Fortunately your raising slaves' children privately is not publicly known.`);
 		}
 	}
 	if (V.breederOrphanageTotal > 0 && V.arcologies[0].FSRepopulationFocus !== "unset") {
 		r.push(`The public <span class="green">approves</span> of the way you've dedicated ${num(V.breederOrphanageTotal)} of your slaves' children to be raised into future breeders.`);
-		const _futureBreeders = Math.round(((V.breederOrphanageTotal / 100) + 1));
-		FutureSocieties.Change("Repopulationist", _futureBreeders);
+		const futureBreeders = Math.round(((V.breederOrphanageTotal / 100) + 1));
+		FutureSocieties.Change("Repopulationist", futureBreeders);
 	}
 
 	if (V.arcologies[0].FSNull !== "unset") {
@@ -911,11 +911,11 @@ App.EndWeek.reputation = function() {
 
 	App.Events.addParagraph(el, r);
 	r = [];
-	const _repGain = hashSum(V.lastWeeksRepIncome);
-	_repLoss = hashSum(V.lastWeeksRepExpenses);
-	if (_repGain > _repLoss) {
+	const repGain = hashSum(V.lastWeeksRepIncome);
+	repLoss = hashSum(V.lastWeeksRepExpenses);
+	if (repGain > repLoss) {
 		r.push(App.UI.DOM.makeElement("span", `Your reputation increased this week.`, "green"));
-	} else if (_repGain < _repLoss) {
+	} else if (repGain < repLoss) {
 		r.push(App.UI.DOM.makeElement("span", `Your reputation decreased this week.`, "red"));
 	}
 
diff --git a/src/endWeek/events/death.js b/src/endWeek/events/death.js
index 6b3b124ebca49d457e7791ed16366f5a78e7b038..af9ed44407ac26922287ba547ee413ace92d2c6b 100644
--- a/src/endWeek/events/death.js
+++ b/src/endWeek/events/death.js
@@ -18,6 +18,11 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 	}
 
 	execute(node) {
+		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(V.slaveDeath.keys(), 0, 0) : null;
+		if (artRenderer) {
+			node.append(artRenderer.writePreamble());
+		}
+
 		for (const [id, deathType] of V.slaveDeath) {
 			const deceased = getSlave(id);
 			if (deceased) {
@@ -47,8 +52,8 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 				He, His,
 				he, his
 			} = getPronouns(slave);
-			if (V.seeImages) {
-				App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]);
+			if (artRenderer) {
+				App.UI.DOM.appendNewElement("div", el, artRenderer.render(slave), ["imageRef", "tinyImg"]);
 			}
 
 			switch (deathType) {
diff --git a/src/endWeek/events/expire.js b/src/endWeek/events/expire.js
index ef2c58d67e0c57c02360a89d682b964f7e396a43..a1112621ee7c9538c470959abe9f353b20fbe4a3 100644
--- a/src/endWeek/events/expire.js
+++ b/src/endWeek/events/expire.js
@@ -11,8 +11,13 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 
 	execute(node) {
 		V.encyclopedia = "Indentured Servants";
-		const _this = this;
-		for (const id of _this.actors) {
+		const that = this;
+		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(that.actors, 0, 0) : null;
+		if (artRenderer) {
+			node.append(artRenderer.writePreamble());
+		}
+
+		for (const id of that.actors) {
 			const slave = getSlave(id);
 			if (slave) {
 				App.UI.DOM.appendNewElement("div", node, expire(slave));
@@ -20,7 +25,7 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 			}
 		}
 		V.passageSwitchHandler = () => {
-			for (const slaveID of _this.actors) {
+			for (const slaveID of that.actors) {
 				if (getSlave(slaveID)) {
 					removeSlave(getSlave(slaveID));
 				}
@@ -45,21 +50,21 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 				he, his, him, himself, woman
 			} = getPronouns(slave);
 			const {title: Master} = getEnunciation(slave);
-			if (V.seeImages) {
-				App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]);
+			if (artRenderer) {
+				App.UI.DOM.appendNewElement("div", el, artRenderer.render(slave), ["imageRef", "tinyImg"]);
 			}
 
 			r.push(`${slave.slaveName}'s indentured servitude is ending this week, meaning that your arcology is gaining a citizen.`);
 			V.lowerClass += 1;
 
-			let _seed = 0;
-			for (let _seeXp = 0; _seeXp < V.slaves.length; _seeXp++) {
-				if (V.slaves[_seeXp].devotion <= 20) {
-					_seed = 1;
-					V.slaves[_seeXp].devotion -= 1;
+			let seed = 0;
+			for (let seeXp = 0; seeXp < V.slaves.length; seeXp++) {
+				if (V.slaves[seeXp].devotion <= 20) {
+					seed = 1;
+					V.slaves[seeXp].devotion -= 1;
 				}
 			}
-			if (_seed === 1) {
+			if (seed === 1) {
 				r.push(`Those of your slaves who are unhappy with their lives under you are <span class="mediumorchid">envious or angry</span> to see ${him} become free, according to their individual natures.`);
 			}
 
@@ -67,7 +72,7 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 			const result = App.UI.DOM.appendNewElement("div", el);
 
 			slave.indenture = 52;
-			let _slaveCost = slaveCost(slave);
+			let cost = slaveCost(slave);
 
 			if (slave.fetish === "mindbroken") {
 				r.push(`Since ${he} is mindbroken, there is precisely no chance that ${he} will be able to look after ${himself}. ${He}`);
@@ -149,8 +154,8 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 					App.UI.DOM.appendNewElement("div", result, `You cannot afford to do this`, "note");
 				}
 			} else if ((slave.devotion > 50) && (slave.trust > 50)) {
-				_slaveCost = Math.trunc((_slaveCost * 0.5) / 500) * 500;
-				_slaveCost = Math.clamp(_slaveCost, minimumSlaveCost(), 100000);
+				cost = Math.trunc((cost * 0.5) / 500) * 500;
+				cost = Math.clamp(cost, minimumSlaveCost(), 100000);
 
 				r.push(`${His} feelings on this are quite mixed, since ${he} has come to feel that ${he} has a place under you.`);
 				if (!hasAnyLegs(slave)) {
@@ -167,16 +172,16 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 					r.push(Spoken(slave, `"I don't mind being your slave. Could I — would you please give me another indenture? I'm, um, not too worried about the price."`));
 				}
 
-				if (V.cash > _slaveCost) {
+				if (V.cash > cost) {
 					App.UI.DOM.appendNewElement("div", result, App.UI.DOM.link(
 						`Offer ${him} a one year supplementary indenture`,
 						() => {
-							keepSlave(_slaveCost);
+							keepSlave(cost);
 							jQuery(result).empty().append(`${He} smiles almost shyly when you offer ${him} a one year supplementary indenture. The price is reasonable, but definitely favorable to you. ${He} accepts it anyway, and you transfer the money into an escrow account to be held for ${him} until ${his} new indenture is done. Your sex slave once again, ${he} awaits your pleasure without a hint of fear.`);
 						},
 						[],
 						"",
-						`This costs ${cashFormat(_slaveCost)}`
+						`This costs ${cashFormat(cost)}`
 					));
 				} else {
 					App.UI.DOM.appendNewElement("div", result, `You cannot afford to do this`, "note");
@@ -190,16 +195,16 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 				}
 				r.push(`at the moment of ${his} scheduled emancipation, ${he} seems willing to consider a short term continuation of service.`);
 
-				if (V.cash > _slaveCost) {
+				if (V.cash > cost) {
 					App.UI.DOM.appendNewElement("div", result, App.UI.DOM.link(
 						`Offer ${him} a one year supplementary indenture`,
 						() => {
-							keepSlave(_slaveCost);
+							keepSlave(cost);
 							jQuery(result).empty().append(`${He} looks pensive when you offer ${him} a one year supplementary indenture. The price reflects the market, and is a reasonable compensation for a year of sexual slavery. ${He} accepts it after some consideration, and you transfer the money into an escrow account to be held for ${him} until ${his} new indenture is done. Your sex slave once again, ${he} awaits orders with complacency.`);
 						},
 						[],
 						"",
-						`This costs ${cashFormat(_slaveCost)}`
+						`This costs ${cashFormat(cost)}`
 					));
 				} else {
 					App.UI.DOM.appendNewElement("div", result, `You cannot afford to do this`, "note");
@@ -225,7 +230,7 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 
 			function keepSlave(cost) {
 				cashX(forceNeg(cost), "slaveTransfer", slave);
-				_this.actors.delete(slave.ID);
+				that.actors.delete(slave.ID);
 				V.lowerClass -= 1;
 			}
 		}
diff --git a/src/endWeek/events/retire.js b/src/endWeek/events/retire.js
index ccaaf57d8f2641c55667d29c1f7dc03594b63f61..41b32b55a352db6041f66dde671404c02a0142e6 100644
--- a/src/endWeek/events/retire.js
+++ b/src/endWeek/events/retire.js
@@ -10,6 +10,11 @@ App.Events.SERetire = class SERetire extends App.Events.BaseEvent {
 	}
 
 	execute(node) {
+		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null;
+		if (artRenderer) {
+			node.append(artRenderer.writePreamble());
+		}
+
 		for (const id of this.actors) {
 			const slave = getSlave(id);
 			if (slave) {
@@ -27,10 +32,10 @@ App.Events.SERetire = class SERetire extends App.Events.BaseEvent {
 };
 
 /**
- *
  * @param {App.Entity.SlaveState} originalSlave
+ * @param {App.Art.SlaveArtBatch} [artRenderer]
  */
-globalThis.retireScene = function(originalSlave) {
+globalThis.retireScene = function(originalSlave, artRenderer) {
 	const el = new DocumentFragment();
 	const slave = clone(originalSlave);
 	removeSlave(originalSlave);
@@ -40,7 +45,11 @@ globalThis.retireScene = function(originalSlave) {
 		he, his, him, himself, wife, woman, girl
 	} = getPronouns(slave);
 	const {title: Master} = getEnunciation(slave);
-	let his2, He2, he2, him2, girl2;
+	let his2;
+	let He2;
+	let he2;
+	let him2;
+	let girl2;
 	const lover = slave.relationship > 3 ? getSlave(slave.relationshipTarget) : null;
 	if (lover) {
 		({
@@ -49,7 +58,7 @@ globalThis.retireScene = function(originalSlave) {
 	}
 
 	const {heU, hisU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
-	const art = (V.seeImages) ? App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]) : document.createElement("div");
+	const art = (V.seeImages) ? App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer) : document.createElement("div");
 
 	const desc = App.UI.DOM.appendNewElement("div", el);
 	const result = App.UI.DOM.appendNewElement("div", el);
@@ -113,10 +122,10 @@ globalThis.retireScene = function(originalSlave) {
 				r.push(`${His} annuity means that ${he} doesn't have to work, but ${he}'s inclined to do so. ${His} skills command reasonable wages in the slave training field, and between those prospects and ${his} annuity, ${he} stands to become wealthy.`);
 			}
 		} else if (slave.porn.prestigeDesc && slave.porn.prestigeDesc.includes("is world famous for")) {
-			let _pornFame = slave.porn.prestigeDesc;
-			_pornFame = _pornFame.replace("$He is world famous for $his career in slave pornography. Millions are intimately familiar with", "enjoy");
-			_pornFame = _pornFame.replace(".", ",");
-			r.push(`In addition to ${his} annuity, you've laid the groundwork for ${him} to become wealthy by the way you publicized pornography of ${him}. Many thousands of people across the world are willing to pay to${_pornFame} and they enjoy it in part because ${he} doesn't mind it, either. ${He}'s in a position to make great money for doing on camera what ${he} would probably do anyway.`);
+			let pornFame = slave.porn.prestigeDesc;
+			pornFame = pornFame.replace("$He is world famous for $his career in slave pornography. Millions are intimately familiar with", "enjoy");
+			pornFame = pornFame.replace(".", ",");
+			r.push(`In addition to ${his} annuity, you've laid the groundwork for ${him} to become wealthy by the way you publicized pornography of ${him}. Many thousands of people across the world are willing to pay to ${pornFame} and they enjoy it in part because ${he} doesn't mind it, either. ${He}'s in a position to make great money for doing on camera what ${he} would probably do anyway.`);
 		} else if ((slave.intelligence + slave.intelligenceImplant >= -50) && (slave.muscles > 5) && (slave.skill.combat >= 1) && hasAllLimbs(slave) && (slave.face > 10)) {
 			r.push(`${He}'s pretty and deadly. If ${he} feels ${he} prefers wealth and danger to living on ${his} annuity, ${he}'ll have no trouble finding work. In fact, ${he}'ll likely have trouble sifting through all the mercenary organizations, businesses in need of attractive and competent guards for public spaces, and citizens looking for effective bodyguards willing to hire ${him}.`);
 		} else if ((slave.intelligence + slave.intelligenceImplant > 50) && (slave.intelligenceImplant >= 15)) {
diff --git a/src/endWeek/healthFunctions.js b/src/endWeek/healthFunctions.js
index cbd9f697a2c08e616ab405e8a6e0a606777becf9..e654b0044c79a6630cd8ac97d28136acc0692ffb 100644
--- a/src/endWeek/healthFunctions.js
+++ b/src/endWeek/healthFunctions.js
@@ -81,7 +81,7 @@ globalThis.illness = function(slave) {
 		assignBonus += 40;
 	} else if (slave.assignment === Job.SPA || slave.assignment === Job.REST) {
 		assignBonus += 20;
-	} else if ((slave.assignment === Job.MASTERSUITE || slave.assignment === Job.FUCKTOY) && V.PC.skill.medicine >= 40) {
+	} else if ((slave.assignment === Job.MASTERSUITE || slave.assignment === Job.FUCKTOY || slave.assignment === Job.CONCUBINE) && V.PC.skill.medicine >= 40) {
 		assignBonus += 10;
 	} else if (App.Data.Careers.Leader.nurse.includes(slave.career) || slave.skill.nurse > 120 || slave.intelligence + slave.intelligenceImplant > 95) { // Let slaves with experience or brains use it
 		assignBonus += 10;
diff --git a/src/endWeek/nextWeek/resetGlobals.js b/src/endWeek/nextWeek/resetGlobals.js
index e3dac2a4ce278c4cbbca0dc48b4bf33f503adca9..90baae6510c0fc46849c055e23f36295f18d3ed6 100644
--- a/src/endWeek/nextWeek/resetGlobals.js
+++ b/src/endWeek/nextWeek/resetGlobals.js
@@ -2,30 +2,19 @@
  * These are variables that either should be made into temp vars or should be Zeroed out once done with them instead of here. This can also interfere with debugging or hide NaN's as zeroing things out would clear a NaN. Also could stop from NaN's getting worse?
  */
 App.EndWeek.resetGlobals = function() {
-	// Integer and float variables. No real need to zero them out but doesn't hurt to have them in a known state, though this might mask variables NaN'ing out. Takes up the least amount of Memory besides a "" string.
-	V.i = 0;
-	V.j = 0;
-
 	// Other arrays
 	V.events = [];
 	V.RESSevent = [];
 	V.RESSTRevent = [];
 	V.RETSevent = [];
 	V.RECIevent = [];
-	V.RecETSevent = [];
 	V.REFIevent = [];
-	V.REFSevent = [];
 	V.PESSevent = [];
 	V.PETSevent = [];
-	V.FSNonconformistEvents = [];
-	V.REButtholeCheckinIDs = [];
 
 	// Slave Objects using 0 instead of null. Second most memory eaten up.
 	V.activeSlave = 0;
 	V.eventSlave = 0;
-	V.subSlave = 0;
-	V.relative = 0;
-	V.relative2 = 0;
 
 	// Strings Memory varies.
 	V.desc = "";
diff --git a/src/endWeek/nextWeek/weather.js b/src/endWeek/nextWeek/weather.js
index 8acfa415c757467de9c11abf5b082e43fb5608e8..bd0660637517607e256259b4b051578b4cd88b75 100644
--- a/src/endWeek/nextWeek/weather.js
+++ b/src/endWeek/nextWeek/weather.js
@@ -36,10 +36,10 @@ App.EndWeek.weather = function() {
 		V.weatherLastWeek = 1;
 	}
 
-	const _seed = random(1, 10);
+	const seed = random(1, 10);
 	if (V.weatherType === 1) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -47,7 +47,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -55,10 +55,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -66,7 +66,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -74,7 +74,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -82,10 +82,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -93,7 +93,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -101,7 +101,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -109,10 +109,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.hotNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -120,10 +120,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.hotLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.hotHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -131,7 +131,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.hotHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -141,7 +141,7 @@ App.EndWeek.weather = function() {
 		}
 	} else if (V.weatherType === 2) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -149,7 +149,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -157,10 +157,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -168,7 +168,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -176,7 +176,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -184,10 +184,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -195,7 +195,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -203,7 +203,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -211,10 +211,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.windyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -222,10 +222,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.windyLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.windyHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -233,7 +233,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.windyHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -243,7 +243,7 @@ App.EndWeek.weather = function() {
 		}
 	} else if (V.weatherType === 3) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -251,7 +251,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -259,10 +259,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -270,7 +270,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -278,7 +278,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -286,10 +286,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -297,7 +297,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -305,7 +305,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -313,10 +313,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.smokyNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -324,10 +324,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.smokyLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.smokyHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -335,7 +335,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.smokyHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -345,7 +345,7 @@ App.EndWeek.weather = function() {
 		}
 	} else if (V.weatherType === 4) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -353,7 +353,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -361,10 +361,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -372,7 +372,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -380,7 +380,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -388,10 +388,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -399,7 +399,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -407,7 +407,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -415,10 +415,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.toxicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -426,10 +426,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.toxicLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.toxicHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -437,7 +437,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.toxicHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -447,7 +447,7 @@ App.EndWeek.weather = function() {
 		}
 	} else if (V.weatherType === 5) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -455,7 +455,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -463,10 +463,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -474,7 +474,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -482,7 +482,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -490,10 +490,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -501,7 +501,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -509,7 +509,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -517,10 +517,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.coldNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -528,10 +528,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.coldLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.coldHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -539,7 +539,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.coldHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -549,7 +549,7 @@ App.EndWeek.weather = function() {
 		}
 	} else if (V.weatherType === 6) {
 		if (V.week < 25) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -557,7 +557,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 1) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -565,10 +565,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 2) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -576,7 +576,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 50 && V.weatherLastWeek === 3) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -584,7 +584,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 1) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -592,10 +592,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 2) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 3) {
+			} else if (seed > 3) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -603,7 +603,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week < 75 && V.weatherLastWeek === 3) {
-			if (_seed > 5) {
+			if (seed > 5) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -611,7 +611,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 1) {
-			if (_seed > 8) {
+			if (seed > 8) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
 			} else {
@@ -619,10 +619,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 2;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 2) {
-			if (_seed > 7) {
+			if (seed > 7) {
 				V.weatherToday = App.Data.Weather.tectonicNice.random();
 				V.weatherLastWeek = 1;
-			} else if (_seed > 5) {
+			} else if (seed > 5) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
 			} else {
@@ -630,10 +630,10 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 3;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 3) {
-			if (_seed > 6) {
+			if (seed > 6) {
 				V.weatherToday = App.Data.Weather.tectonicLight.random();
 				V.weatherLastWeek = 2;
-			} else if (_seed > 2) {
+			} else if (seed > 2) {
 				V.weatherToday = App.Data.Weather.tectonicHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
@@ -641,7 +641,7 @@ App.EndWeek.weather = function() {
 				V.weatherLastWeek = 4;
 			}
 		} else if (V.week > 75 && V.weatherLastWeek === 4) {
-			if (_seed > 4) {
+			if (seed > 4) {
 				V.weatherToday = App.Data.Weather.tectonicHeavy.random();
 				V.weatherLastWeek = 3;
 			} else {
diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js
index e35ddd2adff93972ea58804a61866408562d912a..1282b47ee97e935aa6c3610810772c593fe795a2 100644
--- a/src/endWeek/reports/arcadeReport.js
+++ b/src/endWeek/reports/arcadeReport.js
@@ -11,9 +11,13 @@ App.EndWeek.arcadeReport = function() {
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.arcade);
 	const slavesLength = slaves.length;
 
-	const cockMilkedSlaves = [], milkedSlaves = [], boobsImplantedSlaves = [], prostatesImplantedSlaves = [];
+	const cockMilkedSlaves = [];
+	const milkedSlaves = [];
+	const boobsImplantedSlaves = [];
+	const prostatesImplantedSlaves = [];
 	let vasectomiesUndone = 0;
-	let milkProfits = 0, profits = 0;
+	let milkProfits = 0;
+	let profits = 0;
 
 	// Statistics gathering
 	V.facility = V.facility || {};
@@ -271,8 +275,7 @@ App.EndWeek.arcadeReport = function() {
 			milkProfits += milk(slave);
 			slave.boobs += boobGrowth(slave);
 			if (
-				(slave.balls > 0) &&
-				(slave.balls < 10) &&
+				slave.balls.isBetween(0, 10) &&
 				(random(1, 100) > (40 + (10 * (slave.balls + (2 * slave.geneMods.NCS)))))
 			) {
 				slave.balls++;
diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js
index 70fd8e21363b783d56f8ed45f3d2b286f0e9a51d..de18e36d06188d72bf7a3e550c22588fbd236e43 100644
--- a/src/endWeek/reports/cellblockReport.js
+++ b/src/endWeek/reports/cellblockReport.js
@@ -6,7 +6,11 @@ App.EndWeek.cellblockReport = function() {
 	let r;
 
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.cellblock);
-	let brokenSlaves = 0, idleBonus = 0, softenedQuirks = 0, trustMalus = 0, FLsFetish = 0;
+	let brokenSlaves = 0;
+	let idleBonus = 0;
+	let softenedQuirks = 0;
+	let trustMalus = 0;
+	let FLsFetish = 0;
 	let devBonus = (V.cellblockDecoration !== "standard") ? 1 : 0;
 	let confinedResults;
 
diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js
index 5f40491bde30f3a759a3007e422173bf1d6e315a..797ebee9b36f9f8f0a999cb9bd0b53a21a472a53 100644
--- a/src/endWeek/reports/clinicReport.js
+++ b/src/endWeek/reports/clinicReport.js
@@ -230,9 +230,9 @@ App.EndWeek.clinicReport = function() {
 			}
 
 			if (slaves.length < V.clinic && !slaveResting(S.Nurse)) {
-				const _idlePay = jsRandom(1, 10) + ((V.clinic - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
-				cashX(_idlePay, "clinic", S.Nurse);
-				r.push(`<div class="indent">Since ${he} doesn't have enough patients to occupy all of ${his} time, ${V.clinicName} takes in citizens' slaves on a contract basis and ${he} helps them too, earning <span class="cash inc">${cashFormat(_idlePay)}.</span></div>`);
+				const idlePay = jsRandom(1, 10) + ((V.clinic - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
+				cashX(idlePay, "clinic", S.Nurse);
+				r.push(`<div class="indent">Since ${he} doesn't have enough patients to occupy all of ${his} time, ${V.clinicName} takes in citizens' slaves on a contract basis and ${he} helps them too, earning <span class="cash inc">${cashFormat(idlePay)}.</span></div>`);
 			}
 		}
 
diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js
index ab01ab1040f6ce143258307b353a3bcda9be0543..aa6836514e5bba1877d4c12f58fbcd5dba9f4bdc 100644
--- a/src/endWeek/reports/dairyReport.js
+++ b/src/endWeek/reports/dairyReport.js
@@ -9,8 +9,23 @@ App.EndWeek.dairyReport = function() {
 	const BF = App.Data.misc.bioreactorFluids;
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.dairy);
 	const DL = slaves.length;
-	const balltacular = [], careerForgotten = [], desterilized = [], hateFilled = [], horrified = [], skillsLost = [], stupidified = [], chemMinor = [];
-	let anusesStretched = 0, cumWeek = 0, femCumWeek = 0, milkWeek = 0, boobtacular = 0, chemSevere = 0, intelligenceLost = 0, mindbroken = 0, vaginasStretched = 0;
+	const balltacular = [];
+	const careerForgotten = [];
+	const desterilized = [];
+	const hateFilled = [];
+	const horrified = [];
+	const skillsLost = [];
+	const stupidified = [];
+	const chemMinor = [];
+	let anusesStretched = 0;
+	let cumWeek = 0;
+	let femCumWeek = 0;
+	let milkWeek = 0;
+	let boobtacular = 0;
+	let chemSevere = 0;
+	let intelligenceLost = 0;
+	let mindbroken = 0;
+	let vaginasStretched = 0;
 	const inflatedSlaves = App.Facilities.Dairy.inflation();
 	const dairySettings = V.dairyStimulatorsSetting + V.dairyFeedersSetting + V.dairyPregSetting;
 	const restrainedInjected = V.dairyRestraintsSetting + V.injectionUpgrade;
@@ -35,7 +50,11 @@ App.EndWeek.dairyReport = function() {
 
 	if (V.MilkmaidID !== 0) {
 		r = [];
-		let milkmaidImpregnated = 0, milkers = 0, cummers = 0, breeders = 0, prostateStim = 0;
+		let milkmaidImpregnated = 0;
+		let milkers = 0;
+		let cummers = 0;
+		let breeders = 0;
+		let prostateStim = 0;
 
 		for (const slave of slaves) {
 			if (slave.lactation > 0) {
diff --git a/src/endWeek/reports/incubatorReport.js b/src/endWeek/reports/incubatorReport.js
index 821f713570513b87c8e9b77a4bec9ed79fa7fdcd..6bb4ebbfd4b6e3a146bbc12abee540691f6c58be 100644
--- a/src/endWeek/reports/incubatorReport.js
+++ b/src/endWeek/reports/incubatorReport.js
@@ -164,8 +164,8 @@ App.EndWeek.incubatorReport = function() {
 			if (tank.geneMods.NCS === 1) {
 				/* NCS should block physical growth beyond that of a toddler, but some players might like
 				 * a little more or less. So using V.minimumSlaveAge or 8, whichever is lesser.	*/
-				const _limitAge = Math.min(8, V.minimumSlaveAge);
-				heightLimitAge = Height.forAge(tank.height, _limitAge, tank.genes);
+				const limitAge = Math.min(8, V.minimumSlaveAge);
+				heightLimitAge = Height.forAge(tank.height, limitAge, tank.genes);
 				heightLimit = heightLimitAge;
 			} else if (tank.geneticQuirks.neoteny === 2 && tank.actualAge > 12) {
 				heightLimitAge = Height.forAge(tank.height, 12, tank.genes);
@@ -758,16 +758,16 @@ App.EndWeek.incubatorReport = function() {
 		if (((V.incubator.setting.pregAdaptation === 1 && tank.genes === "XX") || (V.incubator.setting.pregAdaptation === 2 && tank.genes === "XY") || V.incubator.setting.pregAdaptation === 3) && tank.growTime > 0) {
 			r.push(`The incubator is working on adapting ${his} abdomen and reproductive organs for future pregnancies.`);
 
-			let _weekAdapt = tank.incubatorPregAdaptationInWeek * V.incubator.upgrade.speed;
-			if (isNaN(_weekAdapt)) {
+			let weekAdapt = tank.incubatorPregAdaptationInWeek * V.incubator.upgrade.speed;
+			if (isNaN(weekAdapt)) {
 				/* NaN check AFTER multiply operation, against it result is critical here. Need to be absolutely sure about this operation, not about just tank property itself. This give me two very unpleasant hours to catch this */
 				tank.incubatorPregAdaptationInWeek = (15000 / 2000 - tank.pregAdaptation) / tank.growTime;
 			}
-			_weekAdapt = tank.incubatorPregAdaptationInWeek * V.incubator.upgrade.speed;
+			weekAdapt = tank.incubatorPregAdaptationInWeek * V.incubator.upgrade.speed;
 			/* Now it should be fine */
-			_weekAdapt *= 1 + (V.incubator.setting.reproduction / 5);
-			_weekAdapt *= 1 + (tank.hormoneBalance / 1500);
-			tank.pregAdaptation += _weekAdapt;
+			weekAdapt *= 1 + (V.incubator.setting.reproduction / 5);
+			weekAdapt *= 1 + (tank.hormoneBalance / 1500);
+			tank.pregAdaptation += weekAdapt;
 			/* here goes side effect from intense and extreme settings: */
 			if (random(0, 100) <= (tank.incubatorPregAdaptationPower - 1) * (V.incubator.upgrade.speed / 2 + 1)) {
 				switch (random(1, 9)) { /* side effect selection*/
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 2248460d249cfa572611c4f1d0b0de381f3f3dab..1fe638b39fd6136b0846274b4249b86ad4827a3e 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -20,7 +20,7 @@ App.EndWeek.penthouseReport = function() {
 	for (const slave of App.SlaveAssignment.reportSlaves(penthouseSlaves)) {
 		const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 		if (penthouseArtRenderer) {
-			App.UI.DOM.appendNewElement("div", slaveEntry, penthouseArtRenderer.render(slave), ["imageRef", "medImg"]);
+			App.UI.DOM.drawOneSlaveRight(slaveEntry, slave, penthouseArtRenderer);
 		}
 		App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
 		slaveEntry.append(fullReport(slave));
@@ -28,22 +28,21 @@ App.EndWeek.penthouseReport = function() {
 		if (slave.ID === V.HeadGirlID && hgSlave) {
 			/* Output the HG's slave immediately after the hg */
 			const {He2, he2} = getPronouns(hgSlave).appendSuffix("2");
-			const r = [];
+			const hgSlaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 			if (hgSlave.assignment !== Job.HEADGIRLSUITE) {
-				r.push(`<span class="red">${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.</span>`);
+				App.UI.DOM.appendNewElement("span", hgSlaveEntry, `${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.`, "warning");
 				removeJob(hgSlave, Job.HEADGIRLSUITE);
 			} else {
-				r.push(App.UI.DOM.makeElement("span", SlaveFullName(hgSlave), "slave-name"));
-				if (hgSlave.choosesOwnAssignment === 2) {
-					r.push(App.SlaveAssignment.choosesOwnJob(hgSlave));
-					r.push(He2);
-				}
 				if (penthouseArtRenderer) {
-					r.push(App.UI.DOM.makeElement("div", penthouseArtRenderer.render(hgSlave), ["imageRef", "medImg"]));
+					App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer);
+				}
+				App.SlaveAssignment.appendSlaveLinks(hgSlaveEntry, hgSlave);
+				App.UI.DOM.appendNewElement("span", hgSlaveEntry, SlaveFullName(hgSlave), "slave-name");
+				if (hgSlave.choosesOwnAssignment === 2) {
+					hgSlaveEntry.append(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`);
 				}
-				r.push(App.SlaveAssignment.liveWithHG(hgSlave));
+				hgSlaveEntry.append(` `, App.SlaveAssignment.liveWithHG(hgSlave));
 			}
-			App.Events.addNode(el, r, "div", "slave-report");
 		}
 	}
 
diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js
index 2390b8ce1744ee5546eff0e9c096380639b58567..14b66df8f9889e2bf1816f2c8ca2aa118237f303 100644
--- a/src/endWeek/reports/schoolroomReport.js
+++ b/src/endWeek/reports/schoolroomReport.js
@@ -79,7 +79,7 @@ App.EndWeek.schoolroomReport = function() {
 				idleBonus++;
 			}
 			if (S.Schoolteacher.intelligenceImplant >= 15) {
-				r.push(`Since ${he}'s educated ${him}self, ${he} understands`);
+				r.push(`Since ${he}'s educated ${himself}, ${he} understands`);
 				if (V.schoolroomRemodelBimbo !== 0) {
 					r.push(`how best to apply the new lesson plan.`);
 				} else {
@@ -125,9 +125,9 @@ App.EndWeek.schoolroomReport = function() {
 			}
 
 			if (slaves.length < V.schoolroom && !slaveResting(S.Schoolteacher)) {
-				const _idlePay = jsRandom(1, 10) + ((V.schoolroom - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
-				cashX(_idlePay, "school", S.Schoolteacher);
-				r.push(`<div class="indent">Since ${he} doesn't have enough students to occupy all of ${his} time, ${V.schoolroomName} takes in citizens' slaves on a contract basis and ${he} teaches them too, earning <span class="yellowgreen">${cashFormat(_idlePay)}.</span></div>`);
+				const idlePay = jsRandom(1, 10) + ((V.schoolroom - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
+				cashX(idlePay, "school", S.Schoolteacher);
+				r.push(`<div class="indent">Since ${he} doesn't have enough students to occupy all of ${his} time, ${V.schoolroomName} takes in citizens' slaves on a contract basis and ${he} teaches them too, earning <span class="yellowgreen">${cashFormat(idlePay)}.</span></div>`);
 			}
 
 			return r.join(" ");
diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js
index 6fb78641fdbce6e9065504af918a91120b873e65..d6137936960c41029e3562535386f168a60fee40 100644
--- a/src/endWeek/reports/spaReport.js
+++ b/src/endWeek/reports/spaReport.js
@@ -6,7 +6,9 @@ App.EndWeek.spaReport = function() {
 	let r;
 
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.spa);
-	let healthBonus = 0, restedSlaves = 0, restedSlave;
+	let healthBonus = 0;
+	let restedSlaves = 0;
+	let restedSlave;
 	let devBonus = (V.spaDecoration !== "standard") ? 1 : 0;
 
 	V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.spa); /* FIXME: should be local, passed as a parameter to saRules */
diff --git a/src/endWeek/saBeYourHeadGirl.js b/src/endWeek/saBeYourHeadGirl.js
index 4b8cd5bc40243a1063b1cc4d645348298b350b43..f2a42ea87c43270d231cc2475ba0ae6dec53860d 100644
--- a/src/endWeek/saBeYourHeadGirl.js
+++ b/src/endWeek/saBeYourHeadGirl.js
@@ -233,6 +233,7 @@ App.SlaveAssignment.beYourHeadGirl = (function() {
 		} else {
 			if (slave.fetish === "dom") {
 				r.push(`Having all the slaves look up to and obey ${him} clearly excites ${him}; <span class="lightcoral">${he}'s a natural dom!</span>`);
+				slave.fetishKnown = 1;
 			} else if (fetishChange > jsRandom(0, 100)) {
 				r.push(`Having all the slaves look up to and obey ${him} affects ${his} sexuality, turning ${him} into a <span class="lightcoral">bit of a dominatrix.</span>`);
 				slave.fetish = "dom";
diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js
index 3b9855c85409f3762d8d970a198028bdc6fd8c54..fefd9c8b46081fd7f2c97ab3ad0abf0c98ae6ee3 100644
--- a/src/endWeek/saChoosesOwnClothes.js
+++ b/src/endWeek/saChoosesOwnClothes.js
@@ -972,7 +972,7 @@ App.SlaveAssignment.choosesOwnClothes = (function() {
 					}
 				}
 			}
-			/* Separated in three categories in case you want to, say, increase the probability of choosing _wardrobeAssignment to look more professional*/
+			/* Separated in three categories in case you want to, say, increase the probability of choosing wardrobeAssignment to look more professional*/
 			/* clothing = clothing.concat(wardrobeAssignment, wardrobeFS, wardrobeTastes); better version should the above never amount to anything*/
 			if (wardrobeAssignment.length > 0) {
 				for (let i = 0; i < wardrobeAssignment.length; i++) {
@@ -997,9 +997,10 @@ App.SlaveAssignment.choosesOwnClothes = (function() {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 * @returns {{text:string, shoes:string}}
+	 * @returns {{text:string, shoes:FC.Shoes}}
 	 */
 	function todaysShoes(slave) {
+		/** @type {{text:string, shoes:FC.Shoes}[]} */
 		const shoes = [];
 
 		if (slave.fetish === "mindbroken") {
diff --git a/src/endWeek/saLiveWithHG.js b/src/endWeek/saLiveWithHG.js
index 27aea27bca1ea4ab3d6a7dd97618a5154ebb9e37..cb8b6a556b6c3401a3e6c09985f61581927218d9 100644
--- a/src/endWeek/saLiveWithHG.js
+++ b/src/endWeek/saLiveWithHG.js
@@ -738,7 +738,7 @@ App.SlaveAssignment.liveWithHG = (function() {
 				} else {
 					r.push(`giggling sex)`);
 				}
-				r.push(`that ${slave.slaveName}really starts to <span class="improvement">fetishize boys</span> too.`);
+				r.push(`that ${slave.slaveName} really starts to <span class="improvement">fetishize boys</span> too.`);
 				slave.attrXY += 2;
 				slave.attrKnown = 1;
 			}
@@ -1255,19 +1255,19 @@ App.SlaveAssignment.liveWithHG = (function() {
 			}
 
 			/* get eye colors, HG can be expected to have at least one working eye due to job requirements */
-			const _left = hasLeftEye(HG) ? getLeftEyeColor(HG) : getRightEyeColor(HG);
-			const _right = hasRightEye(HG) ? getRightEyeColor(HG) : _left;
+			const left = hasLeftEye(HG) ? getLeftEyeColor(HG) : getRightEyeColor(HG);
+			const right = hasRightEye(HG) ? getRightEyeColor(HG) : left;
 
 			/* make sure the slave has the same eye color as the HG */
-			if (getLeftEyeColor(slave) !== _left) {
-				setEyeColor(slave, _left, "left");
+			if (getLeftEyeColor(slave) !== left) {
+				setEyeColor(slave, left, "left");
 				r.push(`${HG.slaveName}`);
 				if (getLeftEyeType(slave) === 3) {
 					r.push(`changes`);
 				} else {
 					r.push(`gives`);
 				}
-				r.push(`${slave.slaveName} ${_left}`);
+				r.push(`${slave.slaveName} ${left}`);
 				if (getLeftEyeType(slave) === 3) {
 					r.push(`eye lenses,`);
 				} else if (getLeftEyeType(slave) === 2) {
@@ -1277,15 +1277,15 @@ App.SlaveAssignment.liveWithHG = (function() {
 				}
 				r.push(`to match ${his2} own left eye, since with nymphomania comes narcissism.`);
 			}
-			if (getRightEyeColor(slave) !== _right) {
-				setEyeColor(slave, _right, "right");
+			if (getRightEyeColor(slave) !== right) {
+				setEyeColor(slave, right, "right");
 				r.push(`${HG.slaveName}`);
 				if (getRightEyeType(slave) === 3) {
 					r.push(`changes`);
 				} else {
 					r.push(`gives`);
 				}
-				r.push(`${slave.slaveName} ${_right}`);
+				r.push(`${slave.slaveName} ${right}`);
 				if (getLeftEyeType(slave) === 3) {
 					r.push(`eye lenses,`);
 				} else if (getLeftEyeType(slave) === 2) {
diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js
index 3a6dd3c03238e6a8200c7c7fb8b4c24bf6d25e0c..7d6027a8b5a29372315201b5a28cd022d4a6afba 100644
--- a/src/endWeek/saLongTermMentalEffects.js
+++ b/src/endWeek/saLongTermMentalEffects.js
@@ -1020,7 +1020,7 @@ App.SlaveAssignment.longTermMentalEffects = (function() {
 					}
 				} else if (slave.behavioralFlaw === "hates men") {
 					if (slave.fetish === "pregnancy") {
-						r.push(`${He} dislikes the company of men, but fetishizes pregnancy; ${he} decides that men, those hunky impregnators, can't be //that// bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
+						r.push(`${He} dislikes the company of men, but fetishizes pregnancy; ${he} decides that men, those hunky impregnators, can't be <i>that</i> bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
 						slave.behavioralFlaw = "none";
 					} else if (slave.fetish === "boobs") {
 						r.push(`${He} dislikes the company of men and adores boobs; ${he} finds that ${he} doesn't mind ogling titties with the boys, and <span class="flaw break">gets over ${his} hatred.</span>`);
@@ -1034,10 +1034,10 @@ App.SlaveAssignment.longTermMentalEffects = (function() {
 					}
 				} else if (slave.behavioralFlaw === "hates women") {
 					if (slave.fetish === "pregnancy") {
-						r.push(`${He} dislikes the company of women, but fetishizes pregnancy; ${he} decides that women, with their motherly hips and fertile cunts, can't be //that// bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
+						r.push(`${He} dislikes the company of women, but fetishizes pregnancy; ${he} decides that women, with their motherly hips and fertile cunts, can't be <i>that<i> bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
 						slave.behavioralFlaw = "none";
 					} else if (slave.fetish === "cumslut") {
-						r.push(`${He} dislikes the company of women and has a real oral fixation; ${he} decides that women, with their soft, kissable lips can't be //that// bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
+						r.push(`${He} dislikes the company of women and has a real oral fixation; ${he} decides that women, with their soft, kissable lips can't be <i>that<i> bad, and <span class="flaw break">gets over ${his} hatred.</span>`);
 						slave.behavioralFlaw = "none";
 					} else if (slave.attrXX > 85) {
 						r.push(`${He} dislikes the company of women but likes fucking them; ${he} gets used to putting up with girls to get into their pants, and <span class="flaw break">gets over ${his} hatred.</span>`);
@@ -1396,24 +1396,28 @@ App.SlaveAssignment.longTermMentalEffects = (function() {
 					r.push(`Living in a society that glorifies ${his} paraphilia <span class="devotion inc">leaves ${him} in perpetual ecstasy.</span>`);
 					slave.devotion += 5;
 				}
-				if (["get milked", "work in the dairy"].includes(slave.assignment) && slave.lactation > 0) {
+				if (slave.drugs === "intensive breast injections" || slave.drugs === "hyper breast injections") {
+					r.push(`${His} paraphilia makes ${him} feel <span class="trust inc">fulfilled to be a sex slave</span> if it means breast expansion like this.`);
+					slave.trust += 2;
+					slave.paraphiliaSatisfied = 1;
+				} else if (slave.drugs === "breast injections") {
+					r.push(`${His} paraphilia makes breast injections very satisfying for ${him}.`);
+					slave.paraphiliaSatisfied = 1;
+				} else if (["get milked", "work in the dairy"].includes(slave.assignment) && slave.lactation > 0) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as a cow; ${he} can feel ${his} udders swelling with milk.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (slave.geneticQuirks.gigantomastia === 2 && slave.geneticQuirks.macromastia === 2 && V.geneticMappingUpgrade >= 1) {
 					r.push(`${His} paraphilia is satisfied by the knowledge that ${his} genetic abnormality will keep ${his} breasts growing for the rest of ${his} life.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (V.geneticMappingUpgrade >= 1 && (slave.geneticQuirks.gigantomastia === 2 || slave.geneticQuirks.macromastia === 2)) {
 					r.push(`${His} paraphilia is satisfied by the knowledge that ${his} genetic abnormality will keep ${his} breasts bigger than ${his} head.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (slave.geneticQuirks.gigantomastia === 2) {
 					r.push(`${His} paraphilia is satisfied by ${his} chest's curious tendency toward perpetual growth.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (slave.health.condition < 0) {
 					r.push(`${His} paraphilia is ameliorated by ${his} poor health; ${he} knows ${he} can't take expansion right now.`);
-				} else if (slave.drugs === "intensive breast injections" || slave.drugs === "hyper breast injections") {
-					r.push(`${His} paraphilia makes ${him} feel <span class="trust inc">fulfilled to be a sex slave</span> if it means breast expansion like this.`);
-					slave.trust += 2;
-					slave.paraphiliaSatisfied = 1;
-				} else if (slave.drugs === "breast injections") {
-					r.push(`${His} paraphilia makes breast injections very satisfying for ${him}.`);
-					slave.paraphiliaSatisfied = 1;
+					//paraphilia neither satisfied nor dissatisfied
 				} else {
 					r.push(`${He} feels ${his} breasts are shrinking horribly, leaving the growth addict <span class="devotion dec">depressed and anxious.</span>`);
 					slave.paraphiliaSatisfied = -1;
diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js
index 52c0e5c9eb22116fb063b4d00b2f7bc1d546c370..c4dee8e94501d586eaa731d6594635b00216dd0e 100644
--- a/src/endWeek/saLongTermPhysicalEffects.js
+++ b/src/endWeek/saLongTermPhysicalEffects.js
@@ -727,35 +727,35 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 		let youthening = 0;
 		const youtheningLevel = Math.round(Math.clamp(((slave.physicalAge - 8) / 4) + .25, 0, 10));
 		/*
-		**	r.push(`To prevent the NCS from firing on every attribute in one year, this variable counts the`);
-		**	r.push(`number of NCS affects that fire. Most affects will only trigger if one or two other`);
-		**	r.push(`have already fired, but won't fire beyond. There are two exceptions to that, first,`);
-		**	r.push(`massively oversized growth assets, which will fire always, e.g. boobs > 5000, dick > 10,`);
-		**	r.push(`etc. Second, Body structure, hips/shoulders may fire any time, (decreasing random).`);
+		**	To prevent the NCS from firing on every attribute in one year, this variable counts the
+		**	number of NCS affects that fire. Most affects will only trigger if one or two other
+		**	have already fired, but won't fire beyond. There are two exceptions to that, first,
+		**	massively oversized growth assets, which will fire always, e.g. boobs > 5000, dick > 10,
+		**	etc. Second, Body structure, hips/shoulders may fire any time, (decreasing random).
 		**
-		**	r.push(`Youthening (visual age year number reduction)`);
-		**	r.push(`Happens on a sliding scale, the older a slave is, the faster the de-aging goes.`);
-		**	r.push(`Consequently, it goes slower as the visual age approaches an 8 year old loli/shota body.`);
-		**	r.push(`Age 45+=> auto age reduction 1 year per 1 week.`);
-		**	r.push(`Age 41-44=> age reduction 1 year per 2 weeks.`);
-		**	r.push(`Age 37-40=> age reduction 1 year per 3 weeks.`);
-		**	r.push(`Age 33-36=> age reduction 1 year per 4 weeks.`);
-		**	r.push(`Age 29-32=> age reduction 1 year per 5 weeks.`);
-		**	r.push(`Age 25-28=> age reduction 1 year per 6 weeks.`);
-		**	r.push(`Age 21-24=> age reduction 1 year per 7 weeks.`);
-		**	r.push(`Age 17-20=> age reduction 1 year per 8 weeks.`);
-		**	r.push(`Age 13-16=> age reduction 1 year per 9 weeks.`);
-		**	r.push(`Age 9-12=> slowest age reduction 1 year per 10 weeks.`);
+		**	Youthening (visual age year number reduction)
+		**	Happens on a sliding scale, the older a slave is, the faster the de-aging goes.
+		**	Consequently, it goes slower as the visual age approaches an 8 year old loli/shota body.
+		**	Age 45+=> auto age reduction 1 year per 1 week.
+		**	Age 41-44=> age reduction 1 year per 2 weeks.
+		**	Age 37-40=> age reduction 1 year per 3 weeks.
+		**	Age 33-36=> age reduction 1 year per 4 weeks.
+		**	Age 29-32=> age reduction 1 year per 5 weeks.
+		**	Age 25-28=> age reduction 1 year per 6 weeks.
+		**	Age 21-24=> age reduction 1 year per 7 weeks.
+		**	Age 17-20=> age reduction 1 year per 8 weeks.
+		**	Age 13-16=> age reduction 1 year per 9 weeks.
+		**	Age 9-12=> slowest age reduction 1 year per 10 weeks.
 		**
-		**	r.push(`To track this, the ${slave.NCSyouthening} field counts the *charge* of youthening the slave`);
-		**	r.push(`currently has, and if it's over the youthening requirements, the slave will become younger.`);
+		**	To track this, the slave.NCSyouthening field counts the *charge* of youthening the slave
+		**	currently has, and if it's over the youthening requirements, the slave will become younger.
 		**
-		**	r.push(`Additionally while years fly off quickly in the beginning for older slaves, and oversized body parts`);
-		**	r.push(`shrink away, other secondary characteristics slowly but surely drop off, but based on the above`);
+		**	Additionally while years fly off quickly in the beginning for older slaves, and oversized body parts
+		**	shrink away, other secondary characteristics slowly but surely drop off, but based on the above
 		**	*charge* of youthening.
 		**
-		**	r.push(`Note that with this system a 45 year old slave given NCS would be indistinguishable from an 8 year`);
-		**	r.push(`old in a little over 4 years time.`);
+		**	Note that with this system a 45 year old slave given NCS would be indistinguishable from an 8 year
+		**	old in a little over 4 years time.
 		*/
 		slave.NCSyouthening++;
 		if (slave.visualAge > 8 && slave.NCSyouthening >= (11 - youtheningLevel)) {
@@ -768,11 +768,11 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			youthening++;
 		}
 		/*
-		**	r.push(`height always fires if over 176 cm,`);
-		**	r.push(`also fires if the slave is tall for their visual age`);
-		**	r.push(`also if they are in * NCSyouthening 3-5 (reverse teen years) and`);
-		**	r.push(`over 126 cm`);
-		**	r.push(`or over height (30% chance)`);
+		**	height always fires if over 176 cm,
+		**	also fires if the slave is tall for their visual age
+		**	also if they are in * NCSyouthening 3-5 (reverse teen years) and
+		**	over 126 cm
+		**	or over height (30% chance)
 		*/
 		const heightDelta = slave.height - Height.mean(slave);
 		let shrinkage;
@@ -793,13 +793,13 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Boobs, nipples and areolae.`);
-		**	r.push(`Boobs always fires for over 5000 cc,`);
-		**	r.push(`nipples/areolae shrinkage will fire for boobs under 5000,`);
-		**	r.push(`where nipples are tiny/cute at 30% chance.`);
-		**	r.push(`anything over 300 will fire if`);
-		**	r.push(`the slave's accumulated youthening is 6 or higher,`);
-		**	r.push(`or by a 50% chance.`);
+		**	Boobs, nipples and areolae.
+		**	Boobs always fires for over 5000 cc,
+		**	nipples/areolae shrinkage will fire for boobs under 5000,
+		**	where nipples are tiny/cute at 30% chance.
+		**	anything over 300 will fire if
+		**	the slave's accumulated youthening is 6 or higher,
+		**	or by a 50% chance.
 		*/
 		/** @type {FC.NippleShape} */
 		let nipplesString;
@@ -833,9 +833,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Hips and Shoulders reshaping`);
-		**	r.push(`One or the other can happen per week as long as the hips and shoulders are bigger than the smallest`);
-		**	r.push(`level, though the chances get much more likely for the widest sizes.`);
+		**	Hips and Shoulders reshaping
+		**	One or the other can happen per week as long as the hips and shoulders are bigger than the smallest
+		**	level, though the chances get much more likely for the widest sizes.
 		*/
 		if (((slave.hips - Math.abs(slave.hipsImplant)) > -2) && (random(1, 100) < ((slave.hips + 3) * 18))) {
 			r.push(`${His} <span class="ncs">NCS</span> gets busy <span class="change negative"> reducing the size of ${his}`);
@@ -861,9 +861,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Dick and clit shrinkage`);
-		**	r.push(`Massive 10+ Dicks or 5+ Clits always fire, and at double power.`);
-		**	r.push(`Below that by chance, (reducing chances by current size). In general clits shrink faster.`);
+		**	Dick and clit shrinkage
+		**	Massive 10+ Dicks or 5+ Clits always fire, and at double power.
+		**	Below that by chance, (reducing chances by current size). In general clits shrink faster.
 		*/
 		if (slave.dick >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> is actively <span class="change negative">reducing the size of ${his} giant dick.</span>`);
@@ -883,9 +883,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Balls.`);
-		**	r.push(`Massive testicles (10+) drop by 2 levels,`);
-		**	r.push(`Others decrease by chance based on current size.`);
+		**	Balls.
+		**	Massive testicles (10+) drop by 2 levels,
+		**	Others decrease by chance based on current size.
 		*/
 		if (slave.balls >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> gets busy <span class="change negative">reducing the size of ${his} titanic balls.</span>`);
@@ -897,9 +897,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Butt.`);
-		**	r.push(`Tremendous butts burn of by 2 points.`);
-		**	r.push(`Regular butts based on chances, decrease as the size does.`);
+		**	Butt.
+		**	Tremendous butts burn of by 2 points.
+		**	Regular butts based on chances, decrease as the size does.
 		*/
 		if (buttSize >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> applies and <span class="change negative">reduces the size of ${his} bulbous butt.</span>`);
@@ -911,10 +911,10 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Scrotum and Labia`);
-		**	r.push(`One or the other can fire per week.`);
-		**	r.push(`Pendulous ballsacks or sagging labia will always fire.`);
-		**	r.push(`Otherwise by reducing chance based on current sizes, but labias are a little more likely.`);
+		**	Scrotum and Labia
+		**	One or the other can fire per week.
+		**	Pendulous ballsacks or sagging labia will always fire.
+		**	Otherwise by reducing chance based on current sizes, but labias are a little more likely.
 		*/
 		if (slave.geneMods.rapidCellGrowth !== 1) {
 			if (slave.scrotum >= 5) {
@@ -936,8 +936,8 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			}
 		}
 		/*
-		**	r.push(`Voice.`);
-		**	r.push(`Small chance for any non-childlike voice.`);
+		**	Voice.
+		**	Small chance for any non-childlike voice.
 		*/
 		if ((countNCS < 3) && (slave.voice < 3) && slave.voice !== 0 && (random(1, 100) > (slave.voice * 15))) {
 			r.push(`${His} <span class="ncs">NCS</span> has <span class="change positive">raised the pitch of ${his} voice, ${he} now sounds more`);
@@ -950,7 +950,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Pussy/Ass-Pussy rejuvenation.`);
+		**	Pussy/Ass-Pussy rejuvenation.
 		**	10% chance of either one rejuvenating per week. (The Child Whore's delight!)
 		*/
 		if (slave.geneMods.rapidCellGrowth !== 1) {
@@ -965,7 +965,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			}
 		}
 		/*
-		**	r.push(`reset youthening for those that just got younger (see age above) or for already lolified slaves.`);
+		**	reset youthening for those that just got younger (see age above) or for already lolified slaves.
 		*/
 		if (youthening > 0 || slave.NCSyouthening > 9) {
 			slave.NCSyouthening = 0;
diff --git a/src/endWeek/saNanny.js b/src/endWeek/saNanny.js
index 9908fd1643332cf4955f0a4aa6ae2fe78f206167..6c1a49e9b6de216f05bbaacc3d9a95fe73d7724f 100644
--- a/src/endWeek/saNanny.js
+++ b/src/endWeek/saNanny.js
@@ -61,7 +61,7 @@ App.SlaveAssignment.nanny = function(slave) {
 		let t = '';
 
 		// TODO:
-		if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+		if (App.Data.Careers.General.servant.includes(slave.career)) {
 			t += ` ${He} has experience with nannying from ${his} life before ${he} was a slave, making ${him} more effective.`;
 		} else if (slave.skill.servant >= V.masteredXP) {
 			t += ` ${He} has experience with nannying from working for you, making ${him} more effective.`;
diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js
index 9141e651868e2e6ae963086a7ba4232e91c3fc4b..ff28caacd6fadd9ecf5994607b4a1810ed6361ad 100644
--- a/src/endWeek/saRecruitGirls.js
+++ b/src/endWeek/saRecruitGirls.js
@@ -812,7 +812,7 @@ App.SlaveAssignment.recruitGirls = (function() {
 			r.push(`${He} has experience in recruitment from working for you.`);
 			V.recruiterProgress += 2;
 		} else if (slave.skill.recruiter > 120) {
-			r.push(`${He} has enough experience in recruitment to beging applying it.`);
+			r.push(`${He} has enough experience in recruitment to begin applying it.`);
 			V.recruiterProgress += 1;
 		}
 		if (slave.skill.recruiter < V.masteredXP) {
diff --git a/src/endWeek/saRulesFunctions.js b/src/endWeek/saRulesFunctions.js
index 9a9f3ee306860f7a4a9d1d8f2f29907ce6812d8c..ab06cf112cce4a25d5f89d5f5739d8ba7567f982 100644
--- a/src/endWeek/saRulesFunctions.js
+++ b/src/endWeek/saRulesFunctions.js
@@ -618,11 +618,11 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 		His, He,
 		he, him, his
 	} = getPronouns(slave);
-	const _who = (slave.rules.release.slaves === 1) ? "other slaves" : `${his} family`;
+	const who = (slave.rules.release.slaves === 1) ? "other slaves" : `${his} family`;
 	/* should be the only two choices if we get here */
 	if (slave.fetishKnown === 1 && slave.fetishStrength > 60) {
 		if (slave.fetish === "submissive") {
-			el.append(`plead that ${_who} fuck ${him}. `);
+			el.append(`plead that ${who} fuck ${him}. `);
 			if (App.EndWeek.saVars.averageDick > 4) {
 				if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) {
 					if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) {
@@ -654,7 +654,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 			el.append(`${he} fancies. `);
 			seX(slave, "oral", "slaves", "penetrative", random(5, 15));
 		} else if (slave.fetish === "humiliation") {
-			el.append(`demand that ${_who} let ${him} fuck them in public. `);
+			el.append(`demand that ${who} let ${him} fuck them in public. `);
 			if (!slave.rivalry) {
 				const rival = randomRapeRivalryTarget(slave, (s) => (s.devotion <= 20 && s.trust < -20));
 				if (rival) {
@@ -681,7 +681,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 				seX(slave, "penetrative", "slaves", "penetrative", random(1, 3));
 			}
 		} else if (slave.fetish === "buttslut" && canDoAnal(slave)) {
-			el.append(`demand that ${_who} penetrate ${his} anus. `);
+			el.append(`demand that ${who} penetrate ${his} anus. `);
 			if (App.EndWeek.saVars.averageDick > 4) {
 				if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) {
 					if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) {
@@ -693,7 +693,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 			}
 			seX(slave, "anal", "slaves", "penetrative", random(5, 12));
 		} else if (slave.fetish === "boobs") {
-			el.append(`demand that ${_who} massage ${his} breasts. `);
+			el.append(`demand that ${who} massage ${his} breasts. `);
 			if (slave.lactation > 0) {
 				slave.lactationDuration = 2;
 				slave.boobs -= slave.boobsMilk;
@@ -711,10 +711,10 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 			}
 			el.append(`to let ${him} fuck them. `);
 			if (!slave.rivalry) {
-				const _rival = randomRapeRivalryTarget(slave, (s) => { return (s.devotion <= 50 && s.sexualFlaw !== "none"); });
-				if (_rival) {
-					el.append(`${He} focuses on ${SlaveFullName(_rival)} who has a sexual flaw ${slave.slaveName} can exploit. ${He} sadistically `);
-					if (_rival.sexualFlaw === "hates oral") {
+				const rival = randomRapeRivalryTarget(slave, (s) => { return (s.devotion <= 50 && s.sexualFlaw !== "none"); });
+				if (rival) {
+					el.append(`${He} focuses on ${SlaveFullName(rival)} who has a sexual flaw ${slave.slaveName} can exploit. ${He} sadistically `);
+					if (rival.sexualFlaw === "hates oral") {
 						el.append(`rapes the poor slave's face`);
 						if (!canAchieveErection(slave)) {
 							el.append(` with `);
@@ -724,8 +724,8 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 								el.append(`a strap-on`);
 							}
 						}
-						el.append(`. ${_rival.slaveName} hates oral`);
-					} else if (_rival.sexualFlaw === "hates penetration" && canDoVaginal(_rival)) {
+						el.append(`. ${rival.slaveName} hates oral`);
+					} else if (rival.sexualFlaw === "hates penetration" && canDoVaginal(rival)) {
 						el.append(`rapes the poor slave's pussy`);
 						if (!canAchieveErection(slave)) {
 							el.append(` with `);
@@ -735,8 +735,8 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 								el.append(`a strap-on`);
 							}
 						}
-						el.append(`. ${_rival.slaveName} hates penetration`);
-					} else if ((_rival.sexualFlaw === "hates anal" || _rival.sexualFlaw === "hates penetration") && canDoAnal(_rival)) {
+						el.append(`. ${rival.slaveName} hates penetration`);
+					} else if ((rival.sexualFlaw === "hates anal" || rival.sexualFlaw === "hates penetration") && canDoAnal(rival)) {
 						el.append(`rapes the poor slave's ass`);
 						if (!canAchieveErection(slave)) {
 							el.append(` with `);
@@ -746,12 +746,12 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 								el.append(`a strap-on`);
 							}
 						}
-						el.append(`. ${_rival.slaveName} hates anal`);
-					} else if (_rival.sexualFlaw === "shamefast") {
-						el.append(`rapes the poor slave in public. ${_rival.slaveName} is terribly shamefast`);
-					} else if (_rival.sexualFlaw === "idealistic") {
-						const {him2} = getPronouns(_rival).appendSuffix("2");
-						el.append(`rapes the poor slave every time ${he} catches ${him2} being romantic. ${_rival.slaveName} is still idealistic`);
+						el.append(`. ${rival.slaveName} hates anal`);
+					} else if (rival.sexualFlaw === "shamefast") {
+						el.append(`rapes the poor slave in public. ${rival.slaveName} is terribly shamefast`);
+					} else if (rival.sexualFlaw === "idealistic") {
+						const {him2} = getPronouns(rival).appendSuffix("2");
+						el.append(`rapes the poor slave every time ${he} catches ${him2} being romantic. ${rival.slaveName} is still idealistic`);
 					} else {
 						el.append(`rapes the poor slave every chance ${he} gets,`);
 					}
@@ -759,15 +759,15 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 					App.UI.DOM.appendNewElement("span", el, `starts a rivalry`, "lightsalmon");
 					el.append(` between them. `);
 					slave.rivalry = 1;
-					_rival.rivalry = 1;
-					slave.rivalryTarget = _rival.ID;
-					_rival.rivalryTarget = slave.ID;
-					SimpleSexAct.Slave(_rival, 4);
-					if (canPenetrate(_rival)) {
+					rival.rivalry = 1;
+					slave.rivalryTarget = rival.ID;
+					rival.rivalryTarget = slave.ID;
+					SimpleSexAct.Slave(rival, 4);
+					if (canPenetrate(rival)) {
 						seX(slave, "penetrative", "slaves", "penetrative", random(1, 3));
 					}
-					if (!App.Utils.sexAllowed(slave, _rival)) {
-						el.append(`As the rules do not permit ${slave.slaveName} and ${_rival.slaveName} to have sex, ${he} is `);
+					if (!App.Utils.sexAllowed(slave, rival)) {
+						el.append(`As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is `);
 						App.UI.DOM.appendNewElement("span", el, `severely punished.`, "yellow");
 						slave.trust -= 4;
 					}
@@ -778,7 +778,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 				seX(slave, "penetrative", "slaves", "penetrative", random(1, 3));
 			}
 		} else if (slave.fetish === "masochist") {
-			el.append(`demand that ${_who} hurt ${him}. `);
+			el.append(`demand that ${who} hurt ${him}. `);
 			if (App.EndWeek.saVars.averageDick > 4) {
 				if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) {
 					if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) {
@@ -801,27 +801,27 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 			}
 			SimpleSexAct.Slave(slave, 12);
 		} else if (slave.fetish === "dom") {
-			el.append(`force ${_who} to submit to ${him}. `);
+			el.append(`force ${who} to submit to ${him}. `);
 			if (!slave.rivalry) {
-				const _rival = randomRapeRivalryTarget(slave, (s) => { return (s.devotion <= 20 && s.trust < -20); });
-				if (_rival) {
-					el.append(`${He} repeatedly rapes a reluctant ${SlaveFullName(_rival)} ${he} can't seem to keep ${his} hand`);
+				const rival = randomRapeRivalryTarget(slave, (s) => { return (s.devotion <= 20 && s.trust < -20); });
+				if (rival) {
+					el.append(`${He} repeatedly rapes a reluctant ${SlaveFullName(rival)} ${he} can't seem to keep ${his} hand`);
 					if (hasBothArms(slave) || !hasAnyArms(slave)) {
 						el.append(`s`);
 					}
 					if (!hasAnyArms(slave)) {
 						el.append(` (so to speak)`);
 					}
-					el.append(` off the poor slave, who can't avoid ${him}. Not surprisingly, ${_rival.slaveName} resents this, and ${slave.slaveName}'s ongoing sexual abuse `);
+					el.append(` off the poor slave, who can't avoid ${him}. Not surprisingly, ${rival.slaveName} resents this, and ${slave.slaveName}'s ongoing sexual abuse `);
 					App.UI.DOM.appendNewElement("span", el, `starts a rivalry`, "lightsalmon");
 					el.append(` between them. `);
 					slave.rivalry = 1;
-					_rival.rivalry = 1;
-					slave.rivalryTarget = _rival.ID;
-					_rival.rivalryTarget = slave.ID;
-					SimpleSexAct.Slave(_rival, 4);
-					if (!App.Utils.sexAllowed(slave, _rival)) {
-						el.append(`As the rules do not permit ${slave.slaveName} and ${_rival.slaveName} to have sex, ${he} is `);
+					rival.rivalry = 1;
+					slave.rivalryTarget = rival.ID;
+					rival.rivalryTarget = slave.ID;
+					SimpleSexAct.Slave(rival, 4);
+					if (!App.Utils.sexAllowed(slave, rival)) {
+						el.append(`As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is `);
 						App.UI.DOM.appendNewElement("span", el, `severely punished.`, "yellow");
 						slave.trust -= 4;
 					}
@@ -832,7 +832,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 				actX(slave, "penetrative", random(6, 9));
 			}
 		} else if (slave.fetish === "pregnancy") {
-			el.append(`demand that ${_who} indulge ${his} pregnancy fetish. `);
+			el.append(`demand that ${who} indulge ${his} pregnancy fetish. `);
 			if (App.EndWeek.saVars.averageDick > 5) {
 				if (slave.mpreg === 0) {
 					if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) {
@@ -858,7 +858,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 				actX(slave, "penetrative", random(6, 9));
 			}
 		} else if (slave.energy > 95) {
-			el.append(`demand that ${_who} satisfy ${his} formidable appetites. `);
+			el.append(`demand that ${who} satisfy ${his} formidable appetites. `);
 			if (App.EndWeek.saVars.averageDick > 4) {
 				if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) {
 					if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) {
@@ -884,14 +884,14 @@ App.EndWeek.Rules.rapeFetish = function(slave) {
 				actX(slave, "penetrative", random(3, 6));
 			}
 		} else {
-			el.append(`demand that ${_who} have sex with ${him}. `);
+			el.append(`demand that ${who} have sex with ${him}. `);
 			SimpleSexAct.Slave(slave, 7);
 			if (canPenetrate(slave)) {
 				seX(slave, "anal", "slaves", "penetrative", random(3, 6));
 			}
 		}
 	} else {
-		el.append(`demand that ${_who} have sex with ${him}. `);
+		el.append(`demand that ${who} have sex with ${him}. `);
 		SimpleSexAct.Slave(slave, 7);
 		if (canPenetrate(slave)) {
 			actX(slave, "penetrative", random(3, 6));
@@ -1246,7 +1246,7 @@ App.EndWeek.Rules.permissiveDrugEffects = function(slave) {
 		he, him, his
 	} = getPronouns(slave);
 
-	const _who = (slave.rules.release.slaves === 1) ? `other slaves` : `${his} family`;
+	const who = (slave.rules.release.slaves === 1) ? `other slaves` : `${his} family`;
 	/* should be the only two choices if we get here */
 	if (slave.balls > 0) {
 		if (slave.drugs === "testicle enhancement" || slave.drugs === "intensive testicle enhancement") {
@@ -1258,11 +1258,11 @@ App.EndWeek.Rules.permissiveDrugEffects = function(slave) {
 					} else {
 						el.append(`${his} cumhole produces slow, anemic ejaculations, no matter how backed up ${he} is. `);
 					}
-					el.append(`${He} is very reliant on ${_who} to help ${him}, which `);
+					el.append(`${He} is very reliant on ${who} to help ${him}, which `);
 					App.UI.DOM.appendNewElement("span", el, `habituates ${him}`, "mediumaquamarine");
 					el.append(` to slave sex. `);
 				} else {
-					el.append(`${His} terribly swollen balls force ${him} to rely on ${_who} for release several times a day, and jetting cum into and onto them `);
+					el.append(`${His} terribly swollen balls force ${him} to rely on ${who} for release several times a day, and jetting cum into and onto them `);
 					App.UI.DOM.appendNewElement("span", el, `habituates ${him}`, "mediumaquamarine");
 					el.append(` to slave sex. `);
 				}
@@ -1281,11 +1281,11 @@ App.EndWeek.Rules.permissiveDrugEffects = function(slave) {
 					} else {
 						el.append(`${his} cumhole produces slow, anemic ejaculations, no matter how backed up ${he} is. `);
 					}
-					el.append(`${He} is completely dependent on your ${_who} to help ${him}, which `);
+					el.append(`${He} is completely dependent on your ${who} to help ${him}, which `);
 					App.UI.DOM.appendNewElement("span", el, `habituates ${him}`, "mediumaquamarine");
 					el.append(` to slave sex. `);
 				} else {
-					el.append(`${His} grotesquely swollen balls force ${him} to rely on ${_who} for release throughout times a day, and swelling them with cum `);
+					el.append(`${His} grotesquely swollen balls force ${him} to rely on ${who} for release throughout times a day, and swelling them with cum `);
 					App.UI.DOM.appendNewElement("span", el, `habituates ${him}`, "mediumaquamarine");
 					el.append(` to slave sex, though you have to take precautions so ${he} doesn't knock up your entire stock. `);
 				}
@@ -1428,13 +1428,13 @@ App.EndWeek.Rules.partnerDrugEffects = function(slave) {
 	const {He, His,
 		he, him, his} = getPronouns(slave);
 
-	const _sr = getSlave(slave.relationshipTarget);
+	const sr = getSlave(slave.relationshipTarget);
 	let his2;
 	let him2;
-	if (_sr) {
+	if (sr) {
 		({
 			his2, him2
-		} = getPronouns(_sr).appendSuffix("2"));
+		} = getPronouns(sr).appendSuffix("2"));
 	}
 	if (slave.balls > 0) {
 		if (slave.drugs === "testicle enhancement" || slave.drugs === "intensive testicle enhancement") {
@@ -1475,7 +1475,7 @@ App.EndWeek.Rules.partnerDrugEffects = function(slave) {
 			}
 		}
 	}
-	if (slave.drugs === "super fertility drugs" && canImpreg(slave, _sr)) {
+	if (slave.drugs === "super fertility drugs" && canImpreg(slave, sr)) {
 		if ((slave.devotion > 20) || (slave.trust < -20)) {
 			el.append(`${His} reproductive system is in overdrive leading ${him} to come to find ${his} ${relationshipTerm(slave)} for insemination several times a day; ${he} `);
 			App.UI.DOM.appendNewElement("span", el, `desperately hopes`, "mediumaquamarine");
diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js
index c5e1fdd264caef2957baf1ccb5d933f8cbf411ee..ef1f299fcec6923e1dec4774a0f7d1283f5af966 100644
--- a/src/endWeek/saServant.js
+++ b/src/endWeek/saServant.js
@@ -18,7 +18,7 @@ App.SlaveAssignment.servant = (function() {
 	return saServant;
 
 	/**
-	 * @param {App.Entity.SlaveState} slave
+	 * @param {FC.ReportSlave} slave
 	 * @param {number} [bonus=0] - bonus from facility leader effects
 	 * @returns {string}
 	 */
@@ -149,7 +149,7 @@ App.SlaveAssignment.servant = (function() {
 			r.push(`${He} does ${his} very best to be the perfect house${wife}, making ${him} an outstanding servant.`);
 		}
 
-		if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+		if (App.Data.Careers.General.servant.includes(slave.career)) {
 			r.push(`${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`);
 		} else if (slave.skill.servant >= V.masteredXP) {
 			r.push(`${He} has experience with house keeping from working for you, making ${him} more effective.`);
@@ -192,7 +192,7 @@ App.SlaveAssignment.servant = (function() {
 	}
 
 	/**
-	 * @param {App.Entity.SlaveState} slave
+	 * @param {FC.ReportSlave} slave
 	 *
 	 */
 	function physicalEffects(slave) {
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index c51cff0e4e979b6498936521b9082ea73e54d7bb..aee7713c35c10215c98ec36e11e7e9aadefc0a0e 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1394,7 +1394,7 @@ App.SlaveAssignment.serveThePublic = (function() {
 							} else {
 								r += `giving a good titfuck,`;
 							}
-							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times they were used this week.`;
+							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times ${his} breasts were used this week.`;
 							slave.need -= mammaryUse;
 						}
 						break;
diff --git a/src/endWeek/saTakeClasses.js b/src/endWeek/saTakeClasses.js
index 0ceaf6c4795f1e3eacdaca4bba2dfa0f283362ad..43e2302044369d493f82d34a845f2fb6bf6cc620 100644
--- a/src/endWeek/saTakeClasses.js
+++ b/src/endWeek/saTakeClasses.js
@@ -679,7 +679,7 @@ App.SlaveAssignment.takeClasses = (function() {
 						} else if (slave.skill.stewardess <= 120) {
 							r += ` The tutor has ${him} attend lectures on slave breaking and management, to prepare ${him} for running a facility. ${He} keeps working with the cleaning crews, but now takes command during outings.`;
 						} else if (slave.skill.stewardess <= 200) {
-							r += ` ${He} is familiar with every nook and cranny of your arcology. ${He} no longer accompanies your cleaning crews, instead ${he} organizes their deployments. ${He}is becoming an adept manager.`;
+							r += ` ${He} is familiar with every nook and cranny of your arcology. ${He} no longer accompanies your cleaning crews, instead ${he} organizes their deployments. ${He} is becoming an adept manager.`;
 						}
 						r += ` ${slaveSkillIncrease('stewardess', slave, skillIncrease)}`;
 					}
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index ec8fc500ffa044c0570dc172b83f262c1ac4ed2c..c78c72a459eb8bf6867b71997db065ad6493ccf4 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -1475,7 +1475,7 @@ App.SlaveAssignment.whore = (function() {
 							} else {
 								r += `giving a good titfuck,`;
 							}
-							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times they were used this week.`;
+							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times ${his} breasts were used this week.`;
 							slave.need -= mammaryUse;
 						}
 						break;
diff --git a/src/events/JE/jeSlaveDisputeBreedingDeal.js b/src/events/JE/jeSlaveDisputeBreedingDeal.js
index 1d747a96eb97770daa5063dac3bca02600aede9e..d15c3f741635c3f421b1357bcad9477d350ef99e 100644
--- a/src/events/JE/jeSlaveDisputeBreedingDeal.js
+++ b/src/events/JE/jeSlaveDisputeBreedingDeal.js
@@ -103,8 +103,8 @@ App.Events.JESlaveDisputeBreedingDeal = class JESlaveDisputeBreedingDeal extends
 			r.push(`You offer to buy out the deal, paying the breeder and taking the slave yourself, and passing the child off to the buyer. The citizen gets what he wants and speaks <span class="green">kindly</span> in public about how you helped smooth over a rather rough dispute. The breeder sends a <span class="green">positive note</span> around the industry to the effect that slavers trading with your arcology can expect to be aided in times of need; though the loss of a star mother always stings.`);
 			V.arcologies[0].prosperity += 3;
 			repX(300, "event");
-			frag.append(App.UI.newSlaveIntro(slave));
 			App.Events.addParagraph(frag, r);
+			frag.append(App.UI.newSlaveIntro(slave));
 			return frag;
 		}
 	}
diff --git a/src/events/JE/jeSlaveDisputeSlaveDeal.js b/src/events/JE/jeSlaveDisputeSlaveDeal.js
index f3e67f0af05fae7fd4353c5843de02952b05c40c..e6de4acf22256c03d69787f8250381bd7c04cbc0 100644
--- a/src/events/JE/jeSlaveDisputeSlaveDeal.js
+++ b/src/events/JE/jeSlaveDisputeSlaveDeal.js
@@ -88,8 +88,8 @@ App.Events.JESlaveDisputeSlaveDeal = class JESlaveDisputeSlaveDeal extends App.E
 			V.arcologies[0].prosperity += 5;
 			repX(2500, "event");
 			r.push(`You offer to simply buy out the contract, taking the slave for yourself, letting the slave trader out of her side of the deal, and providing for the daughter's medical care. The trader lets it be known amongst her peers that you will make things right no matter the cost to yourself, <span class="green">increasing prosperity.</span> The story of the mother willing to be enslaved gets around quickly, <span class="green">capturing the hearts</span> of more romantic citizens. The mother, meanwhile, presents ${himself} for enslavement, <span class="hotpink">very grateful</span> that you've saved ${his} daughter's life.`);
-			App.Events.addParagraph(frag, r);
 			frag.append(App.UI.newSlaveIntro(slave));
+			App.Events.addParagraph(frag, r);
 			return frag;
 		}
 	}
diff --git a/src/events/JE/jeSlaveDisputeSlaveTraining.js b/src/events/JE/jeSlaveDisputeSlaveTraining.js
index 348671b15ffac5d8fdeb5ae1c50735af07c11767..086a3959184f2510cce9baef4b32b9d4d5d4c6f9 100644
--- a/src/events/JE/jeSlaveDisputeSlaveTraining.js
+++ b/src/events/JE/jeSlaveDisputeSlaveTraining.js
@@ -106,8 +106,8 @@ App.Events.JESlaveDisputeSlaveTraining = class JESlaveDisputeSlaveTraining exten
 			r.push(`You offer to simply buy out the deal, paying the trainer and taking the slave yourself, and letting the buyer out of the payment. The trainer lets it be known that you support businessmen, who can trust you to ensure they don't come out second best, <span class="green">increasing prosperity.</span> The buyer lets you know privately that he recently had a business deal go bad, so he's in a tough cash situation right now; he's so grateful for your assistance in this embarrassing situation that he talks <span class="green">effusively</span> for days to anyone who will listen about your discreet administration of the arcology. The slave, meanwhile, arrives at your penthouse, <span class="hotpink">rather hopeful</span> that ${he}'s going to a good master.`);
 			V.arcologies[0].prosperity += 5;
 			repX(2500, "event");
-			frag.append(App.UI.newSlaveIntro(slave));
 			App.Events.addParagraph(frag, r);
+			frag.append(App.UI.newSlaveIntro(slave));
 			return frag;
 		}
 	}
diff --git a/src/events/JE/jeSlaveDisputeVirginityDeal.js b/src/events/JE/jeSlaveDisputeVirginityDeal.js
index 4adb0bc1f38784747db8b2458ca5d2f4e9392830..bd3d1cfba8bcb59c65fdceda9d93b9aec6adae41 100644
--- a/src/events/JE/jeSlaveDisputeVirginityDeal.js
+++ b/src/events/JE/jeSlaveDisputeVirginityDeal.js
@@ -83,8 +83,8 @@ App.Events.JESlaveVirginityDeal = class JESlaveVirginityDeal extends App.Events.
 			const frag = new DocumentFragment();
 			let r = [];
 			r.push(`You offer to simply buy out the contract, taking the slave for yourself. This lets the buyer out of buying ${him}, and the slaveowner gets his money; but it soon becomes apparent that what both of them were really looking for is an opportunity to put one over on the other. Neither is pleased to be denied a petty victory, but they both have the sense to keep their mouths shut. The poor slave, meanwhile, appears in the penthouse entryway, <span class="hotpink">hopeful</span> that ${he}'s been lucky enough to end up in a less abusive situation.`);
-			frag.append(App.UI.newSlaveIntro(slave));
 			App.Events.addParagraph(frag, r);
+			frag.append(App.UI.newSlaveIntro(slave));
 			return frag;
 		}
 	}
diff --git a/src/events/PE/peAssociatesPublicSlut.js b/src/events/PE/peAssociatesPublicSlut.js
index 691abcd4eeb759766f8cd164741c85f337d35144..6b0ce51003168bf7903c6855ede492b6b83c2a97 100644
--- a/src/events/PE/peAssociatesPublicSlut.js
+++ b/src/events/PE/peAssociatesPublicSlut.js
@@ -10,7 +10,7 @@ App.Events.PEAssociatesPublicSlut = class PEAssociatesPublicSlut extends App.Eve
 
 		V.nextButton = "Continue";
 		V.nextLink = "RIE Eligibility Check";
-		const _num = random(1, 99);
+		const num = random(1, 99);
 
 		App.Events.addParagraph(node, [
 			`The Promenade is especially vibrant today, humming with activity as the wealthier of`,
@@ -24,28 +24,28 @@ App.Events.PEAssociatesPublicSlut = class PEAssociatesPublicSlut extends App.Eve
 
 
 
-		if (_num < V.seeDicks) {
+		if (num < V.seeDicks) {
 			App.Events.addParagraph(node, [`His pink minidress is scrunched up around his waist, having been peeled back from his flat chest and hiked up to reveal his rather small genitals and his butt. He is bent over the railing at the waist, his hands and legs both shackled at either end of the rail, and a ring gag keeps him relatively quiet, while simultaneously keeping his mouth available for use.`]);
 		} else {
 			App.Events.addParagraph(node, [`Her pink minidress is scrunched up around her waist, having been peeled back from her buxom chest and hiked up to reveal her lewd pussy and ass. She is bent over the railing at the waist, her hands and legs both shackled at either end of the rail, while a ring gag keeps her relatively quiet, while simultaneously keeping her mouth available for use.`]);
 		}
 
-		if (_num < V.seeDicks) {
-			r.push(`The one restraining him is a business associate of yours. She's a beautiful woman who cuts a gorgeous figure in her expensive, tasteful business attire. You have some rapport with one another and she greets you cheerily and you make small talk as she finishes up shackling her newly minted slave. He was, she explains, her boyfriend, who had accrued significant debt due to his severe lack of business sense and tact. She had bought out his debt in order to save him from enslavement, only to find out not long after that he had been cheating on her with another free woman. Since she owned his debt, it took only a few formalities to turn him into her property as revenge. "Since he likes sluts so much, I'm going to turn him into one!" She giggles, while stroking the struggling traps luxurious bleach blonde hair. Her eyes light up as her gaze returns to you. You know what's coming, and are surprised it took this long for it to occur to her. She reaches around her slave and spreads his ass cheeks. "`);
+		if (num < V.seeDicks) {
+			r.push(`The one restraining him is a business associate of yours. She's a beautiful woman who cuts a gorgeous figure in her expensive, tasteful business attire. You have some rapport with one another and she greets you cheerily and you make small talk as she finishes up shackling her newly minted slave. He was, she explains, her boyfriend, who had accrued significant debt due to his severe lack of business sense and tact. She had bought out his debt in order to save him from enslavement, only to find out not long after that he had been cheating on her with another free woman. Since she owned his debt, it took only a few formalities to turn him into her property as revenge. "Since he likes sluts so much, I'm going to turn him into one!" She giggles, while stroking the struggling traps luxurious bleach blonde hair. Her eyes light up as her gaze returns to you. You know what's coming, and are surprised it took this long for it to occur to her. She reaches around her slave and spreads his ass cheeks.`);
 			if (V.PC.title === 1) {
-				r.push(`Sir,`);
+				r.push(`"Sir,`);
 			} else {
-				r.push(`Ma'am,`);
+				r.push(`"Ma'am,`);
 			}
 			r.push(`it would honor me if you fucked him!"`);
 
 			r.push(`You consider the slave's anus. Your associate has clearly spent all day customizing her new toy, it looks freshly bleached and is smooth and inviting. It effectively has been transformed into a sex organ.`);
 		} else {
-			r.push(`The one restraining her is a business associate of yours. He's a well built man who cuts a handsome figure in his expensive, tasteful business attire. You have some rapport with one another and he greets you cheerily and you make small talk as he finishes up shackling his newly minted slave. She was, he explains, his girlfriend, who had accrued significant debt due to her severe lack of business sense and tact. He had bought out her debt in order to save her from enslavement, only to find out not long after that she had been cheating on him with another free man. Since he owned her debt, it took only a few formalities to turn her into his property as revenge. "She was already a slut, I've simply made her look the part, and play it more honestly!" he chuckles, while fondling the struggling bimbo's ample ass. He favors you with a rueful smile as his gaze returns to you. You know what's coming, and are surprised it took this long for it to occur to him. He reaches around his slave and spreads her ass cheeks. "`);
+			r.push(`The one restraining her is a business associate of yours. He's a well built man who cuts a handsome figure in his expensive, tasteful business attire. You have some rapport with one another and he greets you cheerily and you make small talk as he finishes up shackling his newly minted slave. She was, he explains, his girlfriend, who had accrued significant debt due to her severe lack of business sense and tact. He had bought out her debt in order to save her from enslavement, only to find out not long after that she had been cheating on him with another free man. Since he owned her debt, it took only a few formalities to turn her into his property as revenge. "She was already a slut, I've simply made her look the part, and play it more honestly!" he chuckles, while fondling the struggling bimbo's ample ass. He favors you with a rueful smile as his gaze returns to you. You know what's coming, and are surprised it took this long for it to occur to him. He reaches around his slave and spreads her ass cheeks.`);
 			if (V.PC.title === 1) {
-				r.push(`Sir,`);
+				r.push(`"Sir,`);
 			} else {
-				r.push(`Ma'am,`);
+				r.push(`"Ma'am,`);
 			}
 			r.push(`it would honor me if you fucked her! I've had her hymen restored just a few hours ago, first time is all yours if you want it."`);
 
@@ -55,14 +55,14 @@ App.Events.PEAssociatesPublicSlut = class PEAssociatesPublicSlut extends App.Eve
 		App.Events.addParagraph(node, r);
 
 		App.Events.addResponses(node, [
-			new App.Events.Result(`Give ${(_num < V.seeDicks) ? "him his" : "her the"} first taste of slave life`, taste),
+			new App.Events.Result(`Give ${(num < V.seeDicks) ? "him his" : "her the"} first taste of slave life`, taste),
 			new App.Events.Result(`Decline, but suggest coffee in the café across the street`, decline),
 		]);
 
 		function taste() {
 			const frag = new DocumentFragment();
 			let r = [];
-			if (_num < V.seeDicks) {
+			if (num < V.seeDicks) {
 				r.push(`Taking a slave's anal virginity is hardly novel for you, yet somehow it never stops being fun. You grab the bottle of lubricant your associate has left out for use and begin to generously lubricate his asshole.`);
 				if (V.PC.dick === 0) {
 					r.push(`You also reach for one of the brand new strap-ons she has left out for ladies who wish to avail of her slut, tearing it eagerly from its box.`);
@@ -113,7 +113,7 @@ App.Events.PEAssociatesPublicSlut = class PEAssociatesPublicSlut extends App.Eve
 
 		function decline() {
 			let r = [];
-			if (_num < V.seeDicks) {
+			if (num < V.seeDicks) {
 				r.push(`You decline her offer, but instead offer to buy her coffee at the nearby café. You enjoy some especially delicious coffee together while admiring the view of her slave's ass being broken in by a trickle of curious parties, who also occasionally walk around to the other side of the helpless sissy to use his mouth.`);
 			} else {
 				r.push(`You decline his offer, but instead offer to buy him coffee at the nearby café. You enjoy some especially delicious coffee together while admiring the view of his slave's pussy being broken in by a trickle of curious parties, who also occasionally avail of her ass or walk around to the other side of the helpless slut to use her mouth.`);
diff --git a/src/events/PE/peHeadgirlConcubine.js b/src/events/PE/peHeadgirlConcubine.js
index ff53b7102d7cfa07169787e70a752d34d98216f0..0799c5d947abac9cd9bfb80c1509b1c257073643 100644
--- a/src/events/PE/peHeadgirlConcubine.js
+++ b/src/events/PE/peHeadgirlConcubine.js
@@ -55,7 +55,7 @@ App.Events.PEHeadgirlConcubine = class PEHeadgirlConcubine extends App.Events.Ba
 		};
 
 
-		r.push(`You wake up one morning to find ${S.HeadGirl.slaveName} and ${S.Concubine.slaveName} waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
+		r.push(`You wake up one morning to find`, contextualIntro(V.PC, S.HeadGirl, "DOM"), `and`, contextualIntro(S.HeadGirl, S.Concubine, "DOM"), `waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
 		if (S.HeadGirl.boobs >= 10000 && S.Concubine.boobs >= 10000) {
 			r.push(`bed (a position that smashes their massive breasts together on one side),`);
 		} else if (S.HeadGirl.belly >= 45000 && S.Concubine.belly >= 45000) {
@@ -475,7 +475,7 @@ App.Events.PEHeadgirlConcubine = class PEHeadgirlConcubine extends App.Events.Ba
 			if (S.HeadGirl.belly >= 10000) {
 				r.push(`into ${S.HeadGirl.slaveName}'s taut belly`);
 			}
-			r.push(`as you maneuver yourself into place${(V.PC.dick === 0) ? "and don a strap-on, since there isn't enough space for tribbing to work here" : ""}.`);
+			r.push(`as you maneuver yourself into place${(V.PC.dick === 0) ? " and don a strap-on, since there isn't enough space for tribbing to work here" : ""}.`);
 			if (canDo.vaginal.conc) {
 				/* this is up here to give the PC priority on pregnancy */
 				if (canImpreg(S.Concubine, V.PC)) {
diff --git a/src/events/PESS/pessDjPublicity.js b/src/events/PESS/pessDjPublicity.js
index c693ace410fe618bec816270d4b66ac1fcba92fd..45839cc810bf33bedb33328c7553e59faec73f2c 100644
--- a/src/events/PESS/pessDjPublicity.js
+++ b/src/events/PESS/pessDjPublicity.js
@@ -2,7 +2,7 @@ App.Events.pessDjPublicity = class pessDjPublicity extends App.Events.BaseEvent
 	eventPrerequisites() {
 		return [
 			() => !!S.DJ,
-			() => App.Utils.countFacilityWorkers(["club"]).club >= 5,
+			() => App.Entity.facilities.club.employeesIDs().size >= 5,
 			() => S.DJ.face > 95,
 			() => S.DJ.skill.entertainment >= 100,
 		];
diff --git a/src/events/PESS/pessMadamStrategy.js b/src/events/PESS/pessMadamStrategy.js
index ef063810d1b0347fd262e59b0dbbbbc3724f1e74..9e2575e66ba9969fba3478810777ec667ec70b7b 100644
--- a/src/events/PESS/pessMadamStrategy.js
+++ b/src/events/PESS/pessMadamStrategy.js
@@ -2,7 +2,7 @@ App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEv
 	eventPrerequisites() {
 		return [
 			() => !!S.Madam,
-			() => App.Utils.countFacilityWorkers(["brothel"]).brothel >= 5,
+			() => App.Entity.facilities.brothel.employeesIDs().size >= 5,
 			() => S.Madam.actualAge >= 35 || V.AgePenalty === 0,
 			() => S.Madam.skill.whoring >= 100
 		];
@@ -81,7 +81,7 @@ App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEv
 					}
 				}
 			}
-			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way inventory review with you and ${V.assistant.name}. The three of you carefully review the appearance of each of ${his} whores. ${He} is <span class="devotion inc">properly deferential,</span> but definitely has insight to offer about how many of them appeal to customers. With ${his} input, you put together a plan to <span class="limegreen">correct</span> their deficiencies when they can be pulled out of a shift for a quick surgical improvement.`; //TODO: the fuck is a limegreen
+			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way inventory review with you and ${V.assistant.name}. The three of you carefully review the appearance of each of ${his} whores. ${He} is <span class="devotion inc">properly deferential,</span> but definitely has insight to offer about how many of them appeal to customers. With ${his} input, you put together a plan to <span class="limegreen">correct</span> their deficiencies when they can be pulled out of a shift for a quick surgical improvement.`; // TODO: the fuck is a limegreen
 		}
 	}
 };
diff --git a/src/events/PESS/pessTiredCollectrix.js b/src/events/PESS/pessTiredCollectrix.js
index af8584e868e21ea414296d84a92bc348f2647c21..953ad791e426fdd1e831f3026266503d61a570cd 100644
--- a/src/events/PESS/pessTiredCollectrix.js
+++ b/src/events/PESS/pessTiredCollectrix.js
@@ -2,7 +2,7 @@ App.Events.pessTiredCollectrix = class pessTiredCollectrix extends App.Events.Ba
 	eventPrerequisites() {
 		return [
 			() => !!S.Milkmaid,
-			() => App.Utils.countFacilityWorkers(["dairy"]).dairy >= 5,
+			() => App.Entity.facilities.dairy.employeesIDs().size >= 5,
 			() => S.Milkmaid.health.condition >= 70,
 			() => canAchieveErection(S.Milkmaid),
 			() => cumSlaves().length >= 5,
diff --git a/src/events/PESS/pessTiredMilkmaid.js b/src/events/PESS/pessTiredMilkmaid.js
index 8572c0854c53636d297d14745ea0054cbdbef959..4fdd7b4c51217fb003d4ab7f42b9228c43415933 100644
--- a/src/events/PESS/pessTiredMilkmaid.js
+++ b/src/events/PESS/pessTiredMilkmaid.js
@@ -2,7 +2,7 @@ App.Events.pessTiredMilkmaid = class pessTiredMilkmaid extends App.Events.BaseEv
 	eventPrerequisites() {
 		return [
 			() => !!S.Milkmaid,
-			() => App.Utils.countFacilityWorkers(["dairy"]).dairy >= 5,
+			() => App.Entity.facilities.dairy.employeesIDs().size >= 5,
 			() => S.Milkmaid.health.condition >= 70,
 			() => S.Milkmaid.muscles > 5,
 		];
diff --git a/src/events/PESS/pessWorriedHeadgirl.js b/src/events/PESS/pessWorriedHeadgirl.js
index f0f5caffdd13f94608c19b5d8d25405c132f0a68..37608a2675a7311e6011fd3ddf48175899409d45 100644
--- a/src/events/PESS/pessWorriedHeadgirl.js
+++ b/src/events/PESS/pessWorriedHeadgirl.js
@@ -16,7 +16,7 @@ App.Events.pessWorriedHeadgirl = class pessWorriedHeadgirl extends App.Events.Ba
 			He, His,
 			he, his, him, himself, girl, woman, hers
 		} = getPronouns(S.HeadGirl);
-		const {title:Master}= getEnunciation(S.HeadGirl);
+		const {title:Master} = getEnunciation(S.HeadGirl);
 
 		App.Events.drawEventArt(node, S.HeadGirl);
 
diff --git a/src/events/PETS/petsAggressiveWardeness.js b/src/events/PETS/petsAggressiveWardeness.js
index 0fcc0f24f34a0d3e94dc8fe37579c617a9b71808..2ecc7197a974ebf7c594e7f2e88e6375a6de729f 100644
--- a/src/events/PETS/petsAggressiveWardeness.js
+++ b/src/events/PETS/petsAggressiveWardeness.js
@@ -29,7 +29,8 @@ App.Events.petsAggressiveWardeness = class petsAggressiveWardeness extends App.E
 		App.Events.addParagraph(node, [
 			`As you pass the entrance to the hall of cells where`,
 			App.UI.DOM.slaveDescriptionDialog(S.Wardeness),
-			`breaks bitches late one night, you hear some muffled cursing, followed by moans. Curious, you lean into the one cell with an open door and are treated to the sight of ${S.Wardeness.slaveName} holding ${contextualIntro(S.Wardeness, subSlave, true)}'s head`
+			`breaks bitches late one night, you hear some muffled cursing, followed by moans. Curious, you lean into the one cell with an open door and are treated to the sight of ${S.Wardeness.slaveName} holding`,
+			App.UI.DOM.combineNodes(contextualIntro(S.Wardeness, subSlave, "DOM"), `'s head`)
 		]);
 
 		App.Events.addParagraph(node, [`${hasBothLegs(S.Wardeness) ? `between ${his} legs` : `at ${his} groin`}, receiving what is very obviously non-consensual oral sex. ${S.Wardeness.slaveName} is clearly enjoying ${himself}, but gathers ${himself} together and greets you properly, without stopping.`]);
@@ -40,7 +41,7 @@ App.Events.petsAggressiveWardeness = class petsAggressiveWardeness extends App.E
 		]);
 
 		const choices = [];
-		choices.push(new App.Events.Result(`Encourage the schoolteacher to abuse poor students`, encourage));
+		choices.push(new App.Events.Result(`Encourage the use of sleep deprivation as a breaking tool`, encourage));
 		choices.push(new App.Events.Result(`Have a quiet word with the Wardeness about prisoners' health`, quiet));
 		if (subSlave.anus > 0 && canDoAnal(subSlave)) {
 			choices.push(new App.Events.Result(`The prisoner will take it up the butt, too, if ${he2} wants sleep`, upButt));
diff --git a/src/events/PETS/petsComfortingAttendant.js b/src/events/PETS/petsComfortingAttendant.js
index 3fef0862df9178dbb91a8c67666887cbef6d8be4..d41aaa8b5bce55d954fa11cec0d51f2194d36fd5 100644
--- a/src/events/PETS/petsComfortingAttendant.js
+++ b/src/events/PETS/petsComfortingAttendant.js
@@ -34,8 +34,10 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E
 		}
 		r.push(
 			`company is always nice even if you aren't actively using the spa's resting inhabitants. The steam in the warm pool room is turned up very high, and you can hardly see. As you lower yourself into the warm water, you see`,
-			App.UI.DOM.slaveDescriptionDialog(S.Attendant),
-			`across from you, sitting in the water against the pool wall. ${He}'s holding ${contextualIntro(S.Attendant, subSlave, true)} in ${his} arms, rubbing a comforting hand up and down ${his2} back and murmuring into ${his2} ear. ${subSlave.slaveName} has ${his2} head`);
+			contextualIntro(V.PC, S.Attendant, "DOM"),
+			`across from you, sitting in the water against the pool wall. ${He}'s holding`,
+			contextualIntro(S.Attendant, subSlave, "DOM"),
+			`in ${his} arms, rubbing a comforting hand up and down ${his2} back and murmuring into ${his2} ear. ${subSlave.slaveName} has ${his2} head`);
 		if (S.Attendant.boobs > 2000) {
 			r.push(`almost hidden between ${S.Attendant.slaveName}'s massive tits,`);
 		} else if (S.Attendant.boobs > 1000) {
@@ -64,7 +66,11 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E
 			} else {
 				r.push(`taut`);
 			}
-			r.push(`midriff with your arms and giving ${him} a hug before asking ${him} about ${subSlave.slaveName}. In ${S.Attendant.slaveName}'s opinion, there's nothing really wrong with ${him2}: ${he2}'s just having a little trouble accepting different expectations about human interactions. "${He2} just needs a little help accepting that ${he2}'s a slave and it's ${his2} place to serve you, ${Master}," ${he} says. "Like I have!" ${He} wriggles around in your arms and plants a wet kiss on your nose. ${He}'s clean now, so you release ${him} and ${he} steps over to ${his} towel. As ${he} does, you land a wet slap on ${his}`);
+			r.push(`midriff with your arms and giving ${him} a hug before asking ${him} about ${subSlave.slaveName}. In ${S.Attendant.slaveName}'s opinion, there's nothing really wrong with ${him2}: ${he2}'s just having a little trouble accepting different expectations about human interactions.`,
+				Spoken(S.Attendant, `"${He2} just needs a little help accepting that ${he2}'s a slave and it's ${his2} place to serve you, ${Master},"`),
+				`${he} says.`,
+				Spoken(S.Attendant, `"Like I have!"`),
+				`${He} wriggles around in your arms and plants a wet kiss on your nose. ${He}'s clean now, so you release ${him} and ${he} steps over to ${his} towel. As ${he} does, you land a wet slap on ${his}`);
 			if (S.Attendant.butt > 5) {
 				r.push(`massive`);
 			} else if (S.Attendant.butt > 3) {
@@ -72,7 +78,7 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E
 			} else {
 				r.push(`nice`);
 			}
-			r.push(`butt, eliciting a <span class="hotpink">delighted</span> squeal. You use the information to <span class="hotpink">subtly address</span> ${subSlave.slaveName}'s unhappiness.`);
+			r.push(`butt, eliciting a <span class="devotion inc">delighted</span> squeal. You use the information to <span class="devotion inc">subtly address</span> ${subSlave.slaveName}'s unhappiness.`);
 			S.Attendant.devotion += 4;
 			subSlave.devotion += 4;
 			App.Events.addParagraph(frag, r);
diff --git a/src/events/RE/REBusyBrothel.js b/src/events/RE/REBusyBrothel.js
index ed77ffe24981ef3dc508df3047442993673f7c47..62fa9152cf95eb562cc876d848947f04699b3d3b 100644
--- a/src/events/RE/REBusyBrothel.js
+++ b/src/events/RE/REBusyBrothel.js
@@ -1,7 +1,7 @@
 App.Events.REBusyBrothel = class REBusyBrothel extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => App.Utils.countFacilityWorkers(["brothel"]).brothel > 3
+			() => App.Entity.facilities.brothel.employeesIDs().size > 3
 		];
 	}
 
diff --git a/src/events/RE/REBusyDairy.js b/src/events/RE/REBusyDairy.js
index 69311316df27ac63f711ece16b2c45722af2b719..5ce1dd4ac6e69a121530a53e72e76406794e7327 100644
--- a/src/events/RE/REBusyDairy.js
+++ b/src/events/RE/REBusyDairy.js
@@ -1,7 +1,7 @@
 App.Events.REBusyDairy = class REBusyDairy extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => App.Utils.countFacilityWorkers(["dairy"]).dairy > 3,
+			() => App.Entity.facilities.dairy.employeesIDs().size > 3,
 			() => V.dairyRestraintsSetting < 2
 		];
 	}
diff --git a/src/events/RE/reAnalPunishment.js b/src/events/RE/reAnalPunishment.js
index 880ce08998ba9762d695d9617fe2efb368e8e5f8..630aa04de6f2c714a1f682d1f753408d626f24f7 100644
--- a/src/events/RE/reAnalPunishment.js
+++ b/src/events/RE/reAnalPunishment.js
@@ -108,7 +108,7 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven
 		function takePart() {
 			const frag = new DocumentFragment();
 			let r = [];
-			r.push(`You explain ${slave.slaveName}'s double crime to ${him}, and tell ${S.HeadGirl.slaveName} to get started. Your Head Girl orders the weeping slave to present ${his} anus. The ${(slave.physicalAge > 30) ? woman : girl} does not resist, but nor does ${he} comply. ${S.HeadGirl.slaveName} jabs a thumb into ${slave.slaveName}'s side, right above ${his} kidney, driving the wind out of the slave with a pained grunt. ${He} arches ${his} back involuntarily and ${his} grip on you loosens, so${S.HeadGirl.slaveName} drags ${him} off you, telling ${slave.slaveName} that it'll hurt less if ${he} cooperates and assumes the proper position. ${He} doesn't, so ${S.HeadGirl.slaveName}`);
+			r.push(`You explain ${slave.slaveName}'s double crime to ${him}, and tell ${S.HeadGirl.slaveName} to get started. Your Head Girl orders the weeping slave to present ${his} anus. The ${(slave.physicalAge > 30) ? woman : girl} does not resist, but nor does ${he} comply. ${S.HeadGirl.slaveName} jabs a thumb into ${slave.slaveName}'s side, right above ${his} kidney, driving the wind out of the slave with a pained grunt. ${He} arches ${his} back involuntarily and ${his} grip on you loosens, so ${S.HeadGirl.slaveName} drags ${him} off you, telling ${slave.slaveName} that it'll hurt less if ${he} cooperates and assumes the proper position. ${He} doesn't, so ${S.HeadGirl.slaveName}`);
 			if (slave.belly < 1500) {
 				r.push(`assfucks ${him} lying flat on the floor,`);
 			} else {
diff --git a/src/events/RE/reBrothelFunction.js b/src/events/RE/reBrothelFunction.js
index 6b64066d3715a5e5b0255bfda96be241e793c3a5..389e77590be45b033d17979f6357baecf7026e7d 100644
--- a/src/events/RE/reBrothelFunction.js
+++ b/src/events/RE/reBrothelFunction.js
@@ -1,7 +1,7 @@
 App.Events.REBrothelFunction = class REBrothelFunction extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => App.Utils.countFacilityWorkers(["brothel"]).brothel > 5,
+			() => App.Entity.facilities.brothel.employeesIDs().size > 5,
 		];
 	}
 
diff --git a/src/events/RE/reBusyClub.js b/src/events/RE/reBusyClub.js
index c7d06bd74600695e6e493e4168e8d1130d16a868..feb64a959052626e3894f4c4072500f905f31e49 100644
--- a/src/events/RE/reBusyClub.js
+++ b/src/events/RE/reBusyClub.js
@@ -1,7 +1,7 @@
 App.Events.REBusyClub = class REBusyClub extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => App.Utils.countFacilityWorkers(["club"]).club > 3
+			() => App.Entity.facilities.club.employeesIDs().size > 3
 		];
 	}
 
diff --git a/src/events/RE/reBusyMasterSuite.js b/src/events/RE/reBusyMasterSuite.js
index ce42349f950629724ab3a908040414d607530de8..15d0d95604ff07dff676a30ef9cfe9d55cd85efa 100644
--- a/src/events/RE/reBusyMasterSuite.js
+++ b/src/events/RE/reBusyMasterSuite.js
@@ -23,6 +23,9 @@ App.Events.REBusyMasterSuite = class REBusyMasterSuite extends App.Events.BaseEv
 	}
 
 	execute(node) {
+		V.nextButton = "Continue";
+		V.nextLink = "RIE Eligibility Check";
+
 		const msSlaves = V.slaves.filter((s) => s.fuckdoll === 0 && s.assignment === Job.MASTERSUITE)
 			.map((s) => {
 				/** @type {Array<FC.SlaveActs|"none">} */
diff --git a/src/events/RE/reBusyServantsQuarters.js b/src/events/RE/reBusyServantsQuarters.js
index fd47a24e6688e70f51e8f0615d7afdab705a75c5..471195c8b77d68c14ed7e365a8995056e8e06921 100644
--- a/src/events/RE/reBusyServantsQuarters.js
+++ b/src/events/RE/reBusyServantsQuarters.js
@@ -1,7 +1,7 @@
 App.Events.REBusyServantsQuarters = class REBusyServantsQuarters extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => App.Utils.countFacilityWorkers(["servantsQuarters"]).servantsQuarters > 3
+			() => App.Entity.facilities.servantsQuarters.employeesIDs().size > 3
 		];
 	}
 
diff --git a/src/events/RE/reCitizenHookup.js b/src/events/RE/reCitizenHookup.js
index d1703137715fb472b9cc35ee0d03a84fe6b0694b..31e19b9f697e8f5288ef84e04d1036828d89b113 100644
--- a/src/events/RE/reCitizenHookup.js
+++ b/src/events/RE/reCitizenHookup.js
@@ -404,7 +404,7 @@ App.Events.RECitizenHookup = class RECitizenHookup extends App.Events.BaseEvent
 				default:
 					r.push(`a hot young body.`);
 			}
-			r.push(`Citizens like her often appreciate a good hard fuck, since regular submission to a pounding from sex slaves would be a scandal. There's little opprobrium waiting for you if it's known you had her, though, and she's deliciously eager as you press her down onto the bed${(V.PC.dick === 0) ? "and pull on your usual harness" : ""}. She ruts herself hard back against you as you thrust into her, moaning, and after a short while she begs for it even harder, so you flip her over and mount her like a bitch, making her scream.`);
+			r.push(`Citizens like her often appreciate a good hard fuck, since regular submission to a pounding from sex slaves would be a scandal. There's little opprobrium waiting for you if it's known you had her, though, and she's deliciously eager as you press her down onto the bed${(V.PC.dick === 0) ? " and pull on your usual harness" : ""}. She ruts herself hard back against you as you thrust into her, moaning, and after a short while she begs for it even harder, so you flip her over and mount her like a bitch, making her scream.`);
 			if (S.Concubine) {
 				const {
 					his, him
diff --git a/src/events/RE/reDevotees.js b/src/events/RE/reDevotees.js
index 6a5312b8082a4317aa6305bc887b766234dccaec..745413a04576ea1b340f28fe083c34ad6fefa3cb 100644
--- a/src/events/RE/reDevotees.js
+++ b/src/events/RE/reDevotees.js
@@ -53,9 +53,9 @@ App.Events.REDevotees = class REDevotees extends App.Events.BaseEvent {
 		function casino() {
 			let t = [];
 			t.push(`The croupiers, bouncers and regulars down at the nearest casino hardly know what to think when you appear with a chit full of cash and twice as many partners as you have arms. You live the night big, starting at the poker table with so many tits and asses on display behind you that, <span class="cash inc">baby, you make a killing.</span> ${slaveList} quickly catch the rhythm of the place: slaves can get away with a little more in the smoky, whiskey soaked, money tinted atmosphere, and they <span class="devotion inc">enjoy themselves immensely.</span> They flirt, flash, giggle, kiss each other, and generally destroy the concentration of everyone within twenty ${V.showInches === 2 ? "yards" : "meters"} — except you. Ring-a-ding-ding.`);
-			const _cashX = random(30, 100)*3;
+			const inc = random(30, 100)*3;
 			for (const s of devotees) {
-				cashX(_cashX, "event", s);
+				cashX(inc, "event", s);
 				s.devotion += 4;
 			}
 			return t;
diff --git a/src/events/RE/reFullBed.js b/src/events/RE/reFullBed.js
index d2f0abe51158c02d0b86b7a2262750c13a9c9f64..80ad6bc5df101a07c2294254dfecf75fa054e3b2 100644
--- a/src/events/RE/reFullBed.js
+++ b/src/events/RE/reFullBed.js
@@ -120,7 +120,7 @@ App.Events.REFullBed = class REFullBed extends App.Events.BaseEvent {
 				actX(bedSlaves[1], "penetrative");
 			} else {
 				t.push(`They stiffen as your hands get more adventurous, but immediately relax and begin to work you harder. They orgasm one after the other from your manipulations, before eagerly cleaning`);
-				/** @type {FC.SlaveActs}*/
+				/** @type {FC.SlaveActs} */
 				let hole;
 				bedSlaves.forEach(s => {
 					if (canDoVaginal(s)) {
diff --git a/src/events/RE/reMaleCitizenHookup.js b/src/events/RE/reMaleCitizenHookup.js
index 1dd730f6e1bf87ee5a95da8e679288a35a06d769..6c85e7e3b0fe6366c89d519a31249911d05272b1 100644
--- a/src/events/RE/reMaleCitizenHookup.js
+++ b/src/events/RE/reMaleCitizenHookup.js
@@ -16,7 +16,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 		V.nextLink = "RIE Eligibility Check";
 
 		const FSArray = FutureSocieties.activeFSes(V.arcologies[0]);
-		const _FS = (FSArray.length > 0) ? FSArray.random() : "none";
+		const FS = (FSArray.length > 0) ? FSArray.random() : "none";
 
 		let r = [];
 		r.push(`At night, the best living areas in the arcology offer a constant mélange of selective entertainments. There's a perpetual social scrum of who is to be invited to what going on, and you occupy a preeminent place atop it, mostly aloof from the struggles of your citizens for recognition and influence. You're invited to almost everything, since everyone who lives here knows the value of being in favor with the owner of the arcology. Invitations to your parties, of course, are some of the most valuable social currency in the arcology and one of ${V.assistant.name}'s most important duties is to help you manage them without wasting your valuable time. It's not actually necessary for you to attend your own parties, since almost everyone will be glad to be seen in the entertainment area of the penthouse whether or not the`);
@@ -37,7 +37,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 			r.push(`alcohol`);
 		}
 		r.push(`and eating your food, though of course they helped pay for it through their rent. They're performing a complex dance of social dominance, and it all radiates around you, with complex unspoken rules of collective approval governing which citizens cycle past you for a word, and for how long. During a low point in the ebb and flow,`);
-		switch (_FS) {
+		switch (FS) {
 			case "FSSubjugationist":
 			case "FSSupremacist":
 				r.push(`a handsome, racially pure young man`);
@@ -133,20 +133,20 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 				r.push(`a cute young man`);
 		}
 		r.push(`sidles up to you.`);
-		if (_FS !== "FSGenderRadicalist") {
+		if (FS !== "FSGenderRadicalist") {
 			r.push(`He begins to introduce himself, but one of the advantages of your connection to the arcology is that you always know who everyone is, and you greet him by name, which people have never learned not to be impressed by.`);
 		} else {
 			r.push(`She begins to introduce herself and, not to your surprise, she is in fact a he.`);
 		}
 		r.push(`He gushes about some of your recent`);
-		if (_FS !== "none") {
-			r.push(FutureSocieties.displayAdj(_FS));
+		if (FS !== "none") {
+			r.push(FutureSocieties.displayAdj(FS));
 		}
 		r.push(`actions, displaying an unusual grasp of what you've been planning. Despite his sincere interest, he's obviously got something else on his mind.`);
 		App.Events.addParagraph(node, r);
 		r = [];
 		r.push(`He's yours for the taking, if you want him, and if his praise and proximity weren't enough to make that clear, he manages to`);
-		switch (_FS) {
+		switch (FS) {
 			case "FSSubjugationist":
 			case "FSSupremacist":
 				r.push(`flash you a view straight down his pants at his ethnically superior dick.`);
@@ -228,7 +228,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 			new App.Events.Result("To them that hath, it shall be given", given),
 		];
 
-		if (_FS !== "none") {
+		if (FS !== "none") {
 			responses.push(new App.Events.Result("Emphasize his societal style with exhibitionism", exhibitionism));
 		}
 
@@ -247,9 +247,9 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 			const frag = new DocumentFragment();
 			let r = [];
 			r.push(`You're not exactly starved for casual sex, but you've never thought there was any such thing as too much of a good thing.`);
-			if (_FS === "FSPhysicalIdealist" || _FS === "FSStatuesqueGlorification") {
+			if (FS === "FSPhysicalIdealist" || FS === "FSStatuesqueGlorification") {
 				r.push(`You nudge him in the ribs and motion to the door.`);
-			} else if (_FS === "FSPetiteAdmiration") {
+			} else if (FS === "FSPetiteAdmiration") {
 				r.push(`You place your hand on the nap of his neck and begin to lead him away.`);
 			} else {
 				r.push(`You pull his arm around your waist.`);
@@ -284,7 +284,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 				}
 			}
 			r.push(`Your guest restrains his eager praise now that you're in private, but his wide-eyed appreciation of your domain is compliment enough. Once in your suite, you undress him, revealing`);
-			switch (_FS) {
+			switch (FS) {
 				case "FSSubjugationist":
 				case "FSSupremacist":
 					r.push(`his fresh, pure body, and gently push him back onto your bed. You tease him as you remove your evening dress, crawl over him and impale yourself on his eager shaft, fully taking its length, before beginning to ride him. Even a female arcology owner like yourself appreciates a good hard fuck, since regular submission to a pounding from sex slaves would be a scandal. There's little opprobrium waiting for you if it's known he had you, though, and he is eagerly thrusting into your pussy. You shift into a slightly more comfortable position`);
@@ -590,11 +590,11 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 					}
 					r.push(`and ride him to orgasm. You follow shortly after, feeling the heat of his seed in the depths of your pussy as it clamps down around his dick. Thankfully, he isn't spent yet and begins anew, quickly carrying your climax to a second orgasm and drawing an adorable moan out of you.`);
 			}
-			if (_FS === "FSAssetExpansionist") {
+			if (FS === "FSAssetExpansionist") {
 				if (S.Concubine && canMove(S.Concubine) && S.Concubine.fetish !== "mindbroken") {
 					r.push(`${S.Concubine.slaveName} eagerly joins the two of you to help clean the massive cumshot up.`);
 				}
-			} else if (_FS !== "FSYouthPreferentialist") {
+			} else if (FS !== "FSYouthPreferentialist") {
 				if (S.Concubine && canMove(S.Concubine) && S.Concubine.fetish !== "mindbroken") {
 					const {he} = getPronouns(S.Concubine);
 					r.push(`The`);
@@ -609,7 +609,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 				}
 			}
 			r.push(`Sometimes society overlooks that you are a woman and have certain needs, but your lover tonight knows exactly how to treat you. When your guest`);
-			if (_FS !== "FSYouthPreferentialist") {
+			if (FS !== "FSYouthPreferentialist") {
 				r.push(`is finally spent,`);
 			} else {
 				r.push(`wakes up from against your body,`);
@@ -617,7 +617,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 			r.push(`he showers, dresses, and leaves discreetly, offering you a proper thank you. This is the kind of thing that <span class="green">builds a lasting reputation</span> in the Free Cities.`);
 			repX(5000, "event");
 			if (canGetPregnant(V.PC)) {
-				switch (_FS) {
+				switch (FS) {
 					case "FSAssetExpansionist":
 					case "FSRepopulationFocus":
 					case "FSSlaveProfessionalism":
@@ -635,8 +635,8 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 						r.push(knockMeUp(V.PC, 40, 0, -2));
 				}
 			}
-			if (_FS !== "none") {
-				const desc = "a tasteful morning-after message, complete with number, from a handsome " + FutureSocieties.displayAdj(_FS) + " citizen";
+			if (FS !== "none") {
+				const desc = "a tasteful morning-after message, complete with number, from a handsome " + FutureSocieties.displayAdj(FS) + " citizen";
 				V.trinkets.push(desc);
 			} else {
 				V.trinkets.push("a tasteful morning-after message, complete with number, from a handsome citizen");
@@ -649,7 +649,7 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 			const frag = new DocumentFragment();
 			let r = [];
 			r.push(`You turn to face him straight on, and something about the look in your eye fills him with mixed apprehension and anticipation. You agree with his banter and praise him for being so forward-thinking, before transitioning to more direct praise of his style and then his body. You're speaking in a tone that cuts through the room, and by the time you kiss your willing conquest, there's not a person in the room who isn't paying attention. They all understand the message: this gathering is turning into something else, now. Those few who aren't willing to fuck in public withdraw, and everyone who didn't come with a sexual partner sends urgent messages to have appropriate slaves brought from their apartments. You make out with him for a while, letting everyone make arrangements, and then pull his clothes off, making sure his`);
-			switch (_FS) {
+			switch (FS) {
 				case "FSSubjugationist":
 				case "FSSupremacist":
 					r.push(`superior body`);
@@ -741,8 +741,8 @@ App.Events.REMaleCitizenHookup = class REMaleCitizenHookup extends App.Events.Ba
 				default:
 					r.push(`hot young body`);
 			}
-			V.arcologies[0][_FS] += 5;
-			r.push(`is obvious to everyone. The message is clear, and your guest of honor is the center of attention as you take him there in view of the arcology's leading citizens. Naturally, the story percolates, making it clear that there's nothing you won't do to <span class="green">further acceptance of ${_FS} principles.</span>`);
+			V.arcologies[0][FS] += 5;
+			r.push(`is obvious to everyone. The message is clear, and your guest of honor is the center of attention as you take him there in view of the arcology's leading citizens. Naturally, the story percolates, making it clear that there's nothing you won't do to <span class="green">further acceptance of ${FS} principles.</span>`);
 			if (canGetPregnant(V.PC)) {
 				r.push(knockMeUp(V.PC, 40, 0, -2));
 			}
diff --git a/src/events/RE/reMalefactor.js b/src/events/RE/reMalefactor.js
index 00c508accaddd9aa27257fa4e4172c107ac2a42f..319e8d55fa69ffb04b9f9792468ee9d1ff380f9f 100644
--- a/src/events/RE/reMalefactor.js
+++ b/src/events/RE/reMalefactor.js
@@ -242,7 +242,7 @@ App.Events.REMalefactor = class REMalefactor extends App.Events.BaseEvent {
 					break;
 				case "orphanloli":
 					r.push(`You declare ${his} holes fair game for the entire arcology, so that all free citizens can own ${him} for a moment, if they wish. ${He} spends a torturous day in the stocks before being hauled in for enslavement, <span class="health dec">completely broken</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
-					applyMindbroken(slave);
+					applyMindbroken(slave, slave.intelligence);
 					break;
 				case "anchorBaby":
 					r.push(`You declare ${his} holes fair game for the entire arcology; since ${he} wants to produce future slaves, your arcology might as well have the privilege of fathering them. ${He} spends a torturous day in the stocks after ${his} children are taken to a slave orphanage before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
diff --git a/src/events/RE/reNickname.js b/src/events/RE/reNickname.js
index 9b012646d09e03d9865212abc6b34d2df7da7d64..ab82233622984764a1370bdb116cd37616967afc 100644
--- a/src/events/RE/reNickname.js
+++ b/src/events/RE/reNickname.js
@@ -37,281 +37,281 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent {
 
 	/** @param {App.Entity.SlaveState} slave */
 	getQualifiedNicknames(slave) {
-		const _qualifiedNicknames = new Set();
+		const qualifiedNicknames = new Set();
 
 		if (slave.nationality) {
-			_qualifiedNicknames.add("nationality");
+			qualifiedNicknames.add("nationality");
 		}
 
 		if (V.seeRace === 1) {
 			switch (slave.race) {
 				case "amerindian":
-					_qualifiedNicknames.add("amerindian");
+					qualifiedNicknames.add("amerindian");
 					break;
 				case "asian":
-					_qualifiedNicknames.add("asian");
+					qualifiedNicknames.add("asian");
 					break;
 				case "black":
-					_qualifiedNicknames.add("black");
+					qualifiedNicknames.add("black");
 					break;
 				case "indo-aryan":
-					_qualifiedNicknames.add("indo-aryan");
+					qualifiedNicknames.add("indo-aryan");
 					break;
 				case "latina":
-					_qualifiedNicknames.add("latina");
+					qualifiedNicknames.add("latina");
 					break;
 				case "malay":
-					_qualifiedNicknames.add("malay");
+					qualifiedNicknames.add("malay");
 					break;
 				case "middle eastern":
-					_qualifiedNicknames.add("middle eastern");
+					qualifiedNicknames.add("middle eastern");
 					break;
 				case "mixed race":
-					_qualifiedNicknames.add("mixed race");
+					qualifiedNicknames.add("mixed race");
 					break;
 				case "pacific islander":
-					_qualifiedNicknames.add("pacific islander");
+					qualifiedNicknames.add("pacific islander");
 					break;
 				case "catgirl":
-					_qualifiedNicknames.add("catgirl");
+					qualifiedNicknames.add("catgirl");
 					break;
 				case "semitic":
-					_qualifiedNicknames.add("semitic");
+					qualifiedNicknames.add("semitic");
 					break;
 				case "southern european":
-					_qualifiedNicknames.add("southern european");
+					qualifiedNicknames.add("southern european");
 					break;
 				case "white":
-					_qualifiedNicknames.add("white");
+					qualifiedNicknames.add("white");
 					break;
 			}
 		}
 
 		if (slave.boobs < 500 && slave.butt < 3 && slave.weight <= 10) {
-			_qualifiedNicknames.add("girlish");
+			qualifiedNicknames.add("girlish");
 		}
 		if (slave.boobs <= 300) {
-			_qualifiedNicknames.add("flat");
+			qualifiedNicknames.add("flat");
 		}
 		if (slave.anus > 2 || slave.vagina > 2) {
-			_qualifiedNicknames.add("loose");
+			qualifiedNicknames.add("loose");
 		}
 		if (slave.boobs < 500 && slave.butt < 3 && slave.dick > 0) {
-			_qualifiedNicknames.add("trap");
+			qualifiedNicknames.add("trap");
 		}
 		if (slave.boobs > 500 && slave.butt > 3 && slave.dick > 0) {
-			_qualifiedNicknames.add("trans");
+			qualifiedNicknames.add("trans");
 		}
 		if (slave.weight > 30) {
-			_qualifiedNicknames.add("chubby");
+			qualifiedNicknames.add("chubby");
 		}
 		if (slave.weight > 100) {
-			_qualifiedNicknames.add("fat");
+			qualifiedNicknames.add("fat");
 		}
 		if (slave.muscles > 30) {
-			_qualifiedNicknames.add("muscles");
+			qualifiedNicknames.add("muscles");
 		}
 		if (slave.energy > 95) {
 			if (slave.anus > 1) {
-				_qualifiedNicknames.add("buttslut");
+				qualifiedNicknames.add("buttslut");
 			}
-			_qualifiedNicknames.add("cumslut");
-			_qualifiedNicknames.add("humiliation");
-			_qualifiedNicknames.add("submissive");
+			qualifiedNicknames.add("cumslut");
+			qualifiedNicknames.add("humiliation");
+			qualifiedNicknames.add("submissive");
 		}
 		if (slave.fetishKnown === 1 && slave.fetishStrength > 60) {
 			switch (slave.fetish) {
 				case "buttslut":
 					if (slave.anus > 0) {
-						_qualifiedNicknames.add("buttslut");
+						qualifiedNicknames.add("buttslut");
 					} else {
-						_qualifiedNicknames.add("butt toy");
+						qualifiedNicknames.add("butt toy");
 					}
 					break;
 				case "cumslut":
-					_qualifiedNicknames.add("cumslut");
+					qualifiedNicknames.add("cumslut");
 					break;
 				case "humiliation":
-					_qualifiedNicknames.add("humiliation");
+					qualifiedNicknames.add("humiliation");
 					break;
 				case "submissive":
-					_qualifiedNicknames.add("submissive");
+					qualifiedNicknames.add("submissive");
 			}
 		}
 		if (slave.counter.oral + slave.counter.vaginal + slave.counter.anal > 500) {
-			_qualifiedNicknames.add("veteran");
+			qualifiedNicknames.add("veteran");
 		}
 		if ((slave.boobs * slave.lactation) > 1000) {
-			_qualifiedNicknames.add("cow");
+			qualifiedNicknames.add("cow");
 		}
 		if (slave.skill.oral <= 30 && slave.skill.anal <= 30) {
-			_qualifiedNicknames.add("novice");
+			qualifiedNicknames.add("novice");
 		}
 		if (slave.ID === V.HeadGirlID) {
-			_qualifiedNicknames.add("Head Girl");
+			qualifiedNicknames.add("Head Girl");
 		}
 		if (slave.ID === V.BodyguardID) {
-			_qualifiedNicknames.add("Bodyguard");
+			qualifiedNicknames.add("Bodyguard");
 		}
 		if (slave.ID === V.ConcubineID) {
-			_qualifiedNicknames.add("Concubine");
+			qualifiedNicknames.add("Concubine");
 		}
 		if (slave.ID === V.AttendantID) {
-			_qualifiedNicknames.add("Attendant");
+			qualifiedNicknames.add("Attendant");
 		}
 		if (slave.ID === V.MatronID) {
-			_qualifiedNicknames.add("Matron");
+			qualifiedNicknames.add("Matron");
 		}
 		if (slave.ID === V.MadamID) {
-			_qualifiedNicknames.add("Madam");
+			qualifiedNicknames.add("Madam");
 		}
 		if (slave.ID === V.djID) {
-			_qualifiedNicknames.add("DJ");
+			qualifiedNicknames.add("DJ");
 		}
 		if (slave.ID === V.RecruiterID) {
-			_qualifiedNicknames.add("Recruiter");
+			qualifiedNicknames.add("Recruiter");
 		}
 		if (slave.ID === V.WardenessID) {
-			_qualifiedNicknames.add("Wardeness");
+			qualifiedNicknames.add("Wardeness");
 		}
 		if (slave.ID === V.MilkmaidID) {
-			_qualifiedNicknames.add("Milkmaid");
+			qualifiedNicknames.add("Milkmaid");
 		}
 		if (slave.ID === V.FarmerID) {
-			_qualifiedNicknames.add("Farmer");
+			qualifiedNicknames.add("Farmer");
 		}
 		if (slave.ID === V.MilkmaidID && slave.dick > 5 && canPenetrate(slave) && cumSlaves().length > 3) {
-			_qualifiedNicknames.add("Collectrix");
+			qualifiedNicknames.add("Collectrix");
 		}
 		if (slave.ID === V.StewardessID) {
-			_qualifiedNicknames.add("Stewardess");
+			qualifiedNicknames.add("Stewardess");
 		}
 		if (slave.ID === V.SchoolteacherID) {
-			_qualifiedNicknames.add("Schoolteacher");
+			qualifiedNicknames.add("Schoolteacher");
 		}
 		if (slave.ID === V.NurseID) {
-			_qualifiedNicknames.add("Nurse");
+			qualifiedNicknames.add("Nurse");
 		}
 		if (slave.ID === V.LurcherID) {
-			_qualifiedNicknames.add("Lurcher");
+			qualifiedNicknames.add("Lurcher");
 		}
 		if (slave.assignment === "be a subordinate slave") {
-			_qualifiedNicknames.add("server");
+			qualifiedNicknames.add("server");
 		}
 		if (slave.nipples === "huge" || slave.nipples === "puffy") {
-			_qualifiedNicknames.add("nipples");
+			qualifiedNicknames.add("nipples");
 		} else if (slave.nipples === "fuckable") {
-			_qualifiedNicknames.add("nippleCunts");
+			qualifiedNicknames.add("nippleCunts");
 		}
 		if (slave.areolae > 2) {
-			_qualifiedNicknames.add("areolae");
+			qualifiedNicknames.add("areolae");
 		}
 		if (slave.lips > 40) {
-			_qualifiedNicknames.add("lips");
+			qualifiedNicknames.add("lips");
 		}
 		if (slave.labia > 1 && slave.vagina > -1) {
-			_qualifiedNicknames.add("labia");
+			qualifiedNicknames.add("labia");
 		}
 		if (slave.physicalAge < 18) {
-			_qualifiedNicknames.add("young");
+			qualifiedNicknames.add("young");
 		}
 		if (slave.physicalAge > 35) {
-			_qualifiedNicknames.add("old");
+			qualifiedNicknames.add("old");
 		}
 		if (slave.physicalAge > 59) {
-			_qualifiedNicknames.add("reallyold");
+			qualifiedNicknames.add("reallyold");
 		}
 		if (isAmputee(slave)) {
-			_qualifiedNicknames.add("amp");
+			qualifiedNicknames.add("amp");
 		}
 		if ((slave.boobsImplant / slave.boobs) >= .60 || (slave.buttImplant / slave.butt) > .60) {
-			_qualifiedNicknames.add("implants");
+			qualifiedNicknames.add("implants");
 		}
 		if ((slave.boobsImplant >= 750) && (slave.boobsImplant / slave.boobs) >= .60 && (slave.buttImplant >= 2) && (slave.buttImplant / slave.butt) > .60 && (slave.lipsImplant >= 10) && (slave.lipsImplant / slave.lips) > .30 && (slave.intelligence + slave.intelligenceImplant < -15)) {
-			_qualifiedNicknames.add("bimbo");
+			qualifiedNicknames.add("bimbo");
 		}
 		if (slave.intelligence + slave.intelligenceImplant < -50) {
-			_qualifiedNicknames.add("stupid");
+			qualifiedNicknames.add("stupid");
 		}
 		if (slave.intelligence + slave.intelligenceImplant > 50) {
-			_qualifiedNicknames.add("smart");
+			qualifiedNicknames.add("smart");
 		}
 		if (getBestVision(slave) === 0) {
-			_qualifiedNicknames.add("blind");
+			qualifiedNicknames.add("blind");
 		}
 		if (slave.hears <= -2) {
-			_qualifiedNicknames.add("deaf");
+			qualifiedNicknames.add("deaf");
 		}
 		if (slave.voice === 0) {
-			_qualifiedNicknames.add("mute");
+			qualifiedNicknames.add("mute");
 		}
 		if (slave.breedingMark === 1 && V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") {
-			_qualifiedNicknames.add("mark");
+			qualifiedNicknames.add("mark");
 		}
 		if (slave.broodmother > 1 && slave.preg >= 37) {
-			_qualifiedNicknames.add("hyperbroodmother");
+			qualifiedNicknames.add("hyperbroodmother");
 		}
 		if (slave.broodmother === 1 && slave.preg >= 37) {
-			_qualifiedNicknames.add("broodmother");
+			qualifiedNicknames.add("broodmother");
 		}
 		if (slave.bellyPreg >= 300000) {
-			_qualifiedNicknames.add("hyperpreg");
+			qualifiedNicknames.add("hyperpreg");
 		}
 		if (slave.bellyPreg >= 30000 && slave.boobs >= 5000 && slave.butt > 5 && slave.hips >= 2 && slave.weight < 100) {
-			_qualifiedNicknames.add("fertilityGoddess");
+			qualifiedNicknames.add("fertilityGoddess");
 		}
 		if (slave.dick > 5 && slave.balls > 5 && slave.counter.slavesKnockedUp > 4) {
-			_qualifiedNicknames.add("babymaker");
+			qualifiedNicknames.add("babymaker");
 		}
 		if (slave.prostate > 2 && slave.dick === 0 && slave.vagina > -1) {
-			_qualifiedNicknames.add("superSquirter");
+			qualifiedNicknames.add("superSquirter");
 		}
 		if (slave.bellyPreg >= 100 && slave.pregKnown === 1) {
-			_qualifiedNicknames.add("preg");
+			qualifiedNicknames.add("preg");
 			if ((slave.ovaries === 1 && slave.vagina === 0) || (slave.mpreg === 1 && slave.anus === 0)) {
-				_qualifiedNicknames.add("virgin preg");
+				qualifiedNicknames.add("virgin preg");
 			}
 		}
 		if (slave.dick > 4) {
-			_qualifiedNicknames.add("hung");
+			qualifiedNicknames.add("hung");
 		}
 		if (slave.dick > 0 && slave.balls === 0) {
-			_qualifiedNicknames.add("gelding");
+			qualifiedNicknames.add("gelding");
 		}
 		if (slave.dick === 1) {
-			_qualifiedNicknames.add("micropenis");
+			qualifiedNicknames.add("micropenis");
 		}
 		if (slave.boobs >= 800) {
-			_qualifiedNicknames.add("boobs");
+			qualifiedNicknames.add("boobs");
 		}
 		if (slave.butt > 5) {
-			_qualifiedNicknames.add("butt");
+			qualifiedNicknames.add("butt");
 		}
 		if (slave.vagina === 0) {
-			_qualifiedNicknames.add("virgin");
+			qualifiedNicknames.add("virgin");
 		}
 		if (slave.height >= 185) {
-			_qualifiedNicknames.add("tall");
+			qualifiedNicknames.add("tall");
 		}
 		if (slave.height < 150) {
-			_qualifiedNicknames.add("short");
+			qualifiedNicknames.add("short");
 		}
 		if (slave.vagina === 1 && slave.skill.vaginal <= 10) {
-			_qualifiedNicknames.add("vaginalWhiner");
+			qualifiedNicknames.add("vaginalWhiner");
 		}
 		if (slave.anus === 1 && slave.skill.anal <= 10) {
-			_qualifiedNicknames.add("analWhiner");
+			qualifiedNicknames.add("analWhiner");
 		}
 		if (slave.vagina === -1 && slave.dick === 0 && slave.balls === 0) {
-			_qualifiedNicknames.add("null");
+			qualifiedNicknames.add("null");
 		}
-		return _qualifiedNicknames;
+		return qualifiedNicknames;
 	}
 
 	execute(node) {
 		const [slave] = this.actors.map(a => getSlave(a));
 		const {He, he, him} = getPronouns(slave);
-		const _this = this; // fuck javascript's half-assed classes
+		const that = this; // fuck javascript's half-assed classes
 
 		if (this.params.type === "RIE") {
 			V.nextLink = "Next Week";
@@ -333,7 +333,7 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent {
 		function introPassage() {
 			const el = new DocumentFragment();
 			const r = [];
-			const {nicknameArray, situationDesc, applyDesc, notApplyDesc} = _this.data(slave, seed);
+			const {nicknameArray, situationDesc, applyDesc, notApplyDesc} = that.data(slave, seed);
 			let nickname = either(...nicknameArray);
 			const catEl = App.UI.DOM.makeElement("div", selectCategory(V.debugMode > 0 && V.debugModeEventSelection > 0));
 			r.push(catEl);
diff --git a/src/events/RE/rePregInventorFCTV.js b/src/events/RE/rePregInventorFCTV.js
index 48106e16cafa15b66c4c9ab510b9a4cf871fd26a..a514dd9b13829816bb42480971aeb708b55786ce 100644
--- a/src/events/RE/rePregInventorFCTV.js
+++ b/src/events/RE/rePregInventorFCTV.js
@@ -47,7 +47,7 @@ App.Events.rePregInventorFCTV = class rePregInventorFCTV extends App.Events.Base
 			} else {
 				r.push(`a bit of a reputation already,`);
 			}
-			r.push(`you could significantly improve ${his} chances to impress on the show with a little bit of extra investment in commercial spots${(V.PC.skill.hacking >= 100) ? `or a tweaking of FCTV algorithms` : ``}.`);
+			r.push(`you could significantly improve ${his} chances to impress on the show with a little bit of extra investment in commercial spots${(V.PC.skill.hacking >= 100) ? ` or a tweaking of FCTV algorithms` : ``}.`);
 		}
 		App.Events.addParagraph(node, r);
 
diff --git a/src/events/RE/reRebels.js b/src/events/RE/reRebels.js
index 9727c5bfb5d24ae452a39cc7d9b50566ac6322e9..a3fe2b60180415739cb9b143df5ac4b03834fc57 100644
--- a/src/events/RE/reRebels.js
+++ b/src/events/RE/reRebels.js
@@ -45,7 +45,7 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent {
 			`You have a rebel problem.`,
 			App.UI.DOM.slaveDescriptionDialog(thingOne),
 			`and`,
-			App.UI.DOM.slaveDescriptionDialog(thingTwo),
+			contextualIntro(thingOne, thingTwo, "DOM"),
 			`are both unbroken, and they seem to draw strength from each other. They're discreet about it, but the arcology's always-vigilant systems occasionally catch them nodding to one another after one of them is punished, or giving each other quiet words of encouragement when they think no one is listening. This is extremely dangerous and should be addressed promptly.`
 		);
 
diff --git a/src/events/RE/reRelativeRecruiter.js b/src/events/RE/reRelativeRecruiter.js
index 6f00848962063507a40da4f1120c8e0efed593e2..bce07bb02b52159c2af0a68a69252dc5e7a68248 100644
--- a/src/events/RE/reRelativeRecruiter.js
+++ b/src/events/RE/reRelativeRecruiter.js
@@ -170,7 +170,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 		// pick a random background for the selected relative
 		this.params.background = this._getRelativeBackgrounds(this.params.relative).random();
 
-		let _this = this; // fuck javascript's half-assed classes
+		let that = this; // fuck javascript's half-assed classes
 		let cost = 0; // will be filled out later
 
 		let cheatDiv = App.UI.DOM.makeElement("div", (V.debugMode > 0 && V.debugModeEventSelection > 0) ? cheatModeSelectors() : '');
@@ -198,14 +198,14 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 				t.push("with desperate gestures");
 			}
 			t.push(`that`);
-			switch (_this.params.relative) {
+			switch (that.params.relative) {
 				case "daughter":
 				case "son":
 					t.push(`${he} had a ${daughter2}, who was sent to the slave orphanages. ${He}'s heard a rumor through other slaves that ${his} ${daughter2} will go up for sale soon.`);
 					break;
 				case "mother":
 				case "father":
-					t.push(`${his} ${_this.params.relative} might be getting sold soon. ${He2} has been a slave for some time. ${He}'s heard a rumor through other slaves that ${his} ${_this.params.relative} will go up for sale soon.`);
+					t.push(`${his} ${that.params.relative} might be getting sold soon. ${He2} has been a slave for some time. ${He}'s heard a rumor through other slaves that ${his} ${that.params.relative} will go up for sale soon.`);
 					break;
 				case "older sister":
 				case "older brother":
@@ -219,7 +219,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 					t.push(`${he} has a twin ${sister2}, who was still free the last ${eventSlave.slaveName} knew of ${him2}. ${He}'s heard a rumor through other slaves that ${his} twin has finally been enslaved, and will soon go up for sale.`);
 					break;
 				default:
-					throw Error(`Unknown relative type: ${_this.params.relative}`);
+					throw Error(`Unknown relative type: ${that.params.relative}`);
 			}
 
 			if (!canTalk(eventSlave)) {
@@ -298,8 +298,8 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 			App.Events.addParagraph(frag, t);
 
 			t = [];
-			t.push(`You look up the ${_this.params.relative}. ${He2} costs ${cashFormat(cost)}, a bargain, but you won't be able to inspect ${him2} beyond ${his2} likely resemblance to ${eventSlave.slaveName}.`);
-			t.push(_this._getBackgroundDescription(newSlave, _this.params.background));
+			t.push(`You look up the ${that.params.relative}. ${He2} costs ${cashFormat(cost)}, a bargain, but you won't be able to inspect ${him2} beyond ${his2} likely resemblance to ${eventSlave.slaveName}.`);
+			t.push(that._getBackgroundDescription(newSlave, that.params.background));
 			App.Events.addParagraph(frag, t);
 
 			App.Events.addResponses(frag, [
@@ -315,18 +315,18 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 		function cheatModeSelectors() {
 			const refreshCallback = (effect) => { effect(); $(cheatDiv).empty().append(cheatModeSelectors); $(eventTextDiv).empty().append(eventText); };
 
-			let relativeTypeLinks = _.uniq(_this._getTargetRelativeChoices(getSlave(_this.actors[0]))).map((choice) =>
-				App.UI.DOM.link(choice, refreshCallback, [() => { _this.params.relative = choice; _this.params.background = _this._getRelativeBackgrounds(choice).random(); }])
+			let relativeTypeLinks = _.uniq(that._getTargetRelativeChoices(getSlave(that.actors[0]))).map((choice) =>
+				App.UI.DOM.link(choice, refreshCallback, [() => { that.params.relative = choice; that.params.background = that._getRelativeBackgrounds(choice).random(); }])
 			);
-			let backgroundTypeLinks = _.uniq(_this._getRelativeBackgrounds(_this.params.relative)).map((choice) =>
-				App.UI.DOM.link(choice, refreshCallback, [() => { _this.params.background = choice; }])
+			let backgroundTypeLinks = _.uniq(that._getRelativeBackgrounds(that.params.relative)).map((choice) =>
+				App.UI.DOM.link(choice, refreshCallback, [() => { that.params.background = choice; }])
 			);
 
 			let frag = document.createDocumentFragment();
 			$(frag).append(
-				`Relative Type: <strong>${_this.params.relative}</strong> `, App.UI.DOM.generateLinksStrip(relativeTypeLinks),
+				`Relative Type: <strong>${that.params.relative}</strong> `, App.UI.DOM.generateLinksStrip(relativeTypeLinks),
 				"<br>",
-				`Background: <strong>${_this.params.background}</strong> `, App.UI.DOM.generateLinksStrip(backgroundTypeLinks)
+				`Background: <strong>${that.params.background}</strong> `, App.UI.DOM.generateLinksStrip(backgroundTypeLinks)
 			);
 			return frag;
 		}
@@ -381,7 +381,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 			}
 
 			function relativeOrigin() {
-				switch (_this.params.relative) {
+				switch (that.params.relative) {
 					case "mother":
 					case "father":
 						return "$He was recruited into your service by $his child.";
@@ -397,7 +397,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 					case "twin":
 						return "$He was recruited into your service by $his twin.";
 				}
-				throw Error(`Unknown relative type: ${_this.params.relative}`);
+				throw Error(`Unknown relative type: ${that.params.relative}`);
 			}
 
 			/** @param {App.Entity.SlaveState} slave */
@@ -564,7 +564,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 					"bimbo toy": applyBimboToy,
 					"twin": applyTwin
 				};
-				backgroundDispatch[_this.params.background]();
+				backgroundDispatch[that.params.background]();
 			}
 
 			/** @param {App.Entity.SlaveState} slave */
@@ -597,16 +597,16 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 			}
 
 			const origSlave = BaseSlave();
-			const genepoolRec = V.genePool.find(s => s.ID === _this.actors[0]);
+			const genepoolRec = V.genePool.find(s => s.ID === that.actors[0]);
 			App.Entity.Utils.GenePoolRecordCleanup(genepoolRec);
 			Object.assign(origSlave, genepoolRec);
 			updateGPRecordAgeFromEventSlave(origSlave);
 
-			const newSlave = generateRelatedSlave(origSlave, _this.params.relative);
+			const newSlave = generateRelatedSlave(origSlave, that.params.relative);
 			clearMods(newSlave);
 			newSlave.origin = relativeOrigin();
 			applyBackground(newSlave);
-			if (_this.params.relative === "mother") {
+			if (that.params.relative === "mother") {
 				newSlave.counter.birthsTotal += V.slaves.reduce((acc, cur) => acc + (sameDad(eventSlave, cur) ? 1 : 0), 0);
 			}
 			applyCommon(newSlave);
@@ -641,7 +641,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 			$(cheatDiv).empty();
 
 			// the new slave is already set up to be related to the existing slave, but we're responsible for making sure the existing slave (and any others in our stable) gets *their* relatives set correctly
-			switch (_this.params.relative) {
+			switch (that.params.relative) {
 				case "mother": {
 					setUnknownParents(eventSlave, {mother: newSlave.ID} );
 					for (const slave of V.slaves) {
@@ -699,7 +699,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba
 			const {he: he2} = getPronouns(newSlave);
 
 			let elements = [];
-			elements.push(`You complete the legalities and biometric scanning quickly and without fuss. ${newSlave.slaveName} arrives shortly. The two slaves remember each other only dimly — they parted a long time ago — but they embrace. The devoted ${SlaveTitle(eventSlave)} explains the situation and encourages ${his} ${_this.params.relative} to be a good slave to you. ${newSlave.slaveName} looks a little fearful but clearly realizes that ${he2}'s lucky to be here.`);
+			elements.push(`You complete the legalities and biometric scanning quickly and without fuss. ${newSlave.slaveName} arrives shortly. The two slaves remember each other only dimly — they parted a long time ago — but they embrace. The devoted ${SlaveTitle(eventSlave)} explains the situation and encourages ${his} ${that.params.relative} to be a good slave to you. ${newSlave.slaveName} looks a little fearful but clearly realizes that ${he2}'s lucky to be here.`);
 
 			elements.push(App.UI.newSlaveIntro(newSlave, eventSlave));
 
diff --git a/src/events/RE/reShelterInspection.js b/src/events/RE/reShelterInspection.js
index a991d7f3450eb27c74c3be4bccbe69cb1717dc11..af582660654488ef066afd2d44de6c32700dac44 100644
--- a/src/events/RE/reShelterInspection.js
+++ b/src/events/RE/reShelterInspection.js
@@ -11,6 +11,8 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 
 	execute(node) {
 		const r = [];
+		V.nextButton = " ";
+		V.nextLink = "RIE Eligibility Check";
 
 		const enslaveCost = 10000;
 
@@ -259,7 +261,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 			r.push(`You have ${him2} ushered up to your office, and order ${inspectee.slaveName} brought in.`);
 
 			/*
-			let _inspectionContinues = 1;
+			let inspectionContinues = 1;
 			if (isAmputee(inspectee) && !isAmputee(originSlave)) {
 				r.push(`You may have lopped off the poor ${girl}'s arms and legs, a fact not lost on the inspector. ${He2} can barely conceal ${his2} terror as ${he2} makes lengthy notes on ${his2} tablet before practically running out of the penthouse.`);
 				V.shelterAbuse += 10;
@@ -294,10 +296,10 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 					r.push(`Of course, the poor ${girl} is mindbroken now. The inspector is horrified, though ${he2} tries to conceal it. ${He2} makes lengthy notes on ${his2} tablet, and almost runs out of the penthouse.`);
 					V.shelterAbuse += 5;
 				}
-				_inspectionContinues = 0;
+				inspectionContinues = 0;
 			}
 
-			if (_inspectionContinues === 1) {
+			if (inspectionContinues === 1) {
 				switch (inspectee.origin) {
 					case "You got $him at the Slave Shelter. $He has never communicated anything about $his background, since $he arrived at the shelter with a broken mind.":
 						r.push(`The inspector asks some cursory questions and is shocked when ${he} responds. "`);
@@ -307,7 +309,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 						r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
 						r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 						r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse.`);
-						_inspectionContinues = 0;
+						inspectionContinues = 0;
 						V.shelterAbuse -= 5;
 						break;
 					case "You got $him at the Slave Shelter. It's not clear why $his previous owner cut $his arms and legs off.":
@@ -315,7 +317,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 							r.push(`Unsurprisingly, the poor ${girl} still lacks arms and legs, so the inspector just carries on.`);
 						} else {
 							r.push(`The inspector stares, dumbfounded, at the pair of limbs now supporting ${inspectee.slaveName}. "Most owners wouldn't go through the trouble... I think I've seen enough to know you're welcome to come back and take in another slave any time." ${He2} leaves your penthouse in much better spirits than ${he2} arrived in.`);
-							_inspectionContinues = 0;
+							inspectionContinues = 0;
 							V.shelterAbuse -= 3;
 						}
 						break;
@@ -343,7 +345,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 							r.push(`${He2} turns to you and says`);
 							r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 							r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse.`);
-							_inspectionContinues = 0;
+							inspectionContinues = 0;
 							V.shelterAbuse--;
 						} else {
 							r.push(`Unable to hear ${him2}, ${he} does not respond.`);
@@ -365,7 +367,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 							r.push(`A tear comes to ${his2} weary eye as ${he2} writes out notes on ${his2} tablet.`);
 							r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 							r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse.`);
-							_inspectionContinues = 0;
+							inspectionContinues = 0;
 							V.shelterAbuse--;
 						}
 						break;
@@ -377,7 +379,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 						r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
 						r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 						r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse, even though ${he2} forgot to check ${his} pussy.`);
-						_inspectionContinues = 0;
+						inspectionContinues = 0;
 						V.shelterAbuse -= 5;
 						break;
 					case "You got $him at the Slave Shelter. $His previous owner forced $him to cut off $his dick and balls and cook them.":
@@ -499,7 +501,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 					r.push(`${he2} mutters,`);
 					r.push(Spoken(inspector, `"You restored ${his} mind; I can't believe it. This is incredible."`));
 					r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
-					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from out shelter."`));
+					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 					r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse.`);
 					V.shelterAbuse -= 5;
 				}
@@ -529,8 +531,8 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 					r.push(Spoken(inspector, `"${He} came back?"`));
 					r.push(`${he2} mutters,`);
 					r.push(Spoken(inspector, `"You restored ${his} mind; I can't believe it. This is incredible."`));
-					r.push(`${He2} carries on while writing notes on ${his2} tablet, "You're more than welcome to adopt`);
-					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from out shelter."`));
+					r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
+					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 					r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse, even though ${he2} forgot to check ${his} pussy.`);
 					V.shelterAbuse -= 5;
 				}
@@ -557,7 +559,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 						r.push(`The inspector frowns.`);
 						r.push(Spoken(inspector, `"A buttplug shouldn't do that!"`));
 						r.push(`The slave looks worried and replies,`);
-						r.push(Spoken(inspector, `"It's kinda big? And I wear it all the time. B-but I like it! It d-doen't hurt. Well, anymore."`));
+						r.push(Spoken(inspector, `"It's kinda big? And I wear it all the time. B-but I like it! It d-doesn't hurt. Well, anymore."`));
 						r.push(`The inspector is not amused. ${He2} offers you a few choice words, makes notes on ${his2} tablet, and storms out.`);
 					} else if ((inspectee.assignment === "whore") || (inspectee.assignment === "work in the brothel") || (inspectee.assignment === "serve the public") || (inspectee.assignment === "serve in the club")) {
 						r.push(Spoken(inspectee, `"W-well,"`));
@@ -714,7 +716,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 						break;
 					default:
 						r.push(`${inspectee.slaveName} ${say}s flatly,`);
-						r.push(Spoken(inspectee, `"Whatever my beloved ${properMaster} requires I have a good life now, and I would appreciate it if you would support me by doing everything you can for ${himP}."`));
+						r.push(Spoken(inspectee, `"Whatever my beloved ${properMaster()} requires. I have a good life now, and I would appreciate it if you would support me by doing everything you can for ${himP}."`));
 						r.push(`Taken aback, the inspector ${say2}s ${he2}'ll put out a <span class="reputation inc">good word</span> about you.`);
 						repX(500, "event", inspectee);
 						V.shelterAbuse -= 1;
diff --git a/src/events/RE/reShowerPunishment.js b/src/events/RE/reShowerPunishment.js
index 7d557310c44aa89e04ea4f1216c9be4f408d79ca..c2569f8e92bee8be0e65ca46ebe2371efc0e5392 100644
--- a/src/events/RE/reShowerPunishment.js
+++ b/src/events/RE/reShowerPunishment.js
@@ -18,7 +18,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 	}
 
 	execute(node) {
-		let r = [];
+		const r = new SpacedTextAccumulator(node);
 		const slave = getSlave(this.actors[0]);
 
 		V.nextButton = "Continue";
@@ -65,8 +65,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		} else {
 			r.push(`This is the sort of mild punishment that your regime of respect and dignity requires ${him2} to use for all but the most egregious fault. Thus restricted, ${he2} does ${his2} best to come up with novel little degradations to keep ${his2} charges on their toes.`);
 		}
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 		r.push(`${slave.slaveName} is being very thorough. When you first appeared, ${he} was working ${his} way up ${S.HeadGirl.slaveName}'s `);
 		if (S.HeadGirl.muscles > 30) {
 			r.push(`muscle-corded`);
@@ -123,8 +122,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		} else {
 			r.push(`belly.`);
 		}
-
-		App.Events.addParagraph(node, r);
+		r.toParagraph();
 
 		const choices = [];
 		choices.push(new App.Events.Result(`Just spectate`, spectate));
@@ -133,8 +131,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		App.Events.addResponses(node, choices);
 
 		function spectate() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			r.push(`You could strip off your suit, walk into the steam, and enjoy your slaves' ministrations, but sometimes the artistry of tastefully nude bodies is a welcome change of pace. You lean against the wall, far enough away that they remain unaware of your presence, and take in the sight. ${S.HeadGirl.slaveName} makes the penitent ${girl} do the job with Brahmanical thoroughness, cleaning ${his} superior's ${S.HeadGirl.race} body down to its very last pore. As ${slave.slaveName} circles the Head Girl laboriously, doing ${his} best to ingratiate ${himself} by diligence, the pair of naked`);
 			if (girl === girl2) {
 				r.push(`${women}`);
@@ -142,8 +139,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`slaves`);
 			}
 			r.push(`present a fascinating contrast. They are unclothed alike, the water streaming off their bodies without any distinction, but even an old world fool could not mistake the immense gulf between them.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`When ${slave.slaveName} is finally done, ${S.HeadGirl.slaveName}'s`);
 			if (V.HGSeverity > 0) {
 				r.push(`hands seize ${him} by the ears and pull ${his} head in for a kiss that is dominance distilled into the form of a loving gesture. Then ${he2} pokes ${his2} bitch in the side, forcing the slave to collapse in just the right way.`);
@@ -170,19 +166,17 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`${girl2}'s`);
 			}
 			r.push(`head cranes back with orgasm before long; that diligent scrub must have been quite stimulating.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${slave.slaveName} stays in the shower to clean ${himself}, so ${S.HeadGirl.slaveName} exits to see you watching the denouement. ${He2} <span class="devotion inc">smiles,</span> murmuring a greeting, and hurries over to give you a peck on the cheek, leaning in as best ${he2} can to keep ${his2} moist body away from your suit. "This is the life, ${Master}," ${he2} whispers.`);
 			seX(slave, "oral", S.HeadGirl, "penetrative");
 			S.HeadGirl.devotion += 4;
+			r.toParagraph();
 
-			App.Events.addParagraph(frag, r);
-			return frag;
+			return r.container();
 		}
 
 		function scrub() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			r.push(`You strip off your suit and enter the shower. By the time you get in, ${S.HeadGirl.slaveName}'s sponge scrub is almost done. ${He2} turns to greet you with half-lidded eyes, well pleased with ${his2} thorough scrubbing. ${His2} ${S.HeadGirl.skin} skin shines with wet cleanliness, and ${his2} ${S.HeadGirl.nipples} nipples begin to`);
 			if (S.HeadGirl.nipples === "fuckable") {
 				r.push(`swell with arousal`);
@@ -190,8 +184,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`stiffen`);
 			}
 			r.push(`as ${he2} sees your gaze take in ${his2} nude body. ${He2} brusquely orders ${slave.slaveName} to scrub you, too, anticipating your intention. The rough, exfoliating sensation of the sponge is indeed delightful, and you close your eyes to savor the feeling as the slave rubs it up and down your calves and then the backs of your knees.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			if (V.HGSeverity > 0) {
 				r.push(`You detect tremors of fear in the`);
 				if (hasAnyArms(slave)) {
@@ -213,18 +206,15 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 			seX(slave, "oral", V.PC, "penetrative");
 			r.push(knockMeUp(slave, 10, 1, V.HeadGirlID));
 			slave.trust += 4;
-
-			App.Events.addParagraph(frag, r);
-			return frag;
+			r.toParagraph();
+			return r.container();
 		}
 
 		function HG() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			const {hersP} = getPronouns(V.PC).appendSuffix("P");
 			r.push(`You strip off your suit and walk into the steam, producing a surprised but welcoming greeting from your Head Girl and a muffled, submissive noise from ${slave.slaveName}. ${S.HeadGirl.slaveName} is held more or less stationary by the slave ${he2}'s straddling, so you step in, hook a dominant arm around ${his2} waist, and kiss ${him2}. There's precisely one person in this arcology who's allowed to treat ${him2} as ${hersP}, and it's you. ${He2} relaxes into you with gratitude as you shoulder the burden of being the leader in this little area of your empire, lifting it from ${his2} shoulders for now.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`You run a hand up the side of ${his2} neck, bringing it to rest with your fingers cupping ${him2} under the ear and your thumb running up along ${his2} temple. ${He2} shivers, unable to concentrate despite all ${his2} poise, the ongoing oral service blending into your intense closeness. Right now, ${he2}'s the`);
 			if (S.HeadGirl.physicalAge > 25) {
 				r.push(`${woman2}`);
@@ -238,8 +228,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`blowing ${him2},`);
 			}
 			r.push(`point at the dropped sponge, and then point at yourself. The oral stops as ${slave.slaveName} hurries to scrub you, starting at your feet, but your Head Girl doesn't care. You're kissing ${him2}.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${He2} gently strokes your `);
 			if (V.PC.dick !== 0) {
 				r.push(`rapidly hardening member, smiling into your mouth at the speed with which it stiffens${(V.PC.vagina !== -1) ? ", and teases your pussylips with mischievous fingers" : ""}.`);
@@ -252,16 +241,15 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 			} else {
 				r.push(`hooking your fingers up underneath ${his2} taint to grope ${his2} anus. After teasing ${his2} asspussy for a moment you bring your hand slowly across ${his2} perineum${(S.HeadGirl.scrotum > 0) ? `until ${his2} ballsack rests against your wrist` : ""}. The overstimulated ${S.HeadGirl.slaveName} cums the instant the butt of your hand touches the base of ${his2} cock. ${He2} screams your name.`);
 			}
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${He2} isn't terribly affected by loving shower sex with you; after all, it isn't exactly novel for ${him2}. ${slave.slaveName} was there to bear witness, though, scrubbing your back as ${S.HeadGirl.slaveName} clung to it with orgasm. ${He} can't help but be <span class="devotion inc">impressed.</span> Maybe, just maybe, that could be ${him} someday. ${He} seems distinctly uncomfortable.`);
 
 			seX(slave, "oral", S.HeadGirl, "oral");
 
 			slave.devotion += 4;
 
-			App.Events.addParagraph(frag, r);
-			return frag;
+			r.toParagraph();
+			return r.container();
 		}
 	}
 };
diff --git a/src/events/RE/reSlaveMarriage.js b/src/events/RE/reSlaveMarriage.js
index ad6f841054b7fa57202ed110d696a29155193b4b..e70f8d5da0175f9a53b094b5b48e2bb0953792c6 100644
--- a/src/events/RE/reSlaveMarriage.js
+++ b/src/events/RE/reSlaveMarriage.js
@@ -77,7 +77,7 @@ App.Events.RESlaveMarriage = class RESlaveMarriage extends App.Events.BaseEvent
 			} else {
 				r.push(`${groomSlave.slaveName} is an experienced sex slave, so ${he}'s wearing light pink`);
 			}
-			r.push(`against ${his}${groomSlave.skin} skin.`);
+			r.push(`against ${his} ${groomSlave.skin} skin.`);
 			if (groomSlave.chastityPenis) {
 				r.push(`${He} has a little bow on ${his} chastity cage.`);
 			} else if (canAchieveErection(groomSlave)) {
diff --git a/src/events/RE/reSnatchAndGrabFollowup.js b/src/events/RE/reSnatchAndGrabFollowup.js
index 96aca4c1b6aee482e5bd7072247898e3f63ff81f..94eb42c3222e3731585085d1d44e465f9f8a5a8c 100644
--- a/src/events/RE/reSnatchAndGrabFollowup.js
+++ b/src/events/RE/reSnatchAndGrabFollowup.js
@@ -154,7 +154,7 @@ App.Events.RESnatchAndGrabFollowup = class RESnatchAndGrabFollowup extends App.E
 					snatched.sexualFlaw = "none";
 				}
 				snatched.sexualQuirk = "perverted";
-				App.Events.addParagraph(frag, [`Over the next few weeks, you also begin to notice some significant changes in behavior. Although _slave.slaveName has always been remarkably horny, ${he} has become much more <span class="flaw break">perverted.</span>`]);
+				App.Events.addParagraph(frag, [`Over the next few weeks, you also begin to notice some significant changes in behavior. Although ${snatched.slaveName} has always been remarkably horny, ${he} has become much more <span class="flaw break">perverted.</span>`]);
 			}
 
 			App.Events.addParagraph(frag, r);
diff --git a/src/events/RE/reStandardPunishment.js b/src/events/RE/reStandardPunishment.js
index 7d8a60f69c2c018b5df59e7750ac8f6941b23bfb..c930e678a8395a35837a39922de81af11aa552e2 100644
--- a/src/events/RE/reStandardPunishment.js
+++ b/src/events/RE/reStandardPunishment.js
@@ -95,7 +95,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events.
 		if (V.HeadGirlID !== 0) {
 			r.push(`${S.HeadGirl.slaveName} is`);
 			if (slave.rules.punishment === "situational") {
-				r.push(`assessing an appropriate punishment`);
+				r.push(`assessing an appropriate punishment.`);
 			} else {
 				r.push(`sentencing ${him} to ${his} standard punishment,`);
 				switch (slave.rules.punishment) {
@@ -113,7 +113,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events.
 		} else {
 			r.push(`${V.assistant.name} is`);
 			if (slave.rules.punishment === "situational") {
-				r.push(`assessing an appropriate punishment`);
+				r.push(`assessing an appropriate punishment.`);
 			} else {
 				r.push(`sentencing ${him} to ${his} standard punishment,`);
 				switch (slave.rules.punishment) {
@@ -544,7 +544,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events.
 		function run() {
 			const frag = new DocumentFragment();
 			let r = [];
-			r.push(`You tell ${him} that ${he} clearly needs practice being prompt. Your`);
+			r.push(`You tell ${him} that ${he} clearly needs practice being prompt.`);
 			if (canHear(slave)) {
 				r.push(`Your tone is conversational, but ${he} doesn't mistake it for kindness. It's the tone you use with`);
 			} else {
diff --git a/src/events/REFI/reSadist.js b/src/events/REFI/reSadist.js
index b2ef365e4c030ff0da9c00da1672fbb4170dd3e5..71cb132064790aaaaa6c0c0d6472262b63ddbd19 100644
--- a/src/events/REFI/reSadist.js
+++ b/src/events/REFI/reSadist.js
@@ -91,7 +91,7 @@ App.Events.REFISadist = class REFISadist extends App.Events.BaseEvent {
 		}
 		t.push(`It seems ${he} passed by while`);
 		t.push(contextualIntro(eventSlave, subSlave));
-		t.push(`was beating the${girlU} and found the`);
+		t.push(`was beating the ${girlU} and found the`);
 		if (canSee(eventSlave)) {
 			t.push(`sight`);
 		} else {
diff --git a/src/events/REFS/refsBodyPurismEncounter.js b/src/events/REFS/refsBodyPurismEncounter.js
index 543a1713c44bd95e0a26d54343866e1597851878..7b4aa2513a156b7ab1bc14ca12d4d87b07615d6f 100644
--- a/src/events/REFS/refsBodyPurismEncounter.js
+++ b/src/events/REFS/refsBodyPurismEncounter.js
@@ -58,6 +58,7 @@ App.Events.refsBodyPurismEncounter = class refsBodyPurismEncounter extends App.E
 
 		function pamper() {
 			const frag = new DocumentFragment();
+			repX(1500, "event");
 
 			App.Events.addParagraph(frag, [`You make your presence known to the citizen, and once the usual shock and disbelief have worn off it takes a moment to convince ${him} that your offer of a cleansing experience in your spa is neither a cruel joke nor an underhanded attempt to enslave ${him}. ${He} follows you back to the penthouse where you inform your attendant that the citizen is to be sequestered in the spa for a day of pampering, cleansing and rejuvenation. As the citizen passes through the doors to the spa, ${he} turns and blows you a kiss of gratitude.`]);
 
diff --git a/src/events/REFS/refsWarhound.js b/src/events/REFS/refsWarhound.js
index 4e843ca72aacba30f2a6d45ed4fbf563020e04a4..9f2c443473e949e3fa3fa3254fda7b285b0e7573 100644
--- a/src/events/REFS/refsWarhound.js
+++ b/src/events/REFS/refsWarhound.js
@@ -16,7 +16,7 @@ App.Events.refsWarhound = class refsWarhound extends App.Events.BaseEvent {
 			slave.weight -= 100;
 			slave.waist = random(-10, 50);
 		}
-		applyMindbroken(slave);
+		applyMindbroken(slave, -100);
 		configureLimbs(slave, "all", 6);
 		slave.teeth = "pointy";
 		slave.earT = "inu";
diff --git a/src/events/REFS/refsYouthPreferentialistEncounter.js b/src/events/REFS/refsYouthPreferentialistEncounter.js
index 2431c8e0f097fca21d5a1423ee41ca99a0d52851..87b5fc74b6423b6b5bb53a18105773c56f5c6245 100644
--- a/src/events/REFS/refsYouthPreferentialistEncounter.js
+++ b/src/events/REFS/refsYouthPreferentialistEncounter.js
@@ -34,14 +34,14 @@ App.Events.refsYouthPreferentialistEncounter = class refsYouthPreferentialistEnc
 
 		App.Events.addParagraph(node, [`Your excursions out of your penthouse and into the arcology as a whole often put you in close proximity with citizens from all levels of the social strata. After all, they themselves have their own lives to live within the walls of ${V.arcologies[0].name}.`]);
 
-		App.Events.addParagraph(node, [`On this particular outing you happen to cross paths with a nubile young ${woman}, accompanied by ${his} father. From ${his} plain clothes and rudimentary makeup, it is readily apparent that ${he} is not one of the arcology's well-to-do inhabitants. ${He} recognizes you quickly and dips ${his} head in deference to your high status,${(V.PC.visualAge >= 50) ? `${his} cheeks flushed in embarrassment and delight at an aged arcology owner's interest in a young ${girl} like ${him}.` : `${his} expression awestruck by the presence of an arcology owner before ${him}.`}`]);
+		App.Events.addParagraph(node, [`On this particular outing you happen to cross paths with a nubile young ${woman}, accompanied by ${his} father. From ${his} plain clothes and rudimentary makeup, it is readily apparent that ${he} is not one of the arcology's well-to-do inhabitants. ${He} recognizes you quickly and dips ${his} head in deference to your high status, ${(V.PC.visualAge >= 50) ? `${his} cheeks flushed in embarrassment and delight at an aged arcology owner's interest in a young ${girl} like ${him}.` : `${his} expression awestruck by the presence of an arcology owner before ${him}.`}`]);
 
 		const choices = [];
 		choices.push(new App.Events.Result(`Let them pass`, ignore));
 		if (V.cash >= (cost)) {
 			choices.push(new App.Events.Result(`Fuck ${him} over dinner`, pay, `This will cost ${cashFormat(cost)}.`));
 		} else {
-			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to promote ${him}.`));
+			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to take ${him} on a date.`));
 		}
 		choices.push(new App.Events.Result(`Manipulate ${him} into having sex with you`, fuck));
 		App.Events.addResponses(node, choices);
@@ -62,7 +62,7 @@ App.Events.refsYouthPreferentialistEncounter = class refsYouthPreferentialistEnc
 			App.Events.refreshEventArt(slave);
 
 			const frag = new DocumentFragment();
-			App.Events.addParagraph(frag, [`It only takes a moment for ${V.assistant.name} to uncover the father's financial records and the copious debt therein, and only another moment for you to browbeat the terrified father into allowing his V.daughter to sleep with you under threat of purchasing all their debt and summarily enslaving ${him}.`]);
+			App.Events.addParagraph(frag, [`It only takes a moment for ${V.assistant.name} to uncover the father's financial records and the copious debt therein, and only another moment for you to browbeat the terrified father into allowing his ${daughter} to sleep with you under threat of purchasing all their debt and summarily enslaving ${him}.`]);
 
 			App.Events.addParagraph(frag, [`Once you both retire to your private suite, you peel the ${girl}'s clothes off as easily as one might shed a gift of its wrapping. In the nude ${his} body is tastefully youthful, with narrow hips, firm breasts, and a delicate blush across ${his} shamefaced, rosy cheeks. Despite the circumstances of your sexual conquest of ${him}, ${he} seems to enjoy the fuck well enough by the sounds of ${his} frenzied moans — citizens like ${him} often do since sexual submission to a slave would be a crippling scandal to a prominent citizen, let alone one of ${his} diminished social stature.`]);
 			const choices = [];
diff --git a/src/events/REM/remMerger.js b/src/events/REM/remMerger.js
index e49ad5c1277769753f7e4ea7bf680a6fed7f24f5..b1347bdb2bb2077dc4e19beaf3096f79997f6237 100644
--- a/src/events/REM/remMerger.js
+++ b/src/events/REM/remMerger.js
@@ -17,7 +17,7 @@ App.Events.REMMerger = class REMMerger extends App.Events.BaseEvent {
 		const numCompanies = random(1, maxCompanies);
 
 		const companies = [];
-		for (let _index = 0; _index < numCompanies; ++_index) {
+		for (let index = 0; index < numCompanies; ++index) {
 			companies.push(slaveCompany.pluck());
 		}
 		const assistant = V.assistant.market ? "your market assistant" : V.assistant.name;
diff --git a/src/events/RESS/ageDifferenceOldPC.js b/src/events/RESS/ageDifferenceOldPC.js
index 871c8c63676216eae4175f800a9fd2857185d8ce..592db14bd747ee3c286057c6a6df28c948d96745 100644
--- a/src/events/RESS/ageDifferenceOldPC.js
+++ b/src/events/RESS/ageDifferenceOldPC.js
@@ -74,7 +74,6 @@ App.Events.RESSAgeDifferenceOldPC = class RESSAgeDifferenceOldPC extends App.Eve
 			isFertile(eventSlave)
 				? new App.Events.Result(`Give ${him} an afternoon off for some quality time with a local retirement community`, afternoon, virginityWarning(true))
 				: new App.Events.Result(),
-
 		]);
 
 		function virginityWarning(knockedUp){
diff --git a/src/events/RESS/assFitting.js b/src/events/RESS/assFitting.js
index 299bb57e90bf5adc4468657ca443ded752f8c506..ed16023ca1b06132d74be689d68e1ab306973e58 100644
--- a/src/events/RESS/assFitting.js
+++ b/src/events/RESS/assFitting.js
@@ -21,7 +21,7 @@ App.Events.RESSAssFitting = class RESSAssFitting extends App.Events.BaseEvent {
 		/** @type {Array<App.Entity.SlaveState>} */
 		let [eventSlave] = this.actors.map(a => getSlave(a));
 		const {
-			He, he, His, his, him, hers
+			He, he, His, his, him, himself, hers
 		} = getPronouns(eventSlave);
 		const {title: Master} = getEnunciation(eventSlave);
 
@@ -227,7 +227,7 @@ App.Events.RESSAssFitting = class RESSAssFitting extends App.Events.BaseEvent {
 		} else if (eventSlave.trust > 20) {
 			t.push(`trustingly. ${He}'s thoroughly accustomed to the idea of your eyes on ${his} big bare butt, so ${he} goes back to ${his} efforts, which bounce ${his} behind deliciously.`);
 		} else {
-			t.push(`fearfully. ${He} doesn't want to make a fool of ${him}self, or damage anything by hurrying, and ${he} blushes dreadfully as ${he} keeps working at it.`);
+			t.push(`fearfully. ${He} doesn't want to make a fool of ${himself}, or damage anything by hurrying, and ${he} blushes dreadfully as ${he} keeps working at it.`);
 		}
 		App.Events.addParagraph(node, t);
 		App.Events.addResponses(node, [
@@ -259,13 +259,13 @@ App.Events.RESSAssFitting = class RESSAssFitting extends App.Events.BaseEvent {
 				t.push(V.PC.title === 1 ? "strong" : "feminine");
 				t.push(`hands without surprise or resentment, and relaxes trustingly as you manipulate ${his} bottom. Realizing that you're helping ${him}, ${he} quickly slides the offending item down ${his}`);
 				t.push(hasBothLegs(eventSlave) ? "thighs" : "thigh");
-				t.push(`and off ${him}self, and then thanks you properly. ${He} smiles at you as ${he} puts on the next size up, clearly pleased that you'd <span class="mediumaquamarine">assist ${him} with a trivial thing</span> outside of ${his} direct duties as a sex slave.`);
+				t.push(`and off ${himself}, and then thanks you properly. ${He} smiles at you as ${he} puts on the next size up, clearly pleased that you'd <span class="mediumaquamarine">assist ${him} with a trivial thing</span> outside of ${his} direct duties as a sex slave.`);
 			} else {
 				t.push(`${He} stiffens at the feeling of your hands on ${his} bottom, not sure whether you're about to ram`);
 				t.push(V.PC.dick !== 0 ? "your dick" : "something");
 				t.push(`up ${his} defenseless asshole. You feel the muscles down there tense a little through the softness of the lower part of ${his} buttocks. That's not what you're planning, though, and eventually ${he} realizes that you mean to help. ${He} thanks you hesitantly before bending to slide the offending clothing down ${his}`);
 				t.push(hasBothLegs(eventSlave) ? "thighs." : "thigh.");
-				t.push(`Nervously, ${he} thanks you again after ${he}'s free, unsure of ${him}self but <span class="mediumaquamarine">impressed that you'd help ${him} with a little thing like that.</span>`);
+				t.push(`Nervously, ${he} thanks you again after ${he}'s free, unsure of ${himself} but <span class="mediumaquamarine">impressed that you'd help ${him} with a little thing like that.</span>`);
 			}
 			eventSlave.trust += 5;
 			return t;
diff --git a/src/events/RESS/comfortableSeat.js b/src/events/RESS/comfortableSeat.js
index 1f1b76e69be852ae064684c5a2f0818613a66867..cf800368ec1da80fbdba66361b1a000924ae69e6 100644
--- a/src/events/RESS/comfortableSeat.js
+++ b/src/events/RESS/comfortableSeat.js
@@ -27,7 +27,7 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 		const {
 			He, he, His, his, him, himself, girl
 		} = getPronouns(eventSlave);
-		const {s, say, title: Master} = getEnunciation(eventSlave);
+		const {say, title: Master} = getEnunciation(eventSlave);
 		const desc = SlaveTitle(eventSlave);
 		const belly = bellyAdjective(eventSlave);
 		const dickSize = eventSlave.dick > 4 ? "big" : (eventSlave.dick > 2 ? "" : "tiny");
@@ -162,7 +162,16 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`${He}'s not used to being on top, but ${he} uses ${himself} to service you as submissively as ${he} can. ${He} pays ${his} own pleasure no attention at all,`);
 						break;
 					case "cumslut":
-						t.push(`squats down, coming face to face with ${PC.dick !== 0 ? "your cock" : "the phallus"}. ${canTalk(eventSlave) ? `"${Master}, I changed my mind about ${s}itting," ${he} ${say}s` : `${He} gestures that ${he} changed ${his} mind about sitting`}, and licks ${his} lips sluttily. Then ${he} gives ${PC.dick !== 0 ? "you" : "the phallus"} a lusty blowjob, humming and licking happily. ${He} ${PC.dick !== 0 ? "swallows your load hungrily" : "helps you out of the harness with your permission and eats you out too"},`);
+						t.push(`squats down, coming face to face with ${PC.dick !== 0 ? "your cock" : "the phallus"}.`);
+						if (canTalk(eventSlave)) {
+							t.push(
+								Spoken(eventSlave, `"${Master}, I changed my mind about sitting,"`),
+								`${he} ${say}s,`
+							);
+						} else {
+							t.push(`${He} gestures that ${he} changed ${his} mind about sitting,`);
+						}
+						t.push(`and licks ${his} lips sluttily. Then ${he} gives ${PC.dick !== 0 ? "you" : "the phallus"} a lusty blowjob, humming and licking happily. ${He} ${PC.dick !== 0 ? "swallows your load hungrily" : "helps you out of the harness with your permission and eats you out too"},`);
 						seX(eventSlave, "oral", PC, "penetrative");
 						break;
 					case "humiliation":
@@ -197,7 +206,15 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						} else {
 							t.push(`against one of ${his} nipples.`);
 						}
-						t.push(`${canTalk(eventSlave) ? `"${Master}, I changed my mind about ${s}itting," ${he} ${say}s` : `${He} gestures that ${he} changed ${his} mind about sitting`}, and starts giving you a boob job. ${He} enjoys the breast play,`);
+						if (canTalk(eventSlave)) {
+							t.push(
+								Spoken(eventSlave, `"${Master}, I changed my mind about sitting,"`),
+								`${he} ${say}s,`
+							);
+						} else {
+							t.push(`${He} gestures that ${he} changed ${his} mind about sitting,`);
+						}
+						t.push(`and starts giving you a boob job. ${He} enjoys the breast play,`);
 
 						seX(eventSlave, "mammary", PC, "penetrative");
 						break;
@@ -352,7 +369,17 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 			} else {
 				t.push("cute little rear end.");
 			}
-			t.push(`${He}'s expecting something sexy, and ${he}'s wrong. You give ${his} right asscheek a stinging, open-handed slap. It's so unexpected that ${he} jumps with surprise, takes a step forward, and instantly bursts into tears. Knowing that ${he} has to accept whatever you think ${he} deserves, ${he} takes a step back towards you to come back within range. ${canTalk(eventSlave) ? `${Master}, I'm ${s}-${s}orry," ${he} sobs. "I d-don't under${s}tand. What did I d-do?"` : `${He} shakily gestures a question, begging to know what ${he} did.`} You tell ${him} not to disturb you when you're working, tanning ${his} ass viciously, first one buttock and then the other. ${He} stands there and takes ${his} beating, weeping, more from the <span class="gold">bitter disappointment that ${he}'s not allowed to approach you</span> like that.`);
+			t.push(`${He}'s expecting something sexy, and ${he}'s wrong. You give ${his} right asscheek a stinging, open-handed slap. It's so unexpected that ${he} jumps with surprise, takes a step forward, and instantly bursts into tears. Knowing that ${he} has to accept whatever you think ${he} deserves, ${he} takes a step back towards you to come back within range.`);
+			if (canTalk(eventSlave)) {
+				t.push(
+					`${Master}, I'm s-sorry,"`,
+					`${he} sobs.`,
+					`"I d-don't understand. What did I d-do?"`
+				);
+			} else {
+				t.push(`${He} shakily gestures a question, begging to know what ${he} did.`);
+			}
+			t.push(`You tell ${him} not to disturb you when you're working, tanning ${his} ass viciously, first one buttock and then the other. ${He} stands there and takes ${his} beating, weeping, more from the <span class="gold">bitter disappointment that ${he}'s not allowed to approach you</span> like that.`);
 
 			eventSlave.trust -= 5;
 			return t;
diff --git a/src/events/RESS/coolerLockin.js b/src/events/RESS/coolerLockin.js
index beb3ad3eebf5868a9878a4b547898462e3d49f88..69c954ada68a61aa202bf22f8289774a410ebf67 100644
--- a/src/events/RESS/coolerLockin.js
+++ b/src/events/RESS/coolerLockin.js
@@ -70,10 +70,10 @@ App.Events.RESSCoolerLockin = class RESSCoolerLockin extends App.Events.BaseEven
 		function yourself() {
 			r = [];
 			r.push(`You're not close to the penthouse kitchen area, so it takes you some time to make your way there. By the time you get there, the poor ${girl} is pounding weakly against the refrigerator door to try to get someone's attention. ${capFirstChar(V.assistant.name)} was right, ${he} must be too cold to think straight; if ${he} weren't ${he} might notice the prominent release button right next to where ${he}'s striking the door. ${His} desperate ${eventSlave.skin} face is visible in the window. You hit the exterior release and the door swings open quickly, dumping ${him} into your arms.`);
-			if (s.devotion < -50) {
+			if (eventSlave.devotion < -50) {
 				r.push(`Despite hating you, <span class="devotion inc">${he} clings to you like a long lost love,</span> ${his}`);
 				eventSlave.devotion += 6;
-			} else if (s.devotion <= 20) {
+			} else if (eventSlave.devotion <= 20) {
 				r.push(`Despite not being devoted to you, <span class="devotion inc">${he} clings to you like a long lost love,</span> ${his}`);
 				eventSlave.devotion += 4;
 			} else {
diff --git a/src/events/RESS/devotedVirgin.js b/src/events/RESS/devotedVirgin.js
index 6ec0f48633d40e0f598eadacecc5801923d861ba..b92d97be79d5420e1007f8dc5db95d66d851901e 100644
--- a/src/events/RESS/devotedVirgin.js
+++ b/src/events/RESS/devotedVirgin.js
@@ -23,7 +23,7 @@ App.Events.RESSDevotedVirgin = class RESSDevotedVirgin extends App.Events.BaseEv
 		const {
 			He, he, his, him, himself
 		} = getPronouns(eventSlave);
-		const {s, say, title: Master} = getEnunciation(eventSlave);
+		const {say, title: Master} = getEnunciation(eventSlave);
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -89,7 +89,10 @@ App.Events.RESSDevotedVirgin = class RESSDevotedVirgin extends App.Events.BaseEv
 			}
 			t.push(`body for a long time. Every so often you move your hands over ${his} pussylips, making ${him} shiver and press ${himself} against you, but you only make it the center of attention once the poor over-aroused slave`);
 			if (canTalk(eventSlave)) {
-				t.push(`begs, "I can't take it any more, ${Master}! Fuck me, plea${s}e. Plea${s}e!"`);
+				t.push(
+					`begs,`,
+					Spoken(eventSlave, `"I can't take it any more, ${Master}! Fuck me, please. Please!"`)
+				);
 			} else {
 				t.push(`begins to reach for your ${PC.dick === 0 ? "strap-on" : "cock"} to pull it towards ${himself}.`);
 			}
diff --git a/src/events/RESS/forbiddenMasturbation.js b/src/events/RESS/forbiddenMasturbation.js
index b3fe4bee54e4fd6605f2200feadfcea9c7bc2a1d..b30891060234c18315f917552283167e054eed88 100644
--- a/src/events/RESS/forbiddenMasturbation.js
+++ b/src/events/RESS/forbiddenMasturbation.js
@@ -67,7 +67,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 					r.push(`stares at the scene, blushing, while a hand caresses ${hisA} large belly.`);
 					break;
 				case "angel":
-					r.push(`is covering ${hisA} face, occasionally peeping through _hisA fingers.`);
+					r.push(`is covering ${hisA} face, occasionally peeping through ${hisA} fingers.`);
 					break;
 				case "cherub":
 					r.push(`is trying ${hisA} hardest to look away, but keeps glancing back at the scene.`);
diff --git a/src/events/RESS/frighteningDick.js b/src/events/RESS/frighteningDick.js
index bd3bcfed353d5197995e8f4d9ca3700f288d6858..82ce8ef51b0db669b4b6514f616d1b9d2cd56550 100644
--- a/src/events/RESS/frighteningDick.js
+++ b/src/events/RESS/frighteningDick.js
@@ -27,7 +27,7 @@ App.Events.RESSFrighteningDick = class RESSFrighteningDick extends App.Events.Ba
 		const {
 			He, he, His, his, him, himself
 		} = getPronouns(eventSlave);
-		const {s, say, title: Master} = getEnunciation(eventSlave);
+		const {say, title: Master} = getEnunciation(eventSlave);
 		const desc = SlaveTitle(eventSlave);
 		const belly = bellyAdjective(eventSlave);
 
@@ -58,7 +58,11 @@ App.Events.RESSFrighteningDick = class RESSFrighteningDick extends App.Events.Ba
 		} else {
 			t.push("cute butt");
 		}
-		t.push(`hitting the floor with an audible whack. The light cloth ${he} was using to polish with went flying, and flutters to the ground accusingly. After scrabbling back a short distance, looking up at you hesitantly, and visibly recollecting ${himself}, ${he} swallows twice and then ${say}s, "I'm ${s}orry, ${Master}," in a tone of voice with a great deal of effort applied to keep it even. A frantic, embarrassed search for ${his} cloth ensues. Finding it at last, ${he} returns to ${his} original, low position, and crouch-walks back to the place ${he} was polishing, doing ${his} absolute best to look diligent and industrious and not at all aware that your cock is pointing at ${him} like a gun barrel.`);
+		t.push(
+			`hitting the floor with an audible whack. The light cloth ${he} was using to polish with went flying, and flutters to the ground accusingly. After scrabbling back a short distance, looking up at you hesitantly, and visibly recollecting ${himself}, ${he} swallows twice and then ${say}s,`,
+			Spoken(eventSlave, `"I'm sorry, ${Master},"`),
+			`in a tone of voice with a great deal of effort applied to keep it even. A frantic, embarrassed search for ${his} cloth ensues. Finding it at last, ${he} returns to ${his} original, low position, and crouch-walks back to the place ${he} was polishing, doing ${his} absolute best to look diligent and industrious and not at all aware that your cock is pointing at ${him} like a gun barrel.`
+		);
 		App.Events.addParagraph(node, t);
 		t = [];
 
diff --git a/src/events/RESS/hotPC.js b/src/events/RESS/hotPC.js
index 99fa49a67dac71ff32ff6017cc9919073d844835..73d6c0191ff3b576d365a5b453d277ff38dadc8c 100644
--- a/src/events/RESS/hotPC.js
+++ b/src/events/RESS/hotPC.js
@@ -85,7 +85,7 @@ App.Events.RESSHotPC = class RESSHotPC extends App.Events.BaseEvent {
 			}
 		} else {
 			if (PC.title === 0) {
-				t.push(`abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
+				t.push(`abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
 			} else {
 				t.push(`abdominal muscles with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your bare chest is coated in a light sheen of glistening sweat.`);
 			}
diff --git a/src/events/RESS/imScared.js b/src/events/RESS/imScared.js
index 16194753bcb3073569a5ae0e907894b2f89bfbd5..193e4cebac1b3669a691f5a49bd125e1309e2117 100644
--- a/src/events/RESS/imScared.js
+++ b/src/events/RESS/imScared.js
@@ -35,7 +35,7 @@ App.Events.RESSImScared = class RESSImScared extends App.Events.BaseEvent {
 		let t = [];
 
 		t.push(`During ${his} weekly inspection,`);
-		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(contextualIntro(V.PC, eventSlave, "DOM"));
 		t.push(`has trouble following the routine orders that position ${him} so you can examine ${his} body. The cause is not difficult to determine: ${he}'s so cripplingly terrified that ${he}'s having difficulty functioning. ${He} seems to be trying to obey you, but ${he}'s so scared that ${his} mind is having trouble translating your simple verbal commands into physical obedience. You ask ${him} what ${he}'s so frightened of. The question stuns ${him}, and ${he} ${canSee(eventSlave) ? "stares at" : "faces"} you in mute horror, looking even more terrified than ${he} has up to this point and completely devoid of any idea how to respond. You order ${him} to respond, and this starts ${him} out of ${his} fugue. ${He} begins to cry, makes two false starts, sobs, and then begins forcing out words.`);
 		App.Events.addParagraph(node, t);
 		t = [];
diff --git a/src/events/RESS/impregnationPlease.js b/src/events/RESS/impregnationPlease.js
index 91be8ae34be6e883b08dc54595c96101403d43f6..9bf05cfb93c966bcfca353ec62e560e61b43e81d 100644
--- a/src/events/RESS/impregnationPlease.js
+++ b/src/events/RESS/impregnationPlease.js
@@ -41,7 +41,6 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 		let r = [];
 		r.push(`Taken by a mood,`);
 		r.push(contextualIntro(V.PC, eventSlave, "DOM"));
-		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); // TODO: Integrate contextualIntro somewhere
 		if (isPregnantAndSuperfetation) {
 			if (eventSlave.belly >= 750000) {
 				r.push(`barely makes into your office before turning and leaning against ${his} ${belly} belly. Once ${he} manages to get comfortable against the strained mass, ${he} wiggles ${his} exposed`);
@@ -219,9 +218,10 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 			r.push(`${He} faces you with the look of a child begging for candy,`);
 		}
 		r.push(`desperately awaiting your answer.`);
+		App.Events.addParagraph(node, r);
 
 		let responses = [new App.Events.Result(`Put a slave in ${him}`, impregnate)];
-		if 	(eventSlave.mpreg === 0) {
+		if (eventSlave.mpreg === 0) {
 			responses.push(new App.Events.Result(`Use ${his} ass but give ${him} what ${he} wants`, impregnateAss));
 			responses.push(new App.Events.Result(`Sneak it into ${his} ass instead`, sneak));
 		} else {
@@ -230,7 +230,6 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 		if (cumSlaves().length >= 5) {
 			responses.push(new App.Events.Result(`Use the Dairy cockmilk to impregnate ${him}`, dairy));
 		}
-		App.Events.addParagraph(node, r);
 		App.Events.addResponses(node, responses);
 
 		function impregnate() {
diff --git a/src/events/RESS/lazyEvening.js b/src/events/RESS/lazyEvening.js
index 03b04077e176177bf99bf61f0a563234d3e92d17..28447068fcb9117c58cc90153c4ff57ca89fe65b 100644
--- a/src/events/RESS/lazyEvening.js
+++ b/src/events/RESS/lazyEvening.js
@@ -21,7 +21,7 @@ App.Events.RESSLazyEvening = class RESSLazyEvening extends App.Events.BaseEvent
 		const {
 			He, he, His, his, hers, him, himself, girl, woman
 		} = getPronouns(eventSlave);
-		const {s, title} = getEnunciation(eventSlave);
+		const {title} = getEnunciation(eventSlave);
 
 		V.nextLink = "Next Week";
 
@@ -62,9 +62,15 @@ App.Events.RESSLazyEvening = class RESSLazyEvening extends App.Events.BaseEvent
 		if (!canTalk(eventSlave)) {
 			t.push(`asks with a gesture that carries just the right mixture of submission and exaggerated casualness if you'd like to 'hang out.'`);
 		} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
-			t.push(`lisps with exaggerated casualness, "Let'${s} hang out, ${title}?"`);
+			t.push(
+				`lisps with exaggerated casualness,`,
+				Spoken(eventSlave, `"Let's hang out, ${title}?"`)
+			);
 		} else {
-			t.push(`asks with exaggerated casualness, "Want to hang out, ${title}?"`);
+			t.push(
+				`asks with exaggerated casualness,`,
+				Spoken(eventSlave, `"Want to hang out, ${title}?"`)
+			);
 		}
 		App.Events.addParagraph(node, t);
 
diff --git a/src/events/RESS/moistPussy.js b/src/events/RESS/moistPussy.js
index a2564d00f1381acaea56fa4fc050ae31d100e27b..ecc16fc3a889387d5ccbc6d7578102c015ac8ddd 100644
--- a/src/events/RESS/moistPussy.js
+++ b/src/events/RESS/moistPussy.js
@@ -19,7 +19,7 @@ App.Events.RESSMoistPussy = class RESSMoistPussy extends App.Events.BaseEvent {
 		/** @type {Array<App.Entity.SlaveState>} */
 		let [eventSlave] = this.actors.map(a => getSlave(a));
 		const {
-			He, he, His, his, him, hers
+			He, he, His, his, him, himself, hers
 		} = getPronouns(eventSlave);
 		const belly = bellyAdjective(eventSlave);
 
@@ -124,7 +124,7 @@ App.Events.RESSMoistPussy = class RESSMoistPussy extends App.Events.BaseEvent {
 			} else {
 				t.push(`cup ${his} cute little`);
 			}
-			t.push(`buttocks. ${He} ${eventSlave.voice > 0 ? "coos" : "hums mutely"} at the feeling of your ${V.PC.title === 1 ? "strong" : "feminine"} hands on ${his} bottom, and presses ${him}self against you as you rotate the two of you until you can set ${his} butt on the edge of your desk and ${V.PC.dick !== 0 ? `slide your big dick into ${his} well-lubricated cunt.` : `assertively press your own pussy against ${his} wet cunt.`}`);
+			t.push(`buttocks. ${He} ${eventSlave.voice > 0 ? "coos" : "hums mutely"} at the feeling of your ${V.PC.title === 1 ? "strong" : "feminine"} hands on ${his} bottom, and presses ${himself} against you as you rotate the two of you until you can set ${his} butt on the edge of your desk and ${V.PC.dick !== 0 ? `slide your big dick into ${his} well-lubricated cunt.` : `assertively press your own pussy against ${his} wet cunt.`}`);
 			App.Events.addParagraph(container, t);
 
 			t = [];
@@ -151,7 +151,7 @@ App.Events.RESSMoistPussy = class RESSMoistPussy extends App.Events.BaseEvent {
 			t.push(`${He} clings to you, accepting the closeness to ${his} ${getWrittenTitle(eventSlave)} and enjoying the loving attention, even as the extreme wetness of ${his} cunt and your ${V.PC.dick !== 0 ? "powerful thrusting" : "hungry grinding"} begin to produce lewd noises from between you.`);
 			t.push(`${His} generous natural lubrication lessens the friction and sensation a little, and you go for a long time before you both climax.`);
 			t.push(`You lead ${him} into your office shower, since you're both coated in ${his} pussyjuice${V.PC.dick !== 0 ? ` and ${he}'s carrying a big load of your cum` : ", and your own"}.`);
-			t.push(`Under the hot water, you don't even have to pull ${him} close; <span class="hotpink">${he} presses ${him}self into your arms on ${his} own.</span>`);
+			t.push(`Under the hot water, you don't even have to pull ${him} close; <span class="hotpink">${he} presses ${himself} into your arms on ${his} own.</span>`);
 			if (eventSlave.sexualQuirk === "romantic") {
 				t.push(`For an incorrigible romantic like ${him}, this encounter was perfect, and ${he} <span class="hotpink">loves you all the more for it.</span>`);
 				eventSlave.devotion += 3;
@@ -212,7 +212,7 @@ App.Events.RESSMoistPussy = class RESSMoistPussy extends App.Events.BaseEvent {
 						t.push(`since ${he}'s fully confirmed in ${his} status as a sub, ${he} <span class="hotpink">glows with devotion</span>`);
 						eventSlave.devotion += 3;
 					}
-					t.push(`as ${he} washes ${him}self in the shower with you.`);
+					t.push(`as ${he} washes ${himself} in the shower with you.`);
 				} else {
 					t.push(`${He} seems utterly dissipated by the fucking ${he} just got, and may have just had the best sex of ${his} life. <span class="lightsalmon">${He}'s a submissive!</span>`);
 					eventSlave.fetishKnown = 1;
diff --git a/src/events/RESS/nightVisit.js b/src/events/RESS/nightVisit.js
index 4bd794ee47e194d7357020ab56b154934e28e9fc..9fc1c7a7e36fa1526c5bb09eb7d83fd32e859d09 100644
--- a/src/events/RESS/nightVisit.js
+++ b/src/events/RESS/nightVisit.js
@@ -56,7 +56,7 @@ App.Events.RESSNightVisit = class RESSNightVisit extends App.Events.BaseEvent {
 		} else {
 			if (eventSlave.lips > 70) {
 				r.push(`${he} says meekly through ${his} massive dick-sucking lips,`);
-			} else if ((eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2)) {
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
 				r.push(`${he} says meekly through ${his} inconvenient oral piercings,`);
 			} else {
 				r.push(`${he} says meekly,`);
diff --git a/src/events/RESS/plimbHelp.js b/src/events/RESS/plimbHelp.js
index 959b42fc60c45e4a42996388f7b28560061d1c32..71d30c12ee2d5650829a474672071ca8f0611be7 100644
--- a/src/events/RESS/plimbHelp.js
+++ b/src/events/RESS/plimbHelp.js
@@ -303,7 +303,7 @@ App.Events.RESSPlimbHelp = class RESSPlimbHelp extends App.Events.BaseEvent {
 				r.push(`flooding your rectum with cum.`);
 			}
 			App.Events.addParagraph(frag, r);
-			App.Events.addParagraph(frag, [`When you've climaxed yourself, ${he} looks towards ${his} waiting P-Limbs, but you're not done with ${his} yet. You pick ${him} up again and bring ${him} into the shower. ${He} tries to help you, but again, ${he} gives up after a while, letting you wash ${him}. As you're rinsing the soap off ${him}, ${he} <span class="devotion inc">thanks you devotedly.</span> With the water streaming down ${his} face, you barely notice ${his} gentle tears.`]);
+			App.Events.addParagraph(frag, [`When you've climaxed yourself, ${he} looks towards ${his} waiting P-Limbs, but you're not done with ${him} yet. You pick ${him} up again and bring ${him} into the shower. ${He} tries to help you, but again, ${he} gives up after a while, letting you wash ${him}. As you're rinsing the soap off ${him}, ${he} <span class="devotion inc">thanks you devotedly.</span> With the water streaming down ${his} face, you barely notice ${his} gentle tears.`]);
 			eventSlave.devotion += 4;
 			return frag;
 		}
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/aGift.js b/src/events/RESS/review/aGift.js
index 9bade098fc0fb8239a3d28466efece8979bdb40d..f5249269acd6757b875e34eb1fdc232cb0224210 100644
--- a/src/events/RESS/review/aGift.js
+++ b/src/events/RESS/review/aGift.js
@@ -214,8 +214,7 @@ App.Events.RESSAGift = class RESSAGift extends App.Events.BaseEvent {
 					if (V.PC.vagina !== -1) {
 						r.push(`eat you out`);
 					}
-					r.push(r.pop() + ",");
-					r.push(`${Master}?", ${He}`);
+					r.push(r.pop() + `, ${Master}?" ${He}`);
 					if (eventSlave.belly >= 300000) {
 						r.push(`leans onto ${his} ${belly} middle`);
 					} else if (eventSlave.belly >= 10000) {
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/ampDevoted.js b/src/events/RESS/review/ampDevoted.js
index c4ec8a34c1ce446a06b0dbb33a2110e4694e093f..bdec7dde4e98351e3638a43697af62e1ea24bb2f 100644
--- a/src/events/RESS/review/ampDevoted.js
+++ b/src/events/RESS/review/ampDevoted.js
@@ -51,7 +51,7 @@ App.Events.RESSAmpDevoted = class RESSAmpDevoted extends App.Events.BaseEvent {
 		r.push(`that ${he} is. You've been busy and haven't used ${him} for a while, and since ${he}'s accepted ${his} place as a helpless living fucktoy, ${he}'s gotten quite aroused with nothing to do but lie there and watch ${his} ${getWrittenTitle(eventSlave)} work. It's not like ${he} can touch ${himself} any more.`);
 		if (eventSlave.chastityPenis === 1) {
 			r.push(`${His} caged cock reduces ${him} to a set of holes in a limbless torso.`);
-		} else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
+		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
 			r.push(`${His} penis hangs limp and useless from ${his} limbless torso.`);
 		} else if (eventSlave.dick >= 5) {
 			r.push(`${His} huge erection pokes out from ${his} limbless torso, ${his} only remaining appendage.`);
diff --git a/src/events/RESS/review/badDream.js b/src/events/RESS/review/badDream.js
new file mode 100644
index 0000000000000000000000000000000000000000..abbe369e4fdae910245d95ea94d90198a737af21
--- /dev/null
+++ b/src/events/RESS/review/badDream.js
@@ -0,0 +1,199 @@
+App.Events.RESSBadDream = class RESSBadDream 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.devotion <= 20,
+				s => s.trust < -20,
+				s => s.rules.living === "spare",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, hers
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`Passing near the slave dormitory late at night, you hear a quiet cry within. This is strange; most slaves housed there are not inclined or not allowed to have sex in the middle of the night, and in any case, the noise wasn't one of pleasure. Looking in, you see a jerky movement near the door. It's`,
+			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), ","),
+			`and ${he}'s obviously having a bad dream. ${He} raises`
+		);
+		if (hasBothArms(eventSlave)) {
+			r.push(`an`);
+		} else {
+			r.push(`${his}`);
+		}
+		r.push(`arm to fend off some imagined danger, and in doing so, pushes the sheet down around ${his} waist. ${He} sleeps naked, like all your slaves, and the movement bares ${his}`);
+		if (eventSlave.boobs > 2000) {
+			r.push(`udders`);
+		} else if (eventSlave.boobs > 1000) {
+			r.push(`heavy breasts`);
+		} else if (eventSlave.boobs > 400) {
+			r.push(`boobs`);
+		} else {
+			r.push(`little tits`);
+		}
+		if (eventSlave.belly >= 5000) {
+			r.push(`and ${belly}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			}
+			r.push(`belly`);
+		}
+		r.push(`to the cool night air. The low blue light outlines ${his} nipples as they`);
+		if (eventSlave.nipples !== "fuckable") {
+			r.push(`stiffen`);
+		} else {
+			r.push(`swell`);
+		}
+		r.push(`at the sudden change of temperature,`);
+		switch (eventSlave.nipples) {
+			case "tiny":
+				r.push(`pricking up into little buds.`);
+				break;
+			case "flat":
+				r.push(`becoming visible against ${his} areolae.`);
+				break;
+			case "puffy":
+				r.push(`the puffy promontories jutting even farther out.`);
+				break;
+			case "partially inverted":
+				r.push(`just starting to poke past their inversion.`);
+				break;
+			case "inverted":
+				r.push(`the twin domes formed by their inverted shapes becoming more prominent.`);
+				break;
+			case "huge":
+				r.push(`becoming so large they cast long shadows across ${his} bed.`);
+				break;
+			case "fuckable":
+				r.push(`the fuckable holes steadily closing and starting to poke outwards.`);
+				break;
+			default:
+				r.push(`becoming attractively erect.`);
+		}
+		r.push(`Still dreaming, ${he} clasps ${his}`);
+		if (hasBothArms(eventSlave)) {
+			r.push(`arms`);
+		} else {
+			r.push(`arm`);
+		}
+		r.push(`protectively over ${his}`);
+		if (eventSlave.pregKnown === 1) {
+			r.push(`unborn`);
+			if (eventSlave.pregType > 1) {
+				r.push(`children,`);
+			} else {
+				r.push(`child,`);
+			}
+		} else {
+			r.push(`vulnerable chest,`);
+		}
+		r.push(
+			`and rolls to one side. Halfway into a fetal position, ${he} turns ${his} head against ${his} pillow, murmuring`,
+			Spoken(eventSlave, `"N-no — please no — I'll d-do anyth-thing — no..."`)
+		);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+		/* TODO: add a positive variant */
+			new App.Events.Result(`Let ${him} be`, leave),
+			new App.Events.Result(`Hug ${him}`, hug),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Rape ${him}`, rape, ((eventSlave.vagina === 0 && canDoVaginal(eventSlave)) || (eventSlave.anus === 0) && canDoAnal(eventSlave)) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+		]);
+
+		function leave() {
+			return `It may be for the best to not disturb ${his} restless slumber, you decide. Admiring the attractive view for just a moment longer, you turn back and head to your own bed. The next morning, it appears as though ${eventSlave.slaveName} doesn't even remember this nightmare.`;
+		}
+
+		function hug() {
+			r = [];
+			r.push(`You reach out to hug ${him}, but as soon as your hand touches ${his} shoulder, ${he} writhes instinctively away.`);
+			if (canSee(eventSlave)) {
+				r.push(`${His} eyes fly open, searching frantically for ${his} assailant. Seeing that it's you, ${he} screams and scrabbles away even harder. After making it a few feet, ${he} collects ${his} wits enough to bring ${himself} to a stop and stop screaming, though ${he} continues to sob, staring at you in terror.`);
+			} else {
+				r.push(`${He} gropes frantically for ${his} assailant, before making contact with you. ${He} screams and scrabbles away, only stopping when ${he} collides with the nearest solid object.`);
+				if (canHear(eventSlave)) {
+					r.push(`Only after several call outs that it is you does ${he} stop screaming, though ${he} continues to sob, listening to your every breath in terror.`);
+				} else {
+					r.push(`After screaming ${himself} hoarse, ${he} realizes that ${his} assault has abruptly ended, and gently feels around ${his} surroundings with a shaking hand to discover ${himself} back in ${his} room.`);
+				}
+			}
+			r.push(`${He} remains frozen in place as you slowly advance on ${him} and give ${him} a light embrace. ${His} tears gradually stop, but ${he} does not relax,`);
+			if (canSee(eventSlave)) {
+				r.push(`remaining dumbly stiff`);
+			} else {
+				r.push(`continuing to quake in fear`);
+			}
+			r.push(`within your arms. Eventually you let ${him} go, and ${he} crawls pathetically back under ${his} sheet, still weeping softly. It seems ${he} is <span class="trust dec">more afraid of you</span> than ever, and if you thought that a simple hug could win ${him} over, you were wrong.`);
+			if (canSee(eventSlave)) {
+				eventSlave.trust -= 4;
+			} else if (canHear(eventSlave)) {
+				eventSlave.trust -= 5;
+			} else {
+				eventSlave.trust -= 6;
+			}
+			return r;
+		}
+
+		function rape() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You snatch the sheet off ${him}, shove ${his} uppermost shoulder down so ${his} face is smashed into the pillow, and bring your knees down between ${his} legs, spreading them to force ${hers} apart. You use the hand that isn't controlling ${his} torso to locate ${his}`); // TODO add support for one-handed PC?
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina > 2) {
+					r.push(`amusingly loose cunt`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`large womanhood`);
+				} else if (eventSlave.vagina > 0) {
+					r.push(`tight pussy`);
+				} else {
+					r.push(`poor virgin pussy`);
+				}
+			} else {
+				if (eventSlave.anus > 2) {
+					r.push(`amusingly broad asshole`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`big butthole`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`tight rosebud`);
+				} else {
+					r.push(`poor virgin anus`);
+				}
+			}
+			r.push(`in the dark as ${he} begins to <span class="trust dec">struggle and scream.</span> ${He} comes fully awake when ${he} feels your rough fingers searching for and then finding ${his}`);
+			if (eventSlave.vagina >= 0 && canDoVaginal(eventSlave)) {
+				r.push(`vagina,`);
+			} else {
+				r.push(`crinkled hole,`);
+			}
+			r.push(`and ${his} noise increases to the point where it becomes annoying. You stuff ${his} face into the pillow and take ${him} mercilessly, using the pillow to cut off ${his} breath whenever ${he} struggles too much, until oncoming suffocation forces ${him} to go still and take it like a good little bitch.`);
+			App.Events.addParagraph(frag, r);
+			App.Events.addParagraph(frag, [`<span class="devotion dec">Sometimes dreams do come true.</span>`]);
+			App.Events.addParagraph(frag, [VCheck.Simple(eventSlave, 1)]);
+			eventSlave.trust -= 4;
+			eventSlave.devotion -= 4;
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/cageRelief.js b/src/events/RESS/review/cageRelief.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a4fcb077c0675dea4b0335e8c8135312dd3fb05
--- /dev/null
+++ b/src/events/RESS/review/cageRelief.js
@@ -0,0 +1,372 @@
+App.Events.RESSCageRelief = class RESSCageRelief 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.balls > 0,
+				s => s.scrotum > 0,
+				s => s.chastityPenis === 1,
+				s => s.energy > 50,
+				s => s.energy < 95,
+				s => s.devotion <= 95,
+				s => s.devotion >= -20 || 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, hers
+		} = 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(
+			`You come face to face with`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`in a hallway of your penthouse, entirely by happenstance.`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`${His} ${App.Desc.eyesColor(eventSlave)} lock with yours, and ${he} stares at you dumbly for a long moment.`);
+		} else {
+			r.push(`Once ${he} regains ${his} footing after bumping into you, ${he} gazes towards you dumbly for a long moment.`);
+		}
+		r.push(`Then ${he} squares ${his}`);
+		if (eventSlave.shoulders > 0) {
+			r.push(`broad`);
+		} else if (eventSlave.shoulders < 0) {
+			r.push(`pretty`);
+		} else {
+			r.push(`feminine`);
+		}
+		r.push(`shoulders and bites ${his} lower lip, obviously doing ${his} best to think quickly. Right when you're about to reprimand ${him} for not greeting you properly, ${he} surprises you by throwing ${himself} abjectly on the ground in front of you`);
+		if (eventSlave.belly >= 10000) {
+			r.push(r.pop() + `, ${his} rear forced into the air by ${his} ${belly}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			} else {
+				r.push(`distended`);
+			}
+			r.push(`belly`);
+		}
+		r.push(r.pop() + `.`);
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} uses gestures to apologize for ${his} rudeness, and then gets to ${his}`);
+			if (hasBothLegs(eventSlave)) {
+				r.push(`knees`);
+			} else {
+				r.push(`knee`);
+			}
+			r.push(`so ${he} can use ${his} hand`);
+			if (hasBothArms(eventSlave)) {
+				r.push(`hands`);
+			} else {
+				r.push(`hand`);
+			}
+			r.push(`to gesture more clearly. ${His}`);
+			if (hasBothArms(eventSlave)) {
+				r.push(`hands are`);
+			} else {
+				r.push(`hand is`);
+			}
+			r.push(`shaky as ${he} begs, making two false starts before unmistakably gesturing to ask you to cut ${his} balls off. Once ${he}`);
+			if (canSee(eventSlave)) {
+				r.push(`sees`);
+			} else {
+				r.push(`figures`);
+			}
+			r.push(`that you understand, ${he} begins to cry openly. ${He} gestures that ${he} can barely get off wearing ${his} chastity cage, that it hurts when ${he} does, and that ${he}'s constantly oppressed by the need for release. ${He} thinks that it would be easier to be soft all the time, so ${he} could climax without discomfort. ${He} begs hard, and promises to be a good little bitch.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"Please, ${Master},"`),
+				`the prostrate slave ${say}s shakily, sounding like ${he}'s on the verge of tears.`,
+				Spoken(eventSlave, `"P-please cut my balls off."`)
+			);
+			if (canHear(eventSlave)) {
+				r.push(`Hearing ${himself} ${say} it, ${he}`);
+			} else {
+				r.push(`${He}`);
+			}
+			r.push(
+				`begins to cry openly.`,
+				Spoken(eventSlave, `"I c-can't t-take it anymore. I can b-barely get off wearing this cage on my dick, and when I d-do, it h-hurts,"`),
+				`${he} sobs.`,
+				Spoken(eventSlave, `"I need to g-g-get off s-so bad. Please, please, if I were soft all the time, I wouldn't get hard, so I could come wh-whenever."`),
+				He
+			);
+			if (canSee(eventSlave)) {
+				r.push(`looks up at`);
+			} else {
+				r.push(`angles ${his} head towards you`);
+			}
+			r.push(
+				`you in supplication, tears streaking ${his} face.`,
+				Spoken(eventSlave, `"Please, ${Master}! I'll be s-such a good little bitch, I promise!"`)
+			);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Help ${him} get off`, help),
+			new App.Events.Result(`Cut ${his} balls off`, cut, eventSlave.anus === 0 && canDoAnal(eventSlave) ? `This option will take ${his} anal virginity` : null),
+			canDoAnal(eventSlave)
+				? new App.Events.Result(`Use ${his} cage to torture ${him}`, torture, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null)
+				: new App.Events.Result(),
+			((((eventSlave.fetish === "pregnancy" && PC.belly >= 5000)
+					|| (eventSlave.fetish === "cumslut" && PC.balls >= 14)
+					|| (eventSlave.fetish === "boobs" && PC.boobs >= 1400))
+				&& eventSlave.fetishKnown === 1)
+			|| (((eventSlave.attrXX > 70 && eventSlave.attrXY < 50 && PC.title === 0 && PC.vagina !== -1 && PC.dick === 0)
+					|| (eventSlave.attrXY > 70 && eventSlave.attrXX < 50 && PC.title === 1 && PC.vagina === 0 && PC.dick !== 0))
+				&& eventSlave.attrKnown === 1)
+			)
+				? new App.Events.Result(`Use your body to make ${his} cage feel even tighter`, tighter, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null)
+				: new App.Events.Result()
+		]);
+
+		function help() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You take ${him} by the hand and pull ${him} to ${his} feet, and then kiss ${him}. ${He} knows that this means no, but melts into you anyway, accepting the comforting gesture for what it is. ${He}'s surprised when you do not break the kiss, but continues to make out with you compliantly. You take ${him} by the hands, intertwining your fingers with ${hers} and holding them down at your sides for a while before wrapping ${his} arms around you at your`);
+			if (PC.belly >= 10000) {
+				r.push(`heavily pregnant`);
+			} else if (PC.belly >= 5000) {
+				r.push(`gravid`);
+			} else if (PC.belly >= 1500) {
+				r.push(`swollen`);
+			} else if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
+				r.push(`muscular`);
+			} else if (PC.title === 0) {
+				r.push(`feminine`);
+			} else {
+				r.push(`masculine`);
+			}
+			r.push(`waist. Your hands, thus freed to grope ${him}, tenderly hold ${his} head and neck instead, cupping ${his}`);
+			if (eventSlave.face > 95) {
+				r.push(`gorgeous`);
+			} else if (eventSlave.face >= -10) {
+				r.push(`pretty`);
+			} else {
+				r.push(`homely`);
+			}
+			r.push(`jawline and making ${him} moan at the intimacy.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`${He}'s completely forgotten ${his} troubles, and you see that it stays that way. You consider yourself something of an expert on human stimulation at this point, and you manage ${hers} expertly. (Admittedly, you're also cheating, using discreet scanning of ${his} vital signs to check on ${his} state of arousal.) Whenever ${he}'s in danger of achieving an erection, which would remind ${him} of ${his} chastity cage with a twinge of discomfort, you cool your makeout session off slightly, massaging ${him} capably instead of kissing ${him} deeply. After some time, ${he} shudders, to ${his} own complete surprise and to your unsurprised satisfaction. ${He}'s just done what in a normal sexual encounter would be considered premature ejaculation, since you wrought ${him} to such a subtle state of arousal that ${he} got off without really getting hard. ${He} can muster no coherent response, but <span class="trust inc">hugs you convulsively,</span> sobbing into your`);
+			if (PC.boobs >= 1400) {
+				r.push(`enormous`);
+				if (PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 1200) {
+				r.push(`huge`);
+				if (PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 1000) {
+				r.push(`big`);
+				if (PC.boobsImplant !== 0) {
+					r.push(`firm`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 300) {
+				r.push(`boobs`);
+			} else if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
+				r.push(`strong shoulder`);
+			} else if (PC.title === 0) {
+				r.push(`feminine shoulder`);
+			} else {
+				r.push(`masculine shoulder`);
+			}
+			r.push(`with gratitude and release.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`The scans suggest ${his} discomfort will return in less than half an hour.`);
+			eventSlave.trust += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function cut() {
+			r = [];
+			r.push(`You agree, on the condition that ${he} be a good little bitch like ${he} promised. ${He} thanks you frantically, following you with mixed relief, gratitude, and deep terror as you lead ${him} to the surgery. It's a medically simple procedure, but ${he}'s <span class="health dec">retained for recovery</span> for some time, a common precaution in your penthouse where the surgery affects an area that might be reinjured by sexual use without a short break for the curatives to take effect. When the medical equipment verifies that ${he} can be fucked without pain or danger to ${his} health, you order ${him} to come back up to your office. ${He} is a <span class="devotion inc">very good little bitch,</span>`);
+			if (canDoAnal(eventSlave)) {
+				r.push(`taking`);
+				if (PC.dick !== 0) {
+					r.push(`a hard buttfuck`);
+				} else {
+					r.push(`a hard anal fingerfuck`);
+				}
+				r.push(`with apparent enthusiasm and a strong orgasm, though of course ${his} continued use of a chastity cage conceals almost all the effects.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`enduring all of your teasing without the slightest hint of an erection. Even though ${his} chastity blocks the use of ${his} ass, you still focus most of your attention on ${his} rear for the day the belt comes off.`);
+			}
+			r.push(`When ${he} goes to the bathroom afterward, however, you see ${him}`);
+			if (canSee(eventSlave)) {
+				r.push(`glance at ${himself} in the mirror, just once, and then <span class="trust dec">glance away again,</span>`);
+			} else {
+				r.push(`run ${his} hand under ${his} cock, just once, and then <span class="trust dec">quickly removing ${his} hand,</span>`);
+			}
+			r.push(`a tear leaking down ${his} cheek.`);
+			eventSlave.balls = 0;
+			eventSlave.scrotum = 0;
+			eventSlave.trust -= 4;
+			eventSlave.devotion += 4;
+			surgeryDamage(eventSlave, 5);
+			App.Events.refreshEventArt(eventSlave);
+			return r;
+		}
+
+		function torture() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You make no reply at all, but walk around to stand behind the slave. ${He} knows ${he}'s fucked, and starts to shake with fear. You put a foot on ${his} ass and shove ${him} down`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`so ${his} rear is pointed into the air again,`);
+			} else {
+				r.push(`to lie flat on the floor,`);
+			}
+			r.push(`and then straddle ${him}, shoving`);
+			if (PC.dick !== 0) {
+				r.push(`your`);
+				if (PC.vagina !== -1) {
+					r.push(`futa`);
+				}
+				r.push(`cock up ${his} butt.`);
+			} else {
+				r.push(`one more finger than ${he} can comfortably take up ${his} butt.`);
+			}
+			r.push(`${He} tries to beg some more, but you give ${him} a warning slap, and ${he} shuts up. Despite your roughness, ${he}'s so horny that ${he} starts to get hard. You can't see or feel this directly, of course, but it's easy to tell from ${his} desperate sobbing and involuntary writhing, and the lovely spasming of ${his} anal sphincter. ${His} tears dry up as ${he} builds towards a climax; orgasm might be an uncomfortable experience for ${him}, but it will buy ${him} a few minutes free of discomfort.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`But ${he}'s to be disappointed. You`);
+			if (PC.dick !== 0) {
+				r.push(`worm a hand down between ${his} ass and your stomach, and shove a finger up inside ${him}, alongside your dick`);
+				if (PC.vagina !== -1) {
+					r.push(r.pop() + `, dexterously using the thumb of that hand to stroke your own pussy`);
+				}
+			} else {
+				r.push(`use the hand that isn't fucking ${him} to pull one of ${his} arms around behind ${him} into a painful joint lock`);
+			}
+			r.push(r.pop() + `. The pain ruins ${his} building orgasm, and ${he} cries with frustration and <span class="trust dec">despair</span> as ${he} realizes that ${he} won't be getting off today. You force ${him} to experience this horrible near-release twice more, bringing ${him} to a terribly uncomfortable state of arousal and then using sudden pain to destroy any chance ${he} has of getting relief. All the wriggling and jerking around is good for you, though.`);
+			eventSlave.trust -= 4;
+			r.push(VCheck.Anal(eventSlave, 1));
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function tighter() {
+			const hands = hasBothArms(eventSlave) ? "hands" : "hand";
+			r = [];
+			r.push(`You order ${him} to pay close attention`);
+			if (canSee(eventSlave)) {
+				r.push(`and not look away`);
+			}
+			r.push(r.pop() + `.`);
+			if (eventSlave.fetish === "pregnancy" && PC.belly >= 5000) {
+				if (canSee(eventSlave)) {
+					r.push(`${He} questions what you mean until you begin sensually swaying your`);
+					if (PC.belly >= 100000) {
+						r.push(`massive pregnancy`);
+					} else if (PC.belly >= 60000) {
+						r.push(`giant pregnancy`);
+					} else if (PC.belly >= 15000) {
+						r.push(`advanced pregnancy`);
+					} else if (PC.belly >= 10000) {
+						r.push(`big, pregnant belly`);
+					} else {
+						r.push(`pregnant belly`);
+					}
+					r.push(`and slowly stripping down. ${He} groans at the sight, ${his} dick rapidly hardening at the view of your motherly body. You make sure to play off ${his} pregnancy fetish in every way possible until the aroused slave is in tears from the pressure on ${his} cock.`);
+				} else {
+					r.push(`${He} questions what you mean until you grab ${his} head and push ${his} face against your`);
+					if (PC.belly >= 100000) {
+						r.push(`massive pregnancy.`);
+					} else if (PC.belly >= 60000) {
+						r.push(`giant pregnancy.`);
+					} else if (PC.belly >= 15000) {
+						r.push(`advanced pregnancy.`);
+					} else if (PC.belly >= 10000) {
+						r.push(`big, pregnant belly.`);
+					} else {
+						r.push(`pregnant belly.`);
+					}
+					r.push(`${He} tries to recoil, bringing a hand to your middle. You catch it and run it along your motherly curve to your popped navel. You trace ${his} hand around it as ${he} groans at the sensation, ${his} dick rapidly hardening at the feel of your motherly body. You make sure to play off ${his} pregnancy fetish in every way possible until the aroused slave is in tears from the pressure on ${his} cock.`);
+				}
+			} else if (eventSlave.fetish === "cumslut" && PC.balls >= 14) {
+				if (canSee(eventSlave)) {
+					r.push(`${He} questions what you mean until you begin sensually caressing your massive balls and slowly stripping down. You quickly bring yourself erect and start to jack off. ${He} groans at the sight, licking ${his} lips a the thought of your coming load as ${his} dick rapidly hardens. You tease yourself and hype up just how big and messy your orgasm will be, making ${him} quiver with painful arousal. You moan as you feel the distinct sensation of your coming ejaculation, the sheer amount of sperm moving through you takes some time to release. You hug your nuts, thrusting repeatedly until the wave of cum forces its way out of your throbbing dick. You sigh with relief, just to rub it in ${his} face.`);
+				} else {
+					r.push(`${He} questions what you mean until you strip down and pull ${his} face directly into your massive balls. ${He} tries to recoil, bringing ${his} ${hands} to the immense spheres. You catch them and use one to massage your nuts and encourage a nice big load for ${him} and the other the help jack you off. You can feel ${him} shaking from the pressure on ${his} dick. Not only do you paint ${him} with seed, but you sigh loudly with relief, just to rub it in.`);
+				}
+			} else if (eventSlave.fetish === "boobs" && PC.boobs >= 1400) {
+				if (canSee(eventSlave)) {
+					r.push(`${He} questions what you mean until you pull your arms back, forcing your enormous`);
+					if (PC.boobsImplant !== 0) {
+						r.push(`fake`);
+					}
+					r.push(`breasts to pop free of your top. ${He} groans at the sight, ${his} dick rapidly hardening at the view of your impressive rack. You make sure to play off ${his} tit fetish in every way possible until the aroused slave is in tears from the pressure on ${his} cock.`);
+				} else {
+					r.push(`${He} questions what you mean until you grab ${his} head and push ${his} face against your enormous`);
+					if (PC.boobsImplant !== 0) {
+						r.push(`fake`);
+					}
+					r.push(`breasts. ${He} tries to recoil, bringing ${his} ${hands} to your breasts. You continue burying ${his} face in your rack as ${he} begins to grope you. ${He} groans at the sensation, ${his} dick rapidly hardening at the feel of your lovely tits. You make sure to play off ${his} boob fetish in every way possible until the aroused slave is in tears from the pressure on ${his} cock.`);
+				}
+			} else if (eventSlave.attrXX > 70 && eventSlave.attrXY < 50 && PC.title === 0 && PC.vagina !== -1 && PC.dick === 0) {
+				if (canSee(eventSlave)) {
+					r.push(`${He} questions what you mean until you begin your strip tease. ${He} groans at the sight, ${his} dick rapidly hardening at the view of your tits and pussy. You know just how arousing ${he} finds the female form, and you play off that until the aroused slave is in tears from the pressure on ${his} cock.`);
+				} else {
+					r.push(`${He} questions what you mean until you grab ${his} head and push ${his} face into your pussy. ${He} tries to recoil, bringing ${his} ${hands} to your rear. You continue rubbing yourself against ${his} face as begins to grope you, enjoying your feminine features. ${He} groans as ${his} dick rapidly hardens at the feel of your curves and the`);
+					if (canSmell(eventSlave)) {
+						r.push(`scent of`);
+					} else {
+						r.push(`warmth from`);
+					}
+					r.push(`your arousal. You know just how arousing ${he} finds the female form, and you play off that until the aroused slave is in tears from the pressure on ${his} cock.`);
+				}
+			} else {
+				if (canSee(eventSlave)) {
+					r.push(`${He} questions what you mean until you begin your strip tease. ${He} groans at the sight, ${his} dick rapidly hardening at the view of your erection. You know just how arousing ${he} finds the male form, and you play off that until the aroused slave is in tears from the pressure on ${his} cock.`);
+				} else {
+					r.push(`${He} questions what you mean until you grab ${his} head and push ${his} face against your dick. ${He} tries to recoil, bringing ${his} ${hands} to your balls. You continue rubbing yourself against ${his} face as begins to fondle you, enjoying your masculine features. ${He} groans as ${his} dick rapidly hardens at the feel of your penis against your face and the`);
+					if (canSmell(eventSlave)) {
+						r.push(`scent of`);
+					} else {
+						r.push(`warmth from`);
+					}
+					r.push(`your arousal and precum. You know just how arousing ${he} finds the male form, and you play off that until the aroused slave is in tears from the pressure on ${his} cock.`);
+				}
+			}
+			r.push(`You leave ${him} in a <span class="trust dec">worse state than ${he} started in,</span> as ${he}'s hornier than ever and still lacks any satisfying release. But that's ${his} problem, not yours.`);
+			if (PC.belly >= 10000) {
+				r.push(`Even when so heavily pregnant, it feels good to know you can still bring a dick to full attention.`);
+			}
+			eventSlave.trust -= 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/cumslutWhore.js b/src/events/RESS/review/cumslutWhore.js
new file mode 100644
index 0000000000000000000000000000000000000000..052ef4596721df79ba8cb9ce9c356b0130273ea4
--- /dev/null
+++ b/src/events/RESS/review/cumslutWhore.js
@@ -0,0 +1,180 @@
+App.Events.RESSCumslutWhore = class RESSCumslutWhore extends App.Events.BaseEvent {
+	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 > 20,
+				s => s.fetishKnown === 1,
+				s => [Job.PUBLIC, Job.WHORE, Job.GLORYHOLE].includes(s.assignment),
+				s => s.fetish === "cumslut" || s.energy > 95, // Add condition !== "hates oral" ?
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, girl, hers
+		} = getPronouns(eventSlave);
+		const {title: Master, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const hands = hasBothArms(eventSlave) ? "hands" : "hand";
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`Late at night,`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`returns to the living area of the penthouse. It's the end of ${his} day as a working girl, and despite being obviously tired, ${he}'s smiling with obvious sexual satiation. Every so often, ${he}'ll get a dreamy expression and lick ${his} lips. ${He} fetishizes cum to the extent that getting to eat a`
+		);
+		if (V.showInches === 2) {
+			r.push(`mile`);
+		} else {
+			r.push(`kilometer`);
+		}
+		r.push(`of dick really satisfies ${him}.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`${He} must have at least a little room left`, room),
+			new App.Events.Result(`Cum in ${his} mouth all night`, night),
+			cumSlaves().length >= 5
+				? new App.Events.Result(`Give ${him} access to the Dairy's cockmilk`, cockmilk)
+				: new App.Events.Result()
+		]);
+
+		function room() {
+			r = [];
+			r.push(`You call ${eventSlave.slaveName} in and ask how full ${he} is. ${He} looks confused for a moment but soon figures out what you mean.`);
+			if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) {
+				r.push(`As a mute amputee ${he} communicates poorly,`);
+				if (eventSlave.inflationType === "cum") {
+					if (eventSlave.bellyFluid >= 10000) {
+						r.push(`but ${he} sticks out ${his} hugely bloated cum-belly and opens wide, ${his} intent clear.`);
+					} else if (eventSlave.bellyFluid >= 5000) {
+						r.push(`but ${he} wiggles around so ${his} cum-filled belly sloshes audibly before opening wide.`);
+					} else {
+						r.push(`but ${he} sticks out ${his} cum-swollen belly and opens wide, ${his} intent clear.`);
+					}
+				} else {
+					r.push(`but ${he} does manage to look hungry.`);
+				}
+			} else if (!canTalk(eventSlave)) {
+				if (eventSlave.inflationType === "cum") {
+					if (eventSlave.bellyFluid >= 10000) {
+						r.push(`${He} strokes ${his} hugely bloated cum-belly, makes a sign for "never," and then makes a sign for "enough."`);
+					} else if (eventSlave.bellyFluid >= 5000) {
+						r.push(`${He} jiggles ${his} cum-filled belly lewdly, makes a sign for "need," and then makes a sign for "more."`);
+					} else {
+						r.push(`${He} pats ${his} cum-swollen belly, makes a sign for "much," and then makes a sign for "room."`);
+					}
+				} else {
+					r.push(`${He} gestures at ${his}`);
+					if (eventSlave.belly >= 1500) {
+						r.push(belly);
+					}
+					r.push(`stomach, makes a sign for "full," and then makes a sign for "never."`);
+				}
+			} else {
+				if (eventSlave.inflationType === "cum") {
+					if (eventSlave.bellyFluid >= 10000) {
+						r.push(
+							`${He} strokes ${his} hugely bloated cum-belly,`,
+							Spoken(eventSlave, `"Oh ${Master}, I've had so much cum already today, but I can't help myself if you're offering me even more. I'll find some room in there,"`)
+						);
+					} else if (eventSlave.bellyFluid >= 5000) {
+						r.push(
+							`${He} jiggles ${his} cum-filled belly lewdly,`,
+							Spoken(eventSlave, `"Oh ${Master}, there's so much already in me, but I feel so empty still."`)
+						);
+					} else {
+						r.push(
+							`${He} pats ${his} cum-swollen stomach,`,
+							Spoken(eventSlave, `"Oh ${Master}, this little belly is nothing, I always have room for more,"`)
+						);
+					}
+				} else {
+					r.push(Spoken(eventSlave, `"Oh ${Master}, I'll never be full again,"`));
+				}
+				r.push(`${he} ${say}s`);
+				if (eventSlave.lips > 70) {
+					r.push(`past ${his} enormous lips`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`past ${his} mouthful of piercings`);
+				}
+				r.push(r.pop() + `.`);
+			}
+			r.push(`${He} comes eagerly over and sucks you off with enthusiasm. As you cum, ${he} orgasms quickly at the`);
+			if (canTaste(eventSlave)) {
+				r.push(`taste`);
+			} else {
+				r.push(`feeling`);
+			}
+			r.push(`of the stuff hitting ${his}`);
+			if (V.PC.balls >= 10) {
+				r.push(`mouth, even as your load keeps flowing into ${his} gullet`);
+				if (V.PC.balls >= 30) {
+					r.push(`steadily bloated the poor ${girl}`);
+				}
+			} else {
+				r.push(`mouth.`);
+			}
+			if (!canTalk(eventSlave)) {
+				r.push(`${He}`);
+				if (!canTaste(eventSlave)) {
+					r.push(`(rather ironically)`);
+				}
+				r.push(`signs that you taste great.`);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"${Master}, you taste great,"`),
+					`${he}`
+				);
+				if (!canTaste(eventSlave)) {
+					r.push(`(rather ironically)`);
+				}
+				r.push(`purrs.`);
+			}
+			r.push(`<span class="trust inc">${He} has become more trusting</span> in your willingness to give ${him} what ${he} wants.`);
+			eventSlave.trust += 4;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			return r;
+		}
+
+		function night() {
+			r = [];
+			r.push(`You've had a busy day, so you've been unusually remiss in fucking your slaves. Naturally, this means you'll be spending the evening wandering around your home using your living sexual appliances. ${eventSlave.slaveName} is instructed to follow you and assist. ${He}'s tired, so`);
+			if (!hasAnyArms(eventSlave)) {
+				r.push(`you bring`);
+				if (isAmputee(eventSlave)) {
+					r.push(`${his} limbless torso`);
+				} else {
+					r.push(`${him}`);
+				}
+				r.push(`along as a cum receptacle. Whenever you're about to finish in another slave, you pull out and fill ${his} mouth instead.`);
+			} else {
+				r.push(`you let ${him} tag meekly along, masturbating gently as you use other slaves or just watching lazily. But whenever you're on the point of coming, you switch to ${his} mouth and let ${him} finish you with a few sucks and pumps of ${his} fatigued ${hands}.`);
+			}
+			r.push(`By the time you put the exhausted ${eventSlave.slaveName} to bed ${he}'s in a haze of cum-induced pleasure. <span class="devotion inc">${He} has become more submissive to you.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", V.PC, "penetrative", 5);
+			return r;
+		}
+
+		function cockmilk() {
+			eventSlave.devotion += 10;
+			cashX(random(500, 1000), "event", eventSlave);
+			return `You let ${him} know you have a sexual accessory for ${him} to use. This isn't too unusual, so ${he} comes to your office without much anticipation. ${He} doesn't understand why you have an enormous sealed canister of fresh cum on your desk, but when you explain that it's ${hers} to play with on the job, ${he} starts to bounce with excitement. Not all of ${his} customers are interested in cum play, but quite a few are, and ${he} spends almost as much time cleaning up the gorgeous messes that get made as ${he} does making them. It's a valuable and <span class="cash inc">profitable</span> whore who <span class="devotion inc">looks forward</span> to ${his} next customer.`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/desperatelyHorny.js b/src/events/RESS/review/desperatelyHorny.js
new file mode 100644
index 0000000000000000000000000000000000000000..b30fa66a59b325b84019ed90725ba71de4cc3652
--- /dev/null
+++ b/src/events/RESS/review/desperatelyHorny.js
@@ -0,0 +1,1006 @@
+App.Events.RESSDesperatelyHorny = class RESSDesperatelyHorny 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.rules.release.masturbation === 0,
+				s => !App.Utils.hasNonassignmentSex(s),
+				s => s.need,
+				s => s.devotion >= -20,
+				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, girl, hers
+		} = 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(
+			`Looking deeply unhappy and shivering occasionally,`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`comes to see you.`
+		);
+		if (eventSlave.rules.speech === "restrictive") {
+			r.push(`Since ${he} is not allowed to speak, ${he} just enters your office and stands there, unsure what to do.`);
+		} else {
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} tries to communicate something with ${his}`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`hands,`);
+				} else {
+					r.push(`hand,`);
+				}
+				r.push(`but ${he}'s so distracted ${he} can't manage it. ${He} starts to shake a little and gives up.`);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"${Master}, please! Please — I — please, I need to — oh, ${Master}—"`),
+					he
+				);
+				if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+					r.push(`lisps frantically.`);
+				} else {
+					r.push(`babbles.`);
+				}
+				r.push(`${He} starts to shake a little and lapses into silence.`);
+			}
+		}
+		r.push(`The reason for ${his} distress is obvious:`);
+		if (eventSlave.chastityPenis === 1) {
+			r.push(`${his} chastity cage is mostly solid, but it has a small hole below where the tip of ${his} dick is held, and this is dripping precum. ${He}'s sexually helpless, and sexually overcharged to the point where ${he}'s dripping more precum than a usual dickgirl might ejaculate normally.`);
+		} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100 && !canAchieveErection(eventSlave)) {
+			r.push(`though the hormones are keeping it soft, ${his} member is dripping a stream of precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile" && !canAchieveErection(eventSlave)) {
+			r.push(`though ${he}'s chemically castrated, ${his} soft member is dripping a stream of watery precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.dick > 0 && eventSlave.balls === 0 && !canAchieveErection(eventSlave)) {
+			r.push(`though ${he}'s gelded, ${his} soft member is dripping a stream of watery precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+			r.push(`though ${he}'s far too large to get hard, ${his} engorged member is dripping a stream of watery precum; droplets of the stuff spatter the floor. One of ${his} spasms brushes the length of ${his} cock against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.dick > 0) {
+			if (eventSlave.dick > 4) {
+				r.push(`${his} gigantic member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`);
+			} else if (eventSlave.dick > 2) {
+				r.push(`${his} impressive member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`);
+			} else {
+				r.push(`${his} little member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`);
+			}
+			if (eventSlave.belly >= 10000 || eventSlave.weight > 95) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnancy,`);
+				} else {
+					r.push(`belly,`);
+				}
+			} else {
+				r.push(`abdomen,`);
+			}
+			r.push(`and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.chastityVagina) {
+			r.push(`female juices are leaking out from behind ${his} chastity belt. ${His} cunt desperately wants to be fucked, and is dripping natural lubricant to ease penetration by cocks that cannot reach it through its protective shield.`);
+		} else if (eventSlave.clit > 3) {
+			r.push(`${his} dick-like clit is painfully engorged and juts out massively. The stimulation of the air on ${his} clit keeps ${him} on the brink of orgasm.`);
+		} else if (eventSlave.clit > 0) {
+			r.push(`${his} lovely clit is painfully engorged, and ${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${his} clit brushing accidentally against ${his} hand, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.labia > 0) {
+			r.push(`${his} lovely pussylips are painfully engorged, and ${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${his} generous labia brushing against ${his} thighs, and the stimulation almost brings ${him} to orgasm.`);
+		} else if (eventSlave.vagina === -1) {
+			r.push(`though ${he} has no external genitalia to display it, ${he}'s flushed and uncomfortable, and is unconsciously presenting ${his} ass, since that's ${his} only real avenue to climax.`);
+		} else {
+			r.push(`${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${him} enough stimulation that it almost brings ${him} to orgasm.`);
+		}
+		App.Events.addParagraph(node, r);
+		App.Events.addParagraph(node, [`This is the result of not getting off for several days while on the slave diet provided by the nutritional systems. The mild aphrodisiacs included in ${his} food increase ${his} sex drive, and the increased libido can become cumulative if it's not regularly addressed. It looks like ${he} hasn't really gotten ${hers} in a couple of days, and the poor ${girl} can likely think of nothing but that. ${He}'s so horny ${he}'ll do anything for release. However, ${he} did come to you with ${his} trouble rather than masturbating illicitly.`]);
+
+		let choices = [new App.Events.Result(`Touch ${him} enough to get ${him} off`, touch)];
+		if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none") {
+			choices.push(new App.Events.Result(`Reward ${him} for coming to you`, reward, virginityWarning()));
+		}
+		choices.push(new App.Events.Result(null, null, `Let ${him} get off:`));
+		const unknownWeakFetish = (eventSlave.fetishKnown !== 1 || eventSlave.fetishStrength <= 95);
+		if (eventSlave.fetish !== "cumslut" || unknownWeakFetish) {
+			choices.push(new App.Events.Result(`while ${he} sucks`, sucks));
+		}
+		if (eventSlave.fetish !== "boobs" || unknownWeakFetish) {
+			choices.push(new App.Events.Result(`during nipple play`, nipple));
+		}
+		if ((eventSlave.fetish !== "pregnancy" || unknownWeakFetish) && canDoVaginal(eventSlave)) {
+			choices.push(new App.Events.Result(`during insemination play`, insemination, eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null));
+		}
+		if ((eventSlave.fetish !== "buttslut" || unknownWeakFetish) && canDoAnal(eventSlave)) {
+			choices.push(new App.Events.Result(`while ${he} takes it up the ass`, ass, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null));
+		}
+		if (eventSlave.fetish !== "humiliation" || unknownWeakFetish) {
+			choices.push(new App.Events.Result(`in public`, inPublic));
+		}
+		if (eventSlave.fetish !== "submissive" || unknownWeakFetish) {
+			choices.push(new App.Events.Result(`after submitting to you`, submitting, virginityWarning()));
+		}
+		if (eventSlave.fetish !== "masochist" || unknownWeakFetish) {
+			choices.push(new App.Events.Result(`while in pain`, pain, virginityWarning()));
+		}
+		App.Events.addResponses(node, choices);
+
+		function touch() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a reward for coming to you. ${He} almost bursts into tears and nods jerkily, unable to do anything else. You brush a finger across ${his} cheek, ${his} ear, ${his} lips; at each touch ${he}`);
+			if (!canTalk(eventSlave)) {
+				r.push(`breathes in sharply.`);
+			} else {
+				r.push(`gasps.`);
+			}
+			r.push(`Moving around behind ${him}, you run a hand down ${his} flank to ${his} hip, and then around to ${his}`);
+			if (eventSlave.belly >= 10000 || eventSlave.bellyPreg >= 5000) {
+				r.push(`popped`);
+			}
+			r.push(`navel, and up to cup ${his} breasts. Your run a thumb`);
+			if (eventSlave.nipples !== "fuckable") {
+				r.push(`over`);
+			} else {
+				r.push(`into`);
+			}
+			r.push(`each nipple, almost tipping ${him} over the edge. Your hands move down again,`);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				r.push(`spreading ${his} buttocks to tease ${his} clenched anus, and then forward across ${his} perineum. From there, you trace ${his} labia and end with a pinch of ${his} clit — and this is enough.`);
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`spreading ${his} buttocks to tease ${his} clenched anus, and then forward across ${his} perineum — and this is enough.`);
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`tracing ${his} labia, and then forward to ${his} clit — and this is enough.`);
+			} else {
+				r.push(`to give ${his} buttcheeks a rub down before teasing at ${his} chastity — and this is enough.`);
+			}
+			r.push(`${He} spasms, pitching forward`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`onto ${his} obscene belly.`);
+			} else {
+				r.push(`and almost falling.`);
+			}
+			r.push(`${He} hurries to clean up after ${himself}, sobbing with relief and thanking you; ${his} submissiveness <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function reward() {
+			const {heU, hisU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
+			const child = eventSlave.pregType > 1 ? "children" : "child";
+			r = [];
+			r.push(`${He} almost cries with relief when you tell ${him} to`);
+			switch (eventSlave.fetish) {
+				case "submissive":
+					r.push(`lie down on your desk on ${his} side in the fetal position. ${He} clambers up hurriedly and hugs ${his} knees`);
+					if (eventSlave.belly >= 10000) {
+						r.push(`as best ${he} can with ${his} ${belly}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnancy`);
+						}
+						r.push(`in the way`);
+					}
+					r.push(r.pop() + `, spinning ${himself} around on the smooth surface so ${his} rear is pointing right at you. You stand up and pull ${him} over, ${his} ${eventSlave.skin} skin sliding across the cool glass desktop, until ${his}`);
+					if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+						r.push(`butt is right at the edge of the desk. You warm yourself up with a pussy fuck before shifting your attention to ${his} neglected asshole.`);
+						r.push(VCheck.Both(eventSlave, 3));
+						r.push(`When you finish, you`);
+					} else if (canDoAnal(eventSlave)) {
+						r.push(`butt is right at the edge of the desk.`);
+						r.push(VCheck.Anal(eventSlave, 3));
+						r.push(`You give it a good fuck and then`);
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`pussy is right at the edge of the desk.`);
+						r.push(VCheck.Vaginal(eventSlave, 3));
+						r.push(`You give it a good fuck and then`);
+					} else {
+						r.push(`mouth is right at the edge of the desk. You give it a good fuck and then`);
+						seX(eventSlave, "oral", PC, "penetrative", 3);
+					}
+					r.push(`order ${him} brusquely to clean up and come right back. You use ${him} as a nice little desktop`);
+					if (PC.dick !== 0) {
+						r.push(`cockholster`);
+					} else {
+						r.push(`sex toy`);
+					}
+					r.push(`for the rest of the day.`);
+					break;
+				case "cumslut":
+					r.push(`get under your desk and`);
+					if (PC.dick !== 0) {
+						r.push(`suck a dick`);
+						if (PC.vagina !== -1) {
+							r.push(`and eat a pussy`);
+						}
+					} else {
+						r.push(`eat pussy`);
+					}
+					r.push(`while you work.`);
+					if (eventSlave.belly >= 120000) {
+						r.push(`As ${his} ${belly} belly bumps into you, you sigh and swivel your chair to the side; there is no way ${he}'ll fit under there in ${his} bloated state.`);
+					}
+					r.push(`${He}'s so horny that ${he}'s barely got`);
+					if (PC.dick !== 0) {
+						r.push(`your cock into ${his} mouth`);
+					} else {
+						r.push(`${his} lips and tongue on your cunt`);
+					}
+					r.push(`before ${he} climaxes spontaneously, shivering and moaning nicely. You keep ${him} down there for a while, doing light work and orgasming occasionally as ${he} gently`);
+					if (PC.dick !== 0) {
+						r.push(`blows you`);
+						if (PC.vagina !== -1) {
+							r.push(`and eats you out`);
+						}
+					} else {
+						r.push(`lavishes attention on your wet vagina`);
+					}
+					r.push(r.pop() + `.`);
+					seX(eventSlave, "oral", PC, "penetrative", 3);
+					break;
+				case "humiliation":
+					r.push(`run an unimportant message to a citizen across ${V.arcologies[0].name}. Naked. ${He} blushes with mixed embarrassment and anticipation. ${He}'s so pent up that before taking ten steps out of your penthouse entryway and towards ${his} objective, the open stares ${his} naked, horny body is getting push ${him} over the edge.`);
+					if (eventSlave.chastityPenis === 1) {
+						r.push(`As ${he}`);
+						if (eventSlave.belly >= 10000) {
+							r.push(`waddles`);
+						} else {
+							r.push(`walks`);
+						}
+						r.push(`along, ${his} chastity cage continues to stream precum. It spatters ${his} legs, making ${his} desperation completely obvious to anyone who looks at ${him}`);
+						if (eventSlave.belly >= 150000) {
+							r.push(`from behind`);
+						}
+						r.push(r.pop() + `.`);
+					} else if (canAchieveErection(eventSlave)) {
+						r.push(`${His} rock hard cock,`);
+						if (eventSlave.belly >= 150000) {
+							r.push(`forced down by the size of ${his} ${belly}`);
+							if (eventSlave.bellyPreg >= 3000) {
+								r.push(`pregnancy`);
+							} else {
+								r.push(`stomach`);
+							}
+							r.push(`as ${he}`);
+							if (eventSlave.belly >= 10000) {
+								r.push(`waddles`);
+							} else {
+								r.push(`walks`);
+							}
+							r.push(`hurriedly along, jerks suddenly and shoots out a little squirt of cum down the underside of ${his} belly.`);
+						} else {
+							r.push(`sticking straight forward as ${he}`);
+							if (eventSlave.belly >= 10000) {
+								r.push(`waddles`);
+							} else {
+								r.push(`walks`);
+							}
+							r.push(`hurriedly along, jerks suddenly upward and shoots out a little squirt of cum`);
+							if (eventSlave.belly >= 10000) {
+								r.push(`across the underside of ${his}`);
+								if (eventSlave.bellyPreg >= 3000) {
+									r.push(`pregnant`);
+								}
+								r.push(`belly`);
+							}
+							r.push(r.pop() + `.`);
+						}
+						r.push(`As ${he} stumbles forward, each step releases another squirt.`);
+					} else if (eventSlave.dick > 0) {
+						r.push(His);
+						if (eventSlave.dick > 6) {
+							r.push(`enormous`);
+						}
+						r.push(`soft cock, flopping around as ${he}`);
+						if (eventSlave.belly >= 10000) {
+							r.push(`waddles`);
+						} else {
+							r.push(`walks`);
+						}
+						r.push(`hurriedly along, starts to twitch weakly and release little dribbles of cum. As ${he} stumbles forward, each step releases another squirt.`);
+					} else if (eventSlave.anus > 2) {
+						r.push(`As ${he} stumbles a little with the orgasm, ${his}`);
+						if (canDoAnal(eventSlave)) {
+							r.push(`naked anus is easily visible from behind ${him}, and its lewd spasms attract attention.`);
+						} else {
+							r.push(`anus lewdly spasms under ${his} chastity, and ${his} odd motions attract attention.`);
+						}
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`${He} focuses ${his} attention on ${his} pussy, awkwardly stumbling along as ${he} tries to walk and finger ${himself} at the same time.`);
+					} else if (canDoAnal(eventSlave)) {
+						r.push(`${He} focuses ${his} attention on ${his} asspussy, awkwardly stumbling along as ${he} tries to walk and play with ${his} own butt at the same time.`);
+					} else if (eventSlave.vagina > 0) {
+						r.push(`${He} squirts a little femcum down ${his} inner thighs as ${he} stumbles along, trailing the odor of a woman's pleasure behind ${him}.`);
+					} else {
+						r.push(`${He} focuses ${his} attention on ${his} breasts, awkwardly stumbling along as ${he} tries to walk and`);
+						if (eventSlave.nipples !== "fuckable") {
+							r.push(`tweak`);
+						} else {
+							r.push(`finger`);
+						}
+						r.push(`${his} own nipples at the same time.`);
+					}
+					r.push(`Passersby point and laugh, thrilling ${him}.`);
+					break;
+				case "buttslut":
+					r.push(`sit on your lap.`);
+					if (canDoAnal(eventSlave)) {
+						r.push(`${He} climaxes the instant your`);
+						if (PC.dick !== 0) {
+							r.push(`dickhead`);
+						} else {
+							r.push(`strap-on`);
+						}
+						r.push(`touches ${his}`);
+						if (eventSlave.anus > 2) {
+							r.push(`anal gape,`);
+						} else {
+							r.push(`pucker,`);
+						}
+						r.push(`but ${he} knows this is just the start, and ${he} laughs with pleasure as ${his}`);
+						if (eventSlave.anus > 2) {
+							r.push(`lewd sphincter loosely squeezes`);
+						} else {
+							r.push(`sphincter tightens against`);
+						}
+						r.push(`the base of`);
+						if (PC.dick !== 0) {
+							r.push(`your cock.`);
+						} else {
+							r.push(`the strap-on.`);
+						}
+						r.push(`You`);
+						if (eventSlave.belly >= 5000) {
+							r.push(`spread your legs more and shove the`);
+							if (eventSlave.bellyPreg >= 3000) {
+								r.push(`pregnant,`);
+							}
+							r.push(`giggling buttslut down so ${his} ${belly} belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.`);
+						} else {
+							r.push(`shove the giggling buttslut down so ${his} chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.`);
+						}
+						r.push(`${He} wraps ${his} legs around the back of the chair and hugs your knees with ${his} arms, securing ${himself}`);
+						if (eventSlave.belly >= 100000) {
+							r.push(`to you as an anal cocksleeve for as long as you feel like keeping`);
+							if (PC.dick !== 0) {
+								r.push(`your penis lodged up a compliant butthole.`);
+							} else {
+								r.push(`the happy buttslut nice and full.`);
+							}
+						} else {
+							r.push(`under the desk as an anal cocksleeve for as long as you feel like keeping`);
+							if (PC.dick !== 0) {
+								r.push(`your penis lodged up a compliant butthole.`);
+							} else {
+								r.push(`the happy buttslut trapped under there.`);
+							}
+						}
+						r.push(VCheck.Anal(eventSlave, 1));
+					} else {
+						r.push(`${He} climaxes the instant your`);
+						if (PC.dick !== 0) {
+							r.push(`dickhead`);
+						} else {
+							r.push(`strap-on`);
+						}
+						r.push(`squeezes between ${his}`);
+						if (eventSlave.butt < 2) {
+							r.push(`flat, tight cheeks,`);
+						} else if (eventSlave.butt <= 2) {
+							r.push(`cute cheeks,`);
+						} else if (eventSlave.butt <= 3) {
+							r.push(`round, firm cheeks,`);
+						} else if (eventSlave.butt <= 4) {
+							r.push(`curvy, enticing buttcheeks,`);
+						} else if (eventSlave.butt <= 5) {
+							r.push(`huge cheeks,`);
+						} else if (eventSlave.butt <= 6) {
+							r.push(`massive, alluring cheeks,`);
+						} else if (eventSlave.butt <= 7) {
+							r.push(`enormous cheeks,`);
+						} else if (eventSlave.butt <= 10) {
+							r.push(`gigantic, jiggly cheeks,`);
+						} else if (eventSlave.butt <= 14) {
+							r.push(`inhuman, cushiony butt cheeks,`);
+						} else if (eventSlave.butt <= 20) {
+							r.push(`couch-like, super jiggly ass cheeks,`);
+						}
+						r.push(`but ${he} knows this is just the start, and ${he} laughs with pleasure as hug ${his} rear around`);
+						if (PC.dick !== 0) {
+							r.push(`your cock.`);
+						} else {
+							r.push(`the strap-on.`);
+						}
+						r.push(`You`);
+						if (eventSlave.belly >= 5000) {
+							r.push(`spread your legs more and shove the`);
+							if (eventSlave.bellyPreg >= 3000) {
+								r.push(`pregnant,`);
+							}
+							r.push(`giggling buttslut down so ${his} ${belly} belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.`);
+						} else {
+							r.push(`shove the giggling buttslut down so ${his} chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.`);
+						}
+						r.push(`${He} wraps ${his} legs around the back of the chair and hugs your knees with ${his} arms, securing ${himself}`);
+						if (eventSlave.belly >= 100000) {
+							r.push(`to you as an a cockbun for as long as you feel like keeping`);
+							if (PC.dick !== 0) {
+								r.push(`your penis wrapped in a happy buttslut.`);
+							} else {
+								r.push(`the happy buttslut entertained.`);
+							}
+						} else {
+							r.push(`under the desk as a cockbun for as long as you feel like keeping the happy buttslut trapped under there.`);
+						}
+						r.push(`under the desk as cockbun for as long as you feel like keeping the happy buttslut trapped under there.`);
+					}
+					break;
+				case "boobs":
+					r.push(`lie atop your desk. You don't bother specifying that ${he}'s to lie on ${his} back, since the boob slut jumps up and presents ${his} tits without instructions. You keep working with one hand while you idly tease and`);
+					if (eventSlave.nipples !== "fuckable") {
+						r.push(`flick`);
+					} else {
+						r.push(`finger`);
+					}
+					r.push(`the nearest`);
+					if (eventSlave.lactation > 0) {
+						r.push(`milky`);
+					}
+					r.push(`nipple with the other. ${He}'s so horny that ${he} immediately experiences an immodest orgasm, ${his} back arching away from the cool glass desktop as ${he} rides its waves. ${He} giggles a little, and then gasps as you resume playing with ${him}.`);
+					seX(eventSlave, "mammary", PC, "penetrative");
+					if (eventSlave.lactation > 0) {
+						eventSlave.lactationDuration = 2;
+						eventSlave.boobs -= eventSlave.boobsMilk;
+						eventSlave.boobsMilk = 0;
+					} else {
+						r.push(induceLactation(eventSlave, 4));
+					}
+					break;
+				case "pregnancy":
+					if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+						r.push(`join you on the couch. Since`);
+						if (eventSlave.vagina >= 0) {
+							r.push(`you're saving ${his} pussy,`);
+						} else {
+							r.push(`this slave ${girl} doesn't have a pussy,`);
+						}
+						r.push(`and ${his} tight little rosebud is off limits, your options are a bit limited. But you work with what you have, playing with ${his}`);
+						if (isFertile(eventSlave)) {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how pregnancy would make them drip with cream.`);
+							} else {
+								r.push(`breasts and describing in whispers how big they'll swell if ${he} got pregnant.`);
+							}
+						} else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
+							if (eventSlave.lactation === 1) {
+								r.push(`nipples and describing in whispers how nice and swollen ${he} is with milk.`);
+							} else {
+								r.push(`breasts and describing in whispers how big ${he}'s gotten since ${he} got pregnant.`);
+							}
+						} else if (eventSlave.preg > 0) {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how ${his} pregnancy will soon have them drip with cream.`);
+							} else {
+								r.push(`breasts and describing in whispers how ${his} pregnancy will soon swell them to feed ${his} ${child}.`);
+							}
+						} else {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how they'd drip with cream if only ${he} could get pregnant.`);
+							} else {
+								r.push(`breasts and describing in whispers how big they'd swell if only ${he} could get pregnant.`);
+							}
+						}
+						r.push(`${He} gasps and shudders against you.`);
+						seX(eventSlave, "mammary", PC, "penetrative");
+					} else if (eventSlave.anus === 0 && eventSlave.vagina <= 0) {
+						r.push(`join you on the couch. Since`);
+						if (eventSlave.vagina === 0) {
+							r.push(`${he}'s a virgin and you haven't elected to introduce ${him} to pussyfucking just yet,`);
+						} else {
+							r.push(`this slave ${girl} doesn't have a pussy,`);
+						}
+						r.push(`and ${his} tight little rosebud is fresh and unspoiled, your options are a bit limited. But you work with what you have, playing with ${his}`);
+						if (isFertile(eventSlave)) {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how pregnancy would make them drip with cream.`);
+							} else {
+								r.push(`breasts and describing in whispers how big they'll swell if ${he} got pregnant.`);
+							}
+						} else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
+							if (eventSlave.lactation === 1) {
+								r.push(`nipples and describing in whispers how nice and swollen ${he} is with milk.`);
+							} else {
+								r.push(`breasts and describing in whispers how big ${he}'s gotten since ${he} got pregnant.`);
+							}
+						} else if (eventSlave.preg > 0) {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how ${his} pregnancy will soon have them drip with cream.`);
+							} else {
+								r.push(`breasts and describing in whispers how ${his} pregnancy will soon swell them to feed ${his} ${child}.`);
+							}
+						} else {
+							if (eventSlave.lactation === 0) {
+								r.push(`nipples and describing in whispers how they'd drip with cream if only ${he} could get pregnant.`);
+							} else {
+								r.push(`breasts and describing in whispers how big they'd swell if only ${he} could get pregnant.`);
+							}
+						}
+						r.push(`${He} gasps and shudders against you.`);
+						seX(eventSlave, "mammary", PC, "penetrative");
+					} else if (eventSlave.pregKnown === 1) {
+						r.push(`join you on the couch.`);
+						if (PC.dick !== 0) {
+							r.push(`You orgasm inside ${him} promptly, and then tell ${him} you'll be leaving your seed inside ${him} to do its work while you have ${him} again.`);
+						} else {
+							r.push(`You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into ${him}. You tell ${him} you'll be leaving it inside ${him} to do its work while you have ${him} again.`);
+						}
+						r.push(`${He} gasps at the appeal of the idea and grinds ${himself} against you hungrily.`);
+						if (!canDoVaginal(eventSlave)) {
+							if (eventSlave.mpreg === 1) {
+								r.push(`${He}'s already pregnant, but that doesn't disrupt ${his} fantasy of being even more pregnant.`);
+							} else {
+								r.push(`It's ${his} butt you're fucking, but that doesn't disrupt ${his} fantasy.`);
+							}
+							r.push(VCheck.Anal(eventSlave, 1));
+						} else {
+							r.push(`${He}'s already pregnant, but that doesn't disrupt ${his} fantasy of being even more pregnant.`);
+							r.push(VCheck.Vaginal(eventSlave, 1));
+						}
+					} else {
+						r.push(`join you on the couch.`);
+						if (PC.dick !== 0) {
+							r.push(`You orgasm inside ${him} promptly, and then tell ${him} you'll be leaving your seed inside ${him} to do its work while you have ${him} again.`);
+						} else {
+							r.push(`You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into ${him}. You tell ${him} you'll be leaving it inside ${him} to do its work while you have ${him} again.`);
+						}
+						r.push(`${He} gasps at the appeal of the idea and grinds ${himself} against you hungrily.`);
+						if (!canDoVaginal(eventSlave)) {
+							if (eventSlave.mpreg === 1) {
+								r.push(`${He}'s eager to get pregnant and intends to put ${his} asspussy to use.`);
+							} else {
+								r.push(`It's ${his} butt you're fucking, but that doesn't disrupt ${his} fantasy.`);
+							}
+							r.push(VCheck.Anal(eventSlave, 1));
+						} else {
+							r.push(`${He}'s eager to get pregnant and intends to put ${his} pussy to use.`);
+							r.push(VCheck.Vaginal(eventSlave, 1));
+						}
+					}
+					break;
+				case "dom":
+					r.push(`wait a moment, because you know what ${he} needs. ${He}'s mystified, but steels ${himself} and waits. Another slave appears for an inspection, and ${heU} discovers that ${heU}'s to be inspected with ${eventSlave.slaveName}'s`);
+					if (canPenetrate(eventSlave)) {
+						r.push(`cock up ${hisU} asshole.`);
+					} else {
+						r.push(`fingers assfucking ${himU}.`);
+					}
+					r.push(`The dominant ${eventSlave.slaveName} climaxes immediately to ${his} use of the poor slave, rubbing`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`${his} ${belly}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnant`);
+						}
+						r.push(`belly`);
+					} else {
+						r.push(`${himself}`);
+					}
+					r.push(`all over the other slave's buttocks while ${he} continues banging ${hisU} backdoor.`);
+					seX(eventSlave, "penetrative", "slaves", "anal");
+					break;
+				case "sadist":
+					r.push(`wait a moment, because you know what ${he} needs. ${He}'s mystified, but steels ${himself} and waits. Another slave appears for a trivial punishment, and ${heU} discovers that ${heU}'s to be punished by ${eventSlave.slaveName}'s`);
+					if (canPenetrate(eventSlave)) {
+						r.push(`dick,`);
+					} else {
+						r.push(`fingers,`);
+					}
+					r.push(`forced up ${hisU} anus. The dominant ${eventSlave.slaveName} climaxes quickly, but quickly recovers and keeps assraping the poor ${girlU}.`);
+					seX(eventSlave, "penetrative", "slaves", "anal");
+					break;
+				case "masochist":
+					r.push(`get ${his} ass up on your desk and`);
+					if (eventSlave.belly >= 300000) {
+						r.push(`lie off the side atop ${his} ${belly} stomach.`);
+					} else if (eventSlave.belly < 1500) {
+						r.push(`lie on ${his} side.`);
+					} else {
+						r.push(`lie face-down.`);
+					}
+					r.push(`${He}`);
+					if (eventSlave.belly >= 10000) {
+						r.push(`struggles to heft ${his}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`gravid`);
+						}
+						r.push(`body`);
+					} else {
+						r.push(`clambers`);
+					}
+					r.push(`up, and you let ${his} lie there for a while, tortured by anticipation and arousal, before giving ${his} nearest buttock a harsh open-handed slap. The shock and pain send ${him} over the edge immediately, and ${he} grinds forward into the desk involuntarily; the feeling of the cool desk against ${his}`);
+					if (eventSlave.dick > 0) {
+						r.push(`dickhead`);
+					} else if (eventSlave.vagina === -1) {
+						r.push(`crotch`);
+					} else {
+						r.push(`mons`);
+					}
+					r.push(`slams ${him} into a second climax, and ${he} sobs with overstimulation. You keep ${him} there for a good long while, using ${him} as a desktop toy that makes interesting noises when you hit it.`);
+					break;
+			}
+			if (eventSlave.fetishStrength > 95) {
+				r.push(`Since ${he}'s totally sure of what gets ${him} off, this proof you know it too makes ${him} <span class="trust inc">trust you.</span>`);
+				eventSlave.trust += 5;
+			} else {
+				r.push(`Since ${he}'s developing ${his} kinks, this reinforcement of ${his} sexual identity <span class="fetish inc">advances ${his} fetish.</span>`);
+				eventSlave.fetishStrength += 4;
+			}
+			return r;
+		}
+
+		function sucks() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. From now on, ${he} can come to you and ask to`);
+			if (PC.dick === 0) {
+				r.push(`perform cunnilingus on you`);
+			} else {
+				r.push(`blow you`);
+				if (PC.vagina !== -1) {
+					r.push(`and eat you out`);
+				}
+			}
+			r.push(r.pop() + `, and masturbate while ${he} does. ${He} nods through ${his} tears and hurriedly gets to ${his} knees, gagging in ${his} clumsy eagerness, crying a little with relief as ${he} masturbates furiously`);
+			if (PC.vagina !== -1 && PC.dick !== 0) {
+				r.push(`and does ${his} best to simultaneously please both a cock and a cunt with only one mouth`);
+			}
+			r.push(r.pop() + `. ${He} doesn't even pause after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", PC, "penetrative", 5);
+			const givingHead = PC.dick === 0 ? `giving head` : `sucking cock`;
+			if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of ${givingHead} has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "cumslut";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of ${givingHead}.</span>`);
+			}
+			return r;
+		}
+
+		function nipple() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. From now on, ${he} can come to you and offer you ${his} breasts; ${he} will be allowed to masturbate while you do. ${He} nods through ${his} tears and hurriedly presents ${his} chest, crying a little with relief as ${he} feels`);
+			if (eventSlave.nipples !== "fuckable") {
+				r.push(`you nip a nipple with your teeth.`);
+			} else if (PC.dick !== 0) {
+				r.push(`your dick slip into a nipple.`);
+			} else {
+				r.push(`your tongue penetrate into ${his} nipple.`);
+			}
+			r.push(`${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "mammary", PC, "penetrative", 5);
+			if (eventSlave.fetish === "boobs" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of breast play has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "boobs";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at every brush against ${his} breasts.</span>`);
+			}
+			return r;
+		}
+
+		function insemination() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and offer you ${his}`);
+			if (eventSlave.vagina > 3) {
+				r.push(`hopelessly gaped pussy;`);
+			} else if (eventSlave.vagina > 2) {
+				r.push(`loose pussy;`);
+			} else if (eventSlave.vagina > 1) {
+				r.push(`nice pussy;`);
+			} else {
+				r.push(`tight pussy;`);
+			}
+			r.push(`${he} will be allowed to masturbate while you fill ${him} with cum. ${He} nods through ${his} tears and`);
+			if (eventSlave.belly >= 10000) {
+				r.push(`struggles to get`);
+			} else {
+				r.push(`hurriedly gets`);
+			}
+			r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`);
+			if (PC.dick === 0) {
+				r.push(`a spurting strap-on`);
+			} else {
+				r.push(`your cock`);
+			}
+			r.push(`into ${his} spasming cunt. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			r.push(VCheck.Vaginal(eventSlave, 5));
+			eventSlave.devotion += 4;
+			if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of pregnancy play has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "pregnancy";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of getting pregnant.</span>`);
+			}
+			return r;
+		}
+
+		function ass() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and offer you ${his}`);
+			if (eventSlave.anus > 3) {
+				r.push(`hopelessly gaped rectum;`);
+			} else if (eventSlave.anus > 2) {
+				r.push(`big slit of an asspussy;`);
+			} else if (eventSlave.anus > 1) {
+				r.push(`nice asspussy;`);
+			} else {
+				r.push(`tight asshole;`);
+			}
+			r.push(`${he} will be allowed to masturbate while you buttfuck ${him}. ${He} nods through ${his} tears and`);
+			if (eventSlave.belly >= 10000) {
+				r.push(`struggles to get`);
+			} else {
+				r.push(`hurriedly gets`);
+			}
+			r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`);
+			if (PC.dick === 0) {
+				r.push(`a strap-on`);
+			} else {
+				r.push(`your cock`);
+			}
+			r.push(`into ${his} spasming rectum. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			r.push(VCheck.Anal(eventSlave, 5));
+			eventSlave.devotion += 4;
+			if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of anal has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "buttslut";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of anal sex.</span>`);
+			}
+			return r;
+		}
+
+		function inPublic() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can masturbate in public, sitting with ${his} legs spread for as much exposure as possible. ${He} nods through ${his} tears and sprints out of your office, dripping as ${he} goes. ${He} throws ${himself} to the ground outside, to the considerable amusement of passersby, spreading ${his} legs painfully wide. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of humiliation has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "humiliation";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s starting to long for humiliation.</span>`);
+			}
+			return r;
+		}
+
+		function submitting() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules.`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`For the rest of the week, ${he} can come to you and offer you ${his}`);
+				if (eventSlave.vagina > 3) {
+					r.push(`hopelessly loose pussy;`);
+				} else if (eventSlave.vagina > 2) {
+					r.push(`big slit of a pussy;`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`nice pussy;`);
+				} else {
+					r.push(`tight pussy;`);
+				}
+				r.push(`${he} will be allowed to masturbate after, but only after, you are finished with ${him}. ${He} nods through ${his} tears and`);
+				if (eventSlave.belly >= 10000) {
+					r.push(`struggles to get`);
+				} else {
+					r.push(`hurriedly gets`);
+				}
+				r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} nether lips apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`);
+				if (PC.dick === 0) {
+					r.push(`a strap-on`);
+				} else {
+					r.push(`your cock`);
+				}
+				r.push(`into ${his} spasming vagina. You are not gentle, and despite the stimulation ${he} does not orgasm by the time you`);
+				if (PC.dick === 0) {
+					r.push(`climax to the vibrations of the strap-on, and the pleasure of fucking a bitch.`);
+				} else {
+					r.push(`blow your load in ${his} cunt.`);
+				}
+				r.push(`${He}'s so eager to get off ${he} doesn't bother to move, and just`);
+				if (eventSlave.belly >= 1500) {
+					r.push(`snakes a hand down to fondle ${himself}.`);
+				} else {
+					r.push(`rolls onto ${his} face to hump ${himself} against ${his} hand, against the desk.`);
+				}
+				if (PC.dick === 0) {
+					r.push(`After the momentary pause of your climax, you`);
+					if (PC.vagina !== -1) {
+						r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`);
+					}
+					r.push(`resume thrusting;`);
+				} else {
+					r.push(`Your cum leaks out of ${his} used cunt and onto ${his} working hand;`);
+				}
+				r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+				r.push(VCheck.Vaginal(eventSlave, 5));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`For the rest of the week, ${he} can come to you and offer you ${his}`);
+				if (eventSlave.anus > 3) {
+					r.push(`hopelessly gaped rectum;`);
+				} else if (eventSlave.anus > 2) {
+					r.push(`big slit of an asspussy;`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`nice asspussy;`);
+				} else {
+					r.push(`tight asshole;`);
+				}
+				r.push(`${he} will be allowed to masturbate after, but only after, you are finished with ${him}. ${He} nods through ${his} tears and`);
+				if (eventSlave.belly >= 10000) {
+					r.push(`struggles to get`);
+				} else {
+					r.push(`hurriedly gets`);
+				}
+				r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`);
+				if (PC.dick === 0) {
+					r.push(`a strap-on`);
+				} else {
+					r.push(`your cock`);
+				}
+				r.push(`into ${his} spasming rectum. You are not gentle, and despite the anal stimulation ${he} does not orgasm by the time you`);
+				if (PC.dick === 0) {
+					r.push(`climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch.`);
+				} else {
+					r.push(`blow your load in ${his} ass.`);
+				}
+				r.push(`${He}'s so eager to get off ${he} doesn't bother to move, and just`);
+				if (eventSlave.belly >= 1500) {
+					r.push(`snakes a hand down to fondle ${himself}.`);
+				} else {
+					r.push(`rolls onto ${his} face to hump ${himself} against ${his} hand, against the desk.`);
+				}
+				if (PC.dick === 0) {
+					r.push(`After the momentary pause of your climax, you`);
+					if (PC.vagina !== -1) {
+						r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`);
+					}
+					r.push(`resume thrusting;`);
+				} else {
+					r.push(`Your cum leaks out of ${his} used backdoor and onto ${his} working hand;`);
+				}
+				r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+				r.push(VCheck.Anal(eventSlave, 5));
+			} else {
+				r.push(`For the rest of the week, ${he} can come to you and politely ask to`);
+				if (PC.dick !== 0) {
+					r.push(`suck you off;`);
+				} else {
+					r.push(`eat you out;`);
+				}
+				r.push(`${he} will be allowed to masturbate after, but only after, you are satisfied. ${He} nods through ${his} tears and`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`leans over ${his} ${belly} stomach,`);
+				} else {
+					if (eventSlave.belly >= 10000) {
+						r.push(`struggles`);
+					} else {
+						r.push(`hurriedly gets`);
+					}
+					r.push(`to ${his} knees,`);
+				}
+				r.push(`where ${he} brings ${his} face to your`);
+				if (PC.dick !== 0) {
+					r.push(`erect cock`);
+				} else {
+					r.push(`moist pussy`);
+				}
+				r.push(`and ${his} hand to ${his} crotch. ${He} starts crying a little with relief as ${he} feels you slowly`);
+				if (PC.dick === 0) {
+					r.push(`push your slit against`);
+				} else {
+					r.push(`insert your cock into`);
+				}
+				r.push(`${his} mouth. You are not gentle, and by the time you`);
+				if (PC.dick !== 0) {
+					r.push(`blow your load down ${his} throat,`);
+				} else {
+					r.push(`splash ${his} face with your girlcum,`);
+				}
+				r.push(`${he} still hasn't reached ${his} climax. ${He}'s so eager to get off ${he} doesn't bother to move, and just humps ${himself} against ${his} hand, against`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`${his} belly.`);
+				} else {
+					r.push(`your leg.`);
+				}
+				if (PC.dick === 0) {
+					r.push(`After the momentary pause of your climax, you`);
+					if (PC.vagina !== -1) {
+						r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`);
+					}
+					r.push(`resume thrusting;`);
+				} else {
+					r.push(`After the momentary pause of your climax, you pull ${his} face back to your crotch for a second round;`);
+				}
+				r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+				seX(eventSlave, "oral", PC, "penetrative", 5);
+			}
+			eventSlave.devotion += 4;
+			if (eventSlave.fetish === "submissive" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of submission has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "submissive";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of submission.</span>`);
+			}
+			return r;
+		}
+
+		function pain() {
+			r = [];
+			r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and masturbate: but you will abuse ${him} while ${he} does. ${He} starts to cry in fear, but`);
+			if (eventSlave.belly >= 10000) {
+				r.push(`struggles to get`);
+			} else {
+				r.push(`hurriedly gets`);
+			}
+			r.push(`up on your desk anyway. You swat ${his} thighs apart so ${he} can get a hand down there. ${He} hesitates desperately before touching ${himself}, knowing that as soon as ${he} does the pain will start, but ${his} horniness wins out. You aim a vicious flick at ${his}`);
+			if (eventSlave.nipples === "huge") {
+				r.push(`absurd nipples`);
+			} else if (eventSlave.nipples !== "tiny") {
+				r.push(`big nipples`);
+			} else {
+				r.push(`nipples`);
+			}
+			r.push(`and then take a crop out of your desk, flogging ${his}`);
+			if ((eventSlave.boobsImplant/eventSlave.boobs) >= 0.60) {
+				r.push(`fake`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`jiggling`);
+			} else {
+				r.push(`firm`);
+			}
+			r.push(`breasts without mercy. ${He} finally orgasms and flees, falling over ${his} own feet in ${his} desperation; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			if (eventSlave.fetish === "masochist" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of pain has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "masochist";
+				eventSlave.fetishKnown = 1;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of ${his} ${getWrittenTitle(eventSlave)} beating ${him}.</span>`);
+			}
+			return r;
+		}
+
+		function virginityWarning() {
+			if ((canDoVaginal(eventSlave) && eventSlave.vagina === 0) || (canDoAnal(eventSlave) && eventSlave.anus === 0)) {
+				return `This option may take ${his} virginity`;
+			}
+		}
+	}
+};
diff --git a/src/events/RESS/review/devotedOld.js b/src/events/RESS/review/devotedOld.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ba3de2c1addb8d49b0ef903c9b7006101d0c819
--- /dev/null
+++ b/src/events/RESS/review/devotedOld.js
@@ -0,0 +1,168 @@
+App.Events.RESSDevotedOld = class RESSDevotedOld 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.devotion > 60,
+				s => s.trust > 20,
+				s => s.physicalAge > 37,
+				s => s.anus > 0,
+				s => s.vagina > 0,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		App.Events.addParagraph(node, [
+			`At the end of a long week,`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`moves past your office toward bed. This is completely normal part of the arcology routine, but you notice as ${he} passes that ${he}'s wearing a preoccupied, almost sad expression. You call ${him} over, and ${he} makes a visible effort to brighten up as ${he} comes before you and asks your pleasure. You ask ${him} what's the matter, and ${his} face falls.`
+		]);
+		r.push(Spoken(eventSlave, `"${Master}, I'm so sorry you noticed,"`));
+		if (eventSlave.lips > 70) {
+			r.push(`${he} lisps through ${his} dick-sucking lips.`);
+		} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+			r.push(`${he} lisps through ${his} ridiculous piercings.`);
+		} else {
+			r.push(`${he} ${say}s penitently.`);
+		}
+		r.push(Spoken(eventSlave, `"I'm feeling a little stiff and tired, ${Master}. I wish I was a little younger so I could serve you better, that's all."`));
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Cheer ${him} up`, cheer)
+				: new App.Events.Result(),
+			new App.Events.Result(`Perform a health exam personally`, exam),
+			(S.HeadGirl && V.HeadGirlID !== eventSlave.ID)
+				? new App.Events.Result(`Give ${him} an afternoon off for some quality time with your Head Girl`, quality, 	`This option will cost ${cashFormat(500)}`)
+				: new App.Events.Result()
+		]);
+
+		function cheer() {
+			let didVaginal = false;
+			let didAnal = false;
+			r = [];
+			r.push(`You close in on ${him}, and ${he} starts to present ${himself} with the force of long habit. However, you take ${him} by the hand and draw ${him} in close, running your fingertips along ${his} cheekbone, looking into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
+			if (canSee(eventSlave)) {
+				r.push(`${He} only holds your gaze for a brief moment before blushing and looking down again,`);
+			} else {
+				r.push(`Once ${he} feels your hand stop, ${he} quickly glances down while`);
+			}
+			r.push(`muttering another apology. You raise ${his} chin again with a gentle hand and give ${him} a deep kiss. After a moment ${he} hugs you with almost painful`);
+			if (eventSlave.belly >= 100000) {
+				r.push(`fierceness, a feat given the size of ${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				}
+				r.push(`belly, where`);
+			} else if (eventSlave.belly >= 5000) {
+				r.push(`fierceness, pushing ${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				}
+				r.push(`belly into yours, where`);
+			} else {
+				r.push(`fierceness, and`);
+			}
+			r.push(`you can feel a heat radiating from ${him}. ${He} makes to get down on ${his} knees to serve you again, but instead, you`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`help ${him} up and guide`);
+			} else if (eventSlave.belly >= 5000) {
+				r.push(`gently scoop ${him} up and carry`);
+			} else {
+				r.push(`scoop ${him} up and carry`);
+			}
+			r.push(`${him} to bed, laying the bemused ${girl} down before cuddling up behind ${him}. The two of you make languid love, with you`);
+			if (canHear(eventSlave)) {
+				r.push(`murmuring reassuringly into ${his} ear,`);
+			}
+			r.push(`nibbling ${his} neck, cupping ${his} breasts,`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`rubbing ${his} distended midriff,`);
+			}
+			r.push(`and massaging ${his} shoulders by turns. After a lovely climax together in ${his}`);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				r.push(`pussy ${he} coquettishly shifts ${himself} to line your recovering cock up with ${his} ass,`);
+				didVaginal = true;
+				didAnal = true;
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`pussy ${he} coquettishly shifts ${himself} to face you,`);
+				didVaginal = true;
+			} else {
+				r.push(`ass ${he} coquettishly shifts ${himself} to face you,`);
+				didAnal = true;
+			}
+			if (canSee(eventSlave)) {
+				r.push(`looking with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> into your eyes.`);
+			} else {
+				r.push(`gazing with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> at your face.`);
+			}
+			eventSlave.devotion += 4;
+			eventSlave.trust += 4;
+			if (didVaginal && didAnal) {
+				r.push(VCheck.Both(eventSlave, 1));
+			} else if (didVaginal) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (didAnal) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			return r;
+		}
+
+		function exam() {
+			r = [];
+			r.push(`${He} gets a weekly health exam from the automated systems, which also do their best to monitor ${his} well-being, but ${he} does not protest as you take ${him} to the surgery and give ${him} a`);
+			if (V.PC.skill.medicine >= 100) {
+				r.push(`professional examination. It feels good to put the old skills to use on an attractive patient.`);
+			} else {
+				r.push(`thorough examination.`);
+			}
+			r.push(
+				`There's nothing the matter other than that ${he} hasn't been 18 for a long time. ${He} looks a little sad at some of the results, but whenever ${he} does, you place a hand on ${his} cheek and give ${him} a kiss. ${He} gets the idea.`,
+				Spoken(eventSlave, `"I understand, ${Master}. I can still serve you,"`),
+				`${he} ${say}s.`
+			);
+			r.push(`You adjust ${his} diet and exercise a little, which should <span class="health inc">slightly improve</span> ${his} health`);
+			if (V.PC.skill.medicine >= 100) {
+				r.push(r.pop() + `, and prescribe some new supplements that might help ${him} <span class="health inc">feel ${his} best</span> all the time`);
+				improveCondition(eventSlave, 10);
+			}
+			r.push(r.pop() + `. As ${he} gets up from the chair and makes to resume ${his} duties, you give ${him} a light swat across the buttocks. ${He} squeaks and turns to <span class="trust inc">giggle at you,</span> giving you a broad wink and shaking ${his} tits a little for you.`);
+			eventSlave.trust += 4;
+			improveCondition(eventSlave, 10);
+			return r;
+		}
+
+		function quality() {
+			const {
+				He2, his2, himself2
+			} = getPronouns(S.HeadGirl).appendSuffix('2');
+			cashX(-500, "event", eventSlave);
+			improveCondition(eventSlave, 10);
+			S.HeadGirl.devotion += 4;
+			eventSlave.devotion += 4;
+			return `${S.HeadGirl.slaveName} understands the situation immediately. ${He2} gets ${himself2} and ${eventSlave.slaveName} dressed for a nice, non-sexual 'date' in ${V.clubName}, and leads ${him} out by the hand with a wink over ${his2} shoulder to you. Your Head Girl understands just what kind of break from sexual servitude ${eventSlave.slaveName} really needs. They enjoy a nice meal, take a stroll and talk as friends, and get some inconsequential but relaxing beauty treatments together. They both <span class="devotion inc">enjoy the relaxation,</span> and ${eventSlave.slaveName} <span class="health inc">feels much better</span> after the rest, too.`;
+		}
+	}
+};
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/dickgirlPC.js b/src/events/RESS/review/dickgirlPC.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb70864d314ffe6341caaee8c10193079f97cc42
--- /dev/null
+++ b/src/events/RESS/review/dickgirlPC.js
@@ -0,0 +1,633 @@
+App.Events.RESSDickgirlPC = class RESSDickgirlPC extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.PC.dick > 0,
+			() => V.PC.boobs >= 300,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canSee,
+				s => s.devotion > -20,
+				s => s.devotion <= 50,
+				s => (s.attrXY <= 35 && s.attrXX > 65) || (s.attrXY > 65 && s.attrXX <= 35),
+			]
+		];
+	}
+
+	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, say} = getEnunciation(eventSlave);
+		const PC = V.PC;
+		const belly = bellyAdjective(eventSlave);
+		const arms = hasBothArms(eventSlave) ? "arms" : "arm";
+
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		App.Events.addParagraph(node, [
+			`Having just enjoyed one of your slaves, you take a quick post-coital rinse in one of the showers scattered around the arcology for the purpose. Thus refreshed, you step out and come face to face with`,
+			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), ","),
+			`who is going about ${his} assigned business. ${His} ${App.Desc.eyesColor(eventSlave)} lock with yours for a surprised moment, and then flick down submissively.`
+		]);
+
+		let r = [];
+		r.push(`As ${his} gaze travels down your body towards the floor,`);
+		if (eventSlave.attrXY <= 35) {
+			r.push(`it lingers for a moment on your`);
+			if (PC.boobs >= 1400) {
+				r.push(`enormous`);
+				if (PC.boobsImplant > 0) {
+					r.push(`chest balloons`);
+				} else {
+					r.push(`cow tits`);
+				}
+			} else if (PC.boobs >= 1200) {
+				r.push(`huge,`);
+				if (PC.boobsImplant > 0) {
+					r.push(`clearly fake`);
+				} else {
+					r.push(`heavy`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 1000) {
+				r.push(`big`);
+				if (PC.boobsImplant > 0) {
+					r.push(r.pop() + `, perky`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 800) {
+				r.push(`generous breasts`);
+			} else if (PC.boobs >= 650) {
+				r.push(`handfilling breasts`);
+			} else if (PC.boobs >= 500) {
+				r.push(`average breasts`);
+			} else if (PC.boobs >= 300) {
+				r.push(`small breasts`);
+			}
+			r.push(`before continuing to track downward. When it reaches your cock, still half-hard from the sex and the warm shower, ${he} stiffens with discomfort.`);
+		} else {
+			r.push(`${he} averts ${his} eyes from your`);
+			if (PC.boobs >= 1400) {
+				r.push(`enormous, bare`);
+				if (PC.boobsImplant > 0) {
+					r.push(`chest balloons`);
+				} else {
+					r.push(`cow tits`);
+				}
+			} else if (PC.boobs >= 1200) {
+				r.push(`huge, bare,`);
+				if (PC.boobsImplant > 0) {
+					r.push(`clearly fake`);
+				} else {
+					r.push(`heavy`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 1000) {
+				r.push(`big, bare`);
+				if (PC.boobsImplant > 0) {
+					r.push(r.pop() + `, perky`);
+				}
+				r.push(`breasts`);
+			} else if (PC.boobs >= 800) {
+				r.push(`generous, bare breasts`);
+			} else if (PC.boobs >= 650) {
+				r.push(`handfilling, bare breasts`);
+			} else if (PC.boobs >= 500) {
+				r.push(`average, bare breasts`);
+			} else if (PC.boobs >= 300) {
+				r.push(`small, bare breasts`);
+			}
+			r.push(`as best ${he} can, quickly looking farther down. ${His} gaze lingers for a moment on your cock, still half-hard from the sex and the warm shower, but ${he}'s stiff with discomfort.`);
+		}
+		r.push(`${He} swallows uncomfortably, frozen in place and staring at the floor. ${His} eyes flick up again, stealing a glance at`);
+		if (eventSlave.attrXY <= 35) {
+			r.push(`your boobs and studiously avoiding your dick.`);
+		} else {
+			r.push(`your dick`);
+			if (PC.balls >= 8) {
+				r.push(`and enormous testicles, while`);
+			} else {
+				r.push(`and`);
+			}
+			r.push(`studiously avoiding your boobs.`);
+		}
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} gestures a proper greeting, hands shaking with nervousness.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"Um, hi, ${Master},"`),
+				`${he} ${say}s nervously.`
+			);
+		}
+		App.Events.addParagraph(node, r);
+		if (eventSlave.attrKnown !== 1) {
+			App.Events.addParagraph(node, [`Just like that, the existing mystery about ${his} feelings about girls and guys is <span class="lightcoral">cleared up.</span>`]);
+			eventSlave.attrKnown = 1;
+		}
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Permit ${him} to serve you in a way ${he}'ll be comfortable with`, permit),
+			new App.Events.Result(`Force ${him} to get off to all of you`, force, virginityWarning()),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0) && eventSlave.attrXY <= 35) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0) && eventSlave.attrXY <= 35) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function permit() {
+			const frag = new DocumentFragment();
+			r = [];
+			r.push(`The poor ${girl} is having trouble with`);
+			if (eventSlave.attrXY <= 35) {
+				r.push(`guys, so you decide to be kind to ${him} and play up your feminine side. You lift ${his} ${eventSlave.skin} chin with a soft touch, and kiss ${him} gently on the lips, pressing your breasts full against ${his}`);
+				if (eventSlave.boobs > 5000) {
+					r.push(`titanic udders, which are squashed between you.`);
+				} else if (eventSlave.boobs > 1000) {
+					r.push(`own lovely boobs.`);
+				} else {
+					r.push(`chest.`);
+				}
+				r.push(`You keep your hips cocked back and to the side, so that your rapidly stiffening dick stays clear of ${him}. Taking ${his} hands in your own, you guide them to your`);
+				if (PC.boobs >= 1400) {
+					r.push(`enormous`);
+					if (PC.boobsImplant !== 0) {
+						r.push(`chest balloons.`);
+					} else {
+						r.push(`cow tits.`);
+					}
+				} else if (PC.boobs >= 1200) {
+					r.push(`huge,`);
+					if (PC.boobsImplant !== 0) {
+						r.push(`clearly fake`);
+					} else {
+						r.push(`heavy`);
+					}
+					r.push(`breasts.`);
+				} else if (PC.boobs >= 1000) {
+					r.push(`big`);
+					if (PC.boobsImplant !== 0) {
+						r.push(r.pop() + `, perky`);
+					}
+					r.push(`breasts.`);
+				} else if (PC.boobs >= 800) {
+					r.push(`generous breasts.`);
+				} else if (PC.boobs >= 650) {
+					r.push(`handfilling breasts`);
+				} else if (PC.boobs >= 500) {
+					r.push(`average breasts`);
+				} else if (PC.boobs >= 300) {
+					r.push(`small breasts`);
+				}
+				App.Events.addParagraph(frag, r);
+				r = [];
+				r.push(`${He} hesitates, clearly surprised that you're allowing ${him} to fondle you, but building arousal is making ${him} forget ${his} awkwardness and ${he} begins to play with your boobs in earnest. You direct ${his} fingers to your nipples, and ${he} obeys the nonverbal cue, devoting more attention to the`);
+				if (PC.lactation > 0) {
+					r.push(`milky,`);
+				} else {
+					r.push(`hard,`);
+				}
+				r.push(`sensitive nubs. Satisfied that ${he}'s got the idea, you run your hands lightly down ${his}`);
+				if (eventSlave.weight > 190) {
+					r.push(`voluminous`);
+				} else if (eventSlave.belly >= 5000) {
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`gravid`);
+					} else if (eventSlave.bellyImplant >= 3000) {
+						r.push(`rounded`);
+					} else {
+						r.push(`swollen`);
+					}
+				} else if (eventSlave.weight > 30) {
+					r.push(`soft`);
+				} else if (eventSlave.muscles > 30) {
+					r.push(`rock hard`);
+				} else if (eventSlave.weight > 10) {
+					r.push(`plush`);
+				} else if (eventSlave.muscles > 5) {
+					r.push(`toned`);
+				} else {
+					r.push(`soft`);
+				}
+				r.push(`body and give ${his}`);
+				if (eventSlave.butt > 15) {
+					r.push(`obscene`);
+				} else if (eventSlave.butt > 10) {
+					r.push(`absurd`);
+				} else if (eventSlave.butt > 6) {
+					r.push(`monstrous`);
+				} else if (eventSlave.butt > 3) {
+					r.push(`healthy`);
+				} else {
+					r.push(`cute`);
+				}
+				r.push(`buttocks a gentle massage.`);
+				App.Events.addParagraph(frag, r);
+				r = [];
+				r.push(`${He} has ${his} eyes closed, and is spared any indication that ${he}'s petting and being petted by a person with a cock. ${His} arousal builds quickly, and so does yours. You resolve the situation by using a hand on each of you: you finish yourself off with practiced ease while giving ${his}`);
+				if (canDoVaginal(eventSlave)) {
+					r.push(`clit`);
+				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`own erection`);
+				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`fat member`);
+				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`soft member`);
+				} else if (eventSlave.chastityPenis === 1) {
+					r.push(`nipples`);
+				} else if (eventSlave.chastityVagina) {
+					r.push(`nipples`);
+				} else {
+					r.push(`soft perineum`);
+				}
+				r.push(`some manual stimulation that tips ${him} over the edge. ${He} opens ${his} eyes slowly, <span class="devotion inc">grateful</span> that you were so merciful.`);
+			} else if (eventSlave.attrXX <= 35) {
+				r.push(`girls, so you decide to be kind to ${him} and play up your masculine side. You grab the side of ${his} neck with a rough grip, and pull ${him} downward, forcing ${him} to ${his} knees. ${He} goes willingly, ${his} field of vision filling with your rapidly hardening member.`);
+				if (eventSlave.teeth === "removable") {
+					r.push(`${He} quickly pulls ${his} removable teeth out, getting ready to offer you ${his} soft facepussy.`);
+				} else if (eventSlave.teeth === "pointy") {
+					r.push(`${He} runs ${his} tongue over ${his} frightening teeth carefully, and then opens ${his} jaws wide, getting ready to keep ${his} fangs well clear of your shaft.`);
+				} else if (eventSlave.teeth === "fangs") {
+					r.push(`${He} runs ${his} tongue over ${his} fangs carefully, and then opens ${his} jaws wide, getting ready to keep ${his} teeth well clear of your shaft.`);
+				} else if (eventSlave.teeth === "fang") {
+					r.push(`${He} gets ready to take you from an angle to avoid ${his} fang meeting your member.`);
+				} else if (eventSlave.teeth === "straightening braces" || eventSlave.teeth === "cosmetic braces") {
+					r.push(`${He} runs ${his} tongue over ${his} braces, and then opens wide, mindful of keeping ${his} orthodontia clear of your shaft.`);
+				} else if (eventSlave.teeth === "gapped") {
+					r.push(`${He} runs ${his} tongue across the gap in ${his} front teeth and opens wide.`);
+				}
+				r.push(`${He} takes you into ${his} mouth without hesitation, and keeps ${his} eyes closed. ${He} visibly concentrates all ${his} attention on your dick, ignoring the breasts that are starting to bounce right over ${his} head as you begin rocking your hips with enjoyment.`);
+				App.Events.addParagraph(frag, r);
+				App.Events.addParagraph(frag, [`You run a possessive hand through ${his} ${eventSlave.hColor} hair, and let ${him} know what a good little cocksucker ${he} is. ${He} moans submissively in response, and the humming feels so wonderful that you order ${him} to do it again. Knowing that you're being nice to ${him} by letting ${his} ignore your more feminine characteristics for the moment, ${he} does ${his} best to please you, humming as best ${he} can and using both hands to pleasure your base and balls. You blow your load down ${his} throat, and ${he} swallows it all. ${He} opens ${his} eyes slowly, <span class="trust inc">relieved</span> that you were so merciful.`]);
+			}
+			eventSlave.trust += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return frag;
+		}
+
+		function force() {
+			const frag = new DocumentFragment();
+			r = [];
+			r.push(`The closeminded ${girl} is having trouble with`);
+			if (eventSlave.attrXY <= 35) {
+				r.push(`guys, so ${he} gets to spend some quality time with your dick. You walk into ${him}, running into the surprised slave, driving ${him} backward into the far wall. You kiss ${him}, pinch ${him}, and grope ${him} roughly the whole time, pressing your breasts maliciously against ${his}`);
+				if (eventSlave.boobs > 5000) {
+					r.push(`titanic udders, which are squashed between you.`);
+				} else if (eventSlave.boobs > 1000) {
+					r.push(`own lovely boobs.`);
+				} else {
+					r.push(`chest.`);
+				}
+				r.push(`When ${his}`);
+				if (eventSlave.butt > 15) {
+					r.push(`obscene`);
+				} else if (eventSlave.butt > 10) {
+					r.push(`absurd`);
+				} else if (eventSlave.butt > 6) {
+					r.push(`monstrous`);
+				} else if (eventSlave.butt > 3) {
+					r.push(`healthy`);
+				} else {
+					r.push(`cute`);
+				}
+				r.push(`buttocks crash against the wall, you smash yourself against ${him}. ${He} shudders involuntarily as ${he} feels your stiffening dick between you`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`and ${his} rounded stomach`);
+				}
+				r.push(r.pop() + `, and then again as it rapidly achieves full hardness, crushed between your warm bodies.`);
+				App.Events.addParagraph(frag, r);
+				r = [];
+				r.push(`Making out with ${him} so insistently that ${he}'s short of breath, you begin to hump yourself against ${him}, sliding your prick against ${his}`);
+				if (eventSlave.belly >= 5000) {
+					r.push(belly);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+				}
+				r.push(`belly, thighs, and`);
+				if (canDoVaginal(eventSlave)) {
+					r.push(`labia.`);
+				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`own dick.`);
+				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`fat cock.`);
+				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`limp member.`);
+				} else if (eventSlave.chastityPenis === 1) {
+					r.push(`caged dick.`);
+				} else if (eventSlave.chastityVagina) {
+					r.push(`chastity belt.`);
+				} else {
+					r.push(`soft perineum.`);
+				}
+				r.push(`${He} shudders uncomfortably as ${he} realizes that ${he}'s getting aroused, ${his}`);
+				if (eventSlave.vagina > -1) {
+					r.push(`pussy moistening`);
+				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`dick hardening`);
+				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`dick struggling to engorge`);
+				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+					r.push(`girldick starting to ooze precum`);
+				} else if (eventSlave.chastityPenis === 1) {
+					r.push(`chastity cage growing ever tighter`);
+				} else {
+					r.push(`tiny front hole starting to ooze precum`);
+				}
+				r.push(`from the stimulation, despite ${his} lack of appetite for cock.`);
+				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+					r.push(`${He} knows what's coming when you push ${him}`);
+					if (eventSlave.belly >= 300000) {
+						r.push(`over ${his} ${belly} stomach,`);
+					} else {
+						r.push(`to ${his} knees,`);
+					}
+					r.push(`and does ${his} best to relax.`);
+					App.Events.addParagraph(frag, r);
+					App.Events.addParagraph(frag, [`${He} screws ${his} eyes shut tight and ${his} mouth tighter as you prod at ${his} face with your member. Tiring of ${his} reluctance, you give ${him} a brusque order to open ${his} eyes and gaze upon the dick ${he} will soon be deepthroating. ${He} obeys, but unwillingly, and steadies ${himself} to take its length. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the internal fullness and sexual confusion. ${He} stares as best ${he} can at your penis, transfixed by the sight of it thrusting into ${his} mouth and the feeling of ${his} lips around its girth.`]);
+					r = [];
+					r.push(`${He} slips a hand to ${his} crotch, ${his} arousal overwhelming ${his} preferences. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, holding back to ${his} point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${his} mouth, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} chokes on your cock. You pull out of ${him}, and ${he} struggles to catch ${his} breath, the action sending a blob of ${his} owner's semen running down ${his} chin.`);
+					seX(eventSlave, "oral", PC, "penetrative", 7);
+				} else if (eventSlave.belly >= 10000) {
+					r.push(`${He} knows what's coming when you push ${him}`);
+					if (eventSlave.belly >= 300000) {
+						r.push(`over ${his} ${belly} stomach,`);
+					} else {
+						r.push(`to ${his} knees,`);
+					}
+					r.push(`and does ${his} best to relax.`);
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`);
+					if (canDoVaginal(eventSlave)) {
+						if (eventSlave.vagina > 2) {
+							r.push(`cavernous cunt.`);
+						} else if (eventSlave.vagina > 1) {
+							r.push(`welcoming pussy.`);
+						} else {
+							r.push(`tight flower.`);
+						}
+					} else {
+						if (eventSlave.anus > 2) {
+							r.push(`unresisting asspussy.`);
+						} else if (eventSlave.anus > 1) {
+							r.push(`welcoming butthole.`);
+						} else {
+							r.push(`tight anus.`);
+						}
+					}
+					r.push(`Once you're situated, you give ${him} a brusque order to open ${his} eyes and look behind ${him}. ${He} obeys, but unwillingly, bending as best ${he} can to see how physically close you are. ${He} can't see where it enters ${his}`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(`womanhood,`);
+					} else {
+						r.push(`bowels,`);
+					}
+					r.push(`but ${he}'s very aware of it. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Turned as much as ${he} can, ${he} stares, transfixed by the sight of you thrusting into ${his} body.`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(VCheck.Vaginal(eventSlave, 7));
+					} else {
+						r.push(VCheck.Anal(eventSlave, 7));
+					}
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`You snake a hand under ${him} and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily against you. You release ${him}, and ${he} barely manages to catch ${himself} from collapsing, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`);
+				} else {
+					r.push(`${He} knows what's coming when you pin ${his} torso even harder and reach down to pull ${his} knees up to clasp you around your waist, and does ${his} best to relax.`);
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`);
+					if (canDoVaginal(eventSlave)) {
+						if (eventSlave.vagina > 2) {
+							r.push(`cavernous cunt.`);
+						} else if (eventSlave.vagina > 1) {
+							r.push(`welcoming pussy.`);
+						} else {
+							r.push(`tight flower.`);
+						}
+					} else {
+						if (eventSlave.anus > 2) {
+							r.push(`unresisting asspussy.`);
+						} else if (eventSlave.anus > 1) {
+							r.push(`welcoming butthole.`);
+						} else {
+							r.push(`tight anus.`);
+						}
+					}
+					r.push(`Once you're confident your member is properly seated inside ${him}, and you won't drop ${him}, you give ${him} a brusque order to open ${his} eyes and look down. ${He} obeys, but unwillingly, bending as best ${he} can to look at the base of your dick where it`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(`enters ${his} womanhood.`);
+					} else {
+						r.push(`disappears beneath`);
+						if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+							r.push(`${his} own erect cock.`);
+						} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+							r.push(`${his} own dangling cock.`);
+						} else if (eventSlave.chastityPenis === 1) {
+							r.push(`${his} chastity.`);
+						} else {
+							r.push(`${him}. ${He} can't see where it enters ${his} bowels, but ${he}'s very aware of it.`);
+						}
+					}
+					r.push(`You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Bent almost in half, ${he} stares, transfixed by the sight of your penis delving inside ${his} body.`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(VCheck.Vaginal(eventSlave, 7));
+					} else {
+						r.push(VCheck.Anal(eventSlave, 7));
+					}
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`You push a hand between the two of you and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily within your grasp. You drop ${him}, and ${he} barely manages to catch ${himself} on shaking legs, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`);
+				}
+				App.Events.addParagraph(frag, r);
+				r = [];
+				r.push(`Over the week, you force ${him} to achieve daily orgasm as your cock pounds in and out of ${him}. It's difficult, blowing your load inside a compliant slave ${girl} every day, but you make the necessary sacrifice.`);
+				if (random(1, 2) === 1) {
+					r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about dick.</span>`);
+					eventSlave.attrXY += 5;
+				} else {
+					r.push(`${He} takes it like a good slave. ${His} dislike for dick doesn't change, but ${he} gets better at <span class="devotion inc">suppressing ${his} own inclinations</span> and serving as your cum receptacle.`);
+					eventSlave.devotion += 4;
+				}
+			} else if (eventSlave.attrXX <= 35) {
+				r.push(`girls, so ${he} gets to spend some quality time with your feminine side. You kiss ${him}, teasing your tongue against ${him}, and press your breasts maliciously against ${his}`);
+				if (eventSlave.boobs > 5000) {
+					r.push(`titanic udders, which are squashed between you.`);
+				} else if (eventSlave.boobs > 1000) {
+					r.push(`own lovely boobs.`);
+				} else {
+					r.push(`chest.`);
+				}
+				r.push(`${He} shrinks away from you involuntarily, but you stroke loving hands down ${his} temples, the sides of ${his} neck, and ${his} upper arms. ${He} shudders involuntarily, and you can almost feel ${him} hate ${himself} through your lip lock. You cock your hips back and to the side, keeping your prick well clear of ${him}. As far as ${he} can feel, you're all boobs and feminine lips.`);
+				App.Events.addParagraph(frag, r);
+				r = [];
+				if (eventSlave.toyHole === "dick" || (V.policies.sexualOpenness === 1 && canPenetrate(eventSlave))) {
+					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`butt, working your way under ${his} ${belly} belly`);
+					} else {
+						r.push("butt.");
+					}
+					r.push(`As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`);
+					if (PC.butt >= 5) {
+						r.push(`enormous,`);
+						if (PC.buttImplant !== 0) {
+							r.push(`beachball cheeks,`);
+						} else {
+							r.push(`wobbling ass,`);
+						}
+					} else if (PC.butt >= 4) {
+						r.push(`huge,`);
+						if (PC.buttImplant !== 0) {
+							r.push(`balloon of an`);
+						} else {
+							r.push(`soft`);
+						}
+						r.push(`ass,`);
+					} else if (PC.butt >= 3) {
+						r.push(`big`);
+						if (PC.buttImplant !== 0) {
+							r.push(`fake`);
+						}
+						r.push(`ass,`);
+					} else {
+						r.push(`ass,`);
+					}
+					r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel an unwilling erection building between your cheeks. Pleased, you lean forward and line up your`);
+					if (PC.vagina !== -1) {
+						r.push(`pussy`);
+					} else {
+						r.push(`asshole`);
+					}
+					r.push(`with ${his} dick head and push back into ${him}. You repeat until ${his} hips start moving on their own. You bite on your finger at the sensation of ${his} cock inside you and, using your other hand, begin to jerk yourself off. Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick; it must feel as though ${he} is banging a beautiful woman. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, taking ${him} to the point of climax before enjoying your own orgasm. The heat of your insides, the tightening and twitching of your`);
+					if (PC.vagina !== -1) {
+						r.push(`vagina`);
+					} else {
+						r.push(`rectum`);
+					}
+					r.push(`around ${his} cock, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} nearly knocks your to the floor. You scoot forward, letting ${him} slip from you. ${He} gets a splendid sight of your still gaped`);
+					if (PC.vagina !== -1) {
+						r.push(`cunt`);
+					} else {
+						r.push(`anus`);
+					}
+					r.push(`begging for more`);
+					if (eventSlave.balls > 0) {
+						r.push(`as a blob of ${his} semen drips from your body`);
+					}
+					r.push(r.pop() + `.`);
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to savor a compliant slave's penis every day, but you make the necessary sacrifice.`);
+					if (canImpreg(PC, eventSlave)) {
+						r.push(knockMeUp(PC, 40, 0, eventSlave.ID));
+					}
+				} else if (eventSlave.belly >= 150000) {
+					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt, working your way under ${his} ${belly} belly. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`);
+					if (PC.butt >= 5) {
+						r.push(`enormous,`);
+						if (PC.buttImplant !== 0) {
+							r.push(`beachball cheeks,`);
+						} else {
+							r.push(`wobbling ass,`);
+						}
+					} else if (PC.butt >= 4) {
+						r.push(`huge,`);
+						if (PC.buttImplant !== 0) {
+							r.push(`balloon of an`);
+						} else {
+							r.push(`soft`);
+						}
+						r.push(`ass,`);
+					} else if (PC.butt >= 3) {
+						r.push(`big`);
+						if (PC.buttImplant !== 0) {
+							r.push(`fake`);
+						}
+						r.push(`ass,`);
+					} else {
+						r.push(`ass,`);
+					}
+					r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to play with ${his} clit, using your other hand to jerk off.`);
+					} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`an unwilling erection building between your cheeks. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`the huge cock behind you start to leak onto your back. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`the pretty girldick behind you start to leak. Pleased, you lean back and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.chastityPenis === 1) {
+						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity cage, using your other hand to jerk off.`);
+					} else if (eventSlave.chastityVagina) {
+						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity, using your other hand to jerk off.`);
+					} else if (eventSlave.race === "catgirl") {
+						r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between ${his} legs.`);
+					} else {
+						r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between ${his} legs.`);
+					}
+					r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman under ${his} middle, and is playing with ${his} ass while ${he} gets ${him} off manually. You complete the feeling by bucking against ${him} with extra enthusiasm when you climax.`);
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to grind against a compliant slave every day, but you make the necessary sacrifice.`);
+				} else {
+					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt`);
+					if (eventSlave.belly >= 10000) {
+						r.push(`as well as you can with ${his} ${belly}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnancy`);
+						} else {
+							r.push(`belly`);
+						}
+						r.push(`pushing into you`);
+					}
+					r.push(r.pop() + `. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your tits, leading ${him} like a music teacher guiding a student's hands. When ${he}'s stroking your nipples properly, you grind against ${him} for a while, grinning to yourself as you feel`);
+					if (canDoVaginal(eventSlave)) {
+						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} clit, using your other hand to jerk off.`);
+					} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`an unwilling erection building behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`the huge cock behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
+						r.push(`the pretty girldick behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`);
+					} else if (eventSlave.chastityPenis === 1) {
+						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity cage, using your other hand to jerk off.`);
+					} else if (eventSlave.chastityVagina) {
+						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity, using your other hand to jerk off.`);
+					} else if (eventSlave.race === "catgirl") {
+						r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between ${his} legs.`);
+					} else {
+						r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between ${his} legs.`);
+					}
+					r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman in ${his} ${arms}, and is playing with ${his} boobs while ${he} gets ${him} off manually. You complete the feeling by craning around to rain nibbles and kisses on ${his} ${eventSlave.faceShape} face.`);
+					App.Events.addParagraph(frag, r);
+					r = [];
+					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having one of your slaves detailed to stimulate your nipples every day, but you make the necessary sacrifice.`);
+				}
+				if (random(1, 2) === 1) {
+					r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about tits and ass.</span>`);
+					eventSlave.attrXX += 5;
+				} else {
+					r.push(`${He} serves your feminine body like a good slave. ${His} dislike for sex with girls doesn't change, but ${he} gets better at <span class="devotion inc">suppressing ${his} own inclinations</span> and serving as your plaything.`);
+					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/fearfulHumiliation.js b/src/events/RESS/review/fearfulHumiliation.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7b4aacce18838836308e22dbe2ffaf9ada3253f
--- /dev/null
+++ b/src/events/RESS/review/fearfulHumiliation.js
@@ -0,0 +1,129 @@
+App.Events.RESSFearfulHumiliation = class RESSFearfulHumiliation 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.fetish === "humiliation" || s.energy > 95,
+				s => s.devotion <= 50,
+				s => s.devotion >= -20,
+				s => canDoAnal(s) || canDoVaginal(s),
+				s => s.anus !== 0,
+				s => s.vagina !== 0,
+				s => s.fetishKnown === 1,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		App.Events.addParagraph(node, [
+			`Even if ${he} isn't yet a truly devoted sex slave,`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`generally obeys orders. ${He} blushes furiously when given any sexual command, but ${his} true feelings about humiliation become clear when ${he} is ordered to serve in front of others, even other slaves. It sometimes seems the number of people watching ${him} get fondled, used, or fucked directly reduces the distance between ${him} and ${his} next blushing or even sobbing orgasm.`
+		]);
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Publicly prove the depths of ${his} humiliation to ${him}`, prove),
+			new App.Events.Result(`Use a bait and switch tactic on ${him}, before public use`, tactic),
+		]);
+
+		function prove() {
+			let r = [];
+			r.push(`You drag a fearful, embarrassed,`);
+			if (eventSlave.belly >= 1500) {
+				if (eventSlave.bellyPreg >= 0) {
+					r.push(`pregnant`);
+				} else {
+					r.push(`swollen`);
+				}
+			}
+			r.push(`and totally naked ${eventSlave.slaveName} out into a public hall. A small knot of passersby gather around grinning, enjoying the sight of ${his} nakedness and anticipating a show. To ${his} surprise, you order ${him} to take a few minutes to recount ${his} life story. ${He}'s hesitant at first, but obeys, only realizing as ${he} nears the present day what an abject story of degradation and humiliation ${his} life truly is. ${He} continues shakily, describing in brief ${his} current life, crying a little and trembling with arousal. At a whispered command from you, ${he} concludes`);
+			if (!canTalk(eventSlave)) {
+				r.push(`in embarrassed gestures, "and now my ${getWrittenTitle(eventSlave)} is going to fuck my worthless body in public."`); // not spoken!
+			} else {
+				r.push(Spoken(eventSlave, `"and now my ${Master} is going to fuck my worthless body in public."`));
+			}
+			r.push(`You take ${him} standing there, as ${he} cries with mixed shame and sexual pleasure.`);
+			if (!canDoVaginal(eventSlave)) {
+				r.push(`${He}`);
+				if (eventSlave.dick > 0) {
+					r.push(`cums even though ${he}'s soft`);
+				} else {
+					r.push(`climaxes even though ${he}'s filled`);
+				}
+				r.push(`with the shame,`);
+				if (V.PC.dick === 0) {
+					r.push(`${his} anus clenching around the strap-on you're pumping in and out of it.`);
+				} else {
+					r.push(`adding a sad little dribble to the load dripping out of ${his} asshole.`);
+				}
+			} else {
+				if (V.PC.dick === 0) {
+					r.push(`You make ${him} clean ${his} pussyjuice off your strap-on with ${his} bitch mouth before you take it off.`);
+				} else {
+					r.push(`As you pull out of ${his} clenching pussy, cum runs down ${his} quavering thighs.`);
+				}
+			}
+			r.push(`<span class="devotion inc">${He} has become more submissive to you,</span> and <span class="reputation inc">your reputation has increased.</span>`);
+			eventSlave.devotion += 4;
+			repX(500, "event", eventSlave);
+			if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			return r;
+		}
+
+		function tactic() {
+			let r = []; // TODO: redo art with "nicest clothing"
+			r.push(`You instruct ${him} to get cleaned up and get dressed in ${his} nicest clothing. ${He} obeys, mystified, and is further puzzled to find that you're taking ${him} out for a nice evening at a small bar. You share a tasty meal and listen to good music played on the little stage by an older slave. As the set concludes, you lean over and give ${eventSlave.slaveName} ${his} real orders for the evening. ${He} freezes in terror but eventually makes ${his} way up to the stage, strips in front of all the patrons, and says`);
+			if (!canTalk(eventSlave)) {
+				r.push(
+					`in embarrassed gestures,`,
+					Spoken(eventSlave, `"Please use me, I'm cheap."`)
+				);
+			} else {
+				r.push(Spoken(eventSlave, `"One credit per fuck, if you'll do my worthless body on stage."`));
+			}
+			r.push(`By the end of the night, ${he}'s been fucked by almost everyone in the bar, and ${his} itch for humiliation has been well and truly scratched. As you collect ${his} earnings from the thoroughly pleased bartender, ${he} lies quiescent in a puddle of cum and exhaustion. <span class="yellowgreen">You've collected a decent fee,</span> and <span class="green">your reputation has increased.</span>`);
+			repX(500, "event", eventSlave);
+			cashX(100, "event", eventSlave);
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative", 10);
+				seX(eventSlave, "anal", "public", "penetrative", 10);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 25, 2, -2));
+				}
+			} else if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative", 20);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 50, 0, -2));
+				}
+			} else {
+				seX(eventSlave, "anal", "public", "penetrative", 20);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 50, 1, -2));
+				}
+			}
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/firstPeriod.js b/src/events/RESS/review/firstPeriod.js
new file mode 100644
index 0000000000000000000000000000000000000000..8948e66902cfec0f89fc76dd94301687194d016b
--- /dev/null
+++ b/src/events/RESS/review/firstPeriod.js
@@ -0,0 +1,183 @@
+App.Events.RESSFirstPeriod = class RESSFirstPeriod extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seeAge === 1,
+		];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				(s) => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				(s) => s.actualAge < 18,
+				(s) => s.devotion > 20,
+				(s) => s.ovaries === 1,
+				(s) => s.pubertyXX === 0,
+				(s) => s.preg === 0,
+				(s) => s.physicalAge + s.birthWeek / 52 >= s.pubertyAgeXX - 0.5,
+			]
+		];
+	}
+
+	get weight() {
+		return 10;
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [slave] = this.actors.map(a => getSlave(a));
+		const {His, He, he, his, him, himself, girl} = getPronouns(slave);
+		let r = [];
+		const {title: Master} = getEnunciation(slave);
+		const {say} = getEnunciation(slave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, slave);
+
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(slave),
+			`appears in the door of your office, uncertain if ${he} should disturb you. ${He} stumbles through the doorway, hands on ${his}`
+		);
+		if (slave.weight >= 95) {
+			r.push(`fat belly,`);
+		} else if (slave.belly >= 2000) {
+			r.push(`bloated belly,`);
+		} else if (slave.weight >= 30) {
+			r.push(`chubby belly,`);
+		} else {
+			r.push(`flat belly,`);
+		}
+		r.push(`before stepping forward to stand in front of your desk. ${His} chest is rising and falling with panicked hyperventilation. The poor ${girl} is terrified for some reason.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+		r.push(`You press ${him} on why ${he} is acting this way.`);
+		if (canTalk(slave)) {
+			r.push(
+				Spoken(slave, `"My belly, ${Master},"`),
+				`${he} ${say}s apologetically.`,
+				Spoken(slave, `"It hurts and I don't know why. It just started recently."`)
+			);
+		} else {
+			r.push(`${He} uses gestures to point to ${his} stomach, and explains that ${he} is feeling an unusual pain.`);
+		}
+		r.push(`You check ${his} records and discover ${he} has very likely just become a woman.`);
+		slave.pubertyXX = 1;
+		App.Events.addParagraph(node, r);
+
+		const choices = [];
+		choices.push(new App.Events.Result(`Explain ${he}'s just becoming a woman`, justWoman));
+		if (V.PC.dick !== 0 && slave.eggType === "human") {
+			choices.push(new App.Events.Result(`Demonstrate what this means`, demonstrate, (slave.vagina === 0) ? `This option will take ${his} virginity` : null));
+		}
+		choices.push(new App.Events.Result(`Tell ${him} ${he}'ll just be taking it up the ass more`, ass, (slave.anus === 0) ? `This option will take ${his} anal virginity` : null));
+
+		App.Events.addResponses(node, choices);
+
+
+		function justWoman() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`You tell ${him} that ${he} is just undergoing ${his} first period, and that the pain ${he} is feeling is perfectly natural.`);
+			if (canTalk(slave)) {
+				r.push(
+					Spoken(slave, `"I-I'm a woman now? ${Master}, that m-means, I can get pregnant now."`),
+					`${He} trails off.`
+				);
+			} else {
+				r.push(`${He} brings ${his} hands back to ${his} stomach, an elated look on ${his} face. ${He} makes a gesture resembling a rounded belly.`);
+			}
+			r.push(`Whether or not ${he} gets pregnant is for you to decide, but for now you tell ${him} what ${he} should expect to change, both in and to ${his} body. ${slave.slaveName} <span class="trust inc">appreciates</span> you taking the time to explain ${his} developing body.`);
+			slave.trust += 5;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function demonstrate() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`You tell ${him} that ${he} is just becoming a woman, and to celebrate, you are going to put a child in ${him}.`);
+			if (!canTalk(slave)) {
+				r.push(`${He} gasps and rubs a hand across ${his} stomach.`);
+			} else {
+				r.push(Spoken(slave, `"But I'm still a child myself, ${Master}, I can't get pregnant yet!"`));
+			}
+			r.push(`You tell ${him} that prior to this week, that would have been true. However, now that ${he} has become fertile, it's time that ${he} learned what ${his} body was made for. You guide ${him} to the couch and tell ${him} to lie on ${his} back so that you may take ${him}. ${He} breaks down when ${he} feels your cock enter ${his}`);
+			if (slave.vagina === 0) {
+				r.push(`delightfully tight, virgin`);
+			} else if (slave.vagina === 1) {
+				r.push(`deliciously tight`);
+			} else if (slave.vagina === 2) {
+				r.push(`well experienced`);
+			} else {
+				r.push(`fucked-out`);
+			}
+			r.push(`cunt. ${His} new urges cause ${him} to reach up to hug ${himself} close to you,`);
+			if (slave.boobs < 600) {
+				r.push(`${his} modest breasts let ${him} snuggle close to you, face-to-face, as you take ${him}.`);
+			} else if (slave.boobs < 10000) {
+				r.push(`${his} big tits form a soft cushion between you as you take ${him}.`);
+			} else {
+				r.push(`${his} massive tits stop ${him} from bringing ${himself} too close to you as you take ${him}.`);
+			}
+			r.push(`${He} enjoys ${himself} immensely, but ${he} loses it again when ${he} feels your seed in ${him}, realizing that ${he} will find ${himself} swelling with your child over the coming months. ${He} has become <span class="devotion inc">more submissive</span> to your will now that ${his} very first egg has been fertilized by ${his} ${getWrittenTitle(slave)}.`);
+			slave.devotion += 5;
+			slave.preg = 1;
+			slave.pregWeek = 1;
+			slave.pregKnown = 1;
+			slave.pregSource = -1;
+			slave.pregType = setPregType(slave);
+			WombImpregnate(slave, slave.pregType, -1, 1);
+			r.push(VCheck.Vaginal(slave, 1));
+
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function ass() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`In one swift motion, you pull out a chastity belt and lock it onto ${him}. ${He} gasps as ${he} feels it hug close to ${his} pussy. You explain that ${he} has just become a woman, and thus, will be taking it up the ass until you decide it's time for ${him} to become pregnant.`);
+			if (!canTalk(slave)) {
+				r.push(`${He} rubs a hand across ${his} stomach.`);
+			} else {
+				r.push(Spoken(slave, `"You don't want me to get pregnant, ${Master}?"`));
+			}
+			r.push(`You bring ${him} over to the couch, set ${him} on your lap, and teasingly call ${him} a buttslut. Every so often you graze a finger around ${his} chastity belt, noting how much ${his} body wants you in ${him}, but you only make it the center of attention once the poor over-aroused slave`);
+			if (!canTalk(slave)) {
+				r.push(`begins to use piteous gestures to beg you abjectly to penetrate ${him}.`);
+			} else {
+				r.push(
+					`${say}s,`,
+					Spoken(slave, `"I can't take it any more, ${Master}! Please fuck me pregnant!"`)
+				);
+			}
+			r.push(`You snicker, but remind ${him} that no matter how much ${he} wants to be knocked up, ${his} belt will direct all the dicks ${he} takes into ${his} rear. You line up and insert your`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`cock`);
+			}
+			r.push(`with ${his} ass and begin fucking ${him}, all the while reminding ${him} that ${he} will not be getting pregnant. When ${he} finally orgasms,`);
+			if (V.PC.dick === 0) {
+				r.push(`${his} unabashed enjoyment`);
+			} else {
+				r.push(`the strength of ${his} spasming sphincter`);
+			}
+			r.push(`sends you over as well. ${He}'s left in a confused haze; ${his} body tells ${him} to get pregnant, but you tell ${him} to take it anally. ${He} <span class="devotion inc">sides with your decision</span> and vows to be an anal whore for you.`);
+			if (slave.fetish === "none") { // TODO: text and the original "coral" color suggests fetish loss here, perhaps pregnancy.
+				r.push(`<span class="fetish loss">Overcoming ${his} urges to become a mother via anal causes ${him} to become a buttslut.</span>`);
+				slave.fetish = "buttslut";
+				slave.fetishStrength = 10;
+			}
+			slave.devotion += 5;
+			slave.chastityVagina = 1;
+			r.push(VCheck.Anal(slave, 1));
+
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
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/heavyPiercing.js b/src/events/RESS/review/heavyPiercing.js
new file mode 100644
index 0000000000000000000000000000000000000000..551bcfec8481c880e5ab2d25f58742dd7dacf44f
--- /dev/null
+++ b/src/events/RESS/review/heavyPiercing.js
@@ -0,0 +1,137 @@
+App.Events.RESSHeavyPiercing = class RESSHeavyPiercing extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.vaginaPiercing > 1,
+				s => s.nipplesPiercing > 1,
+				s => s.clitPiercing > 1,
+				s => s.devotion > 20 || s.trust < -20,
+				s => s.devotion <= 50,
+				s => canDoAnal(s) || canDoVaginal(s)
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`The intimate areas of`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`are heavily pierced. This is great; it draws attention to ${his} holes and makes ${him} look like the sex slave ${he} is. However, it does necessitate some extra maintenance. It's the end of the day, and ${eventSlave.slaveName} is in a bathroom`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`carefully checking each of ${his} piercings.`);
+		} else {
+			r.push(`meticulously cleaning each of ${his} piercings.`);
+		}
+		r.push(`Many of them come in contact with fluids on a regular basis, so ${he} cleans them conscientiously.`);
+		App.Events.addParagraph(node, r);
+		App.Events.addParagraph(node, [`As you watch ${him}, it occurs to you that since ${eventSlave.slaveName} isn't fully devoted to you yet, there's all manner of inventive ways you could have a little fun and increase ${his} submission to you at the same time.`]);
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Weight ${his} piercings and fuck ${him} so they swing`, weigh, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null),
+			new App.Events.Result(`Secure ${him} by ${his} piercings for public use`, secure, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null),
+		]);
+
+		function weigh() {
+			r = [];
+			r.push(`You order ${him} to make sure all of ${his} piercings have rings in them, and then come join you when ${he}'s done. ${He} enters your office with a mixture of fear and curiosity on ${his} face. You put ${him} down on`);
+			if (hasAllLimbs(eventSlave)) {
+				r.push(`all fours`);
+			} else {
+				r.push(`the ground`);
+			}
+			if (hasBothLegs(eventSlave)) {
+				r.push(`with ${his} legs spread,`);
+			}
+			if (eventSlave.belly >= 50000) {
+				r.push(`, belly brushing the floor,`);
+			}
+			if (canSee(eventSlave)) {
+				r.push(`blindfold ${him},`);
+			}
+			r.push(`and then start clipping little metal weights on short chains to each of ${his} piercings. Before long, ${his} nipples are painfully stretched under the tugging,`);
+			if (eventSlave.dick > 0) {
+				r.push(`and the weights up and down ${his} cock are causing ${his} considerable discomfort.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`and though ${he} lacks any external genitalia to weight, you make sure ${his} ass feels the burn.`);
+			} else {
+				r.push(`${his} pussylips are being pulled downward, and even ${his} clit is agonizingly tortured.`);
+			}
+			r.push(`You fuck ${him} thoroughly, pounding ${him} so the weights swing. ${He} sobs and begs. <span class="devotion inc">${He} has become more submissive to you.</span>`);
+			eventSlave.devotion += 4;
+			if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			return r;
+		}
+
+		function secure() {
+			r = [];
+			r.push(`You order ${him} to make sure all of ${his} piercings have rings in them, and then come to you when ${he}'s done. ${He} enters your office with a mixture of fear and curiosity on ${his} face. You lead ${him} outside and secure ${him} in a side hall so that ${his} ass is presented to anyone who takes interest. ${He}'s forced to maintain this exact posture by a light chain between`);
+			if (eventSlave.belly > 10000) {
+				r.push(`${his} popped navel and a ring on the ground.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`${his} dickhead and a ring on the ground.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`${his} nipples and a ring on the ground.`);
+			} else {
+				r.push(`${his} pussy and a ring on the ground.`);
+			}
+			r.push(`You fuck ${his} ass to check the bondage; it's good. The chain is out of the way, and ${he} jerks and struggles amusingly to keep it from tugging ${him} painfully. You pull out to leave ${his} fucked butt with cum dribbling out of it, and leave ${him} to the tender mercies of the growing crowd. <span class="reputation inc">The sadists among the public are duly grateful.</span>`);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`They take pleasure in claiming <span class="virginity loss">both ${his} virginity and anal cherry.</span>`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`They take pleasure in claiming <span class="virginity loss">${his} virginity.</span>`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`They take pleasure in claiming <span class="virginity loss">${his} anal cherry.</span>`);
+				}
+				eventSlave.vagina++;
+				eventSlave.anus++;
+				seX(eventSlave, "anal", "public", "penetrative", 5);
+				seX(eventSlave, "vaginal", "public", "penetrative", 5);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 10, 2, -2));
+				}
+			} else if (canDoAnal(eventSlave)) {
+				if (eventSlave.anus === 0) {
+					r.push(`They take pleasure in claiming <span class="virginity loss">${his} anal cherry.</span>`);
+				}
+				eventSlave.anus++;
+				seX(eventSlave, "anal", "public", "penetrative", 10);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 25, 1, -2));
+				}
+			} else {
+				if (eventSlave.vagina === 0) {
+					r.push(`They take pleasure in claiming <span class="virginity loss">${his} virginity.</span>`);
+				}
+				eventSlave.vagina++;
+				seX(eventSlave, "vaginal", "public", "penetrative", 5);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 25, 0, -2));
+				}
+			}
+			repX(2500, "event", eventSlave);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hormoneDysfunction.js b/src/events/RESS/review/hormoneDysfunction.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4d6e4b3b7be784ee80644b40f2c31d0dc560a5b
--- /dev/null
+++ b/src/events/RESS/review/hormoneDysfunction.js
@@ -0,0 +1,123 @@
+App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.hormoneBalance >= 50,
+				s => s.vagina === -1,
+				s => s.balls >= 0,
+				s => s.devotion > 20 || s.trust < -20,
+				s => s.devotion <= 50,
+				s => s.fetish !== "buttslut",
+				s => s.rules.speech === "permissive"
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master, say} = getEnunciation(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`comes to see you. You're busy with other things, so ${he} waits patiently even though ${he}'s clearly very unhappy. Told to explain ${himself}, ${he} gestures at ${his} totally flaccid`
+		);
+		if (!canTalk(eventSlave)) {
+			r.push(`penis.`);
+		} else {
+			if (eventSlave.lips > 70) {
+				r.push(`penis and ${say}s through ${his} huge lips,`);
+			} else if ((eventSlave.lipsPiercing + eventSlave.tonguePiercing > 2)) {
+				r.push(`penis and ${say}s through ${his} piercings,`);
+			} else {
+				r.push(`penis and ${say}s,`);
+			}
+			r.push(Spoken(eventSlave, `"${Master}, I can't get it up."`));
+		}
+		r.push(`Ever since the rules have permitted it, ${contextualIntro(V.PC, eventSlave)} has been a constant masturbator. If ${he} can help it, ${he} never sucks or gives up ${his} ass without a hand between ${his} legs, pumping away.`);
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} mimics masturbation and then traces a finger down ${his} cheek, as though it were a tear.`);
+		} else {
+			r.push(Spoken(eventSlave, `"I can't come like this, ${Master}."`));
+		}
+		r.push(`It makes sense; ${he}'s probably never masturbated without a hard dick. ${He}'s clearly in desperate need of release, and more than a little sad the hormones ${he}'s taking have given ${him} erectile dysfunction.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Give ${him} some vasodilators so ${he} can get relief`, vasodilators),
+			new App.Events.Result(`Sissy slave ${girl}s don't need to climax to serve`, serve),
+			(eventSlave.prostate !== 0 && canDoAnal(eventSlave))
+				? new App.Events.Result(`Prostate stimulation ought to do the trick`, prostate, eventSlave.anus === 0 && canDoAnal(eventSlave) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+		]);
+
+		function vasodilators() {
+			eventSlave.devotion -= 5;
+			return `You give ${him} a shot and send ${him} on ${his} way. Within a few minutes it gives ${him} a raging hard-on that lasts for hours. ${He} spends every spare moment masturbating furiously. Of course, this is a temporary solution, and will just make the eventual return of ${his} problem more disappointing. <span class="devotion dec">${He} is bitterly frustrated.</span>`;
+		}
+
+		function serve() {
+			r = [];
+			r.push(`You explain patiently that ${he} needs to stop focusing on getting off. ${He}'s a sex slave, and what matters is that ${he} pleasures others. If ${he} doesn't climax ${himself}, that's unfortunate but not really significant. ${He} looks terribly forlorn, so to drive home the point you push ${him} down to the floor, give ${him} a rough facefuck, and send ${him} away with tousled hair,`);
+			if (V.PC.dick === 0) {
+				r.push(`a tired tongue,`);
+			} else {
+				r.push(`a mouthful of ejaculate,`);
+			}
+			r.push(`and the same limp dick as before. <span class="devotion dec">It's frustrating for ${him}.</span>`);
+			eventSlave.devotion -= 2;
+			if (eventSlave.clitSetting !== eventSlave.fetish) {
+				r.push(`But, ${he} slowly <span class="fetish gain">accepts ${his} new role as a submissive little sex toy.</span>`);
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+				eventSlave.fetish = "submissive";
+			}
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			return r;
+		}
+
+		function prostate() {
+			r = [];
+			r.push(`You explain that ${he} will have to find a new way to climax to be a happy little shemale slut. As you do, you push ${him} against a wall and force ${him} up on tiptoe so that ${his} butt is conveniently positioned, and then ram`);
+			if (V.PC.dick === 0) {
+				r.push(`a vibrating strap-on`);
+			} else {
+				r.push(`yourself`);
+			}
+			r.push(`up ${his} ass. ${He} squeals and dances against the wall on tiptoe, impaled on your`);
+			if (V.PC.dick === 0) {
+				r.push(`fake cock.`);
+			} else {
+				r.push(`member.`);
+			}
+			r.push(`${He} doesn't climax to anal then, or the next time you assfuck ${him}, or the time after that; but some time later a long buttsex session ends when ${he} gives a little shake and a whimper and dribbles a pathetic squirt of cum from ${his} still-limp dick. By the end of the week <span class="mediumaquamarine">${he}'s smiling trustingly</span> and offering you ${his} butt every chance ${he} gets.`);
+			r.push(VCheck.Anal(eventSlave, 10));
+			eventSlave.trust += 4;
+			if (eventSlave.clitSetting !== eventSlave.fetish) {
+				r.push(`<span class="fetish gain">${He}'s become a confirmed anal addict.</span>`);
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+				eventSlave.fetish = "buttslut";
+			}
+			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/hugeTits.js b/src/events/RESS/review/hugeTits.js
new file mode 100644
index 0000000000000000000000000000000000000000..79bd764a79f71ef0b9c6dd11d4f70d3fa6ff575c
--- /dev/null
+++ b/src/events/RESS/review/hugeTits.js
@@ -0,0 +1,160 @@
+App.Events.RESSHugeTits = class RESSHugeTits extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.boobAccessibility !== 1,
+			() => V.ballsAccessibility !== 1,
+			() => V.pregAccessibility !== 1,
+			() => V.slaves.length > 2,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canTalk,
+				s => s.boobs > 10000,
+				s => s.devotion >= -20,
+				s => (canDoAnal(s) || canDoVaginal(s))
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him
+		} = 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(
+			`There is a horrible crash from the shower. You rush in to see`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`face-down and covered in soap. ${He}'s uninjured, but ${his} tits are so huge that, soapy as ${he} is, ${he} can't seem to stand again. ${His} udders have ${him} pinned to the ground with ${his} legs sticking out of the shower. ${He} pleads`
+		);
+		if (eventSlave.lips > 70) {
+			r.push(`through ${his} huge lips,`);
+		} else if ((eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2)) {
+			r.push(`through ${his} piercings,`);
+		} else {
+			r.push(`piteously,`);
+		}
+		r.push(Spoken(eventSlave, `"Help me, ${Master}!"`));
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Join ${him} in the shower`, join, virginityWarning()),
+			new App.Events.Result(`Fuck ${his} immobilized body`, immobilized, ((eventSlave.anus === 0) || (eventSlave.vagina === 0)) ? `This option will take ${his} virginity` : null),
+			new App.Events.Result(`Let ${him} figure it out`, figure),
+		]);
+
+		function virginityWarning() {
+			if ((eventSlave.vagina === 0) && canDoVaginal(eventSlave)) {
+				return `This option will take ${his} virginity`;
+			} else if ((eventSlave.vagina === -1) && (eventSlave.anus === 0) && canDoAnal(eventSlave)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function join() {
+			r = [];
+			r.push(`You step into the running water and help ${him} to ${his} feet with exaggerated gallantry. ${He} seems surprised`);
+			if (canSee(eventSlave)) {
+				r.push(`and stares at`);
+			} else {
+				r.push(`faces`);
+			}
+			r.push(`you through the steam for a moment before looking away with a blush. Before long you have ${his} back against the shower wall, ${his} titanic udders`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`and ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			}
+			r.push(`offering an amusing challenge as they slide soapily between you as you fuck. ${He} comes in no time at all, and a brief massage of ${his} huge soapy nipples produces a whimpering aftershock orgasm.`);
+			if (canSee(eventSlave)) {
+				r.push(`${His} ${App.Desc.eyesColor(eventSlave)} stare straight into yours`);
+			} else {
+				r.push(`You stare into ${his} ${App.Desc.eyesColor(eventSlave)}`);
+			}
+			r.push(`as ${he} writhes with overstimulation, <span class="devotion inc">${his} trust in your stewardship of ${his} pleasure total.</span>`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function immobilized() {
+			let didAnal = false;
+			let didVaginal = false;
+			r = [];
+			r.push(`You make no answer, groping ${his} soapy`);
+			if (V.seeRace === 1) {
+				r.push(eventSlave.race);
+			}
+			r.push(`buttocks.`);
+			if ((eventSlave.anus > 2) && canDoAnal(eventSlave)) {
+				r.push(`${His} rectum is so fucked out and loose that your groping hand almost slides up it.`);
+			} else if ((eventSlave.vagina > 2) && canDoVaginal(eventSlave)) {
+				r.push(`${His} pussy is so fucked out and loose that your groping hand almost slides up it.`);
+			} else {
+				r.push(`You fingerfuck ${him} for a while, the sting of the soap on ${his} sensitive insides making ${him} gasp.`);
+			}
+			r.push(`It's not like you can't tie ${him} up and fuck ${him} whenever you like, but sliding back and forth on ${his} soapy body is kind of nice.`);
+			if (V.PC.dick === 0) {
+				r.push(`You ride yourself against ${him} until you orgasm`);
+			} else {
+				r.push(`You leave a load of cum in`);
+				if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+					r.push(`each of ${his} holes`);
+					didVaginal = true;
+					didAnal = true;
+				} else if (canDoAnal(eventSlave)) {
+					r.push(`${his} loosened butthole`);
+					didAnal = true;
+				} else {
+					r.push(`${his} loosened vagina`);
+					didVaginal = true;
+				}
+				if (V.PC.vagina !== -1) {
+					r.push(`and make ${him} eat your pussy for a quick aftershock,`);
+				}
+			}
+			r.push(`and only then do you help ${him} back to ${his} feet. ${He} drips soap, water, and`);
+			if (V.PC.dick === 0) {
+				r.push(`your juices.`);
+			} else {
+				r.push(`ejaculate.`);
+			}
+			r.push(`<span class="devotion inc">${He} has become more submissive.</span>`);
+			if (didVaginal && didAnal) {
+				r.push(VCheck.Both(eventSlave, 1));
+			} else if (didVaginal) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (didAnal) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function figure() {
+			eventSlave.devotion -= 5;
+			return `${He} flounders around for a while until you get bored and leave ${him} to it. Eventually ${his} whining brings another slave in, who helps ${him}. This interdependence between slaves <span class="devotion dec">reduces ${his} devotion.</span>`;
+		}
+	}
+};
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/ignorantHorny.js b/src/events/RESS/review/ignorantHorny.js
new file mode 100644
index 0000000000000000000000000000000000000000..7065723251087f820b95556a612d91b8081d65a5
--- /dev/null
+++ b/src/events/RESS/review/ignorantHorny.js
@@ -0,0 +1,550 @@
+App.Events.RESSIgnorantHorny = class RESSIgnorantHorny 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.devotion <= 50,
+				s => s.devotion >= -20,
+				s => s.weekAcquired > 0,
+				s => V.week - s.weekAcquired < 10,
+				s => s.energy > 20,
+				s => s.anus !== 0,
+				s => s.vagina !== 0,
+			]
+		];
+	}
+
+	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, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`First on the inspection schedule is`,
+			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), ","),
+			`and as you watch ${him} enter your office, you note several good signs about ${his} progress towards becoming a good sex slave. ${He} enters obediently, without pretending to be thrilled to be here, but also without hesitation. Best of all,`
+		);
+		if (eventSlave.chastityPenis && canAchieveErection(eventSlave)) {
+			r.push(`${he}'s squirming with discomfort over the lack of room in ${his} chastity.`);
+		} else if (eventSlave.dick > 4 && canAchieveErection(eventSlave)) {
+			r.push(`${he}'s sporting a massive half-erection which slaps lewdly against ${his} thighs as ${he} walks.`);
+		} else if (eventSlave.dick > 2 && canAchieveErection(eventSlave)) {
+			r.push(`${his} dick is half-erect, bobbing lewdly as ${he} walks.`);
+		} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
+			r.push(`${his} pathetic little bitch dick is half-erect.`);
+		} else if (eventSlave.dick > 6) {
+			r.push(`${his} enormous dick is slightly engorged and dripping precum.`);
+		} else if (eventSlave.dick > 0) {
+			r.push(`${his} soft bitch dick is dripping precum.`);
+		} else if (eventSlave.labia > 1) {
+			r.push(`${his} lovely pussylips are flushed and wet.`);
+		} else if (eventSlave.clit > 1) {
+			r.push(`${his} glorious bitch button is stiffly erect.`);
+		} else if (eventSlave.vagina === -1) {
+			r.push(`${he}'s unconsciously sticking ${his} ass out. Getting fucked there is ${his} main sexual outlet, now that ${he} lacks genitals.`);
+		} else {
+			r.push(`${his} pussy is flushed and moist.`);
+		}
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
+			r.push(`The aphrodisiacs racing through ${his} system have ${him} desperate to get off, right now.`);
+		} else if (eventSlave.clitPiercing === 3 && eventSlave.clitSetting !== "none") {
+			r.push(His);
+			if (eventSlave.vagina > -1) {
+				r.push(`clit`);
+			} else {
+				r.push(`frenulum`);
+			}
+			r.push(`piercing is keeping ${his} arousal exquisitely balanced for ${his} inspection.`);
+		} else {
+			r.push(`The mild aphrodisiacs in the slave food have clearly built up some arousal that ${he} hasn't been able to address recently.`);
+		}
+		r.push(`${He} hasn't been with you long; it's been a mere ${V.week-eventSlave.weekAcquired > 1 ? `${V.week-eventSlave.weekAcquired} weeks` : `week`} since ${he} became your slave. ${He} may not be fully cognizant of how ${his} libido is being altered. New slaves aren't informed of the true extent of your abilities to force sexual need. It can be useful for a new ${girl} to wonder if some of the horniness ${he} feels is natural, and suspect that ${he}'s nothing but a dirty slut who deserves to be a sex slave.`);
+
+		App.Events.addParagraph(node, r);
+
+		let choices = [new App.Events.Result(`Tell ${him} the truth`, truth)];
+		if (eventSlave.fetish !== "cumslut" || eventSlave.fetishKnown !== 1) {
+			choices.push(new App.Events.Result(`Trade some oral for release`, trade));
+		}
+		if (eventSlave.fetish !== "buttslut" || eventSlave.fetishKnown !== 1) {
+			if (eventSlave.vagina === -1 && eventSlave.attrXY <= 65) {
+				choices.push(new App.Events.Result(`Make ${him} cum like a girl`, cum));
+			} else if (eventSlave.vagina > -1) {
+				choices.push(new App.Events.Result(`Work on broadening ${his} sexual horizons`, broaden));
+			}
+		}
+		App.Events.addResponses(node, choices);
+
+		function truth() {
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You explain the effects of the`);
+			if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
+				r.push(`sex drugs`);
+			} else if (eventSlave.clitPiercing === 3 && eventSlave.clitSetting !== "none") {
+				r.push(`advanced`);
+				if (eventSlave.vagina > -1) {
+					r.push(`clit`);
+				} else {
+					r.push(`frenulum`);
+				}
+				r.push(`piercing`);
+			} else {
+				r.push(`slave food`);
+			}
+			r.push(`briefly. Comprehension dawns across ${his}`);
+			if (eventSlave.faceShape !== "normal") {
+				r.push(eventSlave.faceShape);
+			}
+			r.push(
+				`face.`,
+				Spoken(eventSlave, `"Yes ${Master},"`),
+				`${he} ${say}s quietly, more to buy time to formulate a response than anything else.`,
+				Spoken(eventSlave, `"Um. I still really, really want to cum, though. W-would you please fuck me? Please, please, ${Master}, please fuck`)
+			);
+			if (eventSlave.vagina > 0 && eventSlave.preg > eventSlave.pregData.normalBirth/4 && canDoVaginal(eventSlave)) {
+				r.push(Spoken(eventSlave, `my pregnant pussy."`));
+			} else if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+				r.push(`me."`);
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`my butt."`);
+			} else {
+				if (eventSlave.vagina > 0 && eventSlave.preg > eventSlave.pregData.normalBirth/4) {
+					r.push(Spoken(eventSlave, `my pregnant pussy.`));
+				} else if (eventSlave.vagina > 0) {
+					r.push(`me.`);
+				} else {
+					r.push(`my butt.`);
+				}
+				r.push(Spoken(eventSlave, `I need it so bad right now, please rip off my chastity and fuck me senseless."`));
+			}
+			r.push(`A vague hint of embarrassment at begging for`);
+			if (PC.dick !== 0) {
+				r.push(`a hard`);
+				if (PC.vagina !== -1) {
+					r.push(`futa`);
+				}
+				r.push(`dicking`);
+			} else {
+				r.push(`your strap-on`);
+			}
+			r.push(`flickers across ${his} face, but hope for sexual release extinguishes it quickly.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
+				r.push(`${He} groans with relief as your`);
+				if (PC.dick !== 0) {
+					r.push(`cock`);
+				} else {
+					r.push(`phallus`);
+				}
+				r.push(
+					`enters ${him}. ${He} does not orgasm immediately, but ${he} knows sweet release is coming. You have ${him} atop your desk, on ${his} back, and ${he}'s participating in ${his} own sexual degradation by holding ${his} legs spread wide apart for you. "Ohh," ${he} moans as you fuck ${him},`,
+					Spoken(eventSlave, `"thank you for telling me why I feel this way, ${Master}. I guess this is how I, oh, am now? Oh, oh, it feels so g-good! Yes! AHH!"`)
+				);
+				if (PC.dick !== 0) {
+					r.push(His);
+					if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+						r.push(`cunt`);
+					} else {
+						r.push(`asshole`);
+					}
+					r.push(`tightens around your shaft delightfully as ${he} climaxes.`);
+				} else {
+					r.push(`${He} shudders with climax.`);
+				}
+				r.push(`${He} smiles <span class="trust inc">trustingly</span> up at you in the afterglow,`);
+				if (eventSlave.balls > 0) {
+					r.push(`${his} ejaculate`);
+					if (eventSlave.chastityPenis === 1) {
+						r.push(`seeping from ${his} chastity cage,`);
+					} else {
+						r.push(`glistening on ${his}`);
+						if (eventSlave.belly > 1500) {
+							r.push(belly);
+							if (eventSlave.bellyPreg >= 1500) {
+								r.push(`gravid`);
+							}
+						}
+						r.push(`belly,`);
+					}
+				}
+				r.push(`touched that you would tell ${him} something like that so honestly.`);
+				if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
+					r.push(VCheck.Both(eventSlave, 1));
+				} else {
+					r.push(VCheck.Anal(eventSlave, 1));
+				}
+			} else {
+				r.push(`${He} groans with lust as pull ${him} onto your lap to make out. "Ohh," ${he} moans as you run your hands across ${his}`);
+				if (eventSlave.boobsImplant >= 1000 && (eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
+					r.push(`bimbo`);
+				} else if (eventSlave.boobs >= 1000 && eventSlave.butt > 5 && eventSlave.hips > 0) {
+					r.push(`fecund`);
+				} else if (eventSlave.boobs >= 1000 && eventSlave.butt > 5) {
+					r.push(`voluptuous`);
+				} else if (eventSlave.weight > 190) {
+					r.push(`voluminous`);
+				} else if (eventSlave.belly >= 5000) {
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`gravid`);
+					} else if (eventSlave.bellyImplant >= 3000) {
+						r.push(`rounded`);
+					} else {
+						r.push(`swollen`);
+					}
+				} else if (eventSlave.weight > 30) {
+					r.push(`soft`);
+				} else if (eventSlave.muscles > 30) {
+					r.push(`ripped`);
+				} else if (eventSlave.muscles > 5) {
+					r.push(`toned`);
+				} else if (eventSlave.boobs >= 500) {
+					r.push(`sultry`);
+				} else {
+					r.push(`needy`);
+				}
+				r.push(
+					`body,`,
+					Spoken(eventSlave, `"thank you for telling me why I feel this way, ${Master}. I guess this is how I, oh, am now?"`),
+					`You reward ${him} for the realization by`
+				);
+				switch (eventSlave.nipples) {
+					case "huge":
+						r.push(`stroking ${his} lewdly erect nipples.`);
+						break;
+					case "flat":
+						r.push(`tweaking ${his} revealed nipples.`);
+						break;
+					case "puffy":
+						r.push(`cupping and fondling ${his} puffy nipples.`);
+						break;
+					case "partially inverted":
+						r.push(`teasing ${his} fully exposed nipples.`);
+						break;
+					case "inverted":
+						r.push(`squeezing ${his} puffy areolae until ${his} inverted nipples pop out for you to tease.`);
+						break;
+					case "fuckable":
+						r.push(`sticking your fingers deep into ${his} nipples.`);
+						break;
+					default:
+						r.push(`tweaking ${his} ${eventSlave.nipples} nipples.`);
+				}
+				r.push(`The pent-up ${girl} is so desperate for release, you can feel ${him} trembling with ecstasy from the nipple stimulation alone.`);
+				r.push(Spoken(eventSlave, `"Oh, oh, it feels so g-good! Yes! AHH!"`));
+				r.push(`${He} shudders with climax, smiling <span class="trust inc">trustingly</span> up at you in the afterglow,`);
+				if (eventSlave.balls > 0) {
+					r.push(`${his} ejaculate`);
+					if (eventSlave.chastityPenis === 1) {
+						r.push(`seeping from ${his} chastity cage,`);
+					} else {
+						r.push(`glistening on ${his}`);
+						if (eventSlave.belly > 1500) {
+							r.push(belly);
+							if (eventSlave.bellyPreg >= 1500) {
+								r.push(`gravid`);
+							}
+						}
+						r.push(`belly,`);
+					}
+				}
+				r.push(`touched that you would tell ${him} something like that so honestly.`);
+				seX(eventSlave, "mammary", PC, "penetrative");
+			}
+			eventSlave.trust += 4;
+			App.Events.addParagraph(frag, r);
+			return r;
+		}
+
+		function trade() {
+			const hands = (hasBothArms(eventSlave)) ? `hands` : `hand`;
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You observe, noncommittally, that ${he} seems ready to get off.`);
+			r.push(
+				Spoken(eventSlave, `"Yes ${Master}!"`),
+				`${he} squeals, too`
+			);
+			if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -50) {
+				r.push(`horny`);
+			} else {
+				r.push(`stupid`);
+			}
+			r.push(`to notice the sarcasm. Sighing inwardly, you slide yourself back from your desk and glance downward significantly, indicating your`);
+			if (PC.dick !== 0) {
+				r.push(`dick`);
+				if (PC.vagina !== -1) {
+					r.push(`and pussy`);
+				}
+			} else {
+				r.push(`girl parts`);
+			}
+			r.push(r.pop() + `. ${He} hurries over, almost throwing ${himself} at your feet in ${his} eagerness. "Touch yourself", you say, making it an imperious command rather than kind permission. ${He} moans into your`); // TODO: review talking PC
+			if (PC.dick !== 0) {
+				r.push(`cock`);
+			} else {
+				r.push(`cunt`);
+			}
+			r.push(`with gratitude as ${he}`);
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
+					r.push(`wraps one hand around ${his} dick and slips the other into ${his} pussy.`);
+				} else {
+					r.push(`dives for ${his} pussy with`);
+					if (hasBothArms(eventSlave)) {
+						r.push(`both hands.`);
+					} else {
+						r.push(`${his} hand.`);
+					}
+				}
+			} else if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
+				if (canAchieveErection(eventSlave)) {
+					if (eventSlave.dick > 4) {
+						r.push(`wraps ${his} ${hands} around ${his} huge erection.`);
+					} else if (canDoAnal(eventSlave) && eventSlave.prostate > 0) {
+						r.push(`wraps a hand around ${his} throbbing erection and reaches around to finger ${his} butt and stimulate ${his} prostate.${his}`);
+					} else {
+						r.push(`wraps a hand around ${his} throbbing erection.`);
+					}
+				} else {
+					if (eventSlave.dick > 4) {
+						r.push(`dives for ${his} huge, soft cock with`);
+						if (hasBothArms(eventSlave)) {
+							r.push(`both hands.`);
+						} else {
+							r.push(`${his} hand.`);
+						}
+					} else {
+						r.push(`reaches down to fondle ${his} limp dick.`);
+					}
+				}
+			} else if (canDoAnal(eventSlave)) {
+				if (eventSlave.dick === 0) {
+					r.push(`reaches down and around to rub ${his}`);
+					if (canDoAnal(eventSlave)) {
+						r.push(`anus and`);
+					}
+					r.push(`perineum.`);
+				} else {
+					if (eventSlave.vagina === -1) {
+						r.push(`reaches around to finger ${his} butt, since that's ${his} only hole.`);
+					} else if (eventSlave.chastityVagina === 1) {
+						r.push(`reaches around to finger ${his} butt, since ${his} pussy's in chastity.`);
+					} else {
+						r.push(`dives for ${his} pussy with`);
+						if (hasBothArms(eventSlave)) {
+							r.push(`both hands.`);
+						} else {
+							r.push(`${his} hand.`);
+						}
+					}
+				}
+			} else if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
+				if (eventSlave.balls > 4) {
+					r.push(`cups ${his} desperate balls, massaging them and encouraging them to release their pent-up cum.`);
+				} else {
+					r.push(`reaches down and around to rub ${his}`);
+					if (canDoAnal(eventSlave)) {
+						r.push(`anus and`);
+					}
+					r.push(`perineum.`);
+				}
+			} else {
+				r.push(`brings ${his} ${hands} to ${his} breasts to`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`tease ${his} erect`);
+				} else {
+					r.push(`finger ${his} swollen`);
+				}
+				r.push(`nipples.`);
+			}
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`${He}'s extremely pent up, and orgasms twice with`);
+			if (PC.dick !== 0) {
+				r.push(`your dick in ${his} mouth`);
+				if (PC.vagina !== -1) {
+					r.push(`first and ${his} tongue quivering along your pussylips second`);
+				}
+			} else {
+				r.push(`${his} mouth on your cunt`);
+			}
+			r.push(r.pop() + `. The mental effects of this formative little experience are impossible to control with precision. Over the next few days, you notice that whenever`);
+			if (canSee(eventSlave)) {
+				r.push(`${he} sees you,`);
+			} else {
+				r.push(`you see ${him},`);
+			}
+			if (random(0, 1) === 1) {
+				r.push(`${he} licks ${his} lips unconsciously. ${He} seems to be developing the beginnings of a lovely <span class="fetish gain">oral fixation.</span>`);
+				eventSlave.fetish = "cumslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+			} else {
+				r.push(`${he} betrays mixed feelings. The shocking intimacy of reaching sexual release as ${he} used ${his} mouth to pleasure you seems to be <span class="devotion inc">affecting ${him}.</span>`);
+				eventSlave.devotion += 4;
+			}
+			seX(eventSlave, "oral", PC, "penetrative");
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function cum() {
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You order ${him} to get ${his} ass up on your desk. ${He} obeys, though not without a flicker of trepidation. ${He} points ${his} butt at you like a sex slave should, and doesn't crane around to`);
+			if (canSee(eventSlave)) {
+				r.push(`see`);
+			} else {
+				r.push(`feel`);
+			}
+			r.push(`what you're doing behind ${him}, but ${he}'s stiff with the awareness that`);
+			if (PC.dick !== 0) {
+				r.push(`there's almost certainly a hard`);
+				if (PC.vagina !== -1) {
+					r.push(`futa`);
+				}
+				r.push(`dick about`);
+			} else {
+				r.push(`you're almost certainly donning a strap-on`);
+			}
+			r.push(`to slide inside ${his} girly asspussy. ${He}'s not wrong, and ${he} lets out a little moan as`);
+			if (PC.dick !== 0) {
+				r.push(`your cockhead,`);
+				if (PC.vagina !== -1) {
+					r.push(`which you kindly lubed with a bit of your pussyjuice,`);
+				}
+			} else {
+				r.push(`its broad tip`);
+			}
+			if (eventSlave.anus > 2) {
+				r.push(`slides easily inside ${his} whorish anus.`);
+			} else if (eventSlave.anus === 2) {
+				r.push(`slides up ${his} experienced butthole.`);
+			} else {
+				r.push(`forces its way inside ${his} tight sphincter.`);
+			}
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`As you fuck ${him}, you pull ${his} torso up so you can play with ${his}`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`udders`);
+			} else if (eventSlave.boobs > 800) {
+				r.push(`tits`);
+			} else {
+				r.push(`nipples`);
+			}
+			r.push(`and whisper manipulation into ${his} ear. You tell ${him} ${he}'s about to cum like a girl. ${He} says nothing, but ${his} body language communicates incomprehension. Girls, you tell ${him}, cum when they get fucked. They cum when`);
+			if (PC.title === 1) {
+				r.push(`guys`);
+			} else {
+				r.push(`their betters`);
+			}
+			r.push(`stick dick inside them. ${He} bursts into tears, sobbing with shame and degradation even as ${he} shakes and`);
+			if (eventSlave.balls > 0) {
+				r.push(`squirts cum.`);
+			} else {
+				r.push(`dribbles ejaculate.`);
+			}
+			r.push(`The next time ${he} sees you,`);
+			if (random(0, 1) === 1) {
+				r.push(`${he} visibly gathers ${his} courage, and flirtatiously <span class="fetish gain">offers you ${his} ass.</span>`);
+				eventSlave.fetish = "buttslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+			} else {
+				r.push(`${he} manages to stop ${himself} from breaking down, and seems to be <span class="devotion inc">working hard</span> to convince ${himself} that ${he}'s a girl.`);
+				eventSlave.devotion += 4;
+			}
+			r.push(VCheck.Anal(eventSlave, 1));
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function broaden() {
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`${He} seems a little too focused on ${his} hot cunt. You order ${him} to get up on your desk, and ${he} obeys eagerly, ${his}`);
+			if (canSee(eventSlave)) {
+				App.Desc.eyesColor(eventSlave);
+				r.push(`shining`);
+			} else {
+				r.push(`facial expression filled`);
+			}
+			r.push(`with lust.`);
+			if (canSee(eventSlave)) {
+				r.push(`They focus`);
+			} else {
+				r.push(`${He} focuses`);
+			}
+			r.push(`on`);
+			if (PC.dick !== 0) {
+				r.push(`your cock as you bring it to bear,`);
+				if (PC.vagina !== -1) {
+					r.push(`not to mention the pussy at its base,`);
+				}
+			} else {
+				r.push(`your strap-on as you step into it,`);
+			}
+			r.push(`and ${he}'s about to express ${his} gratitude when you push the slave, who is sitting on the edge of your desk with ${his} legs spread to provide you access to ${his} pussy, over onto ${his} back. ${He} barely has time to reorient ${himself} when ${he} feels`);
+			if (eventSlave.anus > 2) {
+				r.push(`a sudden fullness in ${his} loose ass.`);
+			} else if (eventSlave.anus === 2) {
+				r.push(`a presence inside ${his} experienced ass.`);
+			} else {
+				r.push(`something starting to push its way up ${his} poor little bottom.`);
+			}
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`${He} cannot hide ${his} disappointment, but has the presence of mind not to protest as you assfuck ${him} hard enough that ${his}`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`ridiculous tits almost hit ${him} in the face with each stroke`);
+			} else if (eventSlave.boobs > 800) {
+				r.push(`big boobs bounce all over the place`);
+			} else {
+				r.push(`boobs bounce`);
+			}
+			if (eventSlave.belly >= 10000) {
+				r.push(`and taut belly is forced back`);
+			}
+			r.push(r.pop() + `. ${His} orgasm sneaks up on ${him}, and comes by surprise, forcing a squeal out of ${him} as ${his} sphincter tightens down involuntarily. ${He} gets up gingerly, clearly feeling sore,`);
+			if (random(0, 1) === 1) {
+				r.push(`and looks preoccupied. ${He} reaches idly around and massages ${his} well-fucked backdoor meditatively, biting ${his} lower lip as ${he} investigates. Maybe, ${he} seems to be thinking, <span class="fetish gain">anal is fun?</span>`);
+				eventSlave.fetish = "buttslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+			} else {
+				r.push(`but <span class="devotion inc">does ${his} honest best</span> to look grateful. ${He} knows ${he}'s a sex slave and can't afford to be particular about little things like getting buttfucked.`);
+				eventSlave.devotion += 4;
+			}
+			r.push(VCheck.Anal(eventSlave, 1));
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
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/looseButtslut.js b/src/events/RESS/review/looseButtslut.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b013382bb957034b42c5fa964935275d0ca26fa
--- /dev/null
+++ b/src/events/RESS/review/looseButtslut.js
@@ -0,0 +1,305 @@
+App.Events.RESSLooseButtslut = class RESSLooseButtslut extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				canHold,
+				canDoAnal,
+				s => s.fetish === "buttslut" || (s.energy > 95 && s.fetish !== "none"),
+				s => s.anus > 2,
+				s => s.belly < 300000,
+				s => s.rules.release.masturbation === 1,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const pinches = eventSlave.nipples !== "fuckable" ? "pinches" : "fingers";
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`Since ${he} has a little free time this evening,`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`finds a quiet corner and engages in ${his} anal proclivities. Since ${his} asshole is so stretched out, ${he} sticks the base of a huge dildo to the ground and`);
+		if (eventSlave.belly >= 100000) {
+			r.push(`struggles to lower ${his} heavy, very gravid body down onto it,`);
+		} else if (eventSlave.belly >= 10000) {
+			r.push(`cautiously lowers ${his}`);
+			if (eventSlave.bellyFluid >= 10000) {
+				r.push(`${eventSlave.inflationType}-stuffed`);
+			} else {
+				r.push(`very gravid`);
+			}
+			r.push(`body on it,`);
+		} else if (eventSlave.belly >= 5000) {
+			r.push(`delicately lowers ${his}`);
+			if (eventSlave.bellyFluid >= 5000) {
+				r.push(`bloated`);
+			} else {
+				r.push(`gravid`);
+			}
+			r.push(`body on it,`);
+		} else {
+			r.push(`squats on it,`);
+		}
+		r.push(`moaning happily as the massive thing inches into ${him}. ${He} starts to slide up and down it`);
+		if (hasBothArms(eventSlave)) {
+			r.push(`hands-free,`);
+		} else {
+			r.push(`automatically,`);
+		}
+		r.push(`so ${he}`);
+		if (canAchieveErection(eventSlave)) {
+			if (eventSlave.dick > 5) {
+				r.push(`jacks off ${his} huge cock with`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`both hands.`);
+				} else {
+					r.push(`${his} hand.`);
+				}
+			} else if (eventSlave.dick > 2) {
+				r.push(`jacks off with`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`${his} hand.`);
+				} else {
+					r.push(`one hand and ${pinches} a nipple with the other.`);
+				}
+			} else {
+				r.push(`rubs ${his} little penis with`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`${his} hand.`);
+				} else {
+					r.push(`one hand and ${pinches} a nipple with the other.`);
+				}
+			}
+		} else if (eventSlave.dick > 5) {
+			r.push(`massages ${his} huge, limp cock with`);
+			if (hasBothArms(eventSlave)) {
+				r.push(`both hands.`);
+			} else {
+				r.push(`${his} hand.`);
+			}
+		} else if (eventSlave.dick > 2) {
+			r.push(`attempts to jack off ${his} limp dick with`);
+			if (!hasBothArms(eventSlave)) {
+				r.push(`${his} hand.`);
+			} else {
+				r.push(`one hand while ${eventSlave.nipples !== "fuckable" ? "pinching" : "fingering"} a nipple with the other.`);
+			}
+		} else if (eventSlave.dick > 0) {
+			r.push(`rubs ${his} little penis with`);
+			if (!hasBothArms(eventSlave)) {
+				r.push(`${his} hand.`);
+			} else {
+				r.push(`one hand and ${pinches} a nipple with the other.`);
+			}
+		} else if (eventSlave.vagina === -1) {
+			r.push(`rubs the sensitive area around ${his} asspussy with`);
+			if (!hasBothArms(eventSlave)) {
+				r.push(`${his} hand.`);
+			} else {
+				r.push(`one hand and ${pinches} a nipple with the other.`);
+			}
+		} else {
+			r.push(`rubs ${his} clit with`);
+			if (!hasBothArms(eventSlave)) {
+				r.push(`${his} hand.`);
+			} else {
+				r.push(`one hand and ${pinches} a nipple with the other.`);
+			}
+		}
+		r.push(`As ${he} enjoys ${himself}, ${his} loose sphincter relaxes further until it's barely gripping the dildo.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Add something to fill ${him} completely`, completely),
+			new App.Events.Result(`Let ${him} use a machine`, machine),
+			(V.HeadGirlID !== 0 && V.HeadGirlID !== eventSlave.ID)
+				? new App.Events.Result(`Call your Head Girl in for double anal`, double)
+				: new App.Events.Result(),
+		]);
+
+		function completely() {
+			r = [];
+			r.push(`${He}'s so occupied that ${he} doesn't`);
+			if (canHear(eventSlave)) {
+				r.push(`hear you`);
+			} else {
+				r.push(`sense your presence`);
+			}
+			r.push(`until you`);
+			if (V.PC.dick === 0) {
+				r.push(`don a strap-on and`);
+			}
+			r.push(`tip ${him} over face forward. With ${him} on ${his} knees, ${his} dildo-stuffed ass is in the air; ${he}'s still masturbating between ${his} legs. After a moment's consideration, you slide two exploratory fingers in alongside the dildo. ${He} gasps and masturbates harder. Thus encouraged, you shove`);
+			if (V.PC.dick === 0) {
+				r.push(`the strap-on`);
+			} else {
+				r.push(`your member`);
+			}
+			r.push(`in alongside the dildo.`);
+			if (eventSlave.voice !== 0) {
+				r.push(`${He} screams at the surprise double anal, sobbing and begging,`);
+			} else {
+				r.push(`${He} screams noiselessly at the surprise double anal, waving ${his} hands in distress,`);
+			}
+			r.push(`but ${he} doesn't try to stop you and doggedly keeps rubbing. By the time you're finished ${his} asshole is a gaping hole much bigger than the average pussy. <span class="devotion inc">${He} has become more submissive to you.</span>`);
+			eventSlave.devotion += 4;
+			r.push(VCheck.Anal(eventSlave, 1));
+			return r;
+		}
+
+		function machine() {
+			r = [];
+			r.push(`There's no reason for ${him} to do that in a quiet corner. You interrupt ${him} and bring ${him} into your office, setting ${him} up on a machine so ${he} can have that dildo rammed up ${his} ass for as long as ${he} likes. Your office is filled with the rhythmic sounds of a sloppy anus being pounded for a good long while.`);
+			if (V.assistant.personality > 0) {
+				r.push(`The`);
+				switch (V.assistant.appearance) {
+					case "monstergirl":
+						r.push(`monstrous voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my cocks, slave."`);
+						break;
+					case "shemale":
+						r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, bitch."`);
+						break;
+					case "amazon":
+						r.push(`aggressive voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be a warrior."`);
+						break;
+					case "businesswoman":
+						r.push(`dominant voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "stop struggling and be a good ${girl}."`);
+						break;
+					case "goddess":
+					case "hypergoddess":
+						r.push(`calming voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax and accept what you deserve, ${girl}."`);
+						break;
+					case "loli":
+						r.push(`young, naïve voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll get better."`);
+						break;
+					case "preggololi":
+						r.push(`young voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, you know it'll be fun!"`);
+						break;
+					case "angel":
+						r.push(`harmonious voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll be over soon."`);
+						break;
+					case "cherub":
+						r.push(`cheerful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll feel better if you do!"`);
+						break;
+					case "incubus":
+						r.push(`forceful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, cocksleeve, take it till you split!"`);
+						break;
+					case "succubus":
+						r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "enjoy the pounding while it lasts."`);
+						break;
+					case "imp":
+						r.push(`mischievous voice of your assistant's avatar can also be heard, mocking ${eventSlave.slaveName}, "your butthole is going to be so loose after this! You'll be nothing more than a used up whore!"`);
+						break;
+					case "witch":
+						r.push(`uncertain voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "just relax and get it over with."`);
+						break;
+					case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+						r.push(`unclear voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "scream louder and let it fill your body completely."`);
+						break;
+					case "schoolgirl":
+						r.push(`girly voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be quiet, or Teacher will hear us."`);
+						break;
+					default:
+						r.push(`poor slave is taken to the very limit by your assistant.`);
+				}
+				seX(eventSlave, "anal", "assistant", "penetrative");
+			} else {
+				actX(eventSlave, "anal");
+			}
+			r.push(`By the time ${he}'s climaxed out, ${he}'s so tired and apathetic that ${he} can't bring ${himself} to get off it or ask for help, so ${he} just relaxes and enjoys the internal massage`);
+			if (eventSlave.dick !== 0) {
+				r.push(`while ${his} flaccid dick twitches weakly`);
+			}
+			r.push(r.pop() + `. <span class="trust inc">${He} has become more trusting of you,</span> since you knew just what ${he} needed.`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function double() {
+			App.Events.refreshEventArt([eventSlave, S.HeadGirl]);
+			const {
+				he2, his2, himself2, He2
+			} = getPronouns(S.HeadGirl).appendSuffix("2");
+			r = [];
+			r.push(`When ${S.HeadGirl.slaveName} comes into your office in response to your summons, ${he2} finds ${eventSlave.slaveName} sitting in your lap with your`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`dick`);
+			}
+			r.push(`up ${his} gaping`);
+			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+				r.push(`butt, your bare pussy very visible at the base of your working cock`);
+			} else {
+				r.push(`butt.`);
+			}
+			r.push(`${S.HeadGirl.slaveName}'s expression softens when ${he2} realizes ${he2}'s here for pleasure, not business. ${eventSlave.slaveName} gasps a little when ${he}`);
+			if (canHear(eventSlave)) {
+				r.push(`hears you tell ${S.HeadGirl.slaveName} to join you up ${his} asshole,`);
+			} else {
+				r.push(`feels you pull apart ${his} asscheeks to make some room for ${S.HeadGirl.slaveName},`);
+			}
+			r.push(`but ${he} doesn't protest.`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`Since your poor Head Girl can't use ${his2} caged cock, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			} else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 7) {
+				r.push(`Even though your Head Girl is rock-hard and ready to fuck, ${his2} cock is far too large to fit into even the most stretched slave's holes. Sighing, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt instead.`);
+			} else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) {
+				r.push(`Your lusty Head Girl is already hard and forces ${his2} oversized cock up ${eventSlave.slaveName}'s already-filled butt while`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`tweaking`);
+				} else {
+					r.push(`fingering`);
+				}
+				r.push(`the moaning slave's nipples.`);
+			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.hormoneBalance >= 100) {
+				r.push(`Since your poor Head Girl can't get hard due to ${his2} hormone therapy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.balls > 0 && S.HeadGirl.ballType === "sterile") {
+				r.push(`Since your poor Head Girl can't get hard due to ${his2} chemical castration, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado`);
+			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.balls === 0) {
+				r.push(`Since your poor Head Girl can't get hard due to ${his2} orchiectomy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			} else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) {
+				r.push(`Since your poor Head Girl is far too big to get hard, much to ${eventSlave.slaveName}'s disappointment, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			} else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 0) {
+				r.push(`Since your poor Head Girl can't get it up for one reason or another, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			} else if (S.HeadGirl.dick > 0) {
+				r.push(`Your lusty Head Girl is already hard and shoves ${himself2} up ${eventSlave.slaveName}'s already-filled butt while`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`tweaking`);
+				} else {
+					r.push(`fingering`);
+				}
+				r.push(`the writhing slave's nipples.`);
+			} else {
+				r.push(`${He2} dons a strap-on and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
+			}
+			r.push(`The two of you jackhammer in and out of ${eventSlave.slaveName}'s ass without mercy; the poor anal whore does ${his} best to relax, but two phalli at once is a lot, even for ${him}. ${He}'s only allowed an anal respite when ${his} sphincter is really fucked out and there's little butthole fun to be had from ${him} any longer. ${He} has become <span class="devotion inc">more submissive to you,</span> and ${S.HeadGirl.slaveName} <span class="devotion inc">enjoyed</span> taking a break to fuck ${him} with you.`);
+			eventSlave.devotion += 4;
+			S.HeadGirl.devotion += 4;
+			seX(eventSlave, "anal", V.PC, "penetrative");
+			seX(eventSlave, "anal", S.HeadGirl, "penetrative");
+			if (canImpreg(eventSlave, V.PC)) {
+				knockMeUp(eventSlave, 5, 0, -1);
+			}
+			if (canImpreg(eventSlave, S.HeadGirl)) {
+				knockMeUp(eventSlave, 5, 0, V.HeadGirlID);
+			}
+			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/modsPlease.js b/src/events/RESS/review/modsPlease.js
new file mode 100644
index 0000000000000000000000000000000000000000..547e83829bb31e52150093ebe97ac568197ad1ab
--- /dev/null
+++ b/src/events/RESS/review/modsPlease.js
@@ -0,0 +1,388 @@
+App.Events.RESSModsPlease = class RESSModsPlease extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.modRequestsAllowed > 0,
+		]; // 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.trust > 50,
+				s => s.devotion > 20,
+				s => s.dick !== 0 || s.vagina !== -1,
+				s => s.nipples !== "fuckable",
+				s => s.rules.speech === "permissive",
+				s => s.corsetPiercing === 0,
+				s => s.tonguePiercing === 0,
+				s => s.anusPiercing === 0,
+				s => s.nipplesPiercing === 0,
+				s => s.dickPiercing === 0,
+				s => s.vaginaPiercing === 0,
+				s => s.lipsTat === 0 || s.lipsTat === "none",
+				s => s.vaginaTat === 0 || s.vaginaTat === "none",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, himself, girl
+		} = 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),
+			`is such a good ${SlaveTitle(eventSlave)} that ${he} enjoys being inspected, even if the inspection doesn't immediately transition into sex. At the moment, ${he}'s luxuriating under your gaze, eagerly offering the sight of every`
+		);
+		if (V.showInches === 2) {
+			r.push(`inch`);
+		} else {
+			r.push(`centimeter`);
+		}
+		r.push(`of ${his} nude body with you. ${He} is confident in ${his} appearance, and more than happy to share it.`);
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		if (canSee(eventSlave)) {
+			r.push(`Seeing`);
+		} else {
+			r.push(`Feeling`);
+		}
+		r.push(`your intent gaze, ${he}`);
+		if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+			r.push(`lisps,`);
+		} else {
+			r.push(`asks,`);
+		}
+		r.push(Spoken(eventSlave, `"${Master}, may I please ask you for something?"`));
+
+		r.push(`At your`);
+		if (canSee(eventSlave)) {
+			r.push(`nod,`);
+		} else {
+			r.push(`acknowledgment,`);
+		}
+		r.push(he);
+		if (eventSlave.fetishKnown === 1) {
+			if (eventSlave.fetish === "submissive") {
+				r.push(
+					`gives a submissive shudder, and turns to show you ${his} bare back.`,
+					Spoken(eventSlave, `"${Master}, may I have a corset piercing? I would love to feel more, um, bound. Tied up. Please?"`)
+				);
+				r.push(`${He} awaits your answer coquettishly,`);
+				if (canSee(eventSlave)) {
+					r.push(`${his} ${App.Desc.eyesColor(eventSlave)} huge.`);
+				} else {
+					r.push(`a look of begging on ${his} face.`);
+				}
+			} else if (eventSlave.fetish === "cumslut") {
+				r.push(
+					`blows you a wet kiss.`,
+					Spoken(eventSlave, `"${Master}, may I have a tongue piercing? It would take my dicksucking to the next level. Please?"`)
+				);
+				r.push(`${He} sticks out ${his} tongue helpfully, leaving ${his} favorite fuckhole wide open so you can see down ${his} hungry throat.`);
+			} else if (eventSlave.fetish === "humiliation") {
+				r.push(`blushes with humiliation.`,
+					Spoken(eventSlave, `"${Master}, may I have a t-tattoo? L-like, on my face. A mean one. Please?"`)
+				);
+				r.push(`${He} hangs ${his} head.`);
+			} else if (eventSlave.fetish === "buttslut") {
+				r.push(`spins around to show off ${his} favorite fuckhole, bending over`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`as far as ${he} can with ${his} ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly in the way`);
+				} else {
+					r.push(`farther than usual`);
+				}
+				r.push(`to indicate the area between it and`);
+				if (eventSlave.vagina > -1) {
+					r.push(`${his} cunt.`);
+				} else if (eventSlave.balls > 0 && eventSlave.scrotum > 0) {
+					r.push(`${his} ballsack.`);
+				} else if (eventSlave.dick === 0) {
+					r.push(`${his} featurelessly smooth groin and its little cumhole.`);
+				} else {
+					r.push(`the base of ${his} soft bitchclit.`);
+				}
+				r.push(Spoken(eventSlave, `"${Master}, may I have a piercing right here? Right below my butthole? It would keep me so ready for a buttfuck. I mean, more than I already am. Please?"`));
+				r.push(`The shameless buttslut begins to wink ${his} asshole meaningfully.`);
+			} else if (eventSlave.fetish === "boobs") {
+				r.push(`wiggles ${his} shoulders to give ${his} boobs some motion.`,
+					Spoken(eventSlave, `"${Master}, may I have some nipple piercings? It would be like having someone playing with my nipples, but, like, all the time. Please?"`)
+				);
+				r.push(`${He} starts to bounce flirtily.`);
+			} else if (eventSlave.fetish === "pregnancy") {
+				r.push(`blushes suddenly and hangs ${his} head.`);
+				if (eventSlave.belly >= 10001) {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a piercing? Right here? A big one?" ${He} indicates ${his} popped navel. "I feel it like it would get my belly more attention, plus I'd hate to not take advantage of my new outie. Please?`));
+				} else {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a tattoo? Right here?"`),
+						`${He} indicates ${his}`);
+					if (eventSlave.belly > 1500) {
+						r.push(`rounded belly.`);
+					} else {
+						r.push(`abdomen.`);
+					}
+					r.push(Spoken(eventSlave, `"I would love an advertisement that I want to be, um, filled up.`));
+					if (eventSlave.pregKnown === 1) {
+						r.push(Spoken(eventSlave, `Well, when I'm empty again.`));
+					}
+					r.push(Spoken(eventSlave, `Please?"`));
+				}
+				r.push(`${He}`);
+				if (canSee(eventSlave)) {
+					r.push(`looks`);
+				} else {
+					r.push(`gazes`);
+				}
+				r.push(`at you hopefully.`);
+			} else if (eventSlave.fetish === "dom") {
+				r.push(`tosses ${his} head, a`);
+				if (canSee(eventSlave)) {
+					r.push(`gleam in ${his} eye`);
+				} else {
+					r.push(`devious look on ${his} face`);
+				}
+				r.push(
+					Spoken(eventSlave, `"${Master}, may I have a tattoo? Right here?"`),
+					`${He} indicates ${his} eyebrow, temple, and cheek.`,
+					Spoken(eventSlave, `"It would be cool if other girls saw me and were all, 'I'm about to get fucked.' Please?"`)
+				);
+				r.push(`${He} smiles at you hopefully.`);
+			} else if (eventSlave.fetish === "sadist") {
+				r.push(`tosses ${his} head, a`);
+				if (canSee(eventSlave)) {
+					r.push(`gleam in ${his} eye.`);
+				} else {
+					r.push(`malicious look on ${his} face.`);
+				}
+				if (canAchieveErection(eventSlave)) {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a shaft piercing? If I get to stick it in another girl, I'd love to`));
+					if (canSee(eventSlave)) {
+						r.push(Spoken(eventSlave, `see her face`));
+					} else {
+						r.push(`feel her shudder`);
+					}
+					r.push(Spoken(eventSlave, `when that extra little bit of metal slides inside ${him}. Please?"`));
+				} else if (eventSlave.dick > 0) {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a tongue piercing? If I get to eat another girl out, I'd love to listen to her squeal when that little bit of metal scrapes against her. Please? Please?"`));
+				} else {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a labia piercing? If I get to trib another girl, I'd love to`));
+					if (canSee(eventSlave)) {
+						r.push(Spoken(eventSlave, `see her face`));
+					} else {
+						r.push(Spoken(eventSlave, `feel her shudder`));
+					}
+					r.push(Spoken(eventSlave, `when that little bit of metal grinds against her. Please?"`));
+				}
+				r.push(`${He} shudders at the thought,`);
+				if (canSee(eventSlave)) {
+					r.push(`looking`);
+				} else {
+					r.push(`gazing`);
+				}
+				r.push(`at you hopefully.`);
+			} else if (eventSlave.fetish === "masochist") {
+				r.push(`bites ${his} lower lip, looking aroused.`);
+				if (eventSlave.dick > 0) {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a dick piercing? Right th-through my cock. Oh f-fuck it would hurt. Please?"`));
+				} else {
+					r.push(Spoken(eventSlave, `"${Master}, may I have a pussy piercing? Right th-through me. Oh f-fuck it would hurt. Please?"`));
+				}
+				r.push(`${He} shivers at the thought,`);
+				if (canSee(eventSlave)) {
+					r.push(`looking`);
+				} else {
+					r.push(`gazing`);
+				}
+				r.push(`at you hopefully.`);
+			}
+		} else {
+			r.push(`bats ${his} eyes at you, and turns halfway to display ${his} boobs in profile.`,
+				Spoken(eventSlave, `"${Master}, may I have my nipples pierced? It's silly and girly, but I guess— I guess I'd like something silly and girly. Please?"`));
+			r.push(`${He} blushes prettily and`);
+			if (canSee(eventSlave)) {
+				r.push(`looks`);
+			} else {
+				r.push(`gazes`);
+			}
+			r.push(`at you hopefully.`);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Perform it yourself`, perform),
+			new App.Events.Result(`${He}'s beautiful just the way ${he} is`, beautiful),
+			new App.Events.Result(`No, and slaves should not make requests of this kind`, no),
+		]);
+
+		function perform() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You stand up from behind your desk and head towards the body modification studio,`);
+			if (canSee(eventSlave)) {
+				r.push(`crooking a finger at`);
+			} else {
+				r.push(`calling`);
+			}
+			r.push(`${him} as you as you go. ${He} follows bouncily, thanking you profusely, and then thanking you again when it becomes apparent to ${him} that you intend to do the body art yourself. ${He} snuggles into the chair, relaxing as the restraints bind ${him} in. They're not really necessary to modify a willing ${girl}, never mind one this enthusiastic, but they could possibly prevent ${him} from flinching, and it's not like ${he} resents being bound at this point.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`Manipulating the machine, you`);
+			if (eventSlave.fetishKnown === 1) {
+				if (eventSlave.fetish === "submissive") {
+					r.push(`place the first piercing, eliciting a hum of mild pain and abject submission from ${eventSlave.slaveName}. The piercing session goes on and on, with the slave sinking into a boneless, mindless state in which ${his} being is completely in your hands. ${He}'s almost sleepy when you finally release ${him}, but ${he} rises and`);
+					if (canSee(eventSlave)) {
+						r.push(`turns, craning around to see in the mirror.`);
+					} else {
+						r.push(`gingerly feeling around ${his} new piercings.`);
+					}
+					r.push(`${He} <span class="devotion inc">smiles devotedly,</span> and asks you when ${he}'ll be healed enough that ${he} can be laced up.`);
+					eventSlave.corsetPiercing = 1;
+				} else if (eventSlave.fetish === "cumslut") {
+					r.push(`hold ${his} mouth agape and place the first piercing. ${He} can't make much of a facial expression with ${his} mouth that wide, but there is a lewd`);
+					if (canSee(eventSlave)) {
+						r.push(`glint in ${his} eye`);
+					} else {
+						r.push(`look on ${his} face`);
+					}
+					r.push(`when ${he} realizes ${he}'s getting more than one. When you're done, ${he}'s sore enough that ${he} gestures ${his} thanks, <span class="devotion inc">smiling devotedly,</span> and begs you to try ${him} out when ${he}'s healed up.`);
+					eventSlave.tonguePiercing = 2;
+				} else if (eventSlave.fetish === "humiliation") {
+					r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, inscribing the slave's status as a sex object on ${his} forehead. The pain is intense, but ${he} tolerates it, the tears running fast out of the corners of ${his} eyes and low groans rising out of ${his} throat. When ${he}'s finally allowed to rise`);
+					if (canSee(eventSlave)) {
+						r.push(`and sees ${himself} in a mirror,`);
+					} else if (canHear(eventSlave)) {
+						r.push(`and listens intently on your descriptions of ${his} new face,`);
+					}
+					r.push(`${he} blushes furiously and cries harder, knowing that ${his} status as a humiliation slut is now permanent. This culmination of ${his} deeply perverse sense of self <span class="devotion inc">draws ${him} closer to you.</span>`);
+					eventSlave.lipsTat = "degradation";
+				} else if (eventSlave.fetish === "buttslut") {
+					r.push(`place a spreader to keep ${his} legs and cheeks apart and start piercing. ${He} whines with the pain, and then gasps when ${he} realizes that the piercing is going on much longer than ${he} expected. You give ${him} a couple of huge piercings below ${his} anus, big enough that ${he}'ll never be free of them rubbing against ${his} slutty butthole. Not done yet, you put some small, smooth studs around it, just to make sure nobody can possibly misunderstand where to fuck this bitch. ${He} gets up gingerly, but <span class="devotion inc">smiling sluttily.</span>`);
+					eventSlave.anusPiercing = 2;
+				} else if (eventSlave.fetish === "boobs") {
+					if (eventSlave.nipples.includes("inverted")) {
+						r.push(`use a couple of its actuators to stimulate ${his} nipples until they're almost all the way protruded, and then direct them to pull them out all the way. ${He} screams wholeheartedly at the pain, yelling on and on until ${he}'s out of breath and relaxes against the restraints, gasping and crying.`);
+					} else {
+						r.push(`use its actuators to pull ${his} nipples out as far as they will go, forcing a gasp of pain out of ${him}.`);
+					}
+					r.push(`${He} expects a simple nipple piercing, one for each boob; what ${he} gets is a set of heavy rings in each nipple. ${He}'s no masochist, so the pleasure will come later, but ${he} moans as ${he} feels the gradual addition of weight to ${his} nipples. ${He} rises very carefully, trying to keep ${his} boobs still, and <span class="devotion inc">smiles devotedly</span> at you. Soon enough, ${he}'ll be able to orgasm by walking.`);
+					eventSlave.nipplesPiercing = 2;
+				} else if (eventSlave.fetish === "pregnancy") {
+					if (eventSlave.belly >= 10001) {
+						r.push(`hold ${his} ${belly} stomach steady and pierce ${his} navel with the largest, heaviest ring available. There is a lewd`);
+						if (canSee(eventSlave)) {
+							r.push(`glint in ${his} eye`);
+						} else {
+							r.push(`look on ${his} face`);
+						}
+						r.push(`as ${he} feels the new weight settle against ${his} middle. ${He} rises very carefully, trying to keep ${his} new piercing from moving, and <span class="devotion inc">smiles devotedly</span> at you. Soon enough, all eyes will be on ${his} belly as ${he} waddles by.`);
+						eventSlave.navelPiercing = 2;
+					} else {
+						r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, beautifying ${his}`);
+						if (eventSlave.belly >= 150) {
+							r.push(`${belly} stomach`);
+						} else {
+							r.push(`abdomen`);
+						}
+						r.push(`with an inducement to fuck ${him}.`);
+						if (canSee(eventSlave)) {
+							if (eventSlave.belly >= 5000) {
+								r.push(`${He} can't see what you are inking into the underside of ${his} belly, but ${he} tries anyway.`);
+							} else {
+								r.push(`${He}'s just able to crane ${his} head enough to see the work, and eagerly watches.`);
+							}
+							r.push(`When you're done, ${he} stares at ${himself} for a long time,`);
+						} else {
+							r.push(`Once you finish ${his} new tattoo, you describe it to ${him} in detail. ${He} pauses for a moment,`);
+						}
+						r.push(`a curiously mixed expression on ${his} face. This is ${his} life now; it's permanently a part of ${him}, and <span class="devotion inc">${he} knows it.</span>`);
+						eventSlave.vaginaTat = "lewd crest";
+					}
+				} else if (eventSlave.fetish === "dom") {
+					r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, making the side of ${his} face fierce with tribal patterns. Tattooing over such thin and sensitive skin is intensely painful, but ${he} tolerates it, permitting nothing but a low and continuing growl to escape. ${He}'s obviously tired out by the pain when ${he}'s finally allowed to rise, but ${he}`);
+					if (canSee(eventSlave)) {
+						r.push(`looks at ${himself} in the mirror`);
+					} else if (canHear(eventSlave)) {
+						r.push(`listens to your description`);
+					} else {
+						r.push(`traces the design with ${his} fingertips`);
+					}
+					r.push(`with <span class="devotion inc">obvious approval.</span>`);
+					eventSlave.lipsTat = "tribal patterns";
+				} else if (eventSlave.fetish === "sadist") {
+					if (canAchieveErection(eventSlave)) {
+						r.push(`take hold of ${his} most intimate parts and put a set of massive piercings straight through ${his} shaft. ${He} shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when ${he} gets gingerly up from the chair, ${he} doesn't look eager to stick ${his} cock in anything, but ${he}'s <span class="devotion inc">thankful enough.</span>`);
+						eventSlave.dickPiercing = 2;
+					} else if (eventSlave.dick > 0) {
+						r.push(`hold ${his} mouth agape and place the first piercing. ${He} can't make much of a facial expression with ${his} mouth that wide, but there is a lewd`);
+						if (canSee(eventSlave)) {
+							r.push(`glint in ${his} eye`);
+						} else {
+							r.push(`look on ${his} face`);
+						}
+						r.push(`when ${he} realizes ${he}'s getting more than one. When you're done, ${he}'s sore enough that ${he} gestures ${his} thanks, <span class="devotion inc">smiling devotedly;</span> ${he} looks eager to try out ${his} new piercing on a fresh pussy.`);
+						eventSlave.tonguePiercing = 2;
+					} else {
+						r.push(`take hold of ${his} most intimate parts and put a set of massive piercings straight through ${his} pussylips. ${He} shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when ${he} gets gingerly up from the chair, ${he} doesn't look eager to trib anything, but ${he}'s <span class="devotion inc">thankful enough.</span>`);
+						eventSlave.vaginaPiercing = 2;
+					}
+				} else if (eventSlave.fetish === "masochist") {
+					r.push(`take hold of ${his} most intimate parts and put a series of massive piercing straight through ${his}`);
+					if (eventSlave.dick > 0) {
+						r.push(`shaft.`);
+						eventSlave.dickPiercing = 2;
+					} else {
+						r.push(`pussylips.`);
+						eventSlave.vaginaPiercing = 2;
+					}
+					r.push(`${He} shrieks with agony and then orgasms as strongly as you've ever seen a slave climax, ${his} every fiber tensing against the restraints. For a long, long time ${he} has to work to breathe, the overstimulation clearing slowly. When you finally let ${him} up, ${he} hasn't remembered how to talk yet, but ${his} gaze says it for ${him}. It looks like ${he}'s just had <span class="devotion inc">the best sex of ${his} life.</span>`);
+				}
+			} else {
+				if (eventSlave.nipples.includes("inverted")) {
+					r.push(`use a couple of its actuators to stimulate ${his} nipples until they're almost all the way protruded, and then direct them to pull them out all the way. ${He} screams wholeheartedly at the pain, yelling on and on until ${he}'s out of breath and relaxes against the restraints, gasping and crying.`);
+				} else {
+					r.push(`use its actuators to pull ${his} nipples out as far as they will go, forcing a gasp of pain out of ${him}.`);
+				}
+				r.push(`This done, you give ${him} a simple pair of barbell nipple piercings. The machine makes this take less time than it takes to describe it, and after a shocked squeal of pain ${he}'s released. ${He} rises carefully, trying to keep ${his} boobs still, and <span class="devotion inc">smiles thankfully</span> at you. ${He}`);
+				if (canSee(eventSlave)) {
+					r.push(`glances at ${himself} in the mirror,`);
+				} else {
+					r.push(`listens to your description of ${him},`);
+				}
+				r.push(`looking pleased.`);
+				eventSlave.nipplesPiercing = 1;
+			}
+			eventSlave.devotion += 5; // TODO: consider surgeryDamage
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function beautiful() {
+			eventSlave.trust += 4;
+			return `You tell ${him} firmly that ${he}'s beautiful just the way ${he} is. ${He} blushes and giggles at the absurdly trite statement. You conclude the inspection, and ${he} continues on to the next item in ${his} life as a sex slave, <span class="trust inc">pleased and reassured</span> that you have a plan for what ${he} should look like.`;
+		}
+
+		function no(){
+			V.modRequestsAllowed = 0;
+			return `You tell ${him} firmly that you don't intend to apply body modifications to ${him}, your tone communicating that further requests on this subject are not permitted. ${He} understands clearly and looks a little crushed, but trusts that ${he} won't be punished for violating a rule you hadn't promulgated. You repair the oversight immediately, directing your personal assistant to spread notice that decisions about body modifications are yours alone.`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/notMyName.js b/src/events/RESS/review/notMyName.js
index b1f120a24fd039d5de2a3d35bd5dce69e4637495..89aa4de530b83db9b9a22a13e4b37d4a1d5d4620 100644
--- a/src/events/RESS/review/notMyName.js
+++ b/src/events/RESS/review/notMyName.js
@@ -42,7 +42,7 @@ App.Events.RESSNotMyName = class RESSNotMyName extends App.Events.BaseEvent {
 		r.push(`is not yet broken to your will. With your experience with slaves, you've been expecting ${him} to take some opportunity of exercising ${his} remaining independence. You don't have long to wait. One day, you give ${him} inconsequential orders, naturally addressing ${him} by ${his} slave name, ${eventSlave.slaveName}. ${He} replies`);
 		if (eventSlave.lips > 70) {
 			r.push(`waspishly through ${his} dick-sucking lips,`);
-		} else if ((eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2)) {
+		} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
 			r.push(`waspishly through ${his} heavily-pierced lips,`);
 		} else {
 			r.push(`waspishly,`);
@@ -87,7 +87,7 @@ App.Events.RESSNotMyName = class RESSNotMyName extends App.Events.BaseEvent {
 			r.push(`into ${his}`);
 			if (eventSlave.anus === 1) {
 				r.push(`poor little anus,`);
-			} else if ((eventSlave.anus === 2)) {
+			} else if (eventSlave.anus === 2) {
 				r.push(`whore's butt,`);
 			} else {
 				r.push(`gaping rear end,`);
@@ -140,11 +140,11 @@ App.Events.RESSNotMyName = class RESSNotMyName extends App.Events.BaseEvent {
 			r.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment is, but you are obdurate.`);
 			if (eventSlave.muscles > 30) {
 				r.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
-			} else if ((eventSlave.weight >= 190)) {
+			} else if (eventSlave.weight >= 190) {
 				r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
 			} else if (eventSlave.belly >= 120000) {
 				r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`);
-			} else if ((eventSlave.weight >= -10)) {
+			} else if (eventSlave.weight >= -10) {
 				r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
 			} else if (eventSlave.belly >= 1500) {
 				r.push(`${His}`);
diff --git a/src/events/RESS/review/rebelliousArrogant.js b/src/events/RESS/review/rebelliousArrogant.js
new file mode 100644
index 0000000000000000000000000000000000000000..3d4d54b4e0933741d50dea85d4a5f2878f0a27d5
--- /dev/null
+++ b/src/events/RESS/review/rebelliousArrogant.js
@@ -0,0 +1,193 @@
+App.Events.RESSRebelliousArrogant = class RESSRebelliousArrogant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.assignment !== Job.QUARTER,
+				s => s.behavioralFlaw === "arrogant",
+				s => s.devotion < -50,
+				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, girl
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		App.Events.addParagraph(node, [
+			`You have a lot of work to do with`,
+			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), "."),
+			`${He} compounds the usual rebellious anger at being a slave with an apparently unshakeable conviction that ${he} is better than you. Oddly, ${he} seems to maintain the idea that enslaving other people is somehow inappropriate, and that having done so has lowered you morally. This morning, ${he} did not appear to start ${his} morning chores as previously ordered. ${He} sleeps on a bedroll: a brief investigation discloses that ${he} is still in it, and has pulled the blanket up over ${his} head. ${He} refuses to acknowledge your peremptory command to get up.`
+		]);
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Force ${him} out of bed and humiliate ${him} publicly`, humiliate, virginityWarning()),
+			new App.Events.Result(`Let ${him} stay in bed`, stay),
+			V.seePee === 1
+				? new App.Events.Result(`Let ${him} stay in bed, but move it to a public restroom`, restroom)
+				: new App.Events.Result(),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Let ${him} stay in bed, but move it to a whorehouse`, whorehouse, virginityWarning())
+				: new App.Events.Result(),
+			V.arcade > 0
+				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
+				: new App.Events.Result(),
+
+		]);
+
+		function virginityWarning() {
+			if ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) {
+				return `This option will take ${his} virginity`;
+			}
+		}
+
+		function humiliate() {
+			let r = [];
+			r.push(`You drag ${him} unceremoniously out of bed and straight down into the public areas of ${V.arcologies[0].name}. ${His} struggles and protests grow more frantic as ${he}`);
+			let textArray = [];
+			if (canSee(eventSlave)) {
+				textArray.push(`sees the first passersby beginning to stare at the little spectacle`);
+			}
+			if (canHear(eventSlave)) {
+				textArray.push(`begins to hear the various catcalls and other comments directed at ${him}`);
+			} else {
+				textArray.push(`feels the outdoor air on ${his} body`);
+			}
+			if (textArray.length === 1) {
+				r.push(`${textArray[0]}.`);
+			} else if (textArray.length === 2) {
+				r.push(`${textArray[0]} and ${textArray[1]}.`);
+			} else if (textArray.length === 3) {
+				r.push(`${textArray[0]}, ${textArray[2]} and ${textArray[3]}.`);
+			}
+			r.push(`You force ${him} right there, thoroughly raping the struggling ${girl} in public. <span class="trust dec">${He} learns the consequences of refusal,</span>`);
+			if (V.arcologies[0].FSDegradationist !== "unset") {
+				r.push(`and <span class="reputation inc">your citizens certainly enjoy the public spectacle.</span>`);
+				repX(100, "event", eventSlave);
+			} else {
+				r.push(`but <span class="reputation dec">your reputation has been decreased by the unseemly commotion.</span>`);
+				repX(-100, "event", eventSlave);
+			}
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(VCheck.Both(eventSlave, 1));
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				seX(eventSlave, "oral", V.PC, "penetrative");
+			}
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function stay() {
+			eventSlave.trust += 10;
+			eventSlave.devotion -= 10;
+			return `You shrug and walk out of the room and back to your office; you've got more important things to worry about than some drowsy brat. ${eventSlave.slaveName}, for ${his} part, gets out of bed not long after you leave, but is surprised at <span class="devotion dec">how easily ${he} got away with this,</span> and is wondering <span class="trust inc">what else ${he} could get away with.</span>`;
+		}
+
+		function restroom() {
+			eventSlave.trust -= 5;
+			return `You quickly pin the blanket to the mattress, securing ${him} in place. You direct that a urinal in one of ${V.arcologies[0].name}'s public restrooms be unbolted and replaced by the mattress, slave and all. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo (though muffled by the blanket) when ${he} feels urine beginning to soak through the blanket. After an hour or so ${he}'s begging to be let out, <span class="trust dec">swearing ${he}'ll improve ${his} conduct.</span>`;
+		}
+
+		function whorehouse() {
+			let r = [];
+			r.push(`You quickly pin the blanket to the mattress, securing ${him} in place. You direct that ${he} be brought to an arcology salon that serves as a slave brothel. Once ${he}'s there, you take a pair of scissors and cut a slit through the sheets. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo when ${he} feels a cock being shoved through the slit and between ${his} buttocks. Being muffled and held immobile for rape for hire <span class="trust dec">terrifies ${him}</span> but <span class="cash inc">earns some cash.</span>`);
+			eventSlave.trust -= 5;
+			if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative", 5);
+				if (canDoAnal(eventSlave)) {
+					seX(eventSlave, "anal", "public", "penetrative", 5);
+					if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+						r.push(`After the patrons have their way with ${him}, <span class="virginity loss">both ${his} pussy and asshole have been broken in.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginities in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`);
+						eventSlave.trust -= 5;
+						eventSlave.devotion -= 5;
+						eventSlave.vagina++;
+						eventSlave.anus++;
+					} else if (eventSlave.vagina === 0) {
+						r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer a virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`);
+						eventSlave.trust -= 5;
+						eventSlave.devotion -= 5;
+						eventSlave.vagina++;
+					} else if (eventSlave.anus === 0) {
+						r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer an anal virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} anal virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`);
+						eventSlave.trust -= 5;
+						eventSlave.devotion -= 5;
+						eventSlave.anus++;
+					}
+					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+						knockMeUp(eventSlave, 25, 2, -2);
+					}
+				} else {
+					if (eventSlave.vagina === 0) {
+						r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer a virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`);
+						eventSlave.trust -= 5;
+						eventSlave.devotion -= 5;
+						eventSlave.vagina++;
+					}
+					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+						knockMeUp(eventSlave, 25, 0, -2);
+					}
+				}
+			} else if (canDoAnal(eventSlave)) {
+				seX(eventSlave, "anal", "public", "penetrative", 10);
+				if (eventSlave.anus === 0) {
+					r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer an anal virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} anal virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`);
+					eventSlave.trust -= 5;
+					eventSlave.devotion -= 5;
+					eventSlave.anus++;
+					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+						knockMeUp(eventSlave, 50, 1, -2);
+					}
+				}
+			}
+			cashX(100, "event", eventSlave);
+			return r;
+		}
+
+		function arcade() {
+			let r = [];
+			r.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment is, but you are obdurate.`);
+			if (eventSlave.muscles > 30) {
+				r.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
+			} else if (eventSlave.weight >= 190) {
+				r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
+			} else if (eventSlave.belly >= 120000) {
+				r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`);
+			} else if (eventSlave.weight >= -10) {
+				r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(`${His} `);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				} else {
+					r.push(belly);
+				}
+				r.push(` body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`);
+			} else if (eventSlave.muscles < -15) {
+				r.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`);
+			} else {
+				r.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`);
+			}
+			r.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`);
+			r.push(assignJob(eventSlave, "be confined in the arcade"));
+			eventSlave.sentence = 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/resistantAnalVirgin.js b/src/events/RESS/review/resistantAnalVirgin.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f8cde7fe1df5765d37c3fd03476fa8d5bf8ed2a
--- /dev/null
+++ b/src/events/RESS/review/resistantAnalVirgin.js
@@ -0,0 +1,200 @@
+App.Events.RESSResistantAnalVirgin = class RESSResistantAnalVirgin extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.devotion < -20,
+				s => s.trust >= -20,
+				s => s.anus === 0,
+			]
+		];
+	}
+
+	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 PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`has never had anything significant up ${his} ass. Living in ${V.arcologies[0].name}, ${he} can't have missed that anal sex is a part of most slaves' lives. ${He}`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`witnesses`);
+		} else if (canHear(eventSlave)) {
+			r.push(`hears`);
+		} else {
+			r.push(`thinks about`);
+		}
+		r.push(`sodomy several times a day, at least.`);
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		r.push(`Lately, you've noticed that ${he} reacts to these`);
+		if (canSee(eventSlave)) {
+			r.push(`sights`);
+		} else if (canHear(eventSlave)) {
+			r.push(`sounds`);
+		} else {
+			r.push(`thoughts`);
+		}
+		r.push(`with a well-concealed flash of apprehension. It seems ${he}'s figured out that ${he} will probably be required to take it up ${his} little`);
+		if (V.seeRace === 1) {
+			r.push(eventSlave.race);
+		}
+		r.push(`butt someday, and isn't enthusiastic about the prospect. You could probably exploit this.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Let ${him} earn continued anal virginity`, earn),
+			hasAnyLegs(eventSlave)
+				? new App.Events.Result(`Force ${him} to degrade ${himself}`, force, `This option will take ${his} anal virginity`)
+				: new App.Events.Result(),
+			eventSlave.vagina === 0
+				? new App.Events.Result(`Make ${him} choose between ${his} virginities`, choose, `This option will take one of ${his} virginities`)
+				: 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 take a dick up the ass.`);
+			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} butt alone.`);
+			} else {
+				r.push(
+					`${He} begs,`,
+					Spoken(eventSlave, `"Please no, ${Master}, please don't rape me in my ass, ${Master}!"`)
+				);
+			}
+			r.push(`You make a show of considering, and then tell ${him} that if ${he}'s extra obedient, you might let ${him} keep ${his} butt — for now. You tell ${him} to`);
+			if (PC.dick !== 0) {
+				r.push(`blow you`);
+				if (PC.vagina !== -1) {
+					r.push(`and`);
+				}
+			}
+			if (PC.vagina !== -1) {
+				r.push(`lick your pussy`);
+			}
+			r.push(r.pop() + `, and ${he} does with unusual obedience. When ${he}'s done, you bend down and whisper in ${his} ear that if ${he} shows any sign of rebelliousness, you'll ruin ${his} little asshole. <span class="trust dec">${He}'s terrified.</span>`);
+			eventSlave.trust -= 5;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return r;
+		}
+
+		function force() {
+			r = [];
+			r.push(`Suction cup dildos are terribly useful. You place a moderate-sized one on a low table in your office,`);
+			if (eventSlave.chastityAnus) {
+				r.push(`unlock ${his} chastity belt,`);
+			}
+			r.push(`and order ${him} to squat down on it and fuck ${his} own asshole. ${He} hesitates, incredulous, and finds ${himself} bound to the couch and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When ${he}'s been reduced to a state of abject, sobbing surrender, you free ${him} and repeat your orders as though nothing had happened. Still crying, ${he} hobbles over and up onto the table,`);
+			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
+				r.push(`struggles to line ${himself} up, and finds it slammed into ${his} asshole when the table gives out under ${his}`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`gravid`);
+				}
+				r.push(`weight. You leave ${him} there to struggle with the dildo wedged in ${his} rear until ${he} finally manages to pop it free from the table fragment stuck under mass and roll over. You haul ${him} onto`);
+			} else {
+				if (eventSlave.belly > 20) {
+					r.push(`gingerly lowers ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`bulk onto it,`);
+				}
+				r.push(`and fucks ${his} little ass open on the dildo. You keep ${him} up there until ${his} legs give out`);
+				if (eventSlave.belly >= 10000 || eventSlave.weight > 190) {
+					r.push(`and ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`gravid`);
+					}
+					r.push(`weight pins ${him} on the toy;`);
+				} else {
+					r.push(r.pop() + `, and`);
+				}
+				r.push(`then let ${him} lie down on`);
+			}
+			r.push(`the couch, telling ${him} to keep working the dildo with ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} or suffer another whipping. After ${he}'s had ${his} ass filled for a good while, ${he} has no trouble taking a`);
+			if (PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`real dick`);
+			}
+			r.push(`for the first time, and is by this point too exhausted to do anything but lie there and be a good little anal slave. <span class="gold">${He} fears you,</span> and <span class="lime">${his} butthole has been broken in.</span>`);
+			eventSlave.trust -= 5;
+			eventSlave.anus = 1;
+			r.push(VCheck.Anal(eventSlave, 1));
+			return r;
+		}
+
+		function choose() {
+			r = [];
+			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to take a dick up the ass.`);
+			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} butt alone.`);
+			} else {
+				r.push(
+					`${He} begs,`,
+					Spoken(eventSlave, `"Please no, ${Master}, please don't rape me in my ass, ${Master}!"`)
+				);
+			}
+			r.push(`You make a show of considering, and then tell ${him} you know a way ${he} can continue being an anal virgin — for now. You want a new hole to play with, and ${he} has two untouched holes. ${He} gasps when ${he} realizes what you want. ${He} hesitates to answer, uncertain of which ${he} values more, and finds ${himself} bound to the couch`);
+			if (eventSlave.chastityAnus) {
+				r.push(r.pop() + `, stripped of ${his} chastity,`);
+			}
+			r.push(`and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When ${he}'s been reduced to a state of abject, sobbing surrender, you free ${him} and repeat your orders as though nothing had happened. Still crying, ${he} prostrates ${himself} and`);
+			if (eventSlave.trust < 20) {
+				r.push(`spreads ${his} butt for you.`);
+			} else {
+				r.push(`${his} pussylips for you.`);
+			}
+			r.push(`You callously ram a dildo into ${his} fresh hole and tell ${him} to keep working ${himself} with it or suffer another whipping. After ${he}'s fucked ${himself} for a good while, ${he} has no trouble taking a`);
+			if (PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`real dick`);
+			}
+			r.push(`for the first time, and is by this point too exhausted to do anything but lie there and take it a good little slave. <span class="trust dec">${He} fears you</span> but <span class="devotion inc">loses ${himself} to your rule.</span>`);
+			if (eventSlave.trust < 20) {
+				r.push(`<span class="virginity loss">${His} butthole has been broken in.</span>`);
+				eventSlave.anus = 1;
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`<span class="virginity loss">${His} pussy has been broken in.</span>`);
+				eventSlave.vagina = 1;
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			eventSlave.trust -= 5;
+			eventSlave.devotion += 3;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/resistantGelding.js b/src/events/RESS/review/resistantGelding.js
new file mode 100644
index 0000000000000000000000000000000000000000..d682b7f71f966e59c4261ecce58fa5bf0f6f99a5
--- /dev/null
+++ b/src/events/RESS/review/resistantGelding.js
@@ -0,0 +1,126 @@
+App.Events.RESSResistantGelding = class RESSResistantGelding 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 > 0,
+				s => s.balls === 0,
+				s => s.genes === "XY",
+				s => s.devotion <= 50,
+				s => s.trust < -50,
+				s => s.anus > 0,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`You come across`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`standing in the bathroom in front of the sink, with one leg up on the counter so ${he} can inspect ${his} genitalia.`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} sees.`);
+		} else {
+			r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} feels.`);
+		}
+		r.push(`As you watch, ${he} sobs quietly, reaching towards where ${his} scrotum used to be with a trembling hand. Apparently, ${he}'s having trouble accepting ${his} status as a gelded slut.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Abuse ${his} ass`, abuse),
+			new App.Events.Result(`Reassure ${him} of ${his} sexual worth`, reassure),
+			new App.Events.Result(`Comfort ${him}`, comfort)
+		]);
+
+		function abuse() {
+			r = [];
+			r.push(`${He} turns around as`);
+			if (canHear(eventSlave)) {
+				r.push(`${he} hears`);
+			}
+			r.push(`you enter the bathroom, fear and loathing on ${his} face, but you seize ${his} shoulder and spin ${his} back around without a word. You drag ${him} across the counter until ${his} face is over the sink, and turn it on. ${He} struggles in sheer incomprehension as you hold ${his} head over the filling basin with one hand and roughly grope ${his} butt with the other. When the sink is full, you tell ${him} to spread ${his} buttocks for you like a good butthole bitch. ${He} hesitates, so you push ${his} face under the surface of the water and hold it there until ${he} complies. You shove`);
+			if (V.PC.dick === 0) {
+				r.push(`a dildo`);
+			} else {
+				r.push(`your member`);
+			}
+			r.push(`up ${his} anus so harshly that ${he} spasms and reflexively tries to get away, so you push ${him} under again until ${he} stops struggling. For the next ten minutes, ${he} gets shoved under water whenever ${he} offers the slightest resistance to anal rape. Soon, ${his} tears are pattering down into the sink. The next time you decide to buttfuck ${him}, ${he}'s <span class="trust dec">compliant from sheer terror.</span>`);
+			eventSlave.trust -= 5;
+			r.push(VCheck.Anal(eventSlave, 1));
+			return r;
+		}
+
+		function reassure() {
+			r = [];
+			r.push(`${He} turns around as`);
+			if (canHear(eventSlave)) {
+				r.push(`${he} hears`);
+			}
+			r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`);
+			if (canSee(eventSlave)) {
+				r.push(`your gentle expression.`);
+			} else {
+				r.push(`by how calm your steps seem.`);
+			}
+			r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You gently turn ${him} around to face the mirror again, and working from the top of ${his} head, describe ${his} body in minute detail, explaining how pretty and valuable a sex slave ${he} is. When you're about to reach ${his} butt,`);
+			if (canTalk(eventSlave)) {
+				r.push(`${he} uses gestures to beg you not to assrape ${him}.`);
+			} else {
+				if (eventSlave.lips > 70) {
+					r.push(`${he} begs meekly through ${his} massive dick-sucking lips,`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`${he} begs meekly through ${his} mouthful of piercings,`);
+				} else {
+					r.push(`${he} begs meekly,`);
+				}
+				r.push(Spoken(eventSlave, `"${Master}, please, please don't assrape me. I don't think I can take it."`));
+			}
+			r.push(`You patiently explain that taking`);
+			if (V.PC.dick === 0) {
+				r.push(`anything you feel like inserting into ${his} backdoor`);
+			} else {
+				r.push(`your cock`);
+			}
+			r.push(`is ${his} duty, and begin to massage ${his} sphincter open with a single gentle finger. ${He} doesn't enjoy the ensuing assfuck, but ${he} doesn't truly hate it either and <span class="devotion inc">begins to hope</span> that being your butt slave won't be so painful after all.`);
+			eventSlave.devotion += 4;
+			r.push(slaveSkillIncrease('anal', eventSlave, 10));
+			r.push(VCheck.Anal(eventSlave, 1));
+			return r;
+		}
+
+		function comfort() {
+			r = [];
+			r.push(`${He} turns around as`);
+			if (canHear(eventSlave)) {
+				r.push(`${he} hears`);
+			}
+			r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`);
+			if (canSee(eventSlave)) {
+				r.push(`your gentle expression.`);
+			} else {
+				r.push(`by how calm your steps seem.`);
+			}
+			r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You run your hands along ${his} body and kiss ${his} deeply for a long while before reassuring ${him} of ${his} value to you. ${He} looks confused, but goes about ${his} business with dry eyes. ${He} hates you a little less, but wonders whether ${he} can get away with retaining some independence.`);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/resistantShower.js b/src/events/RESS/review/resistantShower.js
new file mode 100644
index 0000000000000000000000000000000000000000..39d6ce96b798b277f447e194819a964040c3c136
--- /dev/null
+++ b/src/events/RESS/review/resistantShower.js
@@ -0,0 +1,192 @@
+App.Events.RESSResistantShower = class RESSResistantShower 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 <= 20,
+				s => s.devotion >= -50,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			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");
+
+		App.Events.addParagraph(node, [
+			`Though ${V.assistant.name} constantly monitors all your slaves, you keep an eye on the video feeds yourself. There's nothing like the personal, human touch. You notice one night that`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`is crouched in the bottom of the shower. Sensing something amiss, you discreetly investigate, and find that ${he}'s crying quietly under the warm water.`
+		]);
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Enter the shower and quietly comfort ${him}`, comfort),
+			new App.Events.Result(`Talk through ${his} problems with ${him}`, talk),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Use ${him} when ${he} gets out`, out, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+		]);
+
+		function comfort() {
+			let r = [];
+			r.push(`${He} starts with surprise`);
+			if (canSee(eventSlave)) {
+				r.push(`as you enter the shower,`);
+			} else if (canHear(eventSlave)) {
+				r.push(`as ${he} hears you enter the shower,`);
+			} else {
+				r.push(`as ${he} feels the water being disturbed by your body,`);
+			}
+			r.push(`and then`);
+			if (canSee(eventSlave)) {
+				r.push(`looks at`);
+			} else {
+				r.push(`turns to`);
+			}
+			r.push(`you in shock as you sit down beside ${him}, ignoring the water soaking your clothes. ${He} does not resist when you draw ${him} gently into your lap. ${He}'s stiff and uncomfortable as you hold ${him} gently, but ${he} eventually relaxes and allows ${his} head to rest`);
+			if (V.PC.boobs >= 300) {
+				r.push(`between your breasts.`);
+			} else {
+				r.push(`against your shoulder.`);
+			}
+			r.push(`${He}'s utterly conflicted; the hateful person who ${he} is expected to fuck is tenderly comforting ${him}. ${He} finally seems to accept the animal comfort, whatever its source, and begins to <span class="trust inc">trust</span> you to do more than just use ${him}.`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function talk() {
+			const frag = document.createDocumentFragment();
+			let r = [];
+			r.push(`You enter the bathroom and quietly wait until ${he}'s done. When the water shuts off, ${he} stands up absently and spins so the shower's air dry function can blow the water off ${him}. You can't help but notice`);
+			if (eventSlave.weight > 30) {
+				r.push(`a lot of motion across ${his}`);
+				if (eventSlave.weight > 190) {
+					r.push(`expansive`);
+				} else if (eventSlave.weight > 130) {
+					r.push(`fat`);
+				} else if (eventSlave.weight > 95) {
+					r.push(`thick`);
+				} else {
+					r.push(`chubby`);
+				}
+				r.push(`body when the air jets play across ${him}.`);
+			} else if (eventSlave.belly >= 5000) {
+				r.push(`how firm ${his} ${belly} belly is.`);
+			} else if (eventSlave.dick > 1) {
+				r.push(`${his} soft cock flop around as one of the air jets strikes it.`);
+			} else if (eventSlave.boobs > 800) {
+				if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
+					r.push(`how ${his} fake tits refuse to jiggle under the air jets.`);
+				} else {
+					r.push(`how the air jets produce a lot of delectable jiggling when they strike ${his} boobs.`);
+				}
+			} else if (eventSlave.butt > 4) {
+				r.push(`how ${he} has to spread ${his} big buttcheeks to let an air jet dry between them.`);
+			} else if (eventSlave.labia > 0) {
+				r.push(`how one of the air jets creates some motion in ${his} generous labia.`);
+			} else if (eventSlave.muscles > 5) {
+				r.push(`how the air jets make ${his} taut abs look even more impressive.`);
+			} else {
+				r.push(`${his} nipples`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`stiffen`);
+				} else {
+					r.push(`engorge`);
+				}
+				r.push(`under the air jets.`);
+			}
+			r.push(`As ${he} rotates,`);
+			if (canSee(eventSlave)) {
+				r.push(`${he} notices you with a start and looks concerned, but you do your best to look reassuring and beckon`);
+			} else {
+				r.push(`you gently call ${his} name. ${He} jumps at the sound of your voice and looks concerned, but you do your best to calm ${him} and gingerly coax`);
+			}
+			r.push(`${him} out of the shower.`);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`You ask ${him} what's troubling ${him}, and the look of concern returns. Suspecting that ${he}'s afraid of telling the truth, you gently encourage ${him} to be honest, and assure ${him} that you're simply taking an interest in ${his} well-being. ${He} still hesitates, but eventually sniffles a little and`);
+			if (!canTalk(eventSlave)) {
+				r.push(`reluctantly gestures,`);
+			} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+				r.push(`lisps,`);
+			} else {
+				r.push(`admits,`);
+			}
+			if (eventSlave.sexualFlaw === "hates oral" && eventSlave.counter.oral > 0) {
+				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting facefucked."`));
+			} else if (eventSlave.sexualFlaw === "hates anal" && eventSlave.counter.anal > 0) {
+				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting assraped."`));
+			} else if (eventSlave.sexualFlaw === "hates penetration" && eventSlave.counter.vaginal > 0) {
+				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting fucked."`));
+			} else if (eventSlave.behavioralFlaw === "hates women") {
+				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate girls. They're gross."`));
+			} else if (eventSlave.behavioralFlaw === "hates men") {
+				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate cocks. I don't want to see another one, ever again."`));
+			} else if ((eventSlave.sexualFlaw === "idealistic") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) {
+				r.push(Spoken(eventSlave, `"I feel like I'm going crazy, ${Master}. No one here seems to know that rape is wrong. Th-they just r-rape me."`));
+			} else if (eventSlave.sexualFlaw === "shamefast") {
+				r.push(Spoken(eventSlave, `"I want to cover myself so badly, ${Master}. I'm so embarrassed all the time. I'm so tired of being embarrassed."`));
+			} else if ((eventSlave.sexualFlaw === "repressed") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) {
+				r.push(Spoken(eventSlave, `"I'm filthy, ${Master}. I've been used, and I can't ever be clean again. I'm a d-dirty, sinful whore."`));
+			} else {
+				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I was just r-remembering, b-before — all this."`));
+			}
+			r.push(`You tell ${him} kindly that you understand, and that ${he}'ll be trained to address this. Then, you turn and go. ${He}'s mystified; though ${he}'s not overjoyed by the promise of correction, ${he} finds ${himself} <span class="devotion inc">less resistant</span> to following your plans.`);
+			eventSlave.devotion += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function out() {
+			let r = [];
+			r.push(`Eventually ${he} finishes and switches the shower to dry. The airflow dries ${him} and ${he} steps out, but as ${he} does, ${he}'s seized and flung over the countertop with a slap as ${his} naked, ${eventSlave.skin}`);
+			if (eventSlave.belly >= 5000) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			} else {
+				r.push(`skin`);
+			}
+			r.push(`hits the surface.`);
+			const yourself = V.PC.dick === 0 ? `your vibrating strap-on` : `yourself`;
+			if (eventSlave.vagina > -1 && !canDoVaginal(eventSlave)) {
+				r.push(`With ${his} chastity belt protecting ${his} pussy, you ram ${yourself} up ${his} ass instead, drawing a pained sob.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`You ram ${yourself} up ${his} ass, drawing a pained sob.`);
+			} else if (!canDoAnal(eventSlave)) {
+				r.push(`You ram mercilessly into ${his} cunt, forcing a few gasps out of ${him} before it sinks in that this is happening.`);
+			} else {
+				r.push(`You take ${his} silly cunt just long enough to force a few gasps out of ${him} before you pull out and ram ${yourself} up ${his} ass, drawing a pained sob.`);
+			}
+			r.push(`As ${he} takes the pounding sullenly,`);
+			if (canSee(eventSlave)) {
+				r.push(`${he} has a direct view of ${his} own eyes in the mirror, and clearly <span class="trust dec">is disturbed by what ${he} sees.</span>`);
+			} else if (canHear(eventSlave)) {
+				r.push(`${he} can hear nothing but the sound of ${his} brutal rape, and clearly <span class="trust dec">is disturbed by what ${he} hears.</span>`);
+			} else {
+				r.push(`${his} blindness and deafness mean that one of the few things ${he} can feel is ${his} own rape, which <span class="trust dec">disturbs ${him} to no end.</span>`);
+			}
+			eventSlave.trust -= 5;
+			r.push(VCheck.Both(eventSlave, 1));
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/restrictedProfession.js b/src/events/RESS/review/restrictedProfession.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fe3ab81606827086436afaf968347d44e4a51f8
--- /dev/null
+++ b/src/events/RESS/review/restrictedProfession.js
@@ -0,0 +1,182 @@
+App.Events.RESSRestrictedProfession = class RESSRestrictedProfession 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 => s.assignment !== Job.QUARTER,
+				s => s.rules.speech === "restrictive",
+				s => s.devotion > 60,
+				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
+		} = 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");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`is`
+		);
+		if (!hasAnyLegs(eventSlave)) {
+			r.push(`sitting`);
+			if (hasAnyArms(eventSlave)) {
+				r.push(`helplessly`);
+			} else {
+				r.push(`limblessly`);
+			}
+		} else if (!canWalk(eventSlave)) {
+			r.push(`kneeling`);
+		} else {
+			r.push(`standing`);
+		}
+		r.push(`before your desk for ${his} regular inspection. ${He} is studiously observing the letter of the rule against speaking, and is doing ${his} best to make your inspection as efficient as possible. ${His} desire to please radiates off ${him} in almost palpable waves. ${He} obviously wants to communicate something to you, but can't do it without breaking the rules.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Let ${him} speak briefly if ${he}'s very quiet`, briefly),
+			new App.Events.Result(`Make ${him} say it in public`, make),
+			new App.Events.Result(`Keep ${him} quiet but spend some time with ${him}`, quiet),
+		]);
+
+		function briefly() {
+			r = [];
+			r.push(`You stand up from your desk and approach ${him} very closely without touching ${him}. Looking straight`);
+			if (hasAnyEyes(eventSlave)) {
+				r.push(`into ${his} ${hasBothEyes(eventSlave) ? "eyes" : "eye"},`);
+				r.push(`which are`);
+				if (canSee(eventSlave)) {
+					r.push(`fixed helplessly on you,`);
+				} else {
+					r.push(`gazing in your general direction,`);
+				}
+			} else {
+				r.push(`at ${him},`);
+			}
+			r.push(`you tell ${him} that you'll let ${him} say whatever it is ${he} needs to say to you, but only if ${he}'s very quiet. ${He}`);
+			if (canSee(eventSlave)) {
+				r.push(`looks at you with huge eyes but`);
+			}
+			r.push(`nods vigorously. ${He} waits until you lean into ${him}, making ${him} shiver at your proximity, before putting ${his}`);
+			if (eventSlave.lips > 70) {
+				r.push(`ridiculous`);
+			} else if (eventSlave.lips > 40) {
+				r.push(`enormous`);
+			} else if (eventSlave.lips > 20) {
+				r.push(`pillowlike`);
+			} else {
+				r.push(`girlish`);
+			}
+			r.push(`lips next to your ear and whispering nervously, "I love you, ${Master}." ${He} recoils a little as if burned by the audacity of ${his} words, but only manages to back off a little before you gather ${his}`);
+			if (isAmputee(eventSlave)) {
+				r.push(`limbless`);
+			} else if (eventSlave.bellyPreg >= 1500) {
+				r.push(`gravid`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(belly);
+			} else {
+				r.push(`rocking`);
+			}
+			r.push(`torso into your arms, holding the back of ${his} head with one hand and rubbing ${his} quivering back with the other. Eventually, ${he} relaxes into`);
+			if (PC.boobs >= 300) {
+				if (PC.boobsImplant !== 0) {
+					r.push(`your fake breasts,`);
+				} else {
+					r.push(`your soft chest,`);
+				}
+			} else {
+				r.push(`you,`);
+			}
+			r.push(`knowing that ${his} ${getWrittenTitle(eventSlave)} can never and will never reciprocate, but <span class="devotion inc">accepting</span> that the loving physical contact is a tremendously kind gesture for a master to make.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function make() {
+			r = [];
+			r.push(`Since you suspect you know what it is ${he} wants to say, you`);
+			if (!hasAnyLegs(eventSlave)) {
+				r.push(`carry ${him} out`);
+			} else if (hasAnyArms(eventSlave)) {
+				r.push(`lead ${him} by the hand`);
+			} else {
+				r.push(`have ${him} follow you`);
+			}
+			r.push(`onto the club, busy with citizens. You tell ${him} quietly that ${he}'s to shout whatever it is ${he} wanted to say, if it's something everyone should hear; otherwise ${he}'s to keep it to ${himself}. ${He}`);
+			if (canSee(eventSlave)) {
+				r.push(`looks around`);
+			} else if (canHear(eventSlave)) {
+				r.push(`listens`);
+			} else {
+				r.push(`opens ${his} mouth`);
+			}
+			r.push(`nervously, ${his} ${eventSlave.skin} skin betraying a growing blush, before clearing ${his} throat twice, licking ${his} lips, and howling "I LOVE MY ${Master.toUpperCase()}" at the tops of ${his} lungs. When this is out of ${him} ${he} collapses a little, as though the pressure of holding it inside were propping ${him} up. This attracted a considerable amount of attention, almost all of it <span class="reputation inc">positive,</span> with many passersby laughing at the fun, and your fellow slaveowners giving you discreet winks and quiet congratulations.`);
+			repX(750, "event", eventSlave);
+			return r;
+		}
+
+		function quiet() {
+			r = [];
+			r.push(`You announce that you're finished with business for the day, and feel like some quiet time. ${He} cannot keep`);
+			if (canSee(eventSlave)) {
+				r.push(`a gleam of humor out of ${his} eye`);
+			} else {
+				r.push(`the corners of ${his} lips from rising slightly`);
+			}
+			r.push(`at`);
+			if (canHear(eventSlave)) {
+				r.push(`hearing`);
+			} else {
+				r.push(`the phrase`);
+			}
+			r.push(`'quiet time,' and ${he}`);
+			if (!hasAnyLegs(eventSlave)) {
+				r.push(`presents ${himself} to be carried`);
+			} else {
+				r.push(`follows you`);
+			}
+			r.push(`happily enough. When ${he}`);
+			if (canSee(eventSlave)) {
+				r.push(`sees`);
+			} else {
+				r.push(`realizes`);
+			}
+			r.push(`you're headed to your bedroom ${he} begins to anticipate ${his} ${getWrittenTitle(eventSlave)}'s`);
+			if (PC.dick === 0) {
+				r.push(`strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`but is surprised to find that instead of using ${him} you simply`);
+			if (isAmputee(eventSlave)) {
+				r.push(`place ${him} in bed and curl up around ${his} limbless torso.`);
+			} else if (eventSlave.bellyPreg >= 5000) {
+				r.push(`help ${him} into bed and curl up with ${him}, your arms encircling ${his} prominent baby bump.`);
+			} else if (eventSlave.belly >= 5000) {
+				r.push(`help ${him} into bed and curl up with ${him}, your arms encircling ${his} ${belly} dome of a middle.`);
+			} else {
+				r.push(`climb into bed and pull ${him} under the sheets with you.`);
+			}
+			r.push(`${He}'s almost disappointed, but after looking into your resting face for a while, nestles ${his} head onto your broad chest and goes to sleep with a <span class="devotion inc">look of contentment</span> on ${his} face. When the two of you wake from your brief nap, you ask ${him} if ${he} has anything else to communicate to you. ${He} smiles sleepily and shakes ${his} head no.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/servantMaid.js b/src/events/RESS/review/servantMaid.js
index 30905cc0f19c77becf9872278e63a7b983905346..482d2cb3cec9e80af8fb382216266142551ec6e0 100644
--- a/src/events/RESS/review/servantMaid.js
+++ b/src/events/RESS/review/servantMaid.js
@@ -63,7 +63,7 @@ App.Events.RESSServantMaid = class RESSServantMaid extends App.Events.BaseEvent
 					r.push(`${His} pussy is visibly soaked, ironically staining the flimsy skirt of ${his} uniform as ${he} cleans your office.`);
 				}
 			}
-		} else if ((eventSlave.clothes === "a nice maid outfit")) {
+		} else if (eventSlave.clothes === "a nice maid outfit") {
 			r.push(`${His} maid uniform is fairly demure for a sex slave and makes some effort to conceal ${his} form from prying eyes, even whilst presenting an image of servitude and obedience that a classic maids' ensemble embodies so well. ${His} dress is fairly conservative, enveloping ${his} breasts in intricate lace and cloth. Likewise, ${his} apron is more than ornamental, ${eventSlave.slaveName} having stuffed it with cleaning materials and tools.`);
 			if (getLimbCount(eventSlave, 102) > 2) {
 				r.push(`Although ${his} movements rarely stray from a slight flick of ${his} wrist as ${he} dusts some surface or a gyration of ${his} body as ${he} scrubs the floor clean, ${his} P-Limbs nonetheless produce a steady stream of minute machine noises. They give ${him} the coordination ${he} needs to purge even the smallest of stains, but the multitude of gyros, servos, and other mechanical pieces constantly working to maintain it ensure that the process is far from silent.`);
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..0aefeaa4363dd481cbb0839af81278b5e4fd56a8
--- /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, balls-less 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.isBetween(0, 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/RESS/review/sleepingAmbivalent.js b/src/events/RESS/review/sleepingAmbivalent.js
new file mode 100644
index 0000000000000000000000000000000000000000..b1a81c27f41cdc0e577b24633e87adcd63193f34
--- /dev/null
+++ b/src/events/RESS/review/sleepingAmbivalent.js
@@ -0,0 +1,390 @@
+App.Events.RESSSleepingAmbivalent = class RESSSleepingAmbivalent 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.devotion <= 20,
+				s => s.devotion > -10,
+				s => s.assignment !== Job.QUARTER,
+				s => s.rules.living === "spare",
+			]
+		];
+	}
+
+	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 {womanP} = getPronouns(V.PC).appendSuffix("P");
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		App.Events.addParagraph(node, [
+			`Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex.`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+			`catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. ${He} probably went to sleep with ${his} sheet pulled up to ${his} chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but ${he}'s shrugged it down. Half ${his} torso is bare.`
+		]);
+		let r = [];
+		r.push(`The dim blue light plays across ${his} ${eventSlave.skin} skin.`);
+		if (eventSlave.boobs > 2000) {
+			r.push(`${His} massive boob on that side is slightly shifted by each breath.`);
+		} else if (eventSlave.boobs > 800) {
+			r.push(`${His} breast on that side rises and falls with each breath.`);
+		} else {
+			r.push(`That side of ${his} chest rises and falls with each breath.`);
+		}
+		if (eventSlave.belly >= 5000) {
+			r.push(`${His} ${belly}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			}
+			r.push(`belly is only partially covered by the sheet, leaving most of it visible.`);
+		}
+		r.push(`${He}'s sleeping soundly, ${his} breaths coming deep and slow. Most slaves where ${he} is mentally are troubled by bad dreams, but the poor ${girl} is evidently too tired for that.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Grope ${his} boob`, grope),
+			(eventSlave.belly >= 5000 || eventSlave.weight > 30)
+				? new App.Events.Result(`Rub ${his} belly`, rub)
+				: new App.Events.Result(),
+			(V.PC.dick !== 0)
+				? new App.Events.Result(`Cum on ${his} face`, cum)
+				: new App.Events.Result(`Squirt on ${his} face`, squirt),
+			new App.Events.Result(`Just watch ${him} for a little while`, watch),
+		]);
+
+		function grope() {
+			r = [];
+			r.push(`${His} eyes fly open as ${he} feels someone groping ${him}.`);
+			if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
+				r.push(`You're mauling ${his} fake boob, squeezing it and making the skin of ${his} breast, which is already stretched rather taut by the implant, stretch a bit farther.`);
+			} else if (eventSlave.boobs > 3000) {
+				r.push(`You're hefting and massaging ${his} mass of breastflesh, playing with ${his}`);
+				if ((eventSlave.boobsImplant/eventSlave.boobs) < .60) {
+					r.push(`mostly`);
+				}
+				r.push(`natural boob, making ${his} huge soft udder bounce and jiggle.`);
+			} else if (eventSlave.lactation > 0) {
+				r.push(`You're kneading and massaging ${his} udder, and the milk begins to`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`bead at`);
+				} else {
+					r.push(`leak from`);
+				}
+				r.push(`the cow's nipple.`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`You've got ${his} whole tit in your hands, jiggling and squeezing the entire thing.`);
+			} else {
+				r.push(`You're massaging and squeezing ${his} flat chest.`);
+			}
+			r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
+			if (!canSee(eventSlave)) {
+				r.push(`recognizes your familiar`);
+				if (canSmell(eventSlave)) {
+					r.push(`smell`);
+				} else {
+					r.push(`touch`);
+				}
+				r.push(`and`);
+			}
+			r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
+			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+				r.push(`Though ${he}'s smart,`);
+			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+				r.push(`Though ${he}'s not dumb,`);
+			} else {
+				r.push(`${He}'s an idiot, and`);
+			}
+			r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
+			switch (eventSlave.nipples) {
+				case "inverted":
+					r.push(`painfully protruding ${his} fully inverted nipple. ${He} puts up with even that, though ${he} cries a little as it pops out.`);
+					break;
+				case "partially inverted":
+					r.push(`painfully protruding ${his} partially inverted nipple. ${He} puts up with that, too, though ${he} winces as it pops out.`);
+					break;
+				case "huge":
+					r.push(`rolling ${his} huge nipple between a thumb and forefinger, hard enough to hurt. ${He} accepts the mammary abuse.`);
+					break;
+				case "fuckable":
+					r.push(`forcing your entire fist into ${his} nipple. ${He} accepts the stimulation as best ${he} can.`);
+					break;
+				default:
+					r.push(`playing with ${his} nipple, pinching it hard enough to hurt. ${He} accepts the mammary abuse.`);
+			}
+			r.push(`Satisfied, you leave ${him} to get back to sleep as best ${he} can.`);
+			eventSlave.devotion += 4;
+			if (eventSlave.lactation > 0) {
+				eventSlave.lactationDuration = 2;
+				eventSlave.boobs -= eventSlave.boobsMilk;
+				eventSlave.boobsMilk = 0;
+			}
+			return r;
+		}
+
+		function rub() {
+			r = [];
+			if (eventSlave.bellyPreg >= 5000) {
+				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, life-rounded, stomach.`);
+				if (eventSlave.weight > 10) {
+					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
+				} else if (eventSlave.muscles > 5) {
+					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
+				} else {
+					r.push(`You're massaging and teasing ${his} taut belly.`);
+				}
+				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
+				if (!canSee(eventSlave)) {
+					r.push(`recognizes your familiar`);
+					if (canSmell(eventSlave)) {
+						r.push(`smell`);
+					} else {
+						r.push(`touch`);
+					}
+					r.push(`and`);
+				}
+				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+					r.push(`Though ${he}'s smart,`);
+				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+					r.push(`Though ${he}'s not dumb,`);
+				} else {
+					r.push(`${He}'s an idiot, and`);
+				}
+				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
+				if (eventSlave.weight > 10) {
+					r.push(`sinking your hands into ${his} fat to get a good feel of the life growing within.`);
+				} else {
+					r.push(`feeling for the life growing within ${him}.`);
+				}
+				if (eventSlave.weight > 30) {
+					r.push(`Though it takes some groping before you are met with a kick from ${his} unborn child.`);
+				} else if (eventSlave.pregType < 3) {
+					r.push(`It doesn't take long before you are met with a kick from ${his} unborn child.`);
+				} else {
+					r.push(`${He} is so full of children that your ministrations are met with a hail of motion.`);
+				}
+				if (eventSlave.pregSource === -1) {
+					r.push(`Smiling at how active your children are,`);
+				} else {
+					r.push(`Satisfied,`);
+				}
+			} else if (eventSlave.bellyImplant >= 5000) {
+				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly} stomach.`);
+				if (eventSlave.weight > 10) {
+					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
+				} else if (eventSlave.muscles > 5) {
+					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
+				} else {
+					r.push(`You're massaging and teasing ${his} taut belly.`);
+				}
+				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
+				if (!canSee(eventSlave)) {
+					r.push(`recognizes your familiar`);
+					if (canSmell(eventSlave)) {
+						r.push(`smell`);
+					} else {
+						r.push(`touch`);
+					}
+					r.push(`and`);
+				}
+				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+					r.push(`Though ${he}'s smart,`);
+				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+					r.push(`Though ${he}'s not dumb,`);
+				} else {
+					r.push(`${He}'s an idiot, and`);
+				}
+				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
+				if (eventSlave.weight > 10) {
+					r.push(`sinking your hands into ${his} fat to get a good feel of the implant hidden within.`);
+				} else {
+					r.push(`feeling up the implant within ${him}.`);
+				}
+				if (eventSlave.weight > 30) {
+					r.push(`Though it takes some groping before you locate the firm sphere.`);
+				} else if (eventSlave.belly < 10000) {
+					r.push(`It doesn't take long for you to have a solid grip on the firm sphere.`);
+				} else {
+					r.push(`It's so huge it's hard to miss, but that just gives you more room to poke and prod at.`);
+				}
+				r.push(`Satisfied,`);
+			} else if (eventSlave.bellyFluid >= 5000) {
+				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, ${eventSlave.inflationType}-filled stomach.`);
+				if (eventSlave.weight > 10) {
+					r.push(`You're massaging and jiggling ${his} huge, soft belly, enjoying the sounds it makes as you move it.`);
+				} else if (eventSlave.muscles > 5) {
+					r.push(`You're massaging and jiggling ${his} taut belly and stretched abs, enjoying the sounds it makes as you move it.`);
+				} else {
+					r.push(`You're massaging and jiggling ${his} taut belly, enjoying the sounds it makes as you move it.`);
+				}
+				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
+				if (!canSee(eventSlave)) {
+					r.push(`recognizes your familiar`);
+					if (canSmell(eventSlave)) {
+						r.push(`smell`);
+					} else {
+						r.push(`touch`);
+					}
+					r.push(`and`);
+				}
+				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+					r.push(`Though ${he}'s smart,`);
+				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+					r.push(`Though ${he}'s not dumb,`);
+				} else {
+					r.push(`${He}'s an idiot, and`);
+				}
+				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
+				if (eventSlave.weight > 10) {
+					r.push(`sinking your hands into ${his} fat to get a good grip`);
+				} else {
+					r.push(`wrapping your hands around the sloshing globe`);
+				}
+				r.push(`and vigorously shaking. As ${his} gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause ${his} discomfort and not to disgorge ${his} contents. Satisfied,`);
+			} else {
+				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his}`);
+				if (eventSlave.weight > 190) {
+					r.push(`expansive belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and struggling to find ${his} belly button.`);
+				} else if (eventSlave.weight > 160) {
+					r.push(`massive, soft belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and hidden belly button.`);
+				} else if (eventSlave.weight > 130) {
+					r.push(`huge, soft belly. You're massaging and jiggling ${his} thick gut while teasing ${his} folds and hidden belly button.`);
+				} else if (eventSlave.weight > 95) {
+					r.push(`big soft belly. You're massaging and jiggling ${his} gut while teasing ${his} folds and hidden belly button.`);
+				} else {
+					r.push(`chubby middle. You're massaging and jiggling ${his} tiny gut.`);
+				}
+				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
+				if (!canSee(eventSlave)) {
+					r.push(`recognizes your familiar`);
+					if (canSmell(eventSlave)) {
+						r.push(`smell`);
+					} else {
+						r.push(`touch`);
+					}
+					r.push(`and`);
+				}
+				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+					r.push(`Though ${he}'s smart,`);
+				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+					r.push(`Though ${he}'s not dumb,`);
+				} else {
+					r.push(`${He}'s an idiot, and`);
+				}
+				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by roughly kneading ${his} pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied,`);
+			}
+			r.push(`you leave ${him} to get back to sleep as best ${he} can.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function cum() {
+			r = [];
+			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks ${womanP}, and you don't feel the need to bend over ${him} to score good hits. Your load comes in three main jets: the first hits ${him} on the nipple, the second tracks up ${his} sternum and throat, and the third splashes full across ${his} face as ${his} eyes fly open`);
+			if (V.PC.vagina !== -1) {
+				r.push(r.pop() + `, each of these accompanied by some less directionally perfect girlcum`);
+			}
+			r.push(r.pop() + `. ${He} sputters with surprise and then outrage, but`);
+			if (!canSee(eventSlave)) {
+				r.push(`once ${he} recognizes your`);
+				if (canTaste(eventSlave)) {
+					r.push(`taste`);
+				} else {
+					r.push(`presence`);
+				}
+				r.push(`and`);
+			} else {
+				r.push(`then ${he}`);
+			}
+			r.push(`realizes who it is standing over ${him}`);
+			if (canSee(eventSlave)) {
+				r.push(`and`);
+			} else {
+				r.push(`does ${he}`);
+			}
+			r.push(`<span class="trust dec">freezes in terror.</span>`);
+			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+				r.push(`${He}'s quick, and ${he} immediately realizes`);
+			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
+			} else {
+				r.push(`${He} gradually manages to calculate`);
+			}
+			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
+			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+				r.push(`lisps`);
+			} else {
+				r.push(`mumbles`);
+			}
+			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your cum.`);
+			eventSlave.devotion += 4;
+			eventSlave.trust -= 2;
+			return r;
+		}
+
+		function squirt() {
+			r = [];
+			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle ${his} face without touching ${him}, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto ${his} face and down across ${his} chest. ${He} sputters with surprise and then outrage, but then ${he}`);
+			if (canSee(eventSlave)) {
+				r.push(`realizes whose pussy ${he}'s staring straight into`);
+			} else {
+				r.push(`recognizes your`);
+				if (canTaste(eventSlave)) {
+					r.push(`flavor`);
+				} else {
+					r.push(`presence`);
+				}
+			}
+			r.push(`and <span class="trust dec">freezes in terror.</span>`);
+			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
+				r.push(`${He}'s quick, and ${he} immediately realizes`);
+			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
+				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
+			} else {
+				r.push(`${He} gradually manages to calculate`);
+			}
+			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
+			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+				r.push(`lisps`);
+			} else {
+				r.push(`mumbles`);
+			}
+			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your pussyjuice.`);
+			eventSlave.devotion += 4;
+			eventSlave.trust -= 2;
+			return r;
+		}
+
+		function watch() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of ${his} slumbering little movements hold your attention for a time.`);
+			if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
+				r.push(`You watch the subtle movements going on within ${his} womb as well.`);
+			}
+			r.push(`After a while, you head to your own bed. Several of ${his} fellow slaves came and went as you watched ${him}, but if they're surprised by the sight, they have the presence of mind not to show it.`);
+			App.Events.addParagraph(frag, r);
+			App.Events.addParagraph(frag, [`One of them quietly lets ${him} know about the incident the next day, though, and the overall impact on ${his} mental state is surprisingly positive. In a more normal human setting, the news that someone watched ${him} sleep last night without ${his} consent or even knowledge at the time would disturb ${him} greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, ${he}'s obviously thinking, but <span class="mediumaquamarine">perhaps you won't rape ${him} while ${he} sleeps.</span>`]);
+			eventSlave.trust += 4;
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/soreAss.js b/src/events/RESS/review/soreAss.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f3932a1be7407ad514bfc96af7a3f4307ca94e5
--- /dev/null
+++ b/src/events/RESS/review/soreAss.js
@@ -0,0 +1,118 @@
+App.Events.RESSSoreAss = class RESSSoreAss extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.devotion <= 50,
+				s => s.minorInjury === "sore ass",
+			]
+		];
+	}
+
+	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(
+			`One night, you see`,
+			contextualIntro(V.PC, eventSlave, "DOM")
+		);
+
+		if (!hasAnyLegs(eventSlave)) {
+			r.push(`scooting ${himself} from side to side uncomfortably,`);
+		} else if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
+			r.push(`crawling gingerly,`);
+		} else if (shoeHeelCategory(eventSlave) > 1) {
+			r.push(`tottering along painfully,`);
+		} else {
+			r.push(`walking a little funny,`);
+		}
+		r.push(`as though ${he} has a sore butt. You call ${him} over to inspect ${his} backdoor to see if ${he} needs care,`);
+		if (!hasAnyLegs(eventSlave)) {
+			r.push(`and set ${his} helpless body down, spreading ${his} buttocks to examine ${his} anus.`);
+		} else {
+			r.push(`and order ${him} to spread ${his} buttocks for you so you can examine ${his} anus.`);
+		}
+		r.push(`${His} asshole is fine, just a little sore from hard buttfucks. ${He} complies with you, but as you probe ${him} gently with a finger,`);
+		if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) {
+			r.push(`${he} wriggles desperately and turns to mouth "it hurts ${getWrittenTitle(eventSlave)} please don't assrape me" at you.`);
+		} else if (!canTalk(eventSlave)) {
+			r.push(`${he} gestures desperately, telling you ${his} butt hurts and asking you not to assfuck ${him}.`);
+		} else {
+			r.push(
+				`${he} bursts out,`,
+				Spoken(eventSlave, `"${Master}, my butt is so sore! Please don't use my ass, ${Master}. Please."`)
+			);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Punish ${his} ass for insolence`, punish),
+			new App.Events.Result(`Give ${him} some care`, care),
+		]);
+
+		function punish() {
+			r = [];
+			r.push(`You inform ${him} sternly that you will ensure that ${he} is not permanently damaged, and that otherwise, ${he} is to take anal pain like a good buttslave. ${He} starts to beg and whine as you lean back in your chair and`);
+			if (V.PC.dick === 0) {
+				r.push(`hold ${him} upside down on your chest so ${he} can lick your pussy while you use a dildo on ${his} ass.`);
+			} else {
+				r.push(`set ${him} on your chest before reaching around to line your cock up with ${his} sore hole. ${He} shudders and writhes when you start pushing yourself inside.`);
+			}
+			r.push(`You use hard pinches to ${his} nipples to punish ${his} whining, forcing ${him} to take a long, painful buttfuck in silence. <span class="gold">${He} has become more afraid of you.</span>`);
+			if (eventSlave.anus < 3) {
+				r.push(`${His} week of tough anal experience has <span class="lime">permanently loosened ${his} anus.</span>`);
+				eventSlave.anus += 1;
+			}
+			eventSlave.trust -= 5;
+			r.push(VCheck.Anal(eventSlave, 1));
+			return r;
+		}
+
+		function care() {
+			r = [];
+			r.push(`${He}'s filled with anxiety as you`);
+			if (eventSlave.belly < 1500) {
+				r.push(`lay ${him} face-down on your desk,`);
+			} else {
+				r.push(`direct ${him} to lay on ${his} side on your desk`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`with ${his} ${belly} belly hanging over the edge`);
+				}
+				r.push(r.pop() + `,`);
+			}
+			r.push(`but is surprised and reassured when ${he}'s penetrated not by a`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`turgid`);
+				if (V.PC.vagina !== -1) {
+					r.push(`futa`);
+				}
+				r.push(`cock`);
+			}
+			r.push(`but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get ${his} butt back into fucking shape. <span class="trust inc">${He} has become more accepting of anal slavery,</span> and <span class="health inc">${his} asshole feels better.</span>`);
+			if (eventSlave.anus > 2) {
+				r.push(`Your expert care has <span class="orange">allowed ${his} loose asspussy to recover a little of its natural shape and size.</span>`);
+				eventSlave.anus -= 1;
+			}
+			eventSlave.trust += 4;
+			eventSlave.minorInjury = 0;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/trustingHG.js b/src/events/RESS/review/trustingHG.js
new file mode 100644
index 0000000000000000000000000000000000000000..f21b3148bce8e0dad01ec0775706aa9d7d6b6f4f
--- /dev/null
+++ b/src/events/RESS/review/trustingHG.js
@@ -0,0 +1,356 @@
+App.Events.RESSTrustingHG = class RESSTrustingHG 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.trust > 50,
+				s => s.assignment === Job.HEADGIRL, // removed condition V.HeadgirlID !== 0 and eventSlave.ID === V.HeadgirlID during conversion
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, girl, hers
+		} = 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");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`is a busy ${girl}. Your Head Girl is heading for bed, but ${he}'s not done with the day's work just yet. ${He} walks into your office with a pensive look on ${his} face, using a tablet to fiddle with slaves' schedules for tomorrow. Since ${he} was about to retire, ${he}'s nude: you can't help but notice, in the dimmed light of nighttime in your penthouse, the way the low glow of the tablet`
+		);
+		if (eventSlave.boobs > 5000) {
+			r.push(`falls across the tops of ${his} absurd boobs, since ${he}'s forced to hold it on top of them to use it.`);
+		} else if (eventSlave.belly >= 10000) {
+			r.push(`falls across the top of ${his} ${belly}, tautly `);
+			if (eventSlave.belly >= 3000) {
+				r.push(`pregnant`);
+			} else {
+				r.push(`swollen`);
+			}
+			r.push(` belly.`);
+		} else if (!(eventSlave.chastityPenis) && canAchieveErection(eventSlave)) {
+			if (eventSlave.dick > 4) {
+				r.push(`makes ${his} perpetual, formidable erection cast a shadow.`);
+			} else if (eventSlave.dick > 2) {
+				r.push(`catches the head of ${his} stiffly erect dick.`);
+			} else {
+				r.push(`highlights ${his} stiff little girldick.`);
+			}
+		} else if (eventSlave.nipples === "huge") {
+			r.push(`throws a shadow off each of ${his} massive nipples and down the lower halves of ${his} boobs.`);
+		} else if (eventSlave.belly >= 1500) {
+			r.push(`makes ${his} rounded middle cast a shadow.`);
+		} else if (eventSlave.muscles > 95) {
+			r.push(`gives extra definition to ${his} glorious muscles.`);
+		} else if (eventSlave.weight > 95) {
+			r.push(`highlights ${his} soft belly.`);
+		} else if (eventSlave.dick > 0) {
+			r.push(`rests on the base of ${his} soft cock.`);
+		} else if (eventSlave.weight > 10) {
+			r.push(`flatters ${his} soft body.`);
+		} else {
+			r.push(`flatters ${him}.`);
+		}
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		r.push(
+			`${He} did not expect to find you here, and is so preoccupied that ${he} doesn't notice you right away. When ${he} does, ${he} smiles.`,
+			Spoken(eventSlave, `"Good evening,`)
+		);
+		if (V.HGFormality === 1) {
+			r.push(Spoken(eventSlave, `${Master},"`));
+			r.push(`${he} murmurs properly, and keeps working. Only a slight blush, barely detectable in the low light, betrays ${his} consternation at not greeting you immediately.`);
+		} else if (eventSlave.trust > 95) {
+			if (PC.customTitle) {
+				if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+					r.push(`${PC.customTitleLisp},"`);
+				} else {
+					r.push(`${PC.customTitle},"`);
+				}
+			} else if (PC.title !== 0) {
+				r.push(Spoken(eventSlave, `Sir,"`));
+			} else {
+				r.push(Spoken(eventSlave, `Ma'am,"`));
+			}
+			r.push(`${he} murmurs. Even in the dim light, you perceive a slight blush of pleasure from ${him} as ${he} savors the status of being allowed to call you that. ${He} goes back to working with a little smile still playing across ${his} lips.`);
+		} else {
+			r.push(`um,`);
+			if (PC.customTitle) {
+				if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+					r.push(`${PC.customTitleLisp},"`);
+				} else {
+					r.push(`${PC.customTitle},"`);
+				}
+			} else if (PC.title !== 0) {
+				r.push(Spoken(eventSlave, `S-sir,"`));
+			} else {
+				r.push(`M-ma'am,"`);
+			}
+			r.push(`${he} stammers hesitantly. ${He} isn't comfortable with your permission to be less formal in private, and blushes furiously at ${his} awkwardness. ${He} takes refuge in ${his} tablet.`);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Commend ${his} service`, commend),
+			new App.Events.Result(`Share some refreshments with ${him}`, share),
+		]);
+
+		function commend() {
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You clear your throat and compliment ${him}, commending ${his} work ethic, trustworthiness, and loyalty. ${He} blushes much harder as ${he} understands. "Thank you,`);
+			if (V.HGFormality === 1) {
+				r.push(`${Master}!"`);
+			} else {
+				if (PC.customTitle) {
+					if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+						r.push(`${PC.customTitleLisp}!"`);
+					} else {
+						r.push(`${PC.customTitle}!"`);
+					}
+				} else if (PC.title !== 0) {
+					r.push(Spoken(eventSlave, `Sir!"`));
+				} else {
+					r.push(Spoken(eventSlave, `Ma'am!"`));
+				}
+			}
+			r.push(
+				`${he} says fervently, and gestures at the tablet.`,
+				Spoken(eventSlave, `"I've noticed a couple of the slaves working better together recently, so I'm making some minor adjustments to give them more shifts together."`)
+			);
+			App.Events.addParagraph(frag, r);
+
+			r = [];
+			r.push(`You're sure ${he}'ll do ${his} best, and you tell ${him} so. ${He} thanks you again, and you both go back to your work. Though your Head Girl continues manipulating ${his} tablet diligently, ${he} can't seem to stop ${himself} from <span class="hotpink">stealing the occasional glance at you.</span> ${His} ${App.Desc.eyesColor(eventSlave)}, dark in the dimness of the office, seem to have an unaccountable sheen.`);
+			if (V.assistant.personality !== 0) {
+				const {
+					heA, hisA, girlA, himselfA, loliA
+				} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+				r.push(`${capFirstChar(V.assistant.name)}'s ${V.assistant.appearance} avatar appears on your desktop, glowing brightly, and ruins the moment. "${eventSlave.slaveName} loooves ${his} `);
+				if (PC.customTitle) {
+					r.push(`${PC.customTitle},`);
+				} else if (PC.title !== 0) {
+					r.push(`Maaaster,`);
+				} else {
+					r.push(`Miiistress,`);
+				}
+				r.push(`"${heA} taunts,`);
+				switch (V.assistant.appearance) {
+					case "monstergirl":
+						r.push(`${hisA} hair forming a heart shape.`);
+						break;
+					case "shemale":
+						r.push(`using ${hisA} hands to make a heart shape over ${hisA} balls.`);
+						break;
+					case "amazon":
+						r.push(`grinning far more sweetly than ${hisA} muscular form should be able to manage.`);
+						break;
+					case "businesswoman":
+						r.push(`though ${heA}'s blushing ${himselfA}.`);
+						break;
+					case "cherub":
+					case "fairy":
+					case "pregnant fairy":
+						r.push(`flitting around and giggling excitedly.`);
+						break;
+					case "goddess":
+						r.push(`massaging ${hisA} pregnant belly meaningfully.`);
+						break;
+					case "hypergoddess":
+						r.push(`massaging ${hisA} squirming pregnant belly meaningfully.`);
+						break;
+					case "loli":
+						r.push(`giggling playfully.`);
+						break;
+					case "preggololi":
+						r.push(`giggling playfully, though ${hisA} hands have wandered to ${hisA} crotch.`);
+						break;
+					case "angel":
+						r.push(`using ${hisA} hands to make a heart shape.`);
+						break;
+					case "incubus":
+						r.push(`using ${hisA} hands to make a heart shape around ${hisA} erection as ${heA} thrusts.`);
+						break;
+					case "succubus":
+						if (PC.dick !== 0) {
+							r.push(`forms an "O" with ${hisA} lips and makes exaggerated head bobbing motions.`);
+						} else {
+							r.push(`forms a "V" with ${hisA} fingers and wiggles ${hisA} tongue in it.`);
+						}
+						break;
+					case "imp":
+						r.push(`flapping around and cackling manically.`);
+						break;
+					case "witch":
+						r.push(`while holding out a mostly empty vial of love potion.`);
+						break;
+					case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+						r.push(`forming half of ${himselfA} into an enormous pussy, the other into a giant dick, and introducing the two to each other.`);
+						break;
+					case "schoolgirl":
+						r.push(`the very picture of a malicious school${girlA}.`);
+						break;
+					default:
+						r.push(`turning ${hisA} avatar a throbbing pink.`);
+				}
+				App.Events.addParagraph(frag, r);
+				r = [];
+				r.push(
+					`Your Head Girl turns a darker shade of red.`,
+					Spoken(eventSlave, `"Oh, shut up, you little`)
+				);
+				switch (V.assistant.appearance) {
+					case "monstergirl":
+						r.push(Spoken(eventSlave, `monster,"`));
+						break;
+					case "shemale":
+						r.push(Spoken(eventSlave, `cockmonster,"`));
+						break;
+					case "amazon":
+						r.push(Spoken(eventSlave, `dyke,"`));
+						break;
+					case "businesswoman":
+						r.push(Spoken(eventSlave, `witch,"`));
+						break;
+					case "fairy":
+					case "pregnant fairy":
+						r.push(Spoken(eventSlave, `mosquito,"`));
+						break;
+					case "goddess":
+					case "hypergoddess":
+						r.push(Spoken(eventSlave, `cow,"`));
+						break;
+					case "loli":
+						r.push(Spoken(eventSlave, `midget,"`));
+						break;
+					case "preggololi":
+						r.push(Spoken(eventSlave, `slut ${loliA},"`));
+						break;
+					case "angel":
+						r.push(Spoken(eventSlave, `turkey,"`));
+						break;
+					case "cherub":
+						r.push(Spoken(eventSlave, `dove,"`));
+						break;
+					case "incubus":
+						r.push(Spoken(eventSlave, `dick,"`));
+						break;
+					case "succubus":
+						r.push(Spoken(eventSlave, `cunt,"`));
+						break;
+					case "imp":
+						r.push(Spoken(eventSlave, `bat,"`));
+						break;
+					case "witch":
+						r.push(Spoken(eventSlave, `blunderer,"`));
+						break;
+					case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+						r.push(Spoken(eventSlave, `shapeshifter,"`));
+						break;
+					case "schoolgirl":
+						r.push(Spoken(eventSlave, `slut,"`));
+						break;
+					default:
+						r.push(Spoken(eventSlave, `toaster,"`));
+				}
+				r.push(`${he} says cattily, but ${he} smiles as well.`);
+			}
+			eventSlave.devotion += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function share() {
+			let frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You reach into the back of your desk, where your private reserves are, and wordlessly offer ${him} a`);
+			if (PC.refreshmentType === 0) { // TODO: consider making this a global function since it's used in multiple events
+				r.push(`${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 1) {
+				r.push(`glass of ${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 2) {
+				r.push(`plate of ${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 3) {
+				r.push(`line of ${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 4) {
+				r.push(`syringe of ${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 5) {
+				r.push(`pill of ${PC.refreshment}.`);
+			} else if (PC.refreshmentType === 6) {
+				r.push(`tab of ${PC.refreshment}.`);
+			}
+			r.push(`${He} stares at you disbelievingly for a moment before stammering ${his} thanks and accepting it with both hands. ${He} holds it uncertainly, watching you get one yourself.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`${He} is first among your slaves, but ${he} is still very much a slave. ${He} neither receives nor expects`);
+			if (PC.refreshmentType === 0) {
+				r.push(`indulgences like tobacco and other smokables. Carcinogens are sometimes the necessary side effects of slave body modification, not an acceptable downside of luxury.`);
+			} else if (PC.refreshmentType === 1) {
+				r.push(`drink other than what the slave feeding systems provide ${him}. ${He} might be your Head Girl, but the liquid food keeps ${his} libido charged, ${his} body healthy, and ${his} asshole invitingly clean, just like any other slave.`);
+			} else if (PC.refreshmentType === 2) {
+				r.push(`food other than what the slave feeding systems provide ${him}. ${He} might be your Head Girl, but the liquid food keeps ${his} libido charged, ${his} body healthy, and ${his} asshole invitingly clean, just like any other slave.`);
+			} else {
+				r.push(`drugs other than what the drug dispensers provide ${him}. Addictive drugs are rarely provided to slaves, replaced instead with slightly healthier, but no less addictive, aphrodisiacs.`);
+			}
+			r.push(`But it'll do no harm, just this once, and you tell ${him} so. ${He} nods, not wanting to spoil the moment by speaking.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			if (PC.refreshmentType === 0) {
+				r.push(`After you light ${his} ${PC.refreshment} for ${him}, ${he} holds the `);
+				if (canTaste(eventSlave)) {
+					r.push(`first taste`);
+				} else {
+					r.push(`feeling`);
+				}
+				r.push(` of its smoke in ${his} mouth for a long, sensual moment before letting it trickle back out through ${his} lips.`);
+			} else if (PC.refreshmentType === 1 || PC.refreshmentType === 2) {
+				r.push(`${He} holds the `);
+				if (canTaste(eventSlave)) {
+					r.push(`first taste`);
+				} else {
+					r.push(`feeling`);
+				}
+				r.push(` of it in ${his} mouth for a long, sensual moment before swallowing reverently.`);
+			} else {
+				r.push(`${He} savors the thrill of using ${PC.refreshment} for a moment, before turning to you, an almost desperate need on ${his} face.`);
+			}
+			r.push(`You return to work, and ${he} follows your example, though ${he}'s rather distracted. When ${he} finishes ${hers}, ${he} sets ${his} tablet down for a moment and comes over to you, doing ${his} best to show ${his} naked body to its best advantage as ${he} comes. ${He} gives you a deep kiss,`);
+			if (PC.refreshmentType === 0 || PC.refreshmentType === 1 || PC.refreshmentType === 2) {
+				r.push(`which tastes of fine ${PC.refreshment}, with a hint of ${eventSlave.slaveName},`);
+			} else {
+				r.push(`with plenty of tongue,`);
+			}
+			r.push(`and then goes back to work, <span class="mediumaquamarine">smiling unconsciously</span> as ${he} savors the lingering `);
+			if (PC.refreshmentType === 3 || PC.refreshmentType === 4 || PC.refreshmentType === 5 || PC.refreshmentType === 6) {
+				r.push(`rush.`);
+			} else {
+				if (canTaste(eventSlave)) {
+					r.push(`flavor.`);
+				} else {
+					r.push(`sensation.`);
+				}
+			}
+			eventSlave.trust += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/usedWhore.js b/src/events/RESS/review/usedWhore.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b1e4879304f5e198c8f2a016ec6204e01fdfafe
--- /dev/null
+++ b/src/events/RESS/review/usedWhore.js
@@ -0,0 +1,520 @@
+App.Events.RESSUsedWhore = class RESSUsedWhore 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 => [Job.PUBLIC, Job.WHORE].includes(s.assignment),
+				s => s.vagina !== 0,
+				s => s.anus !== 0,
+				canDoAnal,
+				s => s.devotion <= 50,
+			]
+		];
+	}
+
+	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, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`At the end of a long day, you take a moment to watch the comings and goings of your arcology to decompress. While doing so, you notice someone who's clearly had a longer day than you.`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`is`
+		);
+		if (eventSlave.belly >= 5000) {
+			r.push(`slowly waddling, one hand under ${his} ${belly}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			}
+			r.push(`belly and the other on the small of ${his} back,`);
+		} else {
+			r.push(`making`);
+		}
+		r.push(`${his} tired way back to the kitchen for a meal and then bed after a long day of sex work. ${He}'s stripped off ${his} soiled clothes already, and is clearly too tired to care about nudity at all.`);
+		App.Events.addParagraph(node, r);
+
+		r = [];
+		r.push(`${He} comes around the corner and`);
+		if (PC.belly >= 100000) {
+			r.push(`slams into your massively distended belly, nearly knocking you over.`);
+		} else if (PC.belly >= 10000) {
+			r.push(`bumps into your heavily gravid middle.`);
+		} else if (PC.belly >= 5000) {
+			r.push(`bumps into your rounded middle.`);
+		} else if (PC.balls >= 14) {
+			r.push(`nearly knees your prominent testicles.`);
+		} else if (PC.boobs >= 800) {
+			r.push(`runs into your prominent rack.`);
+		} else {
+			r.push(`almost runs into you.`);
+		}
+		r.push(`${He} stops and`);
+		if (canSee(eventSlave)) {
+			r.push(`stares,`);
+		} else {
+			r.push(`faces you,`);
+		}
+		r.push(`struggling to find the appropriate thing to say or do, but too exhausted to manage it. Even though ${he}'s been obediently cleaning ${himself} between fucks, ${he} looks used up. ${His} ${eventSlave.skin} skin is reddened here and there.`);
+		if (eventSlave.belly >= 750000) {
+			r.push(`${His} ${belly} belly is heavily bruised, the super-stretched skin nearly at its limit from the weight put on it and the forces pushing against it.`);
+		} else if (eventSlave.belly >= 600000) {
+			r.push(`${His} ${belly} belly is deep red and heavily bruised; it's clear that at least one client roughly fucked ${him} over it.`);
+		} else if (eventSlave.belly >= 450000) {
+			r.push(`${His} ${belly} belly looks extremely painful, it's obvious ${he} got fucked over it.`);
+		} else if (eventSlave.belly >= 300000) {
+			r.push(`${His} ${belly} belly is black and blue, it's obvious ${he} got fucked over it.`);
+		} else if (eventSlave.belly >= 150000) {
+			r.push(`${His} ${belly} belly is heavily chafed from rubbing the floor as ${he} struggled to keep ${his} weight off it.`);
+		} else if (eventSlave.belly >= 100000) {
+			r.push(`${His} ${belly} belly is heavily chafed from rubbing against the floor.`);
+		} else if (eventSlave.belly >= 10000) {
+			r.push(`The tip of ${his} huge belly is chafed from rubbing against the floor.`);
+		}
+		if (canDoVaginal(eventSlave)) {
+			r.push(`${His}`);
+			if (eventSlave.labia > 1) {
+				r.push(`generous`);
+			} else {
+				r.push(`poor`);
+			}
+			r.push(`pussylips are puffy, and you have no doubt ${his} vagina is quite sore.`);
+		}
+		if (canDoAnal(eventSlave)) {
+			r.push(`The awkward way ${he}'s standing suggests that ${his}`);
+			if (eventSlave.anus > 2) {
+				r.push(`gaping`);
+			} else if (eventSlave.anus > 1) {
+				r.push(`big`);
+			} else {
+				r.push(`tight`);
+			}
+			r.push(`asshole has had more than one dick up it recently.`);
+		}
+		if (eventSlave.nipples !== "fuckable") {
+			r.push(`Even ${his} nipples are pinker than usual, having been cruelly pinched`);
+			if (eventSlave.lactation > 0) {
+				r.push(`and milked`);
+			}
+			r.push(r.pop() + `.`);
+			if (eventSlave.lactation > 0) {
+				eventSlave.lactationDuration = 2;
+				eventSlave.boobs -= eventSlave.boobsMilk;
+				eventSlave.boobsMilk = 0;
+			} else {
+				r.push(induceLactation(eventSlave, 2));
+			}
+		} else {
+			r.push(`Even ${his} nipples show signs of wear, having prolapsed slightly from heavy use.`);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Use ${him} anyway`, anyway),
+			new App.Events.Result(`Manipulate ${him} into asking to suck you off`, manipulate),
+			new App.Events.Result(`Just talk with ${him}`, talk),
+		]);
+
+		function anyway() {
+			r = [];
+			r.push(`You reach out, grab ${his} shoulder, and shove ${him} against the wall.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} manages to use a gesture to beg you not to,`);
+			} else {
+				r.push(
+					`${He} manages to beg,`,
+					Spoken(eventSlave, `"Please no, ${Master}—"`)
+				);
+			}
+			r.push(`before you give ${him} a hard warning slap on the ass to shut ${him} up. ${He}'s quiet, but starts to sob a little when ${he} feels`);
+			if (PC.dick === 0) {
+				r.push(`the head of a strap-on`);
+			} else {
+				r.push(`your cock`);
+			}
+			r.push(`against ${his}`);
+			if (canDoAnal(eventSlave)) {
+				r.push(`anus.`);
+				if (eventSlave.anus > 2) {
+					r.push(`It's gaped before you even touch it, but it's clearly sore enough that ${he} dreads anal anyway.`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`It's been fucked loose, but it's clearly sore enough that ${he} dreads anal anyway.`);
+				} else {
+					r.push(`It's somehow not gaped yet, and ${he} dreads having it stretched yet again.`);
+				}
+				if (eventSlave.height >= 185) {
+					r.push(`${He}'s tall enough that the angle isn't that uncomfortable for ${him}.`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`${He} hikes ${himself} desperately up on ${his} tiptoes to make the angle less uncomfortable for ${him}.`);
+				} else {
+					r.push(`${He} hikes ${himself} desperately up on ${his} tiptoes, but ${he}'s so short the angle is desperately uncomfortable for ${him}.`);
+				}
+				r.push(`${He} decides to try begging one last time, and`);
+				if (canDoVaginal(eventSlave)) {
+					if (!canTalk(eventSlave)) {
+						r.push(`signs to ask you to use ${his} pussy instead`);
+					} else {
+						r.push(
+							`whines,`,
+							Spoken(eventSlave, `"Just use my pussy, please!"`)
+						);
+					}
+				} else {
+					if (!canTalk(eventSlave)) {
+						r.push(`signs to ask you to let ${him} suck you off instead`);
+					} else {
+						r.push(
+							`whines,`,
+							Spoken(eventSlave, `"Let me suck you off, please!"`)
+						);
+					}
+				}
+				r.push(`as you shove`);
+				if (PC.dick === 0) {
+					r.push(`the strap-on`);
+				} else {
+					r.push(`yourself`);
+				}
+				r.push(`up ${his} butt. ${He} reflexively tries to get away into the wall,`);
+				if (eventSlave.belly > 100000) {
+					r.push(`${his} ${belly} belly squashing out to either side.`);
+				} else if (eventSlave.boobs > 2000) {
+					r.push(`${his} enormous boobs squashing out to either side.`);
+				} else if (eventSlave.boobs > 1000) {
+					r.push(`${his} big boobs squashing out to either side.`);
+				} else if (eventSlave.boobs > 300) {
+					r.push(`${his} boobs crashing into it.`);
+				} else {
+					r.push(`${his} sore nipples giving ${him} a jerk as ${he} does.`);
+				}
+				r.push(`After some continued whining through ${his} tears, ${he} gives up and just <span class="trust dec">lets you</span> rape ${his} sore ass.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`pussy lips.`);
+				if (eventSlave.vagina > 2) {
+					r.push(`It's gaped before you even touch it, but it's clearly sore enough that ${he} dreads penetration anyway.`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`It's been fucked loose, but it's clearly been used enough that ${he} dreads penetration anyway.`);
+				} else {
+					r.push(`It's somehow not loose yet, and ${he} dreads having it stretched yet again.`);
+				}
+				if (eventSlave.height >= 185) {
+					r.push(`${He}'s tall enough that the angle isn't that uncomfortable for ${him}.`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`${He} hikes ${himself} desperately up on ${his} tiptoes to make the angle less uncomfortable for ${him}.`);
+				} else {
+					r.push(`${He} hikes ${himself} desperately up on ${his} tiptoes, but ${he}'s so short the angle is desperately uncomfortable for ${him}.`);
+				}
+				r.push(`${He} decides to try begging one last time, and`);
+				if (!canTalk(eventSlave)) {
+					r.push(`signs to ask you to let ${him} suck you off instead`);
+				} else {
+					r.push(
+						`whines,`,
+						Spoken(eventSlave, `"Let me suck you off, please!"`)
+					);
+				}
+				r.push(`as you shove`);
+				if (PC.dick === 0) {
+					r.push(`the strap-on`);
+				} else {
+					r.push(`yourself`);
+				}
+				r.push(`up ${his} cunt. ${He} reflexively tries to get away into the wall,`);
+				if (eventSlave.belly > 100000) {
+					r.push(`${his} ${belly} belly squashing out to either side.`);
+				} else if (eventSlave.boobs > 2000) {
+					r.push(`${his} enormous boobs squashing out to either side.`);
+				} else if (eventSlave.boobs > 1000) {
+					r.push(`${his} big boobs squashing out to either side.`);
+				} else if (eventSlave.boobs > 300) {
+					r.push(`${his} boobs crashing into it.`);
+				} else {
+					r.push(`${his} sore nipples giving ${him} a jerk as ${he} does.`);
+				}
+				r.push(`After some continued whining through ${his} tears, ${he} gives up and just <span class="trust dec">lets you</span> rape ${his} sore vagina.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			r.push(`When you finally`);
+			if (PC.dick !== 0) {
+				r.push(`fill ${his}`);
+				if (canDoAnal(eventSlave)) {
+					r.push(`butt`);
+				} else {
+					r.push(`pussy`);
+				}
+				r.push(`with your ejaculate and pull out,`);
+				if (PC.vagina !== -1) {
+					r.push(`the motion releasing a waft of the combined cum and pussyjuice smell of a satisfied futa,`);
+				}
+			} else {
+				r.push(`shudder with orgasm and withdraw your strap-on,`);
+			}
+			r.push(`${he} slumps and turns to go, looking a bit sad for some reason.`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function manipulate() {
+			r = [];
+			r.push(`You reach out, grab ${his} shoulder, and shove ${him} against the wall.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} manages to use a gesture to beg you not to,`);
+			} else {
+				r.push(
+					`${He} manages to beg,`,
+					Spoken(eventSlave, `"Please no, ${Master}—"`)
+				);
+			}
+			r.push(`before you give ${him} a hard warning slap on the ass to shut ${him} up. ${He}'s quiet, but starts to sob a little when ${he} feels`);
+			if (PC.dick === 0) {
+				r.push(`the head of a strap-on`);
+			} else {
+				r.push(`an invading`);
+				if (PC.vagina !== -1) {
+					r.push(`futa`);
+				}
+				r.push(`cockhead`);
+			}
+			r.push(`against ${his}`);
+			if (canDoAnal(eventSlave)) {
+				r.push(`anus.`);
+				if (eventSlave.anus > 2) {
+					r.push(`It's gaped before you even touch it, but it's clearly sore enough that ${he} dreads anal anyway.`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`It's been fucked loose, but it's clearly sore enough that ${he} dreads anal anyway.`);
+				} else {
+					r.push(`It's somehow not gaped yet, and ${he} dreads having it stretched yet again.`);
+				}
+			} else {
+				r.push(`pussy lips.`);
+				if (eventSlave.vagina > 2) {
+					r.push(`It's gaped before you even touch it, but it's clearly sore enough that ${he} dreads penetration anyway.`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`It's been fucked loose, but it's clearly been used enough that ${he} dreads penetration anyway.`);
+				} else {
+					r.push(`It's somehow not loose yet, and ${he} dreads having it stretched yet again.`);
+				}
+			}
+			r.push(`${He}`);
+			if (!canTalk(eventSlave)) {
+				r.push(`signs let ${him} suck you off instead.`);
+			} else {
+				r.push(
+					`whines,`,
+					Spoken(eventSlave, `"Let me suck you off, please!"`)
+				);
+			}
+			r.push(`Having gotten ${him} to beg for what you wanted all along, you spin ${him} so ${his}`);
+			if (eventSlave.weight > 160) {
+				r.push(`rippling`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`fat`);
+			} else if (eventSlave.muscles > 95) {
+				r.push(`powerful`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`strong`);
+			} else if (eventSlave.muscles > 5) {
+				r.push(`toned`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`back hits the wall with a smack and shove ${him} down it until ${his}`);
+			if (eventSlave.lips > 70) {
+				r.push(`massive`);
+			} else if (eventSlave.lips > 40) {
+				r.push(`pillowlike`);
+			} else if (eventSlave.lips > 20) {
+				r.push(`girlish`);
+			} else if (eventSlave.lips > 10) {
+				r.push(`average`);
+			} else {
+				r.push(`minuscule`);
+			}
+			r.push(`lips are level with your`);
+			if (PC.dick === 0) {
+				r.push(`fake dick,`);
+			} else {
+				r.push(`dick,`);
+			}
+			if (eventSlave.belly >= 100000) {
+				r.push(`straddle ${his} ${belly} belly,`);
+			}
+			r.push(`and push it into ${his} mouth without waiting for ${him} to get ready. ${He} gags, but does ${his} best to work ${his} tired mouth. When you're finally satisfied and you let ${him} up, you aim another slap at ${his}`);
+			if (eventSlave.butt > 12) {
+				r.push(`inhuman ass`);
+			} else if (eventSlave.butt > 5) {
+				r.push(`massive ass`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big butt`);
+			} else if (eventSlave.butt > 0) {
+				r.push(`nice ass`);
+			} else {
+				r.push(`flat ass`);
+			}
+			r.push(`and let ${him} see it coming; ${he} <span class="devotion inc">accepts</span> the spank due to fright at what you might do if ${he} dodged before fleeing.`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return r;
+		}
+
+		function talk() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You take ${him} by the hand, lead ${him} to a nearby couch, and sit down with ${him}, letting ${him} seat ${himself} beside you so ${he} can`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`rest ${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				}
+				r.push(`bulk against you`);
+			} else {
+				r.push(`lean against you`);
+			}
+			r.push(`without putting too much weight on ${his} poor overused butthole. You ask ${him} about ${his} day.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} uses gestures to recount it through ${his} tears. Apparently while one guy was using ${his} anus, another thought it was hot and waited for him to be done before using ${him} in turn, without letting ${him} rest or clean ${himself}. It took four cocks total for another slave to notice and rescue ${him}.`);
+			} else {
+				r.push(
+					`${He} ${say}s, a little tearfully,`,
+					Spoken(eventSlave, `"${Master}, this guy wanted to use my butt in public. So of course I let him, and he made me sit in his lap to do it, and held my ${hasBothLegs(eventSlave) ? `legs` : "leg"} back so everyone could see! And then another guy thought it was hot and waited, and then fucked me in my ass too. Another slave finally noticed and rescued me after four cocks, ${Master}. I'm really sore."`)
+				);
+			}
+			r.push(`${He}`);
+			if (canSee(eventSlave)) {
+				r.push(`looks up at you with big ${App.Desc.eyesColor(eventSlave)}`);
+			} else {
+				r.push(`gazes at you`);
+			}
+			r.push(`for a long moment, a final tear leaking down ${his} ${eventSlave.skin} cheek, before ${he} suddenly`);
+			if (!canTalk(eventSlave)) {
+				r.push(`shakes with mute laughter.`);
+			} else {
+				r.push(`giggles.`);
+			}
+			r.push(`${He} explains ${himself} after a while: it's not what ${he} thought ${he}'d be doing with ${his} life,`);
+			switch (eventSlave.career) {
+				case "a bioreactor":
+				case "a breeder":
+				case "a breeding bull":
+				case "a dairy cow":
+				case "a dairy slave":
+				case "a Fuckdoll":
+				case "a Futanari Sister":
+				case "a slave":
+				case "a slave since birth":
+				case 0:
+					r.push(`once upon a time.`);
+					break;
+				default:
+					r.push(`back when ${he} was ${convertCareer(eventSlave)}.`);
+			}
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} points to ${himself} and uses both hands to mimic sodomy, as though to suggest that's all ${he} is, before giving you a rueful smile.`);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"${eventSlave.slaveName} the butthole ho, that's me,"`),
+					`${he} ${say}s sadly, before giving you a rueful smile.`
+				);
+			}
+			r.push(`${He} kisses you on the cheek and <span class="trust inc">thanks you</span> for listening instead of raping ${him}.`);
+			eventSlave.trust += 4;
+
+			App.Events.addParagraph(frag, r);
+			App.Events.addResponses(frag, [
+				new App.Events.Result(`Kiss ${him} back`, kiss),
+				new App.Events.Result(`Rape ${him}`, rape),
+			]);
+			return frag;
+
+			function kiss() {
+				r = [];
+				r.push(`You turn to kiss ${him} back, on the lips this time. ${He}`);
+				if (canSee(eventSlave)) {
+					r.push(`sees`);
+				} else {
+					r.push(`feels`);
+				}
+				r.push(`your intention and <span class="trust inc">complies trustingly,</span> closing ${his} eyes and tilting ${his} head slightly so your lips lock perfectly.`);
+				if (eventSlave.lips > 70) {
+					r.push(`${His} ridiculous, pillowlike lips part softly.`);
+				} else if (eventSlave.teeth === "pointy") {
+					r.push(`${He} opens ${his} jaw wide, careful to keep ${his} shark's teeth well clear of you.`);
+				} else if (eventSlave.teeth === "fangs") {
+					r.push(`${He} keeps ${his} jaw steady so you may work around ${his} fangs easier.`);
+				} else if (eventSlave.teeth === "fang") {
+					r.push(`You try your best to work around ${his} lone fang.`);
+				}
+				r.push(`After a few seconds, ${he} realizes you aren't planning to break the kiss anytime soon, and softens, ${his}`);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+				r.push(`body relaxing against yours. ${He} scoots closer to you, bringing ${his} legs up under ${him} on the couch cushions so ${he} can face you comfortably. ${He} leans one`);
+				if (eventSlave.weight > 160) {
+					r.push(`extremely well padded`);
+				} else if (eventSlave.weight > 95) {
+					r.push(`well padded`);
+				} else if (eventSlave.muscles > 30) {
+					r.push(`muscular`);
+				} else if (eventSlave.weight > 10) {
+					r.push(`plush`);
+				} else if (eventSlave.hips > -1) {
+					r.push(`pretty`);
+				}
+				r.push(`hip against your leg, hiking ${himself} half onto your lap so ${he} can make out with you without having to sit with any weight on ${his} sore butthole.`);
+				eventSlave.trust += 2;
+				return r;
+			}
+
+			function rape() {
+				r = [];
+				r.push(`But ${he}'s wrong to place that kind of faith in you. As ${he} withdraws from the kiss, you snake a betraying hand between ${his} butt and the couch, and shove`);
+				if (eventSlave.anus <= 1) {
+					r.push(`two rude fingers up ${his} sore little anus.`);
+				} else if (eventSlave.anus === 2) {
+					r.push(`three rude fingers up ${his} sore anus.`);
+				} else {
+					r.push(`all four of your fingers and your thumb, formed into a point, as far up ${his} loose butt as they will go.`);
+				}
+				r.push(`${He} lets out a pained "oh," and then goes silent. For such a little sound, it bears a great weight of <span class="trust dec">betrayed trust.</span> You insert your fingers to the knuckle, making ${him} writhe with discomfort, and then turf ${him} off the couch to land`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`across ${his} ${belly} stomach`);
+				} else {
+					r.push(`face first`);
+				}
+				r.push(`on the floor in front of you. ${He} tries to spread ${his} butt and angle ${his} hips like a good ${girl}, but you slap ${his} hands away and push your`);
+				if (PC.dick === 0) {
+					r.push(`strap-on`);
+				} else {
+					r.push(`cock`);
+				}
+				r.push(`inside ${him} without regard for ${his} poor anus. ${He} shudders and begins to cry, and keeps crying as you ravage ${his} asshole. When you climax and pull out, ${he} continues to weep, but stumbles off to wash. When ${he} comes back, ${he}'s still sniffling, but without being prompted,`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`<span class="devotion inc">${he} leans over ${his} belly and offers you ${his} sore butthole again.</span>`);
+				} else {
+					r.push(`<span class="devotion inc">${he} gets down on ${his} knees and offers you ${his} sore butthole again.</span>`);
+				}
+				eventSlave.trust -= 4;
+				eventSlave.devotion += 5;
+				r.push(VCheck.Anal(eventSlave, 1));
+				return r;
+			}
+		}
+	}
+};
diff --git a/src/events/RESS/review/vocalDisobedience.js b/src/events/RESS/review/vocalDisobedience.js
new file mode 100644
index 0000000000000000000000000000000000000000..407b893a24636dff057f0288728ae7b1f9e8050f
--- /dev/null
+++ b/src/events/RESS/review/vocalDisobedience.js
@@ -0,0 +1,223 @@
+App.Events.RESSVocalDisobedience = class RESSVocalDisobedience 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.devotion < -50,
+				s => s.trust >= -20,
+				s => s.rules.speech === "restrictive"
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const rudeTitle = eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master;
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			`One morning, despite the fact that ${he} is not allowed to speak without being spoken to,`,
+			contextualIntro(V.PC, eventSlave, "DOM"),
+		);
+		if (canSee(eventSlave)) {
+			r.push(`looks you directly in the eye`);
+		} else {
+			r.push(`faces you`);
+		}
+		r.push(`and asks`);
+		if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+			r.push(`boldly through ${his}`);
+			if (eventSlave.lips > 70) {
+				r.push(`massive dick-sucking lips,`);
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+				r.push(`inconvenient oral piercings,`);
+			} else {
+				r.push(`lisp,`);
+			}
+			r.push(
+				Spoken(eventSlave, `"I'm tired, can I have the day off?"`),
+				`${He} didn't even call you ${getWrittenTitle(eventSlave)}.`
+			);
+		} else {
+			r.push(
+				`boldly,`,
+				Spoken(eventSlave, `"I'm tired, can I have the day off, ${rudeTitle}?"`)
+			);
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Give ${him} a rough spanking`, spanking, virginityWarning()),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Sentence ${him} to public use`, sentence, virginityWarning())
+				: new App.Events.Result(),
+			new App.Events.Result(`Give ${him} the day off`, off),
+		]);
+
+		function virginityWarning() {
+			if ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) {
+				return `This option will take ${his} virginity`;
+			}
+		}
+
+		function spanking() {
+			r = [];
+			if (hasAnyLegs(eventSlave)) {
+				r.push(`You tie the protesting slave to your desk`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`with ${his} chest against the top of the desk with ${his} ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly hanging of the side, so that`);
+				} else {
+					r.push(`so that ${his} chest is against the top of the desk and`);
+				}
+				r.push(`${he}'s standing upright with ${his} ass in the air.`);
+			} else {
+				if (eventSlave.belly >= 300000) {
+					r.push(`You carefully balance the protesting, defenseless torso atop ${his} own ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy.`);
+					} else {
+						r.push(`stomach.`);
+					}
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`You place the protesting, defenseless torso on your lap, face-down with ${his} ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly between your legs.`);
+				} else {
+					r.push(`You place the protesting, defenseless torso on your desk, face-down.`);
+				}
+			}
+			r.push(`You spank ${him} severely, leaving ${his} buttocks bright pink. ${He} must count the strokes or have ${his} punishment start over. Sobbing, ${he} counts`);
+			if (eventSlave.lips > 70) {
+				r.push(`through ${his} massive dick-sucking lips,`);
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+				r.push(`through ${his} inconvenient oral piercings`);
+			}
+			r.push(
+				Spoken(eventSlave, `"Six, AAGHHH, seven, AAGHHH, seven"`),
+				`and then realizes ${his} mistake and begs for mercy — in vain, of course. You finish ${him} off with a rough`
+			);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`fuck, with ${him} jerking against ${his} restraints every time you stroke into ${his} sore buttocks.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`assfuck, with ${him} jerking against ${his} restraints every time you stroke into ${his} sore buttocks.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`throatfuck, with ${him} jerking against ${his} restraints every time you hilt yourself and slap ${his} ass.`);
+				seX(eventSlave, "oral", V.PC, "penetrative");
+			}
+			r.push(`<span class="trust dec">${He} learns from the experience.</span>`);
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function sentence() {
+			r = [];
+			r.push(`When ${he}`);
+			if (canSee(eventSlave)) {
+				r.push(`sees ${he}'s being taken to a sex booth,`);
+			} else if (canHear(eventSlave)) {
+				r.push(`hears the sounds of a public sex parlor,`);
+			} else {
+				r.push(`finally figures out ${his} destination,`);
+			}
+			r.push(`${he} begins to cry. ${He} begs`);
+			if (eventSlave.lips > 70) {
+				r.push(`through ${his} massive dick-sucking lips,`);
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+				r.push(`through ${his} inconvenient oral piercings,`);
+			} else {
+				r.push(`through ${his} tears,`);
+			}
+			r.push(
+				Spoken(eventSlave, `"Please, no, ${Master}, I'll be good —"`),
+				`but is cut off when the machine closes around ${his} head. It will offer ${his}`
+			);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				r.push(`ass and pussy`);
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`ass`);
+			} else {
+				r.push(`pussy`);
+			}
+			r.push(`to anyone who pays for the rest of the week, and keep ${his} fed and cleaned. ${His} world will become nothing but silent, featureless darkness and dick. <span class="cash inc">You earn some money off ${him},</span> and by the end of the night ${his}`);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				r.push(`holes get`);
+			} else {
+				r.push(`hole gets`);
+			}
+			if ((canDoAnal(eventSlave) && eventSlave.anus === 0) || (canDoVaginal(eventSlave) && eventSlave.vagina === 0)) {
+				r.push(`well stretched.`);
+			} else {
+				r.push(`<span class="lime">well stretched.</span>`);
+			}
+			r.push(`<span class="devotion inc">${He} learns from the experience.</span>`);
+			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss">${He}'s lost both ${his} virginity and anal cherry.</span>`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`<span class="virginity loss">${He}'s lost ${his} virginity.</span>`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss"> ${He}'s lost ${his} anal cherry.</span>`);
+				}
+				eventSlave.vagina++;
+				eventSlave.anus++;
+				seX(eventSlave, "vaginal", "public", "penetrative", 10);
+				seX(eventSlave, "anal", "public", "penetrative", 10);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 25, 2, -2));
+				}
+			} else if (canDoAnal(eventSlave)) {
+				if (eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss"> ${He}'s lost ${his} anal cherry.</span>`);
+				}
+				eventSlave.anus++;
+				seX(eventSlave, "anal", "public", "penetrative", 5);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 50, 1, -2));
+				}
+			} else {
+				if (eventSlave.vagina === 0) {
+					r.push(`<span class="virginity loss">${He}'s lost ${his} virginity.</span>`);
+				}
+				eventSlave.vagina++;
+				seX(eventSlave, "vaginal", "public", "penetrative", 20);
+				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+					r.push(knockMeUp(eventSlave, 50, 0, -2));
+				}
+			}
+			eventSlave.devotion += 4;
+			cashX(50, "event", eventSlave);
+			return r;
+		}
+
+		function off() {
+			eventSlave.devotion -= 5;
+			return `${He} skips away happily and spends the rest of the day lounging around. ${His} obedience to you <span class="devotion dec">has decreased.</span>`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/wetDreams.js b/src/events/RESS/review/wetDreams.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1127af4f3469f3e24cb1309ebb1807689c23598
--- /dev/null
+++ b/src/events/RESS/review/wetDreams.js
@@ -0,0 +1,407 @@
+App.Events.RESSWetDreams = class RESSWetDreams extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seeAge === 1,
+		];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				(s) => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				(s) => s.actualAge < 18,
+				(s) => s.devotion > 20,
+				canPenetrate,
+				(s) => s.balls > 0,
+				(s) => s.pubertyXY === 0,
+				(s) => (s.physicalAge + s.birthWeek / 52 >= s.pubertyAgeXY - 0.5),
+
+			]
+		];
+	}
+
+	get weight() {
+		return 10;
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [slave] = this.actors.map(a => getSlave(a));
+		const {
+			He, His,
+			he, his, him, hers, himself, woman, girl
+		} = getPronouns(slave);
+		let r = [];
+		const { title: Master } = getEnunciation(slave);
+		const belly = bellyAdjective(slave);
+		const { say } = getEnunciation(slave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, slave);
+		App.Events.addParagraph(node, [
+			App.UI.DOM.slaveDescriptionDialog(slave),
+			`appears in the door of your office early in the morning, hesitating before stepping in. You question why ${he} has come to see you and ${he} gingerly approaches your desk.`
+		]);
+
+		if (canTalk(slave)) {
+			r.push(
+				Spoken(slave, `"I'm sorry, ${Master},"`),
+				`${he} ${say}s apologetically.`,
+				Spoken(slave, `"I keep wetting my bed at night, and it feels so good too."`)
+			);
+		} else {
+			r.push(`${He} uses gestures to point to ${his} crotch, and explains that ${he} has accidentally started wetting ${his} bed.`);
+		}
+		r.push(`You check ${his} records for any potential health issues that could be causing this annoyance when it dawns on you. ${slave.slaveName} is likely becoming potent, and now is the perfect time to cement ${his} sexuality.`);
+		slave.pubertyXY = 1;
+		App.Events.addParagraph(node, r);
+
+
+		const choices = [];
+		choices.push(new App.Events.Result(`Explain ${he}'s just growing up`, justGrowing));
+		choices.push(new App.Events.Result(`Teach ${him} ${his} place`, teachHisPlace, (slave.vagina === 0) ? `This option will take ${his} virginity` : null));
+		if (V.PC.vagina > 0) {
+			choices.push(new App.Events.Result(`Let me teach you how to use it`, howToUse, `This option will penetrate you`));
+		}
+		choices.push(new App.Events.Result(`Tell ${him} it doesn't matter, ${he} won't be using it`, noMatter, (slave.anus === 0) ? `This option will take ${his} anal virginity` : null));
+		if (V.seeExtreme === 1 && slave.indentureRestrictions <= 0) {
+			choices.push(new App.Events.Result(`Geld ${him} to render ${him} impotent again`, geld));
+		}
+
+		App.Events.addResponses(node, choices);
+
+		function justGrowing() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`You tell ${him} that ${his} body is preparing to be able to impregnate girls, and that what happens at night happens to all boys. Though as a slave, ${he} should consider ${himself} lucky to be allowed to keep ${his} male genitalia.`);
+			if (canTalk(slave)) {
+				r.push(
+					Spoken(slave, `"I-I can get girls pregnant now? ${Master}, that m-means I'll have to be more careful."`),
+					`${He} trails off.`
+				);
+			} else {
+				r.push(`${He} brings ${his} hands to ${his} growing erection, a bubble of precum forming on its tip. ${He} fondles ${himself} as ${he} ponders ${his} new potency.`);
+			}
+			r.push(`You tell ${him} to keep ${his} dick in check or risk losing it, before continuing to read off the other various changes that will occur in ${him}. ${slave.slaveName} <span class="trust inc">appreciates</span> you taking the time to explain ${his} developing body.`);
+			slave.trust += 5;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function teachHisPlace() {
+			const frag = new DocumentFragment();
+			let r = [];
+			if (V.PC.dick === 0) {
+				r.push(`You tell ${him} that ${he} is just becoming a potent ${woman}, and as such, ${he} will need to learn that you are the dominant force in ${his} life.`);
+				if (canTalk(slave)) {
+					r.push(Spoken(slave, `"What does that mean, ${Master}?"`));
+				} else {
+					r.push(`${His} expression shifts to confusion.`);
+				}
+				r.push(`You quickly approach and catch ${him}, forcing ${his}`);
+				if (slave.belly >= 1500) {
+					if (slave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`distended`);
+					}
+				}
+				r.push(`body face-up onto the couch. ${He}`);
+				if (canSee(slave)) {
+					r.push(`watches you carefully`);
+				} else if (canHear(slave)) {
+					r.push(`listens to your movements`);
+				} else {
+					r.push(`waits with trepidation`);
+				}
+				r.push(`as you size up ${his} fully erect`);
+				if (slave.dick === 1) {
+					r.push(`tiny dick.`);
+				} else if (slave.dick === 2) {
+					r.push(`cute dick.`);
+				} else if (slave.dick === 3) {
+					r.push(`dick.`);
+				} else if (slave.dick === 4) {
+					r.push(`big dick.`);
+				} else if (slave.dick === 5) {
+					r.push(`impressive dick.`);
+				} else if (slave.dick === 6) {
+					r.push(`huge dick.`);
+				} else if (slave.dick === 7) {
+					r.push(`gigantic dick`);
+				} else if (slave.dick === 8) {
+					r.push(`titanic dick`);
+				} else if (slave.dick === 9) {
+					r.push(`absurd dick`);
+				} else if (slave.dick === 10) {
+					r.push(`inhuman dick`);
+				} else {
+					r.push(`hypertrophied dick`);
+				}
+				r.push(`You push ${him} back down as you straddle ${his}`);
+				if (slave.belly >= 1500) {
+					r.push(belly);
+					if (slave.bellyPreg >= 1500) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly`);
+				} else if (slave.boobs > 2000) {
+					r.push(`huge tits`);
+				} else {
+					r.push(`chest`);
+				}
+				r.push(`planting your moistening pussy over the ${girl}'s face. You lean forward, teasing ${his} twitching cock, as you grind against ${his} face. As ${he} begins to moan with lust, you quickly bind the base of ${his} penis, denying ${his} release. You grind your cunt into ${his} face, telling ${him} that YOU are the one who'll be orgasming here, not ${him}. Only once you have taught ${him} ${his} place by soaking ${his} face in your cum do you release ${his} dick and lean back to avoid the coming blast. Just undoing the binding is enough to set ${him} over the edge, coating ${his}`);
+				if (slave.bellyPreg >= 1500) {
+					r.push(`pregnancy`);
+				} else {
+					r.push(`belly`);
+				}
+				r.push(`in ${his} virile sperm. You turn around and order the exhausted ${girl} to clean ${himself} up and go back to ${his} assignment; ${he} <span class="devotion inc">complies meekly,</span> understanding that having a potent penis is meaningless in ${his} position.`);
+				if (slave.fetish === "none") { // TODO: was coral, should probably be fetish gain.
+					r.push(`The next time ${he} walks past your office, you can't help notice the growing erection ${he} carries. <span class="fetish dec"> Your dominating display has left ${him} craving domination.</span>`);
+					slave.fetish = "submissive";
+					slave.fetishStrength = 10;
+				}
+				slave.devotion += 5;
+			} else {
+				r.push(`You tell ${him} that ${he} is just becoming a potent ${woman}, and as such, ${he} will need to learn that you are the dominant force in ${his} life.`);
+				if (canTalk(slave)) {
+					r.push(Spoken(slave, `"What does that mean, ${Master}?"`));
+				} else {
+					r.push(`${His} expression shifts to confusion.`);
+				}
+				r.push(`You quickly approach and catch ${him}, forcing ${his}`);
+				if (slave.belly >= 1500) {
+					if (slave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`distended`);
+					}
+				}
+				r.push(`body face-down onto the couch${(slave.belly >= 100000) ? ` as best you can` : ``}. ${He}`);
+				if (canSee(slave)) {
+					r.push(`watches you carefully`);
+				} else {
+					r.push(`listens to your movements`);
+				}
+				r.push(`as you size up ${his} fully erect`);
+				if (slave.dick === 1) {
+					r.push(`tiny dick.`);
+				} else if (slave.dick === 2) {
+					r.push(`cute dick.`);
+				} else if (slave.dick === 3) {
+					r.push(`dick.`);
+				} else if (slave.dick === 4) {
+					r.push(`big dick.`);
+				} else if (slave.dick === 5) {
+					r.push(`impressive dick.`);
+				} else if (slave.dick === 6) {
+					r.push(`huge dick.`);
+				} else if (slave.dick === 7) {
+					r.push(`gigantic dick`);
+				} else if (slave.dick === 8) {
+					r.push(`titanic dick`);
+				} else if (slave.dick === 9) {
+					r.push(`absurd dick`);
+				} else if (slave.dick === 10) {
+					r.push(`inhuman dick`);
+				} else {
+					r.push(`hypertrophied dick`);
+				}
+				r.push(`You push ${his} face into the cushions as you mount ${his}`);
+				if (slave.butt > 6) {
+					r.push(`ridiculous`);
+				} else if (slave.butt > 5) {
+					r.push(`gigantic`);
+				} else if (slave.butt > 4) {
+					r.push(`enormous`);
+				} else if (slave.butt > 3) {
+					r.push(`huge`);
+				} else if (slave.butt > 2) {
+					r.push(`big`);
+				} else if (slave.butt > 1) {
+					r.push(`plump`);
+				} else if (slave.butt > 0) {
+					r.push(`small`);
+				} else {
+					r.push(`flat`);
+				}
+				r.push(`butt, sinking your cock deep into ${his}`);
+				if (slave.anus === 0) {
+					r.push(`virgin`);
+				}
+				r.push(`asspussy. You lean forward, running your hands across ${his} nipples`);
+				if (slave.belly >= 5000) {
+					r.push(`and ${belly}`);
+					if (slave.belly >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly`);
+				}
+				r.push(`as you move to tease ${his} stiff prick. Between your dick in ${his} ass and your hand on ${his} cock, ${he} rapidly approaches ${his} peak. Quickly, you bind the base of ${his} penis, denying ${his} release and eliciting a long moan from the pent-up ${girl}. You begin thrusting hard, telling ${him} that YOU are the one who'll be orgasming here, not ${him}. Only once you have taught ${him} ${his} place by filling ${his} asspussy with your cum do you allow ${his} release. Just undoing the binding is enough to set ${him} over the edge, coating the cushions`);
+				if (slave.belly >= 5000) {
+					r.push(`and the bottom of ${his} ${belly}`);
+					if (slave.belly >= 3000) {
+						r.push(`pregnant`);
+					}
+					r.push(`belly`);
+				}
+				r.push(`in ${his} virile sperm. You dismount and order the exhausted ${girl} to clean ${himself} and the couch up before going back to ${his} assignment; ${he} <span class="devotion inc">complies meekly,</span> understanding that having a potent penis is meaningless in ${his} position.`);
+				if (slave.fetish === "none") { //todo: coral
+					r.push(`The next time ${he} walks past your office, you can't help notice the growing erection ${he} carries. <span class="fetish dec">Your dominating display has left ${him} craving domination.</span>`);
+					slave.fetish = "submissive";
+					slave.fetishStrength = 10;
+				}
+				slave.devotion += 5;
+			}
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function howToUse() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`You tell ${him} that ${he} is just becoming a potent ${woman}, and as such, ${he} will need to learn how to please ${his} partners.`);
+			if (canTalk(slave)) {
+				r.push(Spoken(slave, `"What's that mean, ${Master}?"`));
+			} else {
+				r.push(`${His} expression shifts to confusion.`);
+			}
+			r.push(`You quickly approach and catch ${him}, forcing ${his}`);
+			if (slave.belly >= 1500) {
+				if (slave.bellyPreg >= 1500) {
+					r.push(`gravid`);
+				} else {
+					r.push(`distended`);
+				}
+			}
+			r.push(`body face-up onto the couch. ${He}`);
+			if (canSee(slave)) {
+				r.push(`watches you carefully`);
+			} else if (canHear(slave)) {
+				r.push(`listens to your movements`);
+			} else {
+				r.push(`waits with trepidation`);
+			}
+			r.push(`as you size up ${his} fully erect`);
+			if (slave.dick === 1) {
+				r.push(`tiny dick.`);
+			} else if (slave.dick === 2) {
+				r.push(`cute dick.`);
+			} else if (slave.dick === 3) {
+				r.push(`dick.`);
+			} else if (slave.dick === 4) {
+				r.push(`big dick.`);
+			} else if (slave.dick === 5) {
+				r.push(`impressive dick.`);
+			} else if (slave.dick === 6) {
+				r.push(`huge dick.`);
+			} else if (slave.dick === 7) {
+				r.push(`gigantic dick.`);
+			} else if (slave.dick === 8) {
+				r.push(`titanic dick.`);
+			} else if (slave.dick === 9) {
+				r.push(`absurd dick.`);
+			} else if (slave.dick === 10) {
+				r.push(`inhuman dick.`);
+			} else {
+				r.push(`hypertrophied dick.`);
+			}
+			r.push(`You push ${him} back down as you straddle ${his} cock, lining it up before lowering`);
+			if (V.PC.belly >= 1500) {
+				r.push(`your pregnant body until ${he} delightfully penetrates you.`);
+			} else {
+				r.push(`yourself onto ${his} needy prick.`);
+			}
+			r.push(`You slowly ride ${his} dick, instructing ${him} the proper way to thrust into you and how to adequately support your weight. Once ${he} gets the hand of things, you dismount and lie down on the couch, legs spread, beckoning ${him} into you. ${He} gingerly inserts ${his} cock`);
+			if (slave.belly >= 100000) {
+				r.push(`while you do your best to manage ${his} ${belly} stomach`);
+			}
+			r.push(`and begins thrusting, slowly at first, before getting the hang of things and speeding up${(V.PC.dick !== 0)? `, your own neglected dick bobbing along to ${his} thrusts` : ``}. As soon as you feel ${his} beginning to tense you`);
+			if (V.PC.pregKnown === 1) {
+				r.push(`tell ${him} it's safe to cum in you, you're already pregnant.`);
+			} else {
+				r.push(`order ${him} to pull out.`);
+			}
+			r.push(`The poor ${girl} is so caught up in ${his} lust, ${he} can't stop thrusting. Before you can rectify this, ${he} pushes you over the edge and gushes deep into you as you climax`);
+			if (V.PC.dick !== 0) {
+				r.push(`and spray your own cum`);
+				if (V.PC.belly >= 5000 && slave.belly >= 5000) {
+					r.push(`into the cramped space between your swollen bodies.`);
+				} else if (slave.belly >= 100000) {
+					r.push(`across your belly and the underside of ${hers}.`);
+				} else {
+					r.push(`across ${his} chest.`);
+				}
+			}
+			r.push(`${He} gingerly pulls ${himself} from you, apologizes <span class="devotion inc">meekly</span> for losing control, and snuggles up next to you. Cumming in ${his} ${getWrittenTitle(slave)}'s pussy as ${his} first time builds <span class="trust inc">a special bond</span> with you.`);
+
+			if (V.PC.preg === 0 && V.PC.pregWeek === 0) {
+				r.push(`You aren't on contraceptives right now; ${his} first time may be more fruitful than ${he} realizes.`);
+			}
+			slave.devotion += 10;
+			slave.trust += 20;
+			seX(slave, "penetrative", V.PC, "vaginal");
+			if (canImpreg(V.PC, slave)) {
+				r.push(knockMeUp(V.PC, 60, 0, slave.ID));
+			}
+
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function noMatter() {
+			const frag = new DocumentFragment();
+			let r = [];
+			r.push(`In one swift motion, one pull out a chastity cage and lock it onto ${him}. ${He} gasps as ${he} feels it hug close to ${his} struggling erection. You explain that ${he} has just become potent, and thus, will be restricted until you feel differently.`);
+			if (canTalk(slave)) {
+				r.push(Spoken(slave, `"You don't want me to use my penis, ${Master}?"`));
+			} else {
+				r.push(`${He} rubs a hand across ${his} caged dick.`);
+			}
+			r.push(`You bring ${him} over to the couch, set ${him} on your lap, and teasingly call ${him} a buttslut. Every so often you graze a finger around ${his} chastity cage, torturing ${his} dick and balls, but you only make it the center of attention once the poor over-aroused slave`);
+			if (canTalk(slave)) {
+				r.push(
+					`begs,`,
+					Spoken(slave, `"I can't take it any more, ${Master}! Please fuck me!"`)
+				);
+			} else {
+				r.push(`begins to use piteous gestures to beg you abjectly to penetrate ${him}.`);
+			}
+			r.push(`You snicker, but remind ${him} that ${he} has no say in ${his} release. You line up and insert your`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`cock`);
+			}
+			r.push(`up ${his} ass and begin slowly fucking ${him}, making sure to stimulate ${his} prostate. When ${he} finally orgasms`);
+			if (V.PC.dick === 0) {
+				r.push(`${his} unabashed enjoyment`);
+			} else {
+				r.push(`the strength of ${his} spasming sphincter`);
+			}
+			r.push(`sends you over as well. ${He}'s left in a confused haze; ${his} body tells ${him} to fuck, but you tell ${him} to get fucked. ${He} <span class="hotpink">sides with your decision</span> and vows to be the one taking dick for you.`);
+			if (slave.fetish === "none") {
+				r.push(`<span class="fetish dec">Overcoming ${his} urges to become a father via anal cause ${him} to become a buttslut.</span>`);
+				slave.fetish = "buttslut";
+				slave.fetishStrength = 10;
+			}
+			slave.devotion += 5;
+			slave.chastityPenis = 1;
+			r.push(VCheck.Anal(slave, 1));
+
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function geld() {
+			slave.balls = 0;
+			slave.trust -= 20;
+			surgeryDamage(slave, 10);
+			return `You bluntly tell ${him} ${he} is becoming potent, and that is something you can't allow to roam unchecked amongst your fertile slaves. You drag ${him} to the remote surgery and strap ${him} face-down with ${his} legs spread${(slave.belly >= 5000) ? `${his} ${belly} rounded belly forcing ${his} rear into the air` : ``}. ${He} doesn't understand what's happening, since the anesthetics totally deprive ${him} of any sensation. ${He}'s so drugged and drowsy with <span class="health dec">surgical recovery</span> that it takes a while for ${him} to figure out what's happened. When ${he} does, ${his} poor mind scarcely processes the <span class="trust dec">horror</span> of what's happened. ${He} numbly carries on, terrified.`;
+		}
+	}
+};
diff --git a/src/events/RESS/serveThePublicDevoted.js b/src/events/RESS/serveThePublicDevoted.js
index 6d45289e117701b8854b77fd45b4ea86fdabfdde..b48f8d500ad678452233c4aafb2ed50bea346c73 100644
--- a/src/events/RESS/serveThePublicDevoted.js
+++ b/src/events/RESS/serveThePublicDevoted.js
@@ -44,11 +44,11 @@ App.Events.RESSServeThePublicDevoted = class RESSServeThePublicDevoted extends A
 		t.push(`As ${he} goes, you notice that`);
 		if (eventSlave.chastityPenis === 1) {
 			t.push(`precum is starting to dribble out of ${his} chastity cage.`);
-		} else if ((eventSlave.dick > 0) && canAchieveErection(eventSlave)) {
+		} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
 			t.push(`${his} cock is so hard it's standing out, perfectly straight.`);
-		} else if ((eventSlave.dick > 0) && (eventSlave.balls > 0) && !canAchieveErection(eventSlave)) {
+		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && !canAchieveErection(eventSlave)) {
 			t.push(`${his} semi-hard cock is dribbling precum, a sure sign of a bitch who wants to be buttfucked.`);
-		} else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
+		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
 			t.push(`${his} pathetically soft cock is streaming precum, a sure sign of a bitch who wants to be buttfucked.`);
 		} else if (eventSlave.clit > 0) {
 			t.push(`${his} big clit is obviously engorged.`);
@@ -68,7 +68,7 @@ App.Events.RESSServeThePublicDevoted = class RESSServeThePublicDevoted extends A
 			t.push(`play the dom.`);
 		} else if (eventSlave.fetish === "sadist") {
 			t.push(`find a willing masochist.`);
-		} else if ((eventSlave.fetish === "pregnancy") && (eventSlave.preg > eventSlave.pregData.normalBirth / 4)) {
+		} else if (eventSlave.fetish === "pregnancy" && eventSlave.preg > eventSlave.pregData.normalBirth / 4) {
 			t.push(`have ${his} pregnancy fondled.`);
 		} else if (eventSlave.fetish === "pregnancy") {
 			t.push(`pretend to get knocked up.`);
@@ -272,9 +272,9 @@ App.Events.RESSServeThePublicDevoted = class RESSServeThePublicDevoted extends A
 			t.push(`${eventSlave.slaveName} returns many hours later. ${He}'s obviously bone tired. When you meet ${him} at the entrance to your penthouse ${he}'s surprised to`);
 			t.push(canSee(eventSlave) ? "see" : "find");
 			t.push(`you, but ${he} gives you a little smile anyway. You bring ${him} back to your office, and ${he}'s clearly expecting to get fucked, so ${he}'s surprised when you hand ${him} a hot beverage and sit down on the couch with ${him}. ${He} relaxes quickly and chats with you about ${his} day, gossiping about all the private doings of all the prominent citizens who fucked ${his}`);
-			if ((eventSlave.vagina > 0) && canDoVaginal(eventSlave)) {
+			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
 				t.push(`cunt`);
-			} else if ((eventSlave.anus > 0) && canDoAnal(eventSlave)) {
+			} else if (eventSlave.anus > 0 && canDoAnal(eventSlave)) {
 				t.push(`asshole`);
 			} else {
 				t.push(`mouth`);
diff --git a/src/events/RESS/suppositoryResistance.js b/src/events/RESS/suppositoryResistance.js
index db48ceae518bb6242374ac263f7a61e50d3e5803..d8df258d29006b18b9716e002c266ff313a84418 100644
--- a/src/events/RESS/suppositoryResistance.js
+++ b/src/events/RESS/suppositoryResistance.js
@@ -26,7 +26,7 @@ App.Events.RESSSuppositoryResistance = class RESSSuppositoryResistance extends A
 			He, he, His, his, him, himself
 		} = getPronouns(eventSlave);
 		const {hisA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
-		const {s, sh, ss, title: Master} = getEnunciation(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
 		const desc = SlaveTitle(eventSlave);
 		const belly = bellyAdjective(eventSlave);
 
@@ -56,7 +56,10 @@ App.Events.RESSSuppositoryResistance = class RESSSuppositoryResistance extends A
 
 		t.push(`${He} turns to you as you enter, and ${canSee(eventSlave) ? "seeing" : "realizing"} that it's you, ${he}`);
 		if (canTalk(eventSlave)) {
-			t.push(`mumbles unhappily, "Plea${s}e, ${Master}, can I ju${s}t take a ${sh}ot? A${ss}rape from, you know, people, i${s}, um, bad enough."`);
+			t.push(
+				`mumbles unhappily,`,
+				Spoken(eventSlave, `"Please, ${Master}, can I just take a shot? Assrape from, you know, people, is, um, bad enough."`)
+			);
 		} else {
 			t.push(`uses hesitant gestures to beg you to let ${him} take ${his} drugs normally. ${He} tries to use gestures to explain that ${he} thinks ${he} gets enough anal from humans, without being buttfucked by a machine every morning.`);
 		}
diff --git a/src/events/RETS/reDatePlease.js b/src/events/RETS/reDatePlease.js
index df348b47ce1cf02ca27a37fcaefa4975f86210ef..53cfd0f1b31ff091742080eeec1eb14c79983901 100644
--- a/src/events/RETS/reDatePlease.js
+++ b/src/events/RETS/reDatePlease.js
@@ -33,14 +33,13 @@ App.Events.RETSDatePlease = class RETSDatePlease extends App.Events.BaseEvent {
 		const {
 			He, he, his, him, girl
 		} = getPronouns(eventSlave);
-		const {say} = getEnunciation(eventSlave);
+		const {say, title: master} = getEnunciation(eventSlave);
 		const {him2, girl2, wife2} = getPronouns(subSlave).appendSuffix("2");
 		V.nextLink = "Next Week";
 		let artDiv = document.createElement("div"); // named container so we can replace it later
 		App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
 		node.appendChild(artDiv);
 
-		const master = Spoken(eventSlave, getWrittenTitle(eventSlave));
 		const partner = (eventSlave.relationship >= 5) ? `${wife2}` : `${girl2}friend`;
 		const pitch = (eventSlave.voice > 2) ? "high" : (eventSlave.voice > 1 ? "feminine" : "deep"); // When true male slaves are implemented, split "deep" into husky and masculine?
 
diff --git a/src/events/RETS/reIfYouEnjoyIt.js b/src/events/RETS/reIfYouEnjoyIt.js
index 41eba75a6dd521cad913930da96c3e4ab6a3d981..5b02e1099d874daaa01619c73e09ea1f5d36eb6a 100644
--- a/src/events/RETS/reIfYouEnjoyIt.js
+++ b/src/events/RETS/reIfYouEnjoyIt.js
@@ -229,7 +229,7 @@ App.Events.RETSIfYouEnjoyIt = class RETSIfYouEnjoyIt extends App.Events.BaseEven
 			} else {
 				t.push(`fingerfucking ${subSlave.slaveName}'s ass`);
 			}
-			t.push(`without mercy. The eventSlave screams at the sudden change of pace, thrashing a little. ${His2} struggles bring`);
+			t.push(`without mercy. The slave screams at the sudden change of pace, thrashing a little. ${His2} struggles bring`);
 			if (canSee(subSlave)) {
 				t.push(`${his2} head around, and ${he2}'s surprised to come face to face with your ankles. With dawning comprehension, ${his2} eyes track rapidly up your`);
 				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
@@ -302,7 +302,7 @@ App.Events.RETSIfYouEnjoyIt = class RETSIfYouEnjoyIt extends App.Events.BaseEven
 			} else {
 				t.push(`a pleased chuckle out of you. With dawning comprehension, ${his2} face rapidly moves to face yours.`);
 			}
-			t.push(`${He2} wilts. ${eventSlave.slaveName} thinks this is hilarious, and laughs so hard at the eventSlave's reaction to your appearance that ${he} almost loses hold of ${subSlave.slaveName}'s `);
+			t.push(`${He2} wilts. ${eventSlave.slaveName} thinks this is hilarious, and laughs so hard at the slave's reaction to your appearance that ${he} almost loses hold of ${subSlave.slaveName}'s `);
 			if (subSlave.dick > 0) {
 				t.push(`cock.`);
 			} else if (subSlave.clit > 0) {
@@ -316,7 +316,7 @@ App.Events.RETSIfYouEnjoyIt = class RETSIfYouEnjoyIt extends App.Events.BaseEven
 			} else {
 				t.push(`pull ${subSlave.slaveName}'s mouth against your cunt.`);
 			}
-			t.push(`${eventSlave.slaveName} is still giggling, but leans over the unhappy eventSlave speared between the two of you to <span class="devotion inc">plant a kiss</span> on you. ${He} misses, smearing ${his} kiss along your cheek and past your ear, but you take ${his} face in your hands and kiss ${him} properly as ${subSlave.slaveName} begins to do ${his2} best to relax and get you off, <span class="trust dec">fearful</span> that worse is in store if ${he2} doesn't <span class="devotion inc">submit.</span>`);
+			t.push(`${eventSlave.slaveName} is still giggling, but leans over the unhappy slave speared between the two of you to <span class="devotion inc">plant a kiss</span> on you. ${He} misses, smearing ${his} kiss along your cheek and past your ear, but you take ${his} face in your hands and kiss ${him} properly as ${subSlave.slaveName} begins to do ${his2} best to relax and get you off, <span class="trust dec">fearful</span> that worse is in store if ${he2} doesn't <span class="devotion inc">submit.</span>`);
 			eventSlave.devotion += 4;
 			seX(subSlave, "anal", eventSlave, "penetrative");
 			seX(subSlave, "oral", V.PC, "penetrative");
diff --git a/src/events/RETS/reSiblingTussle.js b/src/events/RETS/reSiblingTussle.js
index bf386b5a3b5e74c47ef4d7983627d588b629b15e..61c3495243fea5cf37f945d8b9e4ca3c2ba54a10 100644
--- a/src/events/RETS/reSiblingTussle.js
+++ b/src/events/RETS/reSiblingTussle.js
@@ -90,7 +90,7 @@ App.Events.RETSSiblingTussle = class RETSSiblingTussle extends App.Events.BaseEv
 					t = [];
 					t.push(`As soon as they realize you aren't going to stop them, the kiss gets deeper and the groping starts in earnest.`);
 					if (sib1.dick > 0) {
-						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s dick, fondling and tugging on it to make sure it's hard for what they're about to do.`);
+						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib1) ? `hard` : `as half-hard as it can be`} for what they're about to do.`);
 					} else if (sib1.vagina >= 0) {
 						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s soft slit, rubbing and massaging it to make sure ${he}'s good and wet.`);
 					} else if (sib1.boobs >= 300) {
@@ -105,7 +105,7 @@ App.Events.RETSSiblingTussle = class RETSSiblingTussle extends App.Events.BaseEv
 					} else if (sib2.balls > 0 && sib1.dick > 0) { // avoid double dick groping by going for the balls
 						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s balls, fondling them to make sure ${he2}'s going to make plenty of cum.`);
 					} else if (sib2.dick > 0) {
-						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s dick, fondling and tugging on it to make sure it's hard for what they're about to do.`);
+						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib2) ? `hard` : `at least semi-hard`} for what they're about to do.`);
 					} else if (sib2.clit > 0 && sib1.vagina >= 0) { // avoid double vagina groping by going for the clit
 						t.push(`reaches for ${his} ${relativeTerm(sib1, sib2)}'s clit, rubbing and flicking it to make sure ${he2}'s ready for action.`);
 					} else if (sib2.vagina >= 0) {
diff --git a/src/events/assistant/assistantFS.js b/src/events/assistant/assistantFS.js
index a3fb40ebf182f01bf686e6d5ee12c384402ce158..76311051b0e72bfd1a88c9c8242aa9e9c5b10e0d 100644
--- a/src/events/assistant/assistantFS.js
+++ b/src/events/assistant/assistantFS.js
@@ -1179,7 +1179,6 @@ App.Events.assistantFS = class assistantFS extends App.Events.BaseEvent {
 				}
 		}
 
-		r.push(App.UI.DOM.makeElement("h3", "Personal assistant appearances"));
 		App.Events.addParagraph(node, r);
 
 		const responses = [
diff --git a/src/events/gameover.js b/src/events/gameover.js
index 0b46cda9e9e2ed00f97e697c129e7411eefeb1d7..88c3e4a12c169ca8e6b579d6e04fc7b1c4b1045b 100644
--- a/src/events/gameover.js
+++ b/src/events/gameover.js
@@ -117,9 +117,7 @@ App.Events.Gameover = function() {
 			}
 			break;
 		case "Rebellion defeat":
-			r.push(`As the furious horde of`);
-			V.SecExp.war.type.toLowerCase().replace(" rebellion", "");
-			r.push(`s invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger.`);
+			r.push(`As the furious horde of ${V.SecExp.war.type.toLowerCase().replace(" rebellion", "")}s invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger.`);
 			r.push(`The end of your story has come and your arcology is now in the hands of whoever will take control of the vermin that dared rise up this day.`);
 			break;
 		case "Idiot Ball 2 The Dumbassening":
diff --git a/src/events/intro/economyIntro.js b/src/events/intro/economyIntro.js
index 1615ac57489e69838da30ae43c4474b2f2293ea6..328a8c9f19f4b24b47090a616d8edb5ec56c3e35 100644
--- a/src/events/intro/economyIntro.js
+++ b/src/events/intro/economyIntro.js
@@ -1,6 +1,5 @@
 App.Intro.economyIntro = function() {
 	const node = new DocumentFragment();
-	// :: Economy Intro [nobr]
 
 	App.Events.addParagraph(node, [
 		`It is the year 2037, and the past 21 years have not been kind. The world is starting to fall apart. The climate is deteriorating, resources are being exhausted, and there are more people to feed every year. Technology is advancing, but not fast enough to save everyone. <span class="intro question"></span>`,
@@ -57,11 +56,11 @@ App.Intro.economyIntro = function() {
 		r.push(`All the things you need to run your arcology are getting more expensive`);
 		if (V.incomeMod === 0) {
 			r.push(`while all forms of income`);
-			//<span style="font-weight:Bold">remain static</span>. [[Easier|Economy Intro][V.incomeRate = 1]]
+			//<span style="font-weight:Bold">remain static.</span> [[Easier|Economy Intro][V.incomeRate = 1]]
 		} else if (V.incomeMod === 1) {
-			r.push(`while all forms of income <span style="font-weight:Bold">rise but cannot keep pace</span>. [[Easier|Economy Intro][${V.incomeRate} = 2]] | [[Harder|Economy Intro][V.incomeRate = 0]]`);
+			r.push(`while all forms of income <span style="font-weight:Bold">rise but cannot keep pace.</span> [[Easier|Economy Intro][${V.incomeRate} = 2]] | [[Harder|Economy Intro][V.incomeRate = 0]]`);
 		} else {
-			r.push(`but luckily all forms of income <span style="font-weight:Bold">rise in lockstep</span>. [[Harder|Economy Intro][${V.incomeRate} = 1]]`);
+			r.push(`but luckily all forms of income <span style="font-weight:Bold">rise in lockstep.</span> [[Harder|Economy Intro][${V.incomeRate} = 1]]`);
 		}
 	//</div>
 
diff --git a/src/events/intro/extremeIntro.js b/src/events/intro/extremeIntro.js
index 97877f834d4077c4146de7f56aed5cb94dca7b3f..e84a13d5136865d6fc8de35e806ae021ad981dd6 100644
--- a/src/events/intro/extremeIntro.js
+++ b/src/events/intro/extremeIntro.js
@@ -1,6 +1,5 @@
 App.Intro.extremeIntro = function() {
 	const node = new DocumentFragment();
-	// :: :: Extreme Intro [nobr]
 
 	App.Events.addParagraph(node, [
 		`The early Free Cities were wild places where the writ of law did not run. In some of the most depraved, slaves' bodies, minds and even lives were playthings of the wealthy and powerful. Though modern Free Cities are tremendously varied, a majority of the new communities made a choice about whether extreme practices were a flaw in a lawless society or one of its benefits.`,
diff --git a/src/events/intro/locationIntro.js b/src/events/intro/locationIntro.js
index 179f4c1636de765d6cd59ce5657790b562ef1666..881d4d3489b9de513c6a1edc9f363590dbc5363d 100644
--- a/src/events/intro/locationIntro.js
+++ b/src/events/intro/locationIntro.js
@@ -1,5 +1,4 @@
 App.Intro.locationIntro = function() {
-	// :: Location Intro
 	const node = new DocumentFragment();
 
 	App.Events.addParagraph(node, [
diff --git a/src/events/intro/newGamePlusPassage.js b/src/events/intro/newGamePlusPassage.js
new file mode 100644
index 0000000000000000000000000000000000000000..14b371992b12e618075307bebe207cce07388fb8
--- /dev/null
+++ b/src/events/intro/newGamePlusPassage.js
@@ -0,0 +1,107 @@
+App.Intro.newGamePlus = function() {
+	const node = new DocumentFragment();
+	V.ui = "start";
+	if (!V.hasOwnProperty("slavesToImportMax")) {
+		V.slavesToImportMax = 5;
+	}
+
+	const fee = 50000 + (V.slavesToImportMax * 10000);
+	setupLastWeeksCash();
+	setupLastWeeksRep();
+
+	App.UI.DOM.appendNewElement("p", node, `You have decided to start over and will be able to take a few things with you: a few slaves, a small fraction of your current reserves of money, and possibly even your experience as an arcology owner, which will give you a very powerful career background. Many of your other customizations and settings will be carried over as the defaults for your new game, but can be revised freely.`);
+
+	if (V.cash >= fee) {
+		App.Events.addNode(node, [`You have allocated funds to bring up to ${V.slavesToImportMax} slaves with you (or your equivalent) to a new arcology. It will cost <span class="yellowgreen">${cashFormat(fee)}</span> to insure another slave's safe transfer. You have <span class="yellowgreen">${cashFormat(V.cash)}</span> to spend.`], "div");
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Increase slave import capacity by 1.",
+			() => {
+				cashX(forceNeg(fee), "capEx");
+				V.slavesToImportMax++;
+				App.UI.reload();
+			}
+		));
+	} else {
+		App.Events.addNode(node, [`You lack the <span class="yellowgreen">${cashFormat(fee)}</span> needed to bring any more than ${V.slavesToImportMax} slaves with you (or your equivalent) to a new arcology.`], "div");
+	}
+
+	V.ngpParams = {nationality: getRevivalistNationality(), prosperity: (250 * V.arcologies[0].prosperity * V.arcologies[0].ownership)};
+	if (V.freshPC === 0) {
+		if (V.retainCareer === 1 && V.PC.career !== "arcology owner") {
+			if (V.week > 52 || (V.PC.skill.slaving >= 100 && V.PC.skill.trading >= 100 && V.PC.skill.warfare >= 100 && V.PC.skill.engineering >= 100 && V.PC.skill.medicine >= 100 && V.PC.skill.hacking >= 100)) {
+				App.Events.addNode(node, [`You have acquired a fair amount of knowledge regarding arcologies and their day-to-day management in your time spent as one's owner qualifying you as an <span class="orange">"arcology owner"!</span> Benefits include:`], "div");
+				for (const text of [
+					`20% reduced cost of construction.`,
+					`Free additional starting rep along with easy rep maintenance.`,
+					`Reduced mercenary costs.`,
+					`An eye for gingered slaves.`,
+					`An edge in all things data.`
+				]) {
+					App.UI.DOM.appendNewElement("div", node, text, "lime");
+				}
+				V.oldCareer = V.PC.career;
+				if (V.retainCareer === 1) {
+					App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+						"Change career.",
+						() => {
+							V.retainCareer = 0;
+							V.PC.career = "arcology owner";
+							App.UI.reload();
+						}
+					));
+				}
+			} else {
+				App.UI.DOM.appendNewElement("div", node, `You lack the experience needed to qualify for a career change to "arcology owner".`);
+			}
+		}
+		if (V.retainCareer === 0 && V.PC.career === "arcology owner") {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Don't change career.",
+				() => {
+					V.retainCareer = 1;
+					V.PC.career = V.oldCareer;
+					App.UI.reload();
+				}
+			));
+		}
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Start over with a new player character.",
+			() => {
+				V.freshPC = 1;
+				V.retainCareer = 1;
+				App.UI.reload();
+			}
+		));
+	} else {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Use existing player character.",
+			() => {
+				V.freshPC = 0;
+				App.UI.reload();
+			}
+		));
+	}
+
+	if (V.cheatMode === 1) {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"DEBUG: Add all slaves to import list",
+			() => {
+				V.slaves.forEach(s => assignJob(s, Job.IMPORTED));
+				App.UI.reload();
+			}
+		));
+	}
+	App.UI.DOM.appendNewElement("div", node, App.Events.makeNode([
+		`Select up to ${V.slavesToImportMax} slaves to be imported into a new game and then click`,
+		App.UI.DOM.link(
+			"here.",
+			() => {
+				V.saveImported = 1;
+				V.oldCareer = "undefined";
+			}, [], "Alpha disclaimer",
+		)
+	]));
+	node.append(App.UI.SlaveList.listNGPSlaves());
+
+	return node;
+};
diff --git a/src/events/intro/pcAppearanceIntro.js b/src/events/intro/pcAppearanceIntro.js
index 82cefc77e27c4a39910e0bd2721fc940d1a3728d..31bc761ae627e0276d3232ab091f19e32af207c5 100644
--- a/src/events/intro/pcAppearanceIntro.js
+++ b/src/events/intro/pcAppearanceIntro.js
@@ -1,14 +1,14 @@
 App.Intro.PCAppearanceIntro = function() {
 	const node = new DocumentFragment();
-	// :: PC Appearance Intro [nobr]
+
 	node.append(
 		`Race and appearance are largely irrelevant in the Free Cities; there are only the free and the enslaved.`,
 		App.UI.DOM.makeElement("div", `Appearance only, will mostly have a superficial effect (unless you make a big deal out of it).`, ["indent", "note"])
 	);
 
-	const _options = new App.UI.OptionsGroup();
-	App.UI.Player.appearance(_options);
-	node.append(_options.render());
+	const options = new App.UI.OptionsGroup();
+	App.UI.Player.appearance(options);
+	node.append(options.render());
 
 	if (isFertile(V.PC)) {
 		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.passageLink(
diff --git a/src/events/intro/pcPregIntro.js b/src/events/intro/pcPregIntro.js
index c88aee7211753fe7468c040cae790ef7889f7255..032b64b63235821f876de747ebb0fd517518335d 100644
--- a/src/events/intro/pcPregIntro.js
+++ b/src/events/intro/pcPregIntro.js
@@ -1,6 +1,5 @@
 App.Intro.PCPregIntro = function() {
 	const node = new DocumentFragment();
-	// :: PC Preg Intro [nobr]
 
 	App.Events.addParagraph(node, [
 		`You have a working female reproductive system, and thus, a menstrual cycle. Women already face hardships as slaveowners and arcology owners, and being with child, coupled with a strong societal aversion to the dominant being penetrated, leads most pregnant owners to find themselves in dire situations. As an added precaution, since nothing stops an owner from hooking up with another owner, contraceptives are common amongst free women.`,
@@ -81,9 +80,7 @@ App.Intro.PCPregIntro = function() {
 
 	App.UI.DOM.appendNewElement("p", node, `Hormones can be an interesting thing, but how do they affect you?`, ["intro", "question"]);
 
-	// <p>
 	r = [];
-	linkArray = [];
 	r.push(`You're`);
 	if (V.PC.pregMood === 1) {
 		r.push(`gentle and motherly when you're hormonal.`);
@@ -92,35 +89,15 @@ App.Intro.PCPregIntro = function() {
 	} else {
 		r.push(`aggressive and domineering when you're hormonal.`);
 	}
-	if (V.PC.pregMood !== 0) {
-		r.push(`gentle and motherly when you're hormonal.`);
-		linkArray.push(App.UI.DOM.passageLink(
-			"Normal",
-			"PC Preg Intro",
-			() => V.PC.pregMood = 0
-		));
-	}
-	if (V.PC.pregMood !== 1) {
-		r.push(`in complete control of yourself.`);
-		linkArray.push(App.UI.DOM.passageLink(
-			"Motherly",
-			"PC Preg Intro",
-			() => V.PC.pregMood = 1
-		));
-	}
-	if (V.PC.pregMood !== 2) {
-		linkArray.push(App.UI.DOM.passageLink(
-			"Aggressive",
-			"PC Preg Intro",
-			() => V.PC.pregMood = 2
-		));
-	}
-
-	App.Events.addParagraph(node, [
-		r.join(" "),
-		App.UI.DOM.generateLinksStrip(linkArray),
-		App.UI.DOM.makeElement("span", `Hormone induced moods may alter some sex scenes, as well as change slaves' reactions to you.`, "note")
-	]);
+	const options = new App.UI.OptionsGroup();
+	options.addOption(r.join(" "), "pregMood", V.PC)
+		.addValueMap(new Map([
+			["Normal", 0],
+			["Motherly", 1],
+			["Aggressive", 2]
+		]))
+		.addComment(`Hormone induced moods may alter some sex scenes, as well as change slaves' reactions to you.`);
+	node.append(options.render());
 
 	App.UI.DOM.appendNewElement("p", node, App.UI.DOM.passageLink(
 		"Confirm player character customization",
diff --git a/src/events/intro/slaveAgeIntro.js b/src/events/intro/slaveAgeIntro.js
index 570e53552460281e0b487103fb6b390ee02ec317..974393450cd8fa2e517763fa6dc2dd5f0ac13e15 100644
--- a/src/events/intro/slaveAgeIntro.js
+++ b/src/events/intro/slaveAgeIntro.js
@@ -1,6 +1,5 @@
 App.Intro.slaveAgeIntro = function() {
 	const node = new DocumentFragment();
-	// :: Slave Age Intro [nobr]
 
 	App.UI.DOM.appendNewElement("p", node, `Do you want to see content involving girls younger than 18 in this game?`, ["intro", "question"]);
 
diff --git a/src/events/intro/tradeIntro.js b/src/events/intro/tradeIntro.js
index ef7f39db17c74be9390096cf03f6e27f3c49be34..58199ce6856ce6756287f67088c198bb8351a130 100644
--- a/src/events/intro/tradeIntro.js
+++ b/src/events/intro/tradeIntro.js
@@ -1,6 +1,5 @@
 App.Intro.tradeIntro = function() {
 	const node = new DocumentFragment();
-	// :: Trade Intro [nobr]
 
 	App.Events.addParagraph(node, [
 		`Most of the Free Cities are run on radically libertarian or even anarcho-capitalist principles. The first Free Cities experimented with indentured servitude, and this rapidly developed into widespread slavery. By now, the Free Cities collectively are a fundamentally slaveowning society and maintain a thriving slave trade that feeds off the terrible conditions in parts of the old world.`,
diff --git a/src/events/nonRandom/daughters/pBombing.js b/src/events/nonRandom/daughters/pBombing.js
index 1e125f79f5a611dad204e29587f5cbc5b26c3103..7c55c2d4676b67d8e9f4b932f364a402f421a62e 100644
--- a/src/events/nonRandom/daughters/pBombing.js
+++ b/src/events/nonRandom/daughters/pBombing.js
@@ -137,5 +137,6 @@ App.Events.PBombing = class PBombing extends App.Events.BaseEvent {
 			setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay);
 		}
 		r.push(`Hours later, you receive another message from the Daughters of Liberty. This one is even briefer than the first. "Next time, '${properMaster()},'" it reads.`);
+		App.Events.addParagraph(node, r);
 	}
 };
diff --git a/src/events/nonRandom/daughters/pCoupAttempt.js b/src/events/nonRandom/daughters/pCoupAttempt.js
index 94008c2f305c61145653c0a9fd1993dda6311bf9..3c011f4523a8044161afcd814254de5a75d71eaa 100644
--- a/src/events/nonRandom/daughters/pCoupAttempt.js
+++ b/src/events/nonRandom/daughters/pCoupAttempt.js
@@ -1,11 +1,4 @@
 App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
-	eventPrerequisites() {
-		return [
-			() => V.collaboration === 1,
-			() => V.traitorType !== "trapper"
-		];
-	}
-
 	execute(node) {
 		let r = [];
 		const {
@@ -208,14 +201,14 @@ App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
 			} else {
 				pcaj = 0;
 			}
-			for (let _pca = 0; _pca <= pcaj; _pca++) {
-				const _slave = GenerateNewSlave("XY", {minAge: 16, maxAge: 32, disableDisability: 1});
-				generateSalonModifications(_slave);
-				_slave.origin = "$He is an enslaved Daughter of Liberty.";
-				_slave.weight = random(-20, 30);
-				_slave.muscles = random(20, 80);
-				_slave.waist = random(10, 80);
-				newSlaves.push(_slave);
+			for (let pca = 0; pca <= pcaj; pca++) {
+				const slave = GenerateNewSlave("XY", {minAge: 16, maxAge: 32, disableDisability: 1});
+				generateSalonModifications(slave);
+				slave.origin = "$He is an enslaved Daughter of Liberty.";
+				slave.weight = random(-20, 30);
+				slave.muscles = random(20, 80);
+				slave.waist = random(10, 80);
+				newSlaves.push(slave);
 			}
 			if (V.seeDicks < 50) {
 				pcaj = 3;
@@ -224,14 +217,14 @@ App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
 			} else {
 				pcaj = 0;
 			}
-			for (let _pca = 0; _pca <= pcaj; _pca++) {
-				const _slave = GenerateNewSlave("XX", {minAge: 16, maxAge: 32, disableDisability: 1});
-				generateSalonModifications(_slave);
-				_slave.origin = "$He is an enslaved Daughter of Liberty.";
-				_slave.weight = random(-50, 30);
-				_slave.muscles = random(0, 80);
-				_slave.waist = random(-20, 20);
-				newSlaves.push(_slave);
+			for (let pca = 0; pca <= pcaj; pca++) {
+				const slave = GenerateNewSlave("XX", {minAge: 16, maxAge: 32, disableDisability: 1});
+				generateSalonModifications(slave);
+				slave.origin = "$He is an enslaved Daughter of Liberty.";
+				slave.weight = random(-50, 30);
+				slave.muscles = random(0, 80);
+				slave.waist = random(-20, 20);
+				newSlaves.push(slave);
 			}
 			V.trinkets.push("a Daughters of Liberty brassard");
 			r.push(IncreasePCSkills('warfare', 5));
@@ -270,8 +263,8 @@ App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
 
 		function sell() {
 			for (const slave of newSlaves) {
-				const _slaveCost = slaveCost(slave);
-				cashX(_slaveCost, "slaveTransfer");
+				const cost = slaveCost(slave);
+				cashX(cost, "slaveTransfer");
 			}
 			return `Prisoners sold.`;
 		}
@@ -280,8 +273,8 @@ App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
 			const frag = new DocumentFragment();
 			let r = [];
 			for (const slave of newSlaves) {
-				const _slaveCost = slaveCost(slave);
-				repX(Math.trunc(_slaveCost / 10), "war");
+				const cost = slaveCost(slave);
+				repX(Math.trunc(cost / 10), "war");
 			}
 			r.push(`Prisoners <span class="green">given away.</span>`);
 			App.Events.addParagraph(frag, r);
diff --git a/src/events/nonRandom/daughters/pCoupBetrayal.js b/src/events/nonRandom/daughters/pCoupBetrayal.js
index c7e3ca7a578f723fc886722f69a5caac69a54fce..b2d9f174a147a693c3386971d342909d24bc72f1 100644
--- a/src/events/nonRandom/daughters/pCoupBetrayal.js
+++ b/src/events/nonRandom/daughters/pCoupBetrayal.js
@@ -1,11 +1,4 @@
 App.Events.PCoupBetrayal = class PCoupBetrayal extends App.Events.BaseEvent {
-	eventPrerequisites() {
-		return [
-			() => V.collaboration === 1,
-			() => V.traitorType !== "trapper"
-		];
-	}
-
 	execute(node) {
 		let r = [];
 		const {He, he} = getPronouns(V.traitor ? V.traitor : {pronoun: App.Data.Pronouns.Kind.neutral});
@@ -13,15 +6,15 @@ App.Events.PCoupBetrayal = class PCoupBetrayal extends App.Events.BaseEvent {
 		V.nextButton = "Continue";
 		V.daughtersVictory = 1;
 
-		const _weeks = V.traitorWeeks-1;
-		const _pregWeeks = V.traitorWeeks-1;
+		const weeks = V.traitorWeeks-1;
+		const pregWeeks = V.traitorWeeks-1;
 		V.traitorWeeks = 0;
 
 		if (V.traitor === 0) { // never happens, needed for typing
 			return node;
 		}
 
-		WombProgress(V.traitor, _pregWeeks, _pregWeeks); /* In all cases should be done */
+		WombProgress(V.traitor, pregWeeks, pregWeeks); /* In all cases should be done */
 		WombUpdatePregVars(V.traitor);
 		if (WombBirthReady(V.traitor, V.traitor.pregData.normalBirth) > 0 ) { /* normal birth case, partial birthers not supported*/
 			V.traitor.preg = -1;
@@ -35,10 +28,10 @@ App.Events.PCoupBetrayal = class PCoupBetrayal extends App.Events.BaseEvent {
 
 		if (V.traitor.bald !== 1) {
 			if (V.traitor.hLength < 150) {
-				V.traitor.hLength += _weeks;
+				V.traitor.hLength += weeks;
 			}
 		}
-		ageSlaveWeeks(V.traitor, _weeks);
+		ageSlaveWeeks(V.traitor, weeks);
 
 		r.push(`You are awakened in the middle of the night by a jolt that shakes the entire arcology, accompanied by a distant boom. It is followed by the wail of the arcology's alarm systems, and then finally by a faint crackle that grows to a constant chatter of gunfire. You rush to the video feeds to see what is going on. The Daughters of Liberty have not only succeeded in locking down your arcology with them outside of it, but have effectively cornered themselves against it. A PMC group has their retreat cut off and is steadily bleeding their numbers. It is a rather short, if not spectacular, battle.`);
 
@@ -57,6 +50,7 @@ App.Events.PCoupBetrayal = class PCoupBetrayal extends App.Events.BaseEvent {
 		r = [];
 
 		r.push(`When ${V.traitor.slaveName} finally manages to return to you, ${he} explains what happened. ${He} caught wind of the military contractors working in the area and succeeded in goading the Daughters of Liberty into attacking the supposed slaver troop. Once it became clear that the untrained ex-slaves and their saviors stood no chance against a coordinated force, they beat a hasty retreat for your arcology under the assumption that the codes you gave them would allow them a fortifiable position. But alas, they found nothing more than their demise.`);
+		App.Events.addParagraph(node, r);
 		restoreTraitor();
 	}
 };
diff --git a/src/events/nonRandom/daughters/pCoupCollaboration.js b/src/events/nonRandom/daughters/pCoupCollaboration.js
index 414501fb071b0f42ff8051a2db29630c4d106b8e..7a7af2ec2fee6702834a1806a16279cafe2d05d1 100644
--- a/src/events/nonRandom/daughters/pCoupCollaboration.js
+++ b/src/events/nonRandom/daughters/pCoupCollaboration.js
@@ -14,10 +14,10 @@ App.Events.PCoupCollaboration = class PCoupCollaboration extends App.Events.Base
 		} = getPronouns(V.traitor ? V.traitor : {pronoun: App.Data.Pronouns.Kind.neutral});
 
 		if (V.traitor !== 0) {
-			const _pregWeeks = V.traitorWeeks;
+			const pregWeeks = V.traitorWeeks;
 			V.traitorWeeks = 0;
 
-			WombProgress(V.traitor, _pregWeeks, _pregWeeks); /* In all cases should be done */
+			WombProgress(V.traitor, pregWeeks, pregWeeks); /* In all cases should be done */
 			WombUpdatePregVars(V.traitor);
 			if (WombBirthReady(V.traitor, V.traitor.pregData.normalBirth) > 0) { /* normal birth case, partial birthers not supported*/
 				V.traitor.preg = -1;
@@ -161,9 +161,7 @@ App.Events.PCoupCollaboration = class PCoupCollaboration extends App.Events.Base
 		}
 
 		App.Events.addParagraph(node, r);
-
 		App.UI.DOM.appendNewElement("p", node, "GAME OVER", "bold");
-
 		V.ui = "start";
 	}
 };
diff --git a/src/events/nonRandom/daughters/pCoupLoss.js b/src/events/nonRandom/daughters/pCoupLoss.js
index 38fa73c1a1911cf49a5f8e37ef11f2d1e7504acb..b511961c403098ea608931cba128bf6b6c2bb626 100644
--- a/src/events/nonRandom/daughters/pCoupLoss.js
+++ b/src/events/nonRandom/daughters/pCoupLoss.js
@@ -3,10 +3,10 @@ App.Events.PCoupLoss = class PCoupLoss extends App.Events.BaseEvent {
 		let r = [];
 
 		if (V.traitor !== 0) {
-			const _pregWeeks = V.traitorWeeks;
+			const pregWeeks = V.traitorWeeks;
 			V.traitorWeeks = 0;
 
-			WombProgress(V.traitor, _pregWeeks, _pregWeeks); /* In all cases should be done */
+			WombProgress(V.traitor, pregWeeks, pregWeeks); /* In all cases should be done */
 			WombUpdatePregVars(V.traitor);
 			if (WombBirthReady(V.traitor, V.traitor.pregData.normalBirth) > 0 ) { /* normal birth case, partial birthers not supported*/
 				V.traitor.preg = -1;
@@ -83,10 +83,7 @@ App.Events.PCoupLoss = class PCoupLoss extends App.Events.BaseEvent {
 		r.push(`If the Daughters had any plans to take you alive, they are lost to the exigencies of combat. Your penthouse remains locked down, forcing them to use breaching charges to make an entrance. These prove entirely too effective, and your last impression is of the floor heaving bodily up toward the ceiling.`);
 
 		App.Events.addParagraph(node, r);
-
 		App.UI.DOM.appendNewElement("p", node, "GAME OVER", "bold");
-
 		V.ui = "start";
 	}
 };
-
diff --git a/src/events/nonRandom/daughters/pTraitorMessage.js b/src/events/nonRandom/daughters/pTraitorMessage.js
index e8d683daae73a49574be5322ee6906773f5078d5..5735ea1a53fc54191604e85b83783370f8f935b5 100644
--- a/src/events/nonRandom/daughters/pTraitorMessage.js
+++ b/src/events/nonRandom/daughters/pTraitorMessage.js
@@ -13,17 +13,17 @@ App.Events.PTraitorMessage = class PTraitorMessage extends App.Events.BaseEvent
 		} = getPronouns(V.traitor ? V.traitor : {pronoun: App.Data.Pronouns.Kind.neutral});
 
 		V.nextButton = "Continue";
-		const _weeks = V.traitorWeeks-1;
-		const _pregWeeks = V.traitorWeeks-1;
+		const weeks = V.traitorWeeks-1;
+		const pregWeeks = V.traitorWeeks-1;
 		V.traitorWeeks = 1;
 		if (V.traitor === 0) { // never happens, just for typing
 			return node;
 		}
 
 		/* ------------------ pregnancy setup start here----------------- */
-		const _wasPreg = (V.traitor.preg > 0) ? 1 : 0;
+		const wasPreg = (V.traitor.preg > 0) ? 1 : 0;
 
-		WombProgress(V.traitor, _pregWeeks, _pregWeeks); /* In all cases should be done */
+		WombProgress(V.traitor, pregWeeks, pregWeeks); /* In all cases should be done */
 		WombUpdatePregVars(V.traitor);
 		if (V.traitor.broodmother > 0) { /* Broodmother implant is assumed as removed.*/
 			V.traitor.preg = -1;
@@ -41,7 +41,7 @@ App.Events.PTraitorMessage = class PTraitorMessage extends App.Events.BaseEvent
 		}
 		SetBellySize(V.traitor); /* In any case it's useful to do.*/
 
-		const _isPreg = (V.traitor.preg > 0) ? 1 : 0;
+		const isPreg = (V.traitor.preg > 0) ? 1 : 0;
 
 		/* ------------------ pregnancy setup end here-----------------
 			r.push(`As no broodmother cases in code below, it's no need to setup every case of impregnation through new system. Backup mechanic will do it for normal pregnancies.`);
@@ -52,16 +52,16 @@ App.Events.PTraitorMessage = class PTraitorMessage extends App.Events.BaseEvent
 		}
 		if (V.traitor.bald !== 1) {
 			if (V.traitor.hLength < 150) {
-				V.traitor.hLength += _weeks;
+				V.traitor.hLength += weeks;
 			}
 		}
-		ageSlaveWeeks(V.traitor, _weeks);
+		ageSlaveWeeks(V.traitor, weeks);
 
-		r.push(`The month after freeing ${V.traitor.slaveName}, you receive another message from the Daughters of Liberty. This one contains a video. It shows ${V.traitor.slaveName} sitting quietly at a table${(_wasPreg !== _isPreg) ? ", no longer clearly pregnant" : ""}, wearing comfortable clothes and eating a nice meal.`);
+		r.push(`The month after freeing ${V.traitor.slaveName}, you receive another message from the Daughters of Liberty. This one contains a video. It shows ${V.traitor.slaveName} sitting quietly at a table${(wasPreg !== isPreg) ? ", no longer clearly pregnant" : ""}, wearing comfortable clothes and eating a nice meal.`);
 		if (V.traitorType === "agent") {
 			if (V.traitor.intelligence+V.traitor.intelligenceImplant < -50) {
 				r.push(`${He} looks a little bewildered, but there's an obvious happiness to ${him}; ${he} may be falling in with their teachings. ${He} seems unaware ${he}'s being recorded.`);
-			} else if (_wasPreg !== _isPreg) {
+			} else if (wasPreg !== isPreg) {
 				r.push(`${He} looks a little depressed, likely due to giving birth away from home, but ${he} is still playing the part of a traitor impeccably. ${He} seems aware ${he}'s being recorded and, for the briefest moment, makes eye contact with the camera.`);
 			} else {
 				r.push(`${He}'s playing the part of a traitor impeccably, feigning happiness despite yearning to be at your side. ${He} seems aware ${he}'s being recorded and, for the briefest moment, makes eye contact with the camera.`);
@@ -76,5 +76,6 @@ App.Events.PTraitorMessage = class PTraitorMessage extends App.Events.BaseEvent
 		r = [];
 
 		r.push(`A voice cuts in, calm but filled with unmistakable rage: "I hope you don't think this fixes everything, scum. We're still coming for you, and for all your slaveowning friends. All you've bought with this is the chance to maybe come out alive at the end. We'll be in touch."`);
+		App.Events.addParagraph(node, r);
 	}
 };
diff --git a/src/events/nonRandom/daughters/pUndergroundRailroad.js b/src/events/nonRandom/daughters/pUndergroundRailroad.js
index d19ed5bcf72039c2b6fa32aa5870a68dad963195..1346528190d633cd8f9c10642365bbeb72003f6d 100644
--- a/src/events/nonRandom/daughters/pUndergroundRailroad.js
+++ b/src/events/nonRandom/daughters/pUndergroundRailroad.js
@@ -191,6 +191,7 @@ App.Events.PUndergroundRailroad = class PUndergroundRailroad extends App.Events.
 				} else {
 					r.push(`shakily gestures an apology, and admits that ${he} does.`);
 				}
+				App.Events.addParagraph(node, r);
 			}
 
 			const responses = [
diff --git a/src/events/nonRandom/eliteTakeOver.js b/src/events/nonRandom/eliteTakeOver.js
index 51299bd0ca184fa2c6edc91b76639d4ae9a274ca..42de7ed345b8f33b336cd46b204c42fecb30ef94 100644
--- a/src/events/nonRandom/eliteTakeOver.js
+++ b/src/events/nonRandom/eliteTakeOver.js
@@ -22,7 +22,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 			he, his
 		} = getPronouns(S.Bodyguard ? S.Bodyguard : {pronoun: App.Data.Pronouns.Kind.neutral});
 
-		let _pregSurrender = 0; // preg/lobotomization check
+		let pregSurrender = 0; // preg/lobotomization check
 		r.push(`You knew this day would come. Surrounding yourself with powerful people has its boons, but also poses a distinct threat. You've heard them murmuring when you enter the room, you've seen them excuse themselves from your presence, and lately they've been overtly hostile. The Societal Elite${(V.arcologies[0].FSNeoImperialistLaw2 === 1) ? ", likely with the support of your ever-plotting Barons," : ""} have turned on you.`);
 		App.Events.addNode(container, r, "div");
 		r = [];
@@ -67,7 +67,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 				r.push(`As ${he} and their leader struggle closer to your desk, his revolver and a syringe are dislodged onto your desk. It seems drugging you wasn't their first thought. With ${S.Bodyguard.slaveName}'s risky gamble, your fate has fallen back into your hands.`);
 			} else {
 				r.push(`You'll spend the rest of your life a breeder to the Societal Elite; blinded and muted. More than a slave, but still less than your master. Life isn't so bad, your two most devoted slaves were taken along to keep you happy, and you are treated quite well, possibilities considered. Though once your eggs dry up, odds are your little remaining usefulness will be at an end. Best not to think too much into it.`);
-				_pregSurrender = 1;
+				pregSurrender = 1;
 				V.ui = "start";
 				App.Events.addParagraph(container, r);
 				r = [];
@@ -81,7 +81,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 		}
 		App.Events.addParagraph(container, r);
 
-		if (_pregSurrender === 0) {
+		if (pregSurrender === 0) {
 			App.UI.DOM.appendNewElement("div", container, "You decide to");
 
 			const choices = [];
@@ -132,33 +132,33 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 		function eliteTakeOverFight(finalChoice) {
 			const node = new DocumentFragment();
 			let r = [];
-			let _BgSignaled;
-			let _EliteEnraged;
+			let bgSignaled;
+			let eliteEnraged;
 
 			switch (finalChoice) {
 				case "bodyguard": {
-					const _roll = random(0, 100);
+					const roll = random(0, 100);
 					if (V.PC.career === "mercenary") {
 						r.push(`As a result of your prior experience as a mercenary you were able to successfully signal ${S.Bodyguard.slaveName} without the Elites noticing.`);
-						_BgSignaled = 1;
-					} else if (V.PC.skill.warfare >= 100 && _roll > 20) {
+						bgSignaled = 1;
+					} else if (V.PC.skill.warfare >= 100 && roll > 20) {
 						r.push(`As a result of your mastery of warfare you were able to successfully signal ${S.Bodyguard.slaveName} without the Elites noticing.`);
-						_BgSignaled = 1;
-					} else if (V.PC.skill.warfare >= 60 && _roll > 30) {
+						bgSignaled = 1;
+					} else if (V.PC.skill.warfare >= 60 && roll > 30) {
 						r.push(`As a result of your expertness of warfare you were able to successfully signal ${S.Bodyguard.slaveName} without the Elites noticing.`);
-						_BgSignaled = 1;
-					} else if (V.PC.skill.warfare >= 30 && _roll > 40) {
+						bgSignaled = 1;
+					} else if (V.PC.skill.warfare >= 30 && roll > 40) {
 						r.push(`As a result of having some skill in warfare you were able to successfully signal ${S.Bodyguard.slaveName} without the elites noticing.`);
-						_BgSignaled = 1;
-					} else if (V.PC.skill.warfare >= 10 && _roll > 50) {
+						bgSignaled = 1;
+					} else if (V.PC.skill.warfare >= 10 && roll > 50) {
 						r.push(`As a result of having a small amount of skill in warfare you were able to successfully signal ${S.Bodyguard.slaveName} without the Elites noticing.`);
-						_BgSignaled = 1;
-					} else if (V.PC.skill.warfare < 10 && _roll > 60) {
+						bgSignaled = 1;
+					} else if (V.PC.skill.warfare < 10 && roll > 60) {
 						r.push(`By blind luck and what little you remember of your lessons in warfare are were able to successfully signal ${S.Bodyguard.slaveName} without the Elites noticing.`);
-						_BgSignaled = 1;
+						bgSignaled = 1;
 					} else {
 						r.push(`One of the Elites shouts "What the fuck are you trying to do?" Well, there goes that option.`);
-						_BgSignaled = 0;
+						bgSignaled = 0;
 					}
 					App.Events.addNode(node, r, "div");
 					r = [];
@@ -178,13 +178,13 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 				case "enrage":
 					if (["arcology owner", "BlackHat", "capitalist", "celebrity", "child prostitute", "escort", "gang", "hacker", "hoodlum", "medical assistant", "medicine", "prostitute", "rich kid", "rising star", "trust fund", "wealth"].includes(V.PC.career)) {
 						r.push(`You know exactly what to say in order to enrage them.`);
-						_EliteEnraged = 1;
+						eliteEnraged = 1;
 					} else if (random(0, 100) > 50) {
 						r.push(`You manage to select the right words to enrage them.`);
-						_EliteEnraged = 1;
+						eliteEnraged = 1;
 					} else {
 						r.push(`You try to enrage them, but your words have had no effect.`);
-						_EliteEnraged = 0;
+						eliteEnraged = 0;
 					}
 					App.Events.addNode(node, r, "div");
 					r = [];
@@ -213,36 +213,36 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 
 				/* variables: */
 				/* Revolver */
-				let _revolverChambers = 6;
-				let _revolverBullets = 5;
+				let revolverChambers = 6;
+				let revolverBullets = 5;
 
 				/* To Hit chance */
-				let _toHit;
+				let toHit;
 				if (V.PC.pregSource === -1 || V.PC.pregSource === -6) { /* still woozy */
-					_toHit = 56;
+					toHit = 56;
 				} else if (V.PC.career === "mercenary" || V.PC.skill.warfare >= 100) {
-					_toHit = 83;
+					toHit = 83;
 				} else if (V.PC.skill.warfare >= 60) {
-					_toHit = 76;
+					toHit = 76;
 				} else if (V.PC.skill.warfare >= 30) {
-					_toHit = 67;
+					toHit = 67;
 				} else if (V.PC.skill.warfare >= 10) {
-					_toHit = 60;
+					toHit = 60;
 				} else {
-					_toHit = 56;
+					toHit = 56;
 				}
-				if (_EliteEnraged === 1) {
-					_toHit += 5;
+				if (eliteEnraged === 1) {
+					toHit += 5;
 				}
 
 				/* shooting */
 				/* in the end I removed the messages from the cycle. I don't think having 6 lines of "you shot" is pretty looking. Feel free to re add them in however */
-				for (let _i = _revolverChambers; _i > 0; _i--) {
-					if (random(0, 100) <= _toHit && _revolverBullets > 0) {
+				for (let i = revolverChambers; i > 0; i--) {
+					if (random(0, 100) <= toHit && revolverBullets > 0) {
 						eliteDead += 1;
-						_revolverBullets -= 1;
-					} else if (_revolverBullets > 0) {
-						_revolverBullets -= 1;
+						revolverBullets -= 1;
+					} else if (revolverBullets > 0) {
+						revolverBullets -= 1;
 					}
 				}
 				App.Events.addNode(node, r, "div");
@@ -259,7 +259,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 
 				/* syringe shot */
 				eliteVegetable = 0;
-				let _druggedThrow = 0;
+				let druggedThrow = 0;
 
 				if (eliteDead > 0) {
 					r.push(`With ${eliteDead} Elites dead, you pick up the syringe from the desk and aim for the forehead of another.`);
@@ -269,7 +269,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 				if (V.PC.pregSource === -1 || V.PC.pregSource === -6) {
 					r.push(`But there's two of them... Shaking your head, you realize it's the drugs messing with you. You just need to focus.`);
 				}
-				const hitRoll = (random(0, 100) - _druggedThrow);
+				const hitRoll = (random(0, 100) - druggedThrow);
 				let syringeHeadShot;
 				if (V.PC.career === "mercenary" && hitRoll > 0) {
 					r.push(`With your prior history as a mercenary, making the throw is child's play.`);
@@ -317,35 +317,35 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 				}
 				App.Events.addNode(node, r, "div");
 				r = [];
-				let _SpentRevolverHitSyringePlunger;
+				let spentRevolverHitSyringePlunger;
 				if (syringeHeadShot === 1) {
 					r.push(`Picking up the spent revolver, you aim for the syringe's plunger.`);
 					if (V.PC.career === "mercenary") {
 						r.push(`With your prior history as a mercenary, making the throw is child's play.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else if (V.PC.skill.warfare >= 100 && random(0, 100) > 50) {
 						r.push(`As a result of your mastery of warfare you successfully made the throw.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else if (V.PC.skill.warfare >= 60 && random(0, 100) > 60) {
 						r.push(`As a result of your expertness of warfare you successfully made the throw.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else if (V.PC.skill.warfare >= 30 && random(0, 100) > 70) {
 						r.push(`As you have some skill you successfully made the throw.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else if (V.PC.skill.warfare >= 10 && random(0, 100) > 80) {
 						r.push(`Your small amount of skill assisted you in making the throw.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else if (V.PC.skill.warfare < 10 && random(0, 100) > 90) {
 						r.push(`By blind luck you successfully made the throw.`);
-						_SpentRevolverHitSyringePlunger = 1;
+						spentRevolverHitSyringePlunger = 1;
 					} else {
 						r.push(`Unfortunately you miss the shot.`);
-						_SpentRevolverHitSyringePlunger = 0;
+						spentRevolverHitSyringePlunger = 0;
 					}
 				}
 				App.Events.addNode(node, r, "div");
 				r = [];
-				if (_SpentRevolverHitSyringePlunger === 1) {
+				if (spentRevolverHitSyringePlunger === 1) {
 					if (random(0, 100) > 50) {
 						r.push(`The target dies of nervous system overload brought about by the drug.`);
 						eliteDead += 1;
@@ -366,7 +366,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 			/*		enslaved = 1				*/
 			/*		had fun (and enslaved) = 2	*/
 
-			if (_BgSignaled === 1) {
+			if (bgSignaled === 1) {
 				const {title: Master} = getEnunciation(S.Bodyguard);
 				r.push(`${S.Bodyguard.slaveName} asks, "${Master}, what should I do with the`);
 				if (eliteLeft < eliteTotal) {
@@ -462,7 +462,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 				const {
 					himU, hisU
 				} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
-				let _SFHappyEverAfter;
+				let sfHappyEverAfter;
 
 				switch (fate) {
 					case 0:
@@ -570,12 +570,12 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 							]);
 
 							function no() {
-								_SFHappyEverAfter = 0;
+								sfHappyEverAfter = 0;
 								return `Your rejection upsets some of them, but their professionalism ensures it isn't visible.`;
 							}
 							function yes() {
 								eliteLeft -= 1;
-								_SFHappyEverAfter = 1;
+								sfHappyEverAfter = 1;
 								repX(2500, "event");
 								return `For a second your acceptance shocks them. Once they recover they are very grateful. "Thank you ${properTitle()}, I'll make sure to look after ${himU}." Soon the story spreads of the kind arcology owner, enhancing your reputation.`;
 							}
@@ -583,7 +583,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 								switch (V.SF.Colonel.Core) {
 									case "kind":
 										r.push(`The Colonel is shocked that you would allow her troops to do this but understands that it comes with the territory.`);
-										if (_SFHappyEverAfter === 1) { // TODO: this never worked in tw since this is set by a link that doesn't refresh this content.
+										if (sfHappyEverAfter === 1) { // TODO: this never worked in tw since this is set by a link that doesn't refresh this content.
 											r.push(`"Thanks for being kind to one of my soldiers."`);
 										}
 										break;
@@ -591,7 +591,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 									case "cruel":
 									case "jaded":
 										r.push(`The Colonel is grateful that you let her troops let off some steam.`);
-										if (_SFHappyEverAfter === 1) {
+										if (sfHappyEverAfter === 1) {
 											r.push(`"Thanks for being kind to one of my soldiers."`);
 										}
 								}
@@ -639,7 +639,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 						if (slave.boobShape === "saggy" || slave.boobShape === "downward-facing") {
 							slave.boobShape = either("perky", "torpedo-shaped", "wide-set");
 						}
-						applyMindbroken(slave);
+						applyMindbroken(slave, random(70, 100));
 						slave.pubicHStyle = "waxed";
 						slave.underArmHStyle = "waxed";
 						slave.anus = 0;
@@ -648,7 +648,7 @@ App.Events.eliteTakeOver = class eliteTakeOver extends App.Events.BaseEvent {
 						slave.canRecruit = 0;
 						newSlave(slave); /* skip New Slave Intro */
 					}
-					for (let _i = eliteLeft; _i > 0; _i--) {
+					for (let i = eliteLeft; i > 0; i--) {
 						const gender = (V.seeDicks === 100 || (random(1, 100) > 50)) ? "XY" : "XX"; /* 50% chance of getting girl or boy */
 						const slave = GenerateNewSlave(gender, {minAge: 25, maxAge: V.retirementAge - 2, race: "nonslave"});
 						slave.origin = "$He was a member of the Societal Elite, captured in their failed attempt at expressing their displeasure.";
diff --git a/src/events/nonRandom/foodCrisis/pFoodCrisisLowerClass.js b/src/events/nonRandom/foodCrisis/pFoodCrisisLowerClass.js
index 4fcf64c831cbd5df297bf81536e372469bb9d292..bc288790a63c42dec11d458147688dbbf49d0a6b 100644
--- a/src/events/nonRandom/foodCrisis/pFoodCrisisLowerClass.js
+++ b/src/events/nonRandom/foodCrisis/pFoodCrisisLowerClass.js
@@ -1,4 +1,4 @@
-App.Events.pFoodCrisisLowerClass = class PFoodCrisis extends App.Events.BaseEvent {
+App.Events.pFoodCrisisLowerClass = class pFoodCrisisLowerClass extends App.Events.BaseEvent {
 	actorPrerequisites() {
 		return [];
 	}
diff --git a/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js b/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
index 913100971c1bc11eb0143f5cca4c162834de29c4..513f1574b62c1494d36e1b93b29779c4032b414c 100644
--- a/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
+++ b/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
@@ -1,4 +1,4 @@
-App.Events.pFoodCrisisMiddleClass = class PFoodCrisis extends App.Events.BaseEvent {
+App.Events.pFoodCrisisMiddleClass = class pFoodCrisisMiddleClass extends App.Events.BaseEvent {
 	actorPrerequisites() {
 		return [];
 	}
diff --git a/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js b/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
index 3e5c573a4bad03b7016b7f63d9efb3cf9e1a66eb..a58b2c864789086b29a2e079bda66f8299f3d0ff 100644
--- a/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
+++ b/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
@@ -1,4 +1,4 @@
-App.Events.pFoodCrisisUpperClass = class PFoodCrisis extends App.Events.BaseEvent {
+App.Events.pFoodCrisisUpperClass = class pFoodCrisisUpperClass extends App.Events.BaseEvent {
 	actorPrerequisites() {
 		return [];
 	}
diff --git a/src/events/nonRandom/mercs/pMercenaries.js b/src/events/nonRandom/mercs/pMercenaries.js
index 6330976dc243e156b95d1e77cd8dc8192d5022ff..3ee123f4e24f2fdc1a11f3404517270157b61eef 100644
--- a/src/events/nonRandom/mercs/pMercenaries.js
+++ b/src/events/nonRandom/mercs/pMercenaries.js
@@ -10,11 +10,11 @@ App.Events.PMercenaries = class PMercenaries extends App.Events.BaseEvent {
 		V.mercenaries = 0;
 		V.mercenariesTitle = "mercenaries";
 
-		let _price = 5000;
+		let price = 5000;
 		if (V.PC.skill.warfare >= 100) {
-			_price = 2500;
+			price = 2500;
 		} else if (V.PC.skill.warfare >= 50) {
-			_price = 3725;
+			price = 3725;
 		}
 
 		App.Events.addParagraph(node, [`Another wave of security hysteria is sweeping the Free Cities. And this time, it's not based on rumor and alarmism. On the other side of the globe, a Free City was sacked by an old world army today. The Free City's handful of high-technology defenders and multitude of drones caused heavy casualties among the attackers, but eventually sheer weight of numbers wore them down.`]);
@@ -31,7 +31,7 @@ App.Events.PMercenaries = class PMercenaries extends App.Events.BaseEvent {
 		choices.push(new App.Events.Result(
 			`Quarter a squad in the arcology`, quarter,
 			App.Events.makeNode([
-				`This will cost ${cashFormat(_price)} ${discount ?
+				`This will cost ${cashFormat(price)} ${discount ?
 					`and some upkeep, <span class="skill player">reduced by your mercenary contacts.</span>` :
 					`and incur significant upkeep costs.`}`
 			])
@@ -39,7 +39,7 @@ App.Events.PMercenaries = class PMercenaries extends App.Events.BaseEvent {
 		choices.push(new App.Events.Result(
 			`Quarter a platoon in the arcology`, platoon,
 			App.Events.makeNode([
-				`This will cost ${cashFormat(_price * 2)} ${discount ?
+				`This will cost ${cashFormat(price * 2)} ${discount ?
 					`and some upkeep, <span class="skill player">reduced by your mercenary contacts</span>.` :
 					`and incur significant upkeep costs.`}`
 			])
@@ -49,7 +49,7 @@ App.Events.PMercenaries = class PMercenaries extends App.Events.BaseEvent {
 
 		function quarter() {
 			repX(-100, "event");
-			cashX(forceNeg(_price), "mercenaries");
+			cashX(forceNeg(price), "mercenaries");
 			V.mercenaries = 1;
 			if (V.secExpEnabled > 0) {
 				V.SecExp.units.mercs.free = 15;
@@ -59,7 +59,7 @@ App.Events.PMercenaries = class PMercenaries extends App.Events.BaseEvent {
 
 		function platoon() {
 			repX(-500, "event");
-			cashX(forceNeg(_price * 2), "mercenaries");
+			cashX(forceNeg(price * 2), "mercenaries");
 			V.mercenaries = 3;
 			if (V.secExpEnabled > 0) {
 				V.SecExp.units.mercs.free = 30;
diff --git a/src/events/nonRandom/mercs/pMercenaryRomeo.js b/src/events/nonRandom/mercs/pMercenaryRomeo.js
index 540089bceba569e998b49f17dd895c05222bf077..50b47db838bdb0cd7011758904394f3158129883 100644
--- a/src/events/nonRandom/mercs/pMercenaryRomeo.js
+++ b/src/events/nonRandom/mercs/pMercenaryRomeo.js
@@ -13,28 +13,28 @@ App.Events.PMercenaryRomeo = class PMercenaryRomeo extends App.Events.BaseEvent
 		V.nextButton = "Continue";
 		/** @type {FC.Zeroable<string>} */
 		let name = 0;
-		let _slaveCost;
+		let cost;
 		let juliet;
 
-		let _romeoSlaves = V.slaves.filter(function(s) { return s.fetish !== "mindbroken" && s.fuckdoll === 0 && ["serve in the club", "serve the public", "whore", "work in the brothel"].includes(s.assignment); });
-		if (_romeoSlaves.length === 0) {
-			_romeoSlaves = V.slaves.filter(function(s) { return (s.counter.publicUse > 0) && (s.newGamePlus === 0) && (s.relationship > -3) && !["be your Concubine", "serve in the master suite"].includes(s.assignment); });
-			if (_romeoSlaves.length === 0) {
+		let romeoSlaves = V.slaves.filter(function(s) { return s.fetish !== "mindbroken" && s.fuckdoll === 0 && ["serve in the club", "serve the public", "whore", "work in the brothel"].includes(s.assignment); });
+		if (romeoSlaves.length === 0) {
+			romeoSlaves = V.slaves.filter(function(s) { return (s.counter.publicUse > 0) && (s.newGamePlus === 0) && (s.relationship > -3) && !["be your Concubine", "serve in the master suite"].includes(s.assignment); });
+			if (romeoSlaves.length === 0) {
 				name = setup.whiteAmericanSlaveNames.random();
 			} else {
-				juliet = _romeoSlaves.random();
+				juliet = romeoSlaves.random();
 			}
 		} else {
-			juliet = _romeoSlaves.random();
+			juliet = romeoSlaves.random();
 		}
 		if (juliet === undefined) {
 			name = setup.whiteAmericanSlaveNames.random();
 		}
 
 		if (name === 0) {
-			_slaveCost = slaveCost(juliet);
-			_slaveCost = (random(60, 70) * Math.trunc(_slaveCost / 100));
-			_slaveCost = 100 * Math.trunc(_slaveCost / 100);
+			cost = slaveCost(juliet);
+			cost = (random(60, 70) * Math.trunc(cost / 100));
+			cost = 100 * Math.trunc(cost / 100);
 		}
 		const {
 			He, His,
@@ -83,7 +83,7 @@ App.Events.PMercenaryRomeo = class PMercenaryRomeo extends App.Events.BaseEvent
 					`here and there and I can't stop thinking about ${him}. I feel ${he}'d make the years sit a little lighter on me.`
 				);
 			}
-			r.push(`I've scraped together what I can, and I can pay ${cashFormat(_slaveCost)}." It's a decent price, probably a little less than you could get at auction. It's a huge sum for a mercenary; it's probably his entire savings. You ask what he would do with ${him}. "Well," he says, actually blushing, "I'd free ${him}. And marry ${him}, if ${he}'d have me."`);
+			r.push(`I've scraped together what I can, and I can pay ${cashFormat(cost)}." It's a decent price, probably a little less than you could get at auction. It's a huge sum for a mercenary; it's probably his entire savings. You ask what he would do with ${him}. "Well," he says, actually blushing, "I'd free ${him}. And marry ${him}, if ${he}'d have me."`);
 
 			App.Events.addParagraph(node, r);
 			const choices = [];
@@ -137,7 +137,7 @@ App.Events.PMercenaryRomeo = class PMercenaryRomeo extends App.Events.BaseEvent
 				}
 				r.push(`${he} gives the nearest camera a little nod and silently mouths the words "Thank you, ${getWrittenTitle(juliet)}." Soon the romantic story of The Mercenary and the slave${girl} is being told in bars and brothels across the Free City, with you naturally playing <span class="reputation inc">a supporting role.</span>`);
 				// TODO: uh, actually increase rep?
-				cashX(_slaveCost, "slaveTransfer");
+				cashX(cost, "slaveTransfer");
 				removeSlave(juliet);
 			}
 			return r;
diff --git a/src/events/nonRandom/mercs/pRaidResult.js b/src/events/nonRandom/mercs/pRaidResult.js
index 6ca7b6370616878f899fa9fdfdd97943d7b724e2..f029f0da627bf61ee6390cc3b78b761152e543c8 100644
--- a/src/events/nonRandom/mercs/pRaidResult.js
+++ b/src/events/nonRandom/mercs/pRaidResult.js
@@ -8,28 +8,28 @@ App.Events.PRaidResult = class PRaidResult extends App.Events.BaseEvent {
 
 		App.Events.addParagraph(node, [`Out ahead of the main body of refugees there is a small knot moving quickly and in good order, carrying weapons. Farther back, there is a larger group separated from the main body who could be easily isolated. And finally, it seems a group of sick and injured refugees have clustered around a tent where there must be medical assistance of some kind.`]);
 
-		const _newSlaves = [];
+		const newSlaves = [];
 		if (this.params.raidTarget === 1) {
 			r.push(`Under orders to target resistance, your mercenaries target the leading group. They even manage to direct a little small arms fire at the VTOL craft as it circles them, dropping mercenaries and plying its nonlethal weapons, but they are of course rapidly defeated. Your share is two slaves in good physical condition, who prove to have been survivors of the defeated attack on the arcology. The mercenaries find after a data search that one of the prisoners whose part of their share was a minor leader in the anti-Free Cities movement. After a quick consultation over their radios, the mercenaries decide that a summary execution out here would be too quick for the wretch, and bring their prize back to the arcology for more thorough punishment. Between the successful raid and the capture of this public enemy, <span class="green">the citizens are quite impressed by you.</span>`);
 			repX(2500, "event");
-			for (let _prr = 0; _prr < 3; _prr++) {
+			for (let prr = 0; prr < 3; prr++) {
 				if (V.seeDicks > 0) {
-					const _slave = GenerateNewSlave("XY");
-					_slave.origin = "$He is an enslaved refugee who participated in the defeated attack on your arcology.";
-					_newSlaves.push(_slave);
+					const slave = GenerateNewSlave("XY");
+					slave.origin = "$He is an enslaved refugee who participated in the defeated attack on your arcology.";
+					newSlaves.push(slave);
 				} else {
-					const _slave = GenerateNewSlave("XX");
-					_slave.origin = "$He is an enslaved refugee who participated in the defeated attack on your arcology.";
-					_newSlaves.push(_slave);
+					const slave = GenerateNewSlave("XX");
+					slave.origin = "$He is an enslaved refugee who participated in the defeated attack on your arcology.";
+					newSlaves.push(slave);
 				}
 			}
 		} else if (this.params.raidTarget === 2) {
 			r.push(`Under orders to target civilians, your mercenaries head for the isolated group. When the VTOL descends to circle around the large group of refugees, it becomes obvious that it won't even be necessary to expend nonlethal ammunition. A few of the refugees throw themselves down in bitterness, but most just subside into the catatonia of helplessness. They stand quiescent as they are searched, tagged, and loaded onto the VTOL like the wretched human refuse they are. The successful raid <span class="green">is the talk of the Free City.</span>`);
 			repX(1000, "event");
-			for (let _prr = 0; _prr < 4; _prr++) {
-				const _slave = GenerateNewSlave();
-				_slave.origin = "$He is an enslaved refugee.";
-				_newSlaves.push(_slave);
+			for (let prr = 0; prr < 4; prr++) {
+				const slave = GenerateNewSlave();
+				slave.origin = "$He is an enslaved refugee.";
+				newSlaves.push(slave);
 			}
 		} else {
 			const {
@@ -38,11 +38,11 @@ App.Events.PRaidResult = class PRaidResult extends App.Events.BaseEvent {
 			r.push(`Under orders to target the largest possible group of people, your mercenaries head for the sick and injured. As the VTOL settles, it becomes apparent that most of the injuries are from combat, almost certainly in the defeat at ${V.arcologies[0].name}. The tent proves to contain a harassed nurse, almost without medical supplies and at the end of ${hisU} rope. When ${heU} sees the mercenaries push through the tent flap, ${heU} heaves a sigh of mixed defeat and relief and wordlessly offers ${hisU} wrists. The mercenaries give you a larger share of the other slaves in return for ${himU}: they tell you in confidence that ${heU}'ll be a medical asset to them as well as the usual amusement. The successful raid <span class="green">is the talk of the Free City.</span>`);
 			App.Events.queueEvent(1, new App.Events.PSlaveMedic());
 			repX(1000, "event");
-			for (let _prr = 0; _prr < 5; _prr++) {
-				const _slave = GenerateNewSlave();
-				_slave.origin = "$He is an enslaved refugee who was wounded in the defeated attack on your arcology.";
-				setHealth(_slave, jsRandom(-50, 40), normalRandInt(20, 3), normalRandInt(15, 3), Math.max(normalRandInt(0, 1), 0), jsRandom(40, 80));
-				_newSlaves.push(_slave);
+			for (let prr = 0; prr < 5; prr++) {
+				const slave = GenerateNewSlave();
+				slave.origin = "$He is an enslaved refugee who was wounded in the defeated attack on your arcology.";
+				setHealth(slave, jsRandom(-50, 40), normalRandInt(20, 3), normalRandInt(15, 3), Math.max(normalRandInt(0, 1), 0), jsRandom(40, 80));
+				newSlaves.push(slave);
 			}
 		}
 		App.Events.addParagraph(node, r);
@@ -54,23 +54,22 @@ App.Events.PRaidResult = class PRaidResult extends App.Events.BaseEvent {
 		App.Events.addResponses(node, choices);
 
 		function sell() {
-			for (const slave of _newSlaves) {
-				const _slaveCost = slaveCost(slave);
-				cashX(_slaveCost, "slaveTransfer");
+			for (const slave of newSlaves) {
+				cashX(slaveCost(slave), "slaveTransfer");
 			}
 			return `Prisoners sold.`;
 		}
 
 		function give() {
-			for (const slave of _newSlaves) {
-				const _slaveCost = slaveCost(slave);
-				repX(Math.trunc(_slaveCost / 10), "event");
+			for (const slave of newSlaves) {
+				const cost = slaveCost(slave);
+				repX(Math.trunc(cost / 10), "event");
 			}
 			return `Prisoners <span class="reputation inc">given away.</span>`;
 		}
 
 		function enslave() {
-			for (const slave of _newSlaves) {
+			for (const slave of newSlaves) {
 				newSlave(slave);
 			}
 			return `You simply enslave all of the refugees yourself. They would have been worse off had you not intervened.`;
diff --git a/src/events/nonRandom/mercs/pSlaveMedic.js b/src/events/nonRandom/mercs/pSlaveMedic.js
index c179406809f69a42f5f69948552c7095b72b0833..dba7354e78886ed3c45dbfbde31ee229fdf55b27 100644
--- a/src/events/nonRandom/mercs/pSlaveMedic.js
+++ b/src/events/nonRandom/mercs/pSlaveMedic.js
@@ -88,7 +88,7 @@ App.Events.PSlaveMedic = class PSlaveMedic extends App.Events.BaseEvent {
 			} else {
 				r.push(`main living area,`);
 			}
-			r.push(`you see ${slave.slaveName} kneeling next to a mercenary with most of his armor stripped off. ${He}'s the ${aNational(slave.nationality)} nurse they captured and enslaved, and ${he} seems to be doing pretty well in ${his} new life. ${He} seems to be checking the sutures on a minor wound to the man's flank. "Don't squirm!" ${he} says with an annoyed tone. "I'll get you off when I've checked this." He chuckles and holds still; ${he} redresses the wound, stands up, and strips off ${his} tank top, allowing ${his} huge tits to swing free. ${He}'s quite young, but ${his} _slave.skin body is appealingly curvy. As ${he} swings one leg across the seated mercenary, ${he} continues, "Please sit still and let me do the work. You need to take it easy for a day or two or you'll pop those sutures." Using ${his} hands, ${he} gently caresses his stiff prick with ${his} pillowy breasts, eliciting a grunt. ${He}'s a strong ${girl}, and pleasures him without letting any of ${his} weight rest on his body at all. When he climaxes, ${he} leans in to clean him with ${his} mouth and then heads off to wash out ${his} cleavage.`);
+			r.push(`you see ${slave.slaveName} kneeling next to a mercenary with most of his armor stripped off. ${He}'s the ${aNational(slave.nationality)} nurse they captured and enslaved, and ${he} seems to be doing pretty well in ${his} new life. ${He} seems to be checking the sutures on a minor wound to the man's flank. "Don't squirm!" ${he} says with an annoyed tone. "I'll get you off when I've checked this." He chuckles and holds still; ${he} redresses the wound, stands up, and strips off ${his} tank top, allowing ${his} huge tits to swing free. ${He}'s quite young, but ${his} ${slave.skin} body is appealingly curvy. As ${he} swings one leg across the seated mercenary, ${he} continues, "Please sit still and let me do the work. You need to take it easy for a day or two or you'll pop those sutures." Using ${his} hands, ${he} gently caresses his stiff prick with ${his} pillowy breasts, eliciting a grunt. ${He}'s a strong ${girl}, and pleasures him without letting any of ${his} weight rest on his body at all. When he climaxes, ${he} leans in to clean him with ${his} mouth and then heads off to wash out ${his} cleavage.`);
 		} else {
 			r.push(`You make a habit of dropping in on your mercenaries whenever you get the chance. You have regular meetings with their grizzled captain, of course, but turning up unannounced to get to know them is simply a matter of self-preservation. The better they like you, the more likely they are to think of more than their pay when deciding how to hazard themselves on your behalf.`);
 
diff --git a/src/events/nonRandom/pSchoolSuggestion.js b/src/events/nonRandom/pSchoolSuggestion.js
index 23234c7cd44b43850b96c180c231fb9e75602b9d..cc0f1b16cdfd8d05dc7a639a1ed07abe51e4972b 100644
--- a/src/events/nonRandom/pSchoolSuggestion.js
+++ b/src/events/nonRandom/pSchoolSuggestion.js
@@ -23,7 +23,7 @@ App.Events.PSchoolSuggestion = class PSchoolSuggestion extends App.Events.BaseEv
 
 		if (V.seeDicks !== 100) {
 			App.Events.addParagraph(node, [`"The Slave School for me," says a portly man with a thriving slave breaking business down in the markets. "Their girls are pretty, skilled, and innocent, without any of that weird crap the other schools go in for. Besides, all that special stuff drives up the prices. TSS girls are cheap for what you get. When you're tired of one, just buy another." He turns to his friend and business partner, a much thinner man. "Though I'm sure you disagree with me."`]);
-			App.Events.addParagraph(node, [`"Of course I do, we've been having this debate every day for ten years." The thin man laughs. "Hasn't hurt our company, though. Anyway, I'm a GRI man. It's much harder to change a girl's body than it is to train her mind. The Growth Research Institute might sell their girls with no training and some nasty flaws, but you can fix those faster than you can grow a well-trained skinny girl's tits out to //here//," and he gestures far out in front of his own chest.`]);
+			App.Events.addParagraph(node, [`"Of course I do, we've been having this debate every day for ten years." The thin man laughs. "Hasn't hurt our company, though. Anyway, I'm a GRI man. It's much harder to change a girl's body than it is to train her mind. The Growth Research Institute might sell their girls with no training and some nasty flaws, but you can fix those faster than you can grow a well-trained skinny girl's tits out to <i>here</i>," and he gestures far out in front of his own chest.`]);
 
 			App.Events.addParagraph(node, [`An older woman standing across from him sniffs. "St. Claver's knows how to do both. They train them right, and if they aren't perfectly made, well, that's what plastic surgery is for." She favors the group with a sharp smile. "The best part is that between the silicone and their, ahem, strict training, they're all the same. Once you get used to their girls, you can always rely on them to give you more of what you like."`]);
 		}
@@ -36,12 +36,14 @@ App.Events.PSchoolSuggestion = class PSchoolSuggestion extends App.Events.BaseEv
 			App.Events.addParagraph(node, [`The unusually competent young heiress standing next to him snickers. "If you're going to bring up refinement, um, hello, the Futanari Sisters. I have four futas in my apartment having sex with each other right now. How do I know? Because they're always having sex with each other. They never stop." Her eyes take on a faraway look and she pauses. "Um, haha, I know what I'm doing later."`]);
 		}
 
-		App.Events.addParagraph(node, [`"If you like them soft and mellow, you got to go with The Cattle Ranch," a buff man blurts loudly while slamming down his empty mug. "I've got a pair of 'em for my bedroom; they are so loving after a good milking. Taste good too." His drinking buddy retorts, "Too much work is what they are. They might as well be animals with how they act.${(V.seePreg === 0) ? "In addition, hope you like pregnant pussies, 'cause you need to keep them gravid or their milk dries up." : ""}"`]);
+		App.Events.addParagraph(node, [`"If you like them soft and mellow, you got to go with The Cattle Ranch," a buff man blurts loudly while slamming down his empty mug. "I've got a pair of 'em for my bedroom; they are so loving after a good milking. Taste good too." His drinking buddy retorts, "Too much work is what they are. They might as well be animals with how they act.${(V.seePreg === 0) ? " In addition, hope you like pregnant pussies, 'cause you need to keep them gravid or their milk dries up." : ""}"`]);
 
-		App.Events.addParagraph(node, [`"I see good taste is scarce within this walls," suddenly stated a young man previously quiet in his corner. "I say quality and strength is where the game should be played and there's nothing better than the girls from the Hippolyta Academy.`]);
+		App.Events.addParagraph(node, [`"I see good taste is scarce within this walls," suddenly stated a young man previously quiet in his corner. "I say quality and strength is where the game should be played and there's nothing better than the girls from the Hippolyta Academy."`]);
 
 		App.Events.addParagraph(node, [`The older gentleman who seems to have been acting as unofficial moderator before you came in turns to you. "In any case, ${(V.PC.title === 1) ? "sir" : "madam"}, we agreed before you came in. We'd like to get together and pay half the cost of encouraging a slave school to set up a branch campus here, if you'd be willing to pay the other half and choose which. I think ${cashFormat(startFee)} from you would cover it." He looks around the group. "Before we started this little debate, we all agreed to chip in regardless of which you chose."`]);
 
+		App.UI.DOM.appendNewElement("div", node, `Selecting a school will cost ${cashFormat(startFee)} and add minor upkeep costs`, "note");
+
 		const choices = [];
 		if (V.seeDicks !== 100) {
 			choices.push(new App.Events.Result(`The Slave School`, TSS));
@@ -61,8 +63,6 @@ App.Events.PSchoolSuggestion = class PSchoolSuggestion extends App.Events.BaseEv
 		}
 		App.Events.addResponses(node, choices);
 
-		App.UI.DOM.appendNewElement("div", node, `Selecting a school will cost ${cashFormat(startFee)}and add minor upkeep costs`, "note");
-
 		function TSS() {
 			V.TSS.schoolPresent = 1;
 			cashX(-startFee, "policies");
diff --git a/src/events/nonRandom/peacekeepers/pPeacekeepersInfluence.js b/src/events/nonRandom/peacekeepers/pPeacekeepersInfluence.js
index e7443022b2619ecb9b523dcc68f869b4acc57f25..107b43f2d71228e60469bd4839474df4f7be9296 100644
--- a/src/events/nonRandom/peacekeepers/pPeacekeepersInfluence.js
+++ b/src/events/nonRandom/peacekeepers/pPeacekeepersInfluence.js
@@ -61,7 +61,7 @@ App.Events.PPeacekeepersInfluence = class PPeacekeepersInfluence extends App.Eve
 					r.push(`The little fairy appears on your table, leaning towards you and squishing ${hisA} breasts together to show off ${hisA} cleavage. You completely fail to notice ${himA}. ${HeA} tries again, turning around and bending over and shaking ${hisA} butt while looking back at you. Yet again ${heA} fails to draw your attention. Frustrated, ${heA} sits on the table, spreading ${hisA} legs and showing off ${hisA} pussy. Peeking over ${hisA} swollen belly, ${heA} sees that you're not even looking at ${himA}. ${HisA} tiny body is just too small to garner your attention. It's not for a few minutes until you notice ${himA} sitting up on the desk, looking away with ${hisA} arms crossed and pouting.`);
 					break;
 				case "hypergoddess":
-					r.push(`The beautiful, massively gravid goddess appears with${hisA} usual wash of radiant golden light, and gently calms ${hisA} squirming occupants until ${heA} has your attention.`);
+					r.push(`The beautiful, massively gravid goddess appears with ${hisA} usual wash of radiant golden light, and gently calms ${hisA} squirming occupants until ${heA} has your attention.`);
 					break;
 				case "loli":
 					r.push(`The cute little ${loliA} pops up, literally, bouncing upward again and again until ${heA} is absolutely certain ${heA} has your attention.`);
diff --git a/src/events/nonRandom/rival/pHostageAcquisition.js b/src/events/nonRandom/rival/pHostageAcquisition.js
index 895c76bd3ed83fa2b8564d359269ca9339339493..9e2c10a514e407dc0c1704200a59514647fa35ff 100644
--- a/src/events/nonRandom/rival/pHostageAcquisition.js
+++ b/src/events/nonRandom/rival/pHostageAcquisition.js
@@ -13,7 +13,7 @@ App.Events.pHostageAcquisition = function() {
 		} = getPronouns(V.hostage);
 		V.hostageRescued = 0;
 		V.hostage.weekAcquired = V.week;
-		let _closer = 0;
+		let closer = 0;
 
 		const {
 			his2, woman2, wife2, girl2
@@ -26,7 +26,7 @@ App.Events.pHostageAcquisition = function() {
 		if (isPCCareerInCategory("wealth")) {
 			r.push(`a popular party ${girl}`);
 			if (V.PC.career === "rich kid") {
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("capitalist")) {
 			if (V.PC.career === "capitalist") {
@@ -35,42 +35,42 @@ App.Events.pHostageAcquisition = function() {
 				r.push(`a hopeful intern`);
 			} else {
 				r.push(`a brilliant student`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("mercenary")) {
 			if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.actualAge > 16) {
 				r.push(`a logistics officer`);
 			} else if (V.PC.career === "child soldier") {
 				r.push(`a conscript`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("engineer")) {
 			if (V.PC.career === "engineer" || V.PC.career === "construction" || V.PC.actualAge > 16) {
 				r.push(`an arcology sales${woman}`);
 			} else if (V.PC.career === "worksite helper") {
 				r.push(`a prodigy`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("medicine")) {
 			if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.actualAge > 16) {
 				r.push(`a surgical nurse`);
 			} else if (V.PC.career === "nurse") {
 				r.push(`a nurse`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("slaver")) {
 			if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.actualAge > 16) {
 				r.push(`an abusive pens guard`);
 			} else if (V.PC.career === "slave tender") {
 				r.push(`a slave caretaker`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("celebrity")) {
 			if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.actualAge > 16) {
 				r.push(`a popular groupie`);
 			} else if (V.PC.career === "slave tender") {
 				r.push(`a child star`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("escort")) {
 			if (V.PC.career === "escort" || V.PC.actualAge > 24) {
@@ -79,21 +79,21 @@ App.Events.pHostageAcquisition = function() {
 				r.push(`a prostitute`);
 			} else {
 				r.push(`a young prostitute`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("gang")) {
 			if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.actualAge > 16) {
 				r.push(`a gang member`);
 			} else {
 				r.push(`a homeless ${girl}`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("servant")) {
 			if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.actualAge > 16) {
 				r.push(`a maid`);
 			}
 			if (V.PC.career === "child servant") {
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("BlackHat")) {
 			if (V.PC.career === "BlackHat" || V.PC.actualAge > 24) {
@@ -102,12 +102,12 @@ App.Events.pHostageAcquisition = function() {
 				r.push(`a bright hacker`);
 			} else {
 				r.push(`a young hacker`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("arcology owner")) {
 			r.push(`a prominent Free Cities citizen`);
 		}
-		if (_closer === 1) {
+		if (closer === 1) {
 			r.push(`dear to you`);
 		} else {
 			r.push(`of your acquaintance`);
@@ -257,6 +257,7 @@ App.Events.pHostageAcquisition = function() {
 						r.push(`and broken.`);
 					}
 					r.push(`Although, if ${he} pulls through this, ${he}'ll be devoted to you forever.`);
+					applyMindbroken(V.hostage, V.hostage.intelligence);
 					V.hostage.weight = -100;
 					V.hostage.muscles = -100;
 					if (V.hostage.health.health > -100) {
@@ -528,6 +529,7 @@ App.Events.pHostageAcquisition = function() {
 				} else {
 					r.push(`Your mercenaries radio you upon arrival. "VIP recovered but... I'm so sorry..."`);
 					r.push(`You immediately wretch from the smell that follows the merc troop into your office. You rise to shout at them for tracking it in when you realize what the source of the smell is. A crate containing the twisted, mutilated, inked and pierced body of ${V.hostage.slaveName}. The mercenaries see themselves out as you carefully take a biometric scan of the inert, limbless body before you. ${He} is alive, but barely, and a brain scan shows few signs of activity. You call for some servants to clean ${him} up, hoping that maybe it will draw ${him} out of ${his} stupor. Deep down, you understand the ${girl} you used to know has been twisted and broken completely; never to be the same again.`);
+					applyMindbroken(V.hostage, V.hostage.intelligence);
 					if (V.hostage.health.health > -100) {
 						setHealth(V.hostage, -40, 30, Math.max(V.hostage.health.longDamage, 30), 2, 100);
 					}
@@ -839,7 +841,7 @@ App.Events.pHostageAcquisition = function() {
 					r.push(`sobbing`);
 					r.push(Spoken(V.hostage, `"I've never had to exercise so much; I'm exhausted!"`));
 					r.push(`You gently wrap your arms around ${his} soft body in a comforting embrace. ${He}'s exactly as you remember.`);
-					if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
+					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`);
 					}
 				} else if (V.rivalryDuration <= 10) {
@@ -852,7 +854,7 @@ App.Events.pHostageAcquisition = function() {
 					r.push(`feeling the muscles under ${his} chubby body, as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"You aren't going to make me pump iron, are you?"`));
 					r.push(`While ${he}'s thinner than you remember, and a little more muscular, ${his} personality is exactly the same.`);
-					if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
+					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`);
 					}
 				} else if (V.rivalryDuration <= 15) {
@@ -966,7 +968,7 @@ App.Events.pHostageAcquisition = function() {
 					r.push(`sobbing`);
 					r.push(Spoken(V.hostage, `"I've never had to exercise so much, I'm exhausted!"`));
 					r.push(`You gently wrap your arms around ${his} soft body in a comforting embrace. ${He}'s exactly as you remember.`);
-					if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
+					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`);
 					}
 				} else if (V.rivalryDuration <= 10) {
@@ -979,7 +981,7 @@ App.Events.pHostageAcquisition = function() {
 					r.push(`feeling the muscles under ${his} chubby body, as ${he} breaks down in tears.`);
 					r.push(Spoken(V.hostage, `"You aren't going to make me pump iron, are you?"`));
 					r.push(`While ${he}'s thinner than you remember, and a little more muscular, ${his} personality is exactly the same.`);
-					if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
+					if (closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) {
 						r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`);
 					}
 				} else if (V.rivalryDuration <= 15) {
@@ -1225,7 +1227,7 @@ App.Events.pHostageAcquisition = function() {
 						r.push(`chest`);
 					}
 					r.push(`as ${he} breaks down in tears.`);
-					r.push(Spoken(V.hostage, `"They made me get on${(hasBothLegs(V.hostage)) ? `my knees` : `the ground`}and make out with some tiny harlot!"`));
+					r.push(Spoken(V.hostage, `"They made me get on ${(hasBothLegs(V.hostage)) ? `my knees` : `the ground`} and make out with some tiny harlot!"`));
 					r.push(`${He}'s exactly as you remember.`);
 				} else if (V.rivalryDuration <= 15) {
 					r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} asks`);
diff --git a/src/events/nonRandom/rival/pRivalryActions.js b/src/events/nonRandom/rival/pRivalryActions.js
index c00cb108baf87b8e699118f76422b5636066ad90..9947749c877c35c55ef3c48c6963207952dac981 100644
--- a/src/events/nonRandom/rival/pRivalryActions.js
+++ b/src/events/nonRandom/rival/pRivalryActions.js
@@ -1534,7 +1534,6 @@ App.Events.pRivalryActions = function() {
 						V.hostage.counter.mammary += 50;
 						V.hostage.lactation = 1;
 						V.hostage.lactationDuration = 2;
-						applyMindbroken(V.hostage);
 						/* Make scars worse: */
 						App.Medicine.Modification.addScourged(V.hostage);
 						App.Medicine.Modification.addScar(V.hostage, "left cheek", "generic", 3);
@@ -1637,7 +1636,6 @@ App.Events.pRivalryActions = function() {
 						V.hostage.corsetPiercing = 1;
 						V.hostage.areolaePiercing = 1;
 						V.hostage.tonguePiercing = 2;
-						applyMindbroken(V.hostage);
 						if (seed < 40) {
 							App.Medicine.Modification.addScar(V.hostage, "anus", "burn", 2);
 						} else if (seed < 80) {
diff --git a/src/events/nonRandom/rival/pRivalryHostage.js b/src/events/nonRandom/rival/pRivalryHostage.js
index 38b133b164da0863226c942b39d664465eab0f73..25e512752c62af3a5f46b210ac02f63f40cc42d3 100644
--- a/src/events/nonRandom/rival/pRivalryHostage.js
+++ b/src/events/nonRandom/rival/pRivalryHostage.js
@@ -28,7 +28,7 @@ App.Events.pRivalryHostage = function() {
 		const {woman2, girl2, he2, his2} = getPronouns(V.hostageWife || {pronoun : 0}).appendSuffix("2");
 		let r = [];
 
-		let _closer = 0;
+		let closer = 0;
 		r.push(`Only a few days into your inter-arcology war, you receive a video message from your rival. Once ${V.assistant.name} is satisfied that the file is clean, you clear your office and pull it up. To your surprise, there are two faces on your desk, not one. One of them is your rival, and after a moment, you remember who the other is. You recognize ${him} from your`);
 		if (isPCCareerInCategory("wealth")) {
 			if (V.PC.career === "wealth" || V.PC.career === "trust fund" || V.PC.actualAge > 16) {
@@ -41,7 +41,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`around your age, that you spent a lot of time with.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("escort")) {
 			r.push(`time as a ${womanP} of sexual promiscuity.`);
@@ -54,7 +54,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was a pretty little slut around your age that you spent most of your time with. You played together, bathed together, shared clients together, and even lost your virginities together.`);
 				}
 				r.push(`You lost track of ${him} while moving up in the world,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("servant")) {
 			r.push(`time as a ${womanP} of servitude. ${He} was a`);
@@ -109,7 +109,7 @@ App.Events.pRivalryHostage = function() {
 					}
 				}
 				r.push(`You lost track of ${him} while moving up in the world,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("gang")) {
 			if (V.PC.career === "gang") {
@@ -127,7 +127,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He}'s put on a surprising amount of weight, so at least ${he} has been eating well.`);
 				}
 				r.push(`You lost track of ${him} while moving up in the world,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("BlackHat")) {
 			if (V.PC.career === "BlackHat") {
@@ -142,7 +142,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was another kid you often practiced your scripts with, or on, considering your stash of nudes pics of ${him}.`);
 				}
 				r.push(`You never really found the time to check up on ${him} while moving up in the world,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("capitalist")) {
 			if (V.PC.career === "capitalist") {
@@ -157,7 +157,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was a cute classmate that you spent a lot of time with learning the ins and outs of business.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("mercenary")) {
 			if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.actualAge > 16) {
@@ -170,7 +170,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was another child soldier that served along side you. You were always there to support each other when combat become too overwhelming.`);
 				}
 				r.push(`You weren't sure what became of them,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("engineer")) {
 			if (V.PC.career === "engineer" || V.PC.career === "construction" || V.PC.actualAge > 16) {
@@ -183,7 +183,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was a cute little ${girl} that loved to stop by the worksite and ask questions. ${He} had a knack for design, and loved to share ${his} ideas with you.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("medicine")) {
 			r.push(`career in medicine.`);
@@ -196,7 +196,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was another little nurse that worked alongside you, entertaining patients and doing ${his} best to stay out of the way.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("slaver")) {
 			if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.actualAge > 16) {
@@ -209,7 +209,7 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was a little ${girl} that helped clean and feed the slaves with you. You made a pretty good team; if a new capture thought it would be easy to overpower a child, they'd quickly learn to watch their back.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("celebrity")) {
 			r.push(`time as a minor celebrity.`);
@@ -222,12 +222,12 @@ App.Events.pRivalryHostage = function() {
 					r.push(`${He} was a child star that was often booked alongside you. So much so, you started to be treated more like siblings than competitors.`);
 				}
 				r.push(`You can't say that you've kept in touch,`);
-				_closer = 1;
+				closer = 1;
 			}
 		} else if (isPCCareerInCategory("arcology owner")) {
 			r.push(`time owning another arcology. ${He} was a prominent citizen who supported your government. You were never particularly close,`);
 		}
-		if (_closer !== 1) {
+		if (closer !== 1) {
 			r.push(`but you do remember ${him}, and your rival knows it. This is obviously the best ${heR} could come up with to provoke an emotional reaction.`);
 		} else {
 			r.push(`but you were close to ${him}, and your rival knows it. ${HeR} clearly did ${hisR} research when coming up with a way to provoke an emotional reaction.`);
diff --git a/src/events/nonRandom/stripClubAftermath.js b/src/events/nonRandom/stripClubAftermath.js
index f21561df29903ce8a24efaf1341985e6d06d6d12..7130029bb7890a50b80c0b7fd856d4e35a30743f 100644
--- a/src/events/nonRandom/stripClubAftermath.js
+++ b/src/events/nonRandom/stripClubAftermath.js
@@ -172,7 +172,7 @@ App.Events.PStripClubAftermath = class PStripClubAftermath extends App.Events.Ba
 		function decline() {
 			const el = new DocumentFragment();
 			const r = [];
-			r.push(`"Aw," ${heU} says, "you're no fun. Well anyway, we've got the money you paid to set those rooms up, <span class="yellowgreen">here it is.</span> And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" <span class="green"> ${V.arcologies[0].name}'s prosperity has increased.</span>`);
+			r.push(`"Aw," ${heU} says, "you're no fun. Well anyway, we've got the money you paid to set those rooms up, <span class="yellowgreen">here it is.</span> And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" <span class="green">${V.arcologies[0].name}'s prosperity has increased.</span>`);
 			App.Events.addParagraph(el, r);
 			V.arcologies[0].prosperity += 2;
 			cashX(500, "event");
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index 42c86aea5ad69a523be72e4f61d4eeca1c0cd09c..034e08abb73b4963fb0974d5dbf4d35b679fa034 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -12,31 +12,48 @@ 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(),
 		new App.Events.RESSArcadeSadist(),
 		new App.Events.RESSAssFitting(),
+		new App.Events.RESSBadDream(),
 		new App.Events.RESSBedSnuggle(),
 		new App.Events.RESSBirthday(),
 		new App.Events.RESSBondageGear(),
 		new App.Events.RESSBreedingBull(),
+		new App.Events.RESSCageRelief(),
 		new App.Events.RESSCockFeederResistance(),
 		new App.Events.RESSComfortableSeat(),
 		new App.Events.RESSCoolerLockin(),
+		new App.Events.RESSCumslutWhore(),
+		new App.Events.RESSDesperatelyHorny(),
 		new App.Events.RESSDevotedAnalVirgin(),
 		new App.Events.RESSDevotedEducated(),
 		new App.Events.RESSDevotedFearfulSlave(),
 		new App.Events.RESSDevotedNympho(),
+		new App.Events.RESSDevotedOld(),
 		new App.Events.RESSDevotedShortstack(),
 		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.RESSHeels(),
 		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(),
 		new App.Events.RESSImScared(),
 		new App.Events.RESSInconvenientLabia(),
@@ -44,12 +61,16 @@ 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(),
 		new App.Events.RESSMilkgasm(),
 		new App.Events.RESSMindbrokenMorning(),
 		new App.Events.RESSModestClothes(),
+		new App.Events.RESSModsPlease(),
 		new App.Events.RESSMoistPussy(),
 		new App.Events.RESSMuscles(),
 		new App.Events.RESSMutinyAttempt(),
@@ -63,26 +84,41 @@ 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(),
 		new App.Events.RESSPlugDisobedience(),
+		new App.Events.RESSRebelliousArrogant(),
 		new App.Events.RESSRefreshmentDelivery(),
+		new App.Events.RESSResistantAnalVirgin(),
+		new App.Events.RESSResistantGelding(),
+		new App.Events.RESSResistantShower(),
+		new App.Events.RESSRestrictedProfession(),
 		new App.Events.RESSRestrictedSmart(),
 		new App.Events.RESSPenitent(),
 		new App.Events.RESSRetchingCum(),
 		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(),
 		new App.Events.RESSSolitaryDesperation(),
+		new App.Events.RESSSoreAss(),
 		new App.Events.RESSSuppositoryResistance(),
 		new App.Events.RESSSurgeryAddict(),
 		new App.Events.RESSTooThinForCumDiet(),
+		new App.Events.RESSTrustingHG(),
+		new App.Events.RESSUsedWhore(),
+		new App.Events.RESSVocalDisobedience(),
 		new App.Events.RESSWaistlineWoes(),
 		new App.Events.RESSWhoreRebellious(),
+		new App.Events.RESSFirstPeriod(),
+		new App.Events.RESSWetDreams(),
 
 		new App.Events.RECIButthole(),
 		new App.Events.RECIFeminization(),
@@ -121,8 +157,6 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.rePregInventorFCTV(),
 
 		new App.Events.REStandardPunishment(),
-		new App.Events.RERebels(),
-
 		new App.Events.REAnalPunishment(),
 		new App.Events.REShowerPunishment(),
 		new App.Events.REHGReplacement(),
@@ -138,6 +172,7 @@ App.Events.getIndividualEvents = function() {
 };
 
 /** get a list of possible nonindividual events
+ *  Note: recruitment events should NOT be added to this list; they go in getNonindividualRecruitmentEvents instead.
  * @returns {Array<App.Events.BaseEvent>}
  */
 App.Events.getNonindividualEvents = function() {
@@ -159,6 +194,7 @@ App.Events.getNonindividualEvents = function() {
 		new App.Events.REDevotedTwins(),
 		new App.Events.RERoyalBlood(),
 		new App.Events.REArcologyInspection(),
+		new App.Events.REShelterInspection(),
 
 		new App.Events.REFIBoobslut(),
 		new App.Events.REFIButtslut(),
@@ -172,15 +208,13 @@ App.Events.getNonindividualEvents = function() {
 
 		new App.Events.RENickname().setType("RNIE"),
 
-		new App.Events.RERecruit(),
 		new App.Events.REBusyMasterSuite(),
-		new App.Events.REMalefactor(),
 		new App.Events.REMaleCitizenHookup(),
 		new App.Events.RECitizenHookup(),
 		new App.Events.REMaleArcologyOwner(),
-		new App.Events.REFSNonconformist(),
 		new App.Events.RESEndowment(),
 		new App.Events.RESMove(),
+		new App.Events.RESSale(),
 		new App.Events.REBoomerang(),
 		new App.Events.REMilfTourist(),
 		new App.Events.REAWOL(),
@@ -189,6 +223,7 @@ App.Events.getNonindividualEvents = function() {
 		new App.Events.REShippingContainer(),
 		new App.Events.REFemaleArcologyOwner(),
 		new App.Events.REBrothelFunction(),
+		new App.Events.RERebels(),
 
 		// legendary
 		new App.Events.RELegendaryFormerAbolitionist(),
@@ -204,6 +239,71 @@ App.Events.getNonindividualEvents = function() {
 		new App.Events.REBusyBrothel(),
 		new App.Events.REBusyServantsQuarters(),
 
+		// refs
+		new App.Events.refsBaronDemand(),
+		new App.Events.refsBodyPurismEncounter(),
+		new App.Events.refsDeadBaron(),
+		new App.Events.refsDegradationistEncounter(),
+		new App.Events.refsFeast(),
+		new App.Events.refsKnightlyDuel(),
+		new App.Events.refsMaturityPreferentialistEncounter(),
+		new App.Events.refsPastoralistEncounter(),
+		new App.Events.refsPaternalistEncounter(),
+		new App.Events.refsPhysicalIdealistEncounter(),
+		new App.Events.refsTotallyLegitCatgirls(),
+		new App.Events.refsTransformationFetishismEncounter(),
+		new App.Events.refsWarhound(),
+		new App.Events.refsYouthPreferentialistEncounter(),
+		new App.Events.REFSNonconformist(),
+
+		// Justice Event
+		new App.Events.JESlaveDisputeBreedingDeal(),
+		new App.Events.JESlaveDisputeIndentureDeal(),
+		new App.Events.JESlaveDisputeMajorityDeal(),
+		new App.Events.JESlaveDisputeSlaveDeal(),
+		new App.Events.JESlaveDisputeSlaveTraining(),
+		new App.Events.JESlaveVirginityDeal(),
+
+		// Random Market Events
+		new App.Events.REMFluctuations(),
+		new App.Events.REMMerger(),
+
+		// SoS
+		new App.Events.RESosSniper(),
+		new App.Events.RESosAssassin(),
+		new App.Events.RESosBombing(),
+
+		// PETS
+		new App.Events.petsAggressiveSchoolteacher(),
+		new App.Events.petsAggressiveWardeness(),
+		new App.Events.petsComfortingAttendant(),
+		new App.Events.petsNurseMolestation(),
+		new App.Events.petsStewardessBeating(),
+
+		// PESS
+		new App.Events.pessBodyguardBeatdown(),
+		new App.Events.pessBodyguardBedtime(),
+		new App.Events.pessDjPublicity(),
+		new App.Events.pessHeadgirlDickgirl(),
+		new App.Events.pessLovingConcubine(),
+		new App.Events.pessLovingHeadgirl(),
+		new App.Events.pessMadamStrategy(),
+		new App.Events.pessTiredCollectrix(),
+		new App.Events.pessTiredMilkmaid(),
+		new App.Events.pessWorriedHeadgirl(),
+		new App.Events.pessWorshipfulImpregnatrix(),
+	];
+};
+
+/** get a list of possible nonindividual recruitment events
+ *  The probability of selecting recruitment events is capped, to allow the above events to trigger more frequently
+ * @returns {Array<App.Events.BaseEvent>}
+ */
+App.Events.getNonindividualRecruitmentEvents = function() {
+	return [
+		new App.Events.RERecruit(),
+		new App.Events.REMalefactor(),
+
 		// recFS
 		new App.Events.recFSArabianRevivalist(),
 		new App.Events.recFSAssetExpansionist(),
@@ -275,49 +375,6 @@ App.Events.getNonindividualEvents = function() {
 		new App.Events.recetsMatchedPair(),
 		new App.Events.recetsMismatchedPair(),
 		new App.Events.recetsPoshMotherDaughter(),
-
-		// refs
-		new App.Events.refsPaternalistEncounter(),
-		new App.Events.refsDegradationistEncounter(),
-
-
-		// Justice Event
-		new App.Events.JESlaveDisputeBreedingDeal(),
-		new App.Events.JESlaveDisputeIndentureDeal(),
-		new App.Events.JESlaveDisputeMajorityDeal(),
-		new App.Events.JESlaveDisputeSlaveDeal(),
-		new App.Events.JESlaveDisputeSlaveTraining(),
-		new App.Events.JESlaveDisputeSlaveDeal(),
-		new App.Events.JESlaveVirginityDeal(),
-
-		// Random Market Events
-		new App.Events.REMFluctuations(),
-		new App.Events.REMMerger(),
-
-		// SoS
-		new App.Events.RESosSniper(),
-		new App.Events.RESosAssassin(),
-		new App.Events.RESosBombing(),
-
-		// PETS
-		new App.Events.petsAggressiveSchoolteacher(),
-		new App.Events.petsAggressiveWardeness(),
-		new App.Events.petsComfortingAttendant(),
-		new App.Events.petsNurseMolestation(),
-		new App.Events.petsStewardessBeating(),
-
-		// PESS
-		new App.Events.pessBodyguardBeatdown(),
-		new App.Events.pessBodyguardBedtime(),
-		new App.Events.pessDjPublicity(),
-		new App.Events.pessHeadgirlDickgirl(),
-		new App.Events.pessLovingConcubine(),
-		new App.Events.pessLovingHeadgirl(),
-		new App.Events.pessMadamStrategy(),
-		new App.Events.pessTiredCollectrix(),
-		new App.Events.pessTiredMilkmaid(),
-		new App.Events.pessWorriedHeadgirl(),
-		new App.Events.pessWorshipfulImpregnatrix(),
 	];
 };
 
@@ -344,7 +401,13 @@ App.Events.getIndividualEventsPassageList = function(slave) {
 	return events.map(e => `JSRE ${e.eventName}:${JSON.stringify(e.toJSON())}`);
 };
 
-/** get a stringified list of possible individual events as fake passage names - TODO: kill me */
+/** get a stringified list of possible nonindividual recruitment events as fake passage names - TODO: kill me */
+App.Events.getNonindividualRecruitmentEventsPassageList = function() {
+	const events = App.Events.getValidEvents(App.Events.getNonindividualRecruitmentEvents());
+	return events.map(e => `JSRE ${e.eventName}:${JSON.stringify(e.toJSON())}`);
+};
+
+/** get a stringified list of possible nonindividual events as fake passage names - TODO: kill me */
 App.Events.getNonindividualEventsPassageList = function() {
 	const events = App.Events.getValidEvents(App.Events.getNonindividualEvents());
 	return events.map(e => `JSRE ${e.eventName}:${JSON.stringify(e.toJSON())}`);
diff --git a/src/events/reRecruit/blessedVessel.js b/src/events/reRecruit/blessedVessel.js
index 1dcbb511811b2834c50d2fada5fa3dff6293a573..71e857295aa06cd5481501af87e306c5108e9f9e 100644
--- a/src/events/reRecruit/blessedVessel.js
+++ b/src/events/reRecruit/blessedVessel.js
@@ -114,7 +114,7 @@ App.Events.recBlessedVessel = class recBlessedVessel extends App.Events.BaseEven
 			slave.weight = 90;
 			slave.muscles = random(-100, -50);
 			slave.career = "a breeder";
-			applyMindbroken(slave);
+			applyMindbroken(slave, slave.intelligence);
 			return slave;
 		}
 	}
diff --git a/src/events/recETS/newSlaveIncestSex.js b/src/events/recETS/newSlaveIncestSex.js
index d623c3c08afb9dc85734c86f14d983a1ec24f050..b15da728a30465f38a685486eb569606258bfaea 100644
--- a/src/events/recETS/newSlaveIncestSex.js
+++ b/src/events/recETS/newSlaveIncestSex.js
@@ -1,5 +1,5 @@
 /**
- * 
+ *
  * @param {App.Entity.SlaveState} relative
  * @param {App.Entity.SlaveState} relative2
  * @returns {HTMLElement}
diff --git a/src/events/recETS/recetsAddictMotherDaughter.js b/src/events/recETS/recetsAddictMotherDaughter.js
index 55d08cc578c220180e42f4613e1952f51d79886d..c572bed90f91e58021c613818f896bec5a8679c8 100644
--- a/src/events/recETS/recetsAddictMotherDaughter.js
+++ b/src/events/recETS/recetsAddictMotherDaughter.js
@@ -64,9 +64,9 @@ App.Events.recetsAddictMotherDaughter = class recetsAddictMotherDaughter extends
 		App.Events.addParagraph(node, [`Enslaving ${him} will cost ${cashFormat(contractCost)}. Alternatively, you could sell your rights to ${him}. Including costs, this will bring in ${cashFormat(cost - contractCost)}. As a third option, for ${cashFormat(contractCost * 2)} you could manipulate ${him} to bind both mother and ${daughter2}, but you wouldn't be able to examine the ${daughter2} first.`]);
 		r.push();
 
-		const _newSlaves = [mother]; /* caller doesn't want relative involved, so you don't get to inspect her even if you can force a sale */
+		const newSlaves = [mother]; /* caller doesn't want relative involved, so you don't get to inspect her even if you can force a sale */
 
-		node.append(App.UI.MultipleInspect(_newSlaves, true, "generic"));
+		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
 		if (V.cash >= contractCost) {
diff --git a/src/events/recETS/recetsIncestFatherDaughter.js b/src/events/recETS/recetsIncestFatherDaughter.js
index 9b00de480a3a5fb3cbe1da28432698eeeb675f28..e37bef8e76613894bfc38b55ec97092601e64193 100644
--- a/src/events/recETS/recetsIncestFatherDaughter.js
+++ b/src/events/recETS/recetsIncestFatherDaughter.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends
 	get eventName() {
 		return `Father Daughter Incest`;
 	}
-	
+
 	execute(node) {
 		V.nextButton = "Continue";
 		V.nextLink = "RIE Eligibility Check";
diff --git a/src/events/recETS/recetsMatchedPair.js b/src/events/recETS/recetsMatchedPair.js
index ad8562845147242e17e17236cedc26631a48a0cb..fdacb0033e61853934b7ff684d2cbe5536355a98 100644
--- a/src/events/recETS/recetsMatchedPair.js
+++ b/src/events/recETS/recetsMatchedPair.js
@@ -76,10 +76,7 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 		sis2.relationshipTarget = sis1.ID;
 		sis1.relationshipTarget = sis2.ID;
 
-		const {
-			His,
-			his, him
-		} = getPronouns(sis1);
+		const {His, his} = getPronouns(sis1);
 		const {
 			he2, sister2,
 		} = getPronouns(sis2).appendSuffix("2");
diff --git a/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js b/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
index 9f90ddc24e3c81dce18e7be5a9aa1ed940be8517..be23e9be32e16a412d38c0bcc820e136efa62ffa 100644
--- a/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
+++ b/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
@@ -12,58 +12,58 @@ App.Events.recFSEgyptianRevivalistAcquisition = class recFSEgyptianRevivalistAcq
 		V.nextLink = "RIE Eligibility Check";
 		V.returnTo = "RIE Eligibility Check";
 		V.encyclopedia = "Enslaving People";
-		V.market = {introType: "egyptian", newSlavesDone: 0, newSlaveIndex: 0};
+		V.market = Object.assign(App.Markets.GlobalVariable(), {introType: "egyptian", newSlavesDone: 0, newSlaveIndex: 0});
 
-		const _contractCost = 3000;
-		const _slave = GenerateNewSlave(null, {minAge: Math.max(16, V.minimumSlaveAge + 3), maxAge: 29, disableDisability: 1});
-		generateSalonModifications(_slave);
-		_slave.origin = "$He offered $himself to you for enslavement hoping you would preserve $his incestuous relationship with $his sibling.";
-		_slave.devotion = random(5, 15);
-		_slave.trust = random(-15, -5);
-		setHealth(_slave, jsRandom(-20, 0), undefined, undefined, undefined, 35);
-		setMissingParents(_slave);
-		_slave.canRecruit = 0;
-		if (_slave.dick > 0 && _slave.balls === 0) {
-			_slave.balls = random(1, 5);
+		const contractCost = 3000;
+		const slave = GenerateNewSlave(null, {minAge: Math.max(16, V.minimumSlaveAge + 3), maxAge: 29, disableDisability: 1});
+		generateSalonModifications(slave);
+		slave.origin = "$He offered $himself to you for enslavement hoping you would preserve $his incestuous relationship with $his sibling.";
+		slave.devotion = random(5, 15);
+		slave.trust = random(-15, -5);
+		setHealth(slave, jsRandom(-20, 0), undefined, undefined, undefined, 35);
+		setMissingParents(slave);
+		slave.canRecruit = 0;
+		if (slave.dick > 0 && slave.balls === 0) {
+			slave.balls = random(1, 5);
 		}
 
-		const _oppositeSex = V.seeDicks.isBetween(0, 100) && (random(1, 4) <= 3);
-		const _secondSlave = generateRelatedSlave(_slave, "younger sibling", _oppositeSex);
+		const oppositeSex = V.seeDicks.isBetween(0, 100) && (random(1, 4) <= 3);
+		const secondSlave = generateRelatedSlave(slave, "younger sibling", oppositeSex);
 
-		_secondSlave.relationship = 4;
-		_secondSlave.relationshipTarget = _slave.ID;
-		_slave.relationship = 4;
-		_slave.relationshipTarget = _secondSlave.ID;
+		secondSlave.relationship = 4;
+		secondSlave.relationshipTarget = slave.ID;
+		slave.relationship = 4;
+		slave.relationshipTarget = secondSlave.ID;
 
-		if (_secondSlave.actualAge <= 22) {
-			_secondSlave.career = App.Data.Careers.General.young.random();
-		} else if (_secondSlave.intelligenceImplant >= 15) {
-			_secondSlave.career = App.Data.Careers.General.educated.random();
+		if (secondSlave.actualAge <= 22) {
+			secondSlave.career = App.Data.Careers.General.young.random();
+		} else if (secondSlave.intelligenceImplant >= 15) {
+			secondSlave.career = App.Data.Careers.General.educated.random();
 		} else {
-			_secondSlave.career = App.Data.Careers.General.uneducated.random();
+			secondSlave.career = App.Data.Careers.General.uneducated.random();
 		}
 
 		/* they've been fucking, obviously, so no virginity */
-		if (_secondSlave.dick > 0) {
-			if (_slave.vagina === 0) {
-				_slave.vagina = _secondSlave.dick > 4 ? 2 : 1;
+		if (secondSlave.dick > 0) {
+			if (slave.vagina === 0) {
+				slave.vagina = secondSlave.dick > 4 ? 2 : 1;
 			}
-			_slave.anus = Math.max(_slave.anus, _secondSlave.dick > 4 ? 2 : 1);
-			if (_slave.preg >= 1) {
-				_slave.pregSource = _secondSlave.ID;
+			slave.anus = Math.max(slave.anus, secondSlave.dick > 4 ? 2 : 1);
+			if (slave.preg >= 1) {
+				slave.pregSource = secondSlave.ID;
 			}
 		}
-		if (_slave.dick > 0) {
-			if (_secondSlave.vagina === 0) {
-				_secondSlave.vagina = _slave.dick > 4 ? 2 : 1;
+		if (slave.dick > 0) {
+			if (secondSlave.vagina === 0) {
+				secondSlave.vagina = slave.dick > 4 ? 2 : 1;
 			}
-			_secondSlave.anus = Math.max(_secondSlave.anus, _slave.dick > 4 ? 2 : 1);
-			if (_secondSlave.preg >= 1) {
-				_secondSlave.pregSource = _slave.ID;
+			secondSlave.anus = Math.max(secondSlave.anus, slave.dick > 4 ? 2 : 1);
+			if (secondSlave.preg >= 1) {
+				secondSlave.pregSource = slave.ID;
 			}
 		}
 
-		const _newSlaves = [_slave, _secondSlave];
+		const newSlaves = [slave, secondSlave];
 		const {
 			HeA,
 		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
@@ -77,12 +77,12 @@ App.Events.recFSEgyptianRevivalistAcquisition = class recFSEgyptianRevivalistAcq
 			`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`
 		]);
 
-		const _totalValue = slaveCost(_slave) + slaveCost(_secondSlave);
-		App.UI.DOM.appendNewElement("div", node, `Enslaving them will cost ${cashFormat(_contractCost)}. Selling them immediately will bring in approximately ${cashFormat(_totalValue-_contractCost)}.`, "note");
-		node.append(App.UI.MultipleInspect(_newSlaves, true));
+		const totalValue = slaveCost(slave) + slaveCost(secondSlave);
+		App.UI.DOM.appendNewElement("div", node, `Enslaving them will cost ${cashFormat(contractCost)}. Selling them immediately will bring in approximately ${cashFormat(totalValue-contractCost)}.`, "note");
+		node.append(App.UI.MultipleInspect(newSlaves, true));
 
 		const choices = [];
-		if (V.cash >= _contractCost) {
+		if (V.cash >= contractCost) {
 			choices.push(new App.Events.Result(`Enslave the pair`, enslave));
 		} else {
 			choices.push(new App.Events.Result(null, null, "You lack the necessary funds to enslave them."));
@@ -90,8 +90,8 @@ App.Events.recFSEgyptianRevivalistAcquisition = class recFSEgyptianRevivalistAcq
 		App.Events.addResponses(node, choices);
 
 		function enslave() {
-			V.market.newSlaves = _newSlaves;
-			V.market.newSlaves.forEach((s) => cashX(forceNeg(_contractCost/V.market.newSlaves.length), "slaveTransfer", s));
+			V.market.newSlaves = newSlaves;
+			V.market.newSlaves.forEach((s) => cashX(forceNeg(contractCost/V.market.newSlaves.length), "slaveTransfer", s));
 			return App.Markets.bulkSlaveIntro();
 		}
 	}
diff --git a/src/events/recFS/recfsIntellectualDependencyTwo.js b/src/events/recFS/recfsIntellectualDependencyTwo.js
index d26986cf54da8d1640a20bae07c887d630bb04bb..96bc82f33e85810baec08f0e246e371a0fd1cff4 100644
--- a/src/events/recFS/recfsIntellectualDependencyTwo.js
+++ b/src/events/recFS/recfsIntellectualDependencyTwo.js
@@ -15,7 +15,7 @@ App.Events.recFSIntellectualDependencyTwo = class recFSIntellectualDependencyTwo
 		generateSalonModifications(slave);
 		slave.origin = "$He was voluntarily enslaved after $he overdosed on psychosuppressant-laced aphrodisiacs and fried $his brain.";
 		slave.dullIntelligence = 1;
-		const _geneticInt = slave.intelligence;/* for longSlaveDescription to report what the intelligence will be while keeping the original value safe for ${V.genePool[]} */
+		const geneticInt = slave.intelligence;/* for longSlaveDescription to report what the intelligence will be while keeping the original value safe for ${V.genePool[]} */
 		slave.intelligence = -100;
 		slave.devotion = random(20, 40);
 		slave.trust = random(0, 50);
@@ -56,7 +56,7 @@ App.Events.recFSIntellectualDependencyTwo = class recFSIntellectualDependencyTwo
 		function enslave() {
 			const frag = new DocumentFragment();
 			r = [];
-			slave.intelligence = _geneticInt;
+			slave.intelligence = geneticInt;
 			r.push(`It takes several hours to track ${him} down for enslavement and once ${he} arrives it becomes clear that ${his} mental state has broken down even further. ${He} spends the better part of the process masturbating and begging for you to touch ${his} body.`);
 
 			r.push(App.UI.newSlaveIntro(slave));
diff --git a/src/events/recFS/recfsSupremacist.js b/src/events/recFS/recfsSupremacist.js
index 4e1f1edb26ebf9753cce6b4a7cc3689a9f9544b8..e916cd251fe48aa5a2b8b817be366f02d4cd1b45 100644
--- a/src/events/recFS/recfsSupremacist.js
+++ b/src/events/recFS/recfsSupremacist.js
@@ -20,8 +20,8 @@ App.Events.recFSSupremacist = class recFSSupremacist extends App.Events.BaseEven
 		if (V.arcologies[0].FSSubjugationistRace !== 0) {
 			pram.race = V.arcologies[0].FSSubjugationistRace;
 		} else {
-			const _races = App.Utils.getRaceArrayWithoutParamRace(V.arcologies[0].FSSupremacistRace);
-			pram.race = _races.random();
+			const races = App.Utils.getRaceArrayWithoutParamRace(V.arcologies[0].FSSupremacistRace);
+			pram.race = races.random();
 		}
 		const slave = GenerateNewSlave(null, pram);
 		generateSalonModifications(slave);
diff --git a/src/events/scheduled/JobFulfillmentCenterDelivery.js b/src/events/scheduled/JobFulfillmentCenterDelivery.js
index ce45d22af5e5f032d35aad85f1fc3fd95dbeb95a..9d0dde386dfa6c50278f90b5f2227083202e719e 100644
--- a/src/events/scheduled/JobFulfillmentCenterDelivery.js
+++ b/src/events/scheduled/JobFulfillmentCenterDelivery.js
@@ -16,12 +16,12 @@ App.Events.JobFulfillmentCenterDelivery = class JobFulfillmentCenterDelivery ext
 			He,
 			he, him
 		} = getPronouns(slave);
-		const _slaveCost = slaveCost(slave) * 6;
+		const cost = slaveCost(slave) * 6;
 
 		App.Events.addParagraph(node, [
 			`A slave dealer has submitted a slave to satisfy your`,
 			App.UI.DOM.makeElement("span", V.JFC.role, "bold"),
-			`order for ${cashFormat(_slaveCost)}.`
+			`order for ${cashFormat(cost)}.`
 		]);
 
 		App.UI.DOM.appendNewElement("span", node, `As usual, the asking price is quite high, to cover training costs. However, you can freely decline the slave should ${he} not meet your standards or the job has already been filled.`, "note");
@@ -29,7 +29,7 @@ App.Events.JobFulfillmentCenterDelivery = class JobFulfillmentCenterDelivery ext
 		node.append(App.Desc.longSlave(slave, {market: "generic"}));
 
 		const choices = [];
-		if (V.cash >= _slaveCost) {
+		if (V.cash >= cost) {
 			choices.push(new App.Events.Result(`Accept the offered slave`, accept));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to accept the offered slave.`));
@@ -39,7 +39,7 @@ App.Events.JobFulfillmentCenterDelivery = class JobFulfillmentCenterDelivery ext
 
 		function accept() {
 			V.JFC = {order: 0, reorder: 0};
-			cashX(-_slaveCost, "slaveTransfer", slave);
+			cashX(-cost, "slaveTransfer", slave);
 
 			return [
 				`${He} has been very well trained by the dealer that offered ${him} to you. ${He} has also picked up on the fact that ${he} was specially selected, and is a little hopeful that this means ${he} may be treated well. ${He} is now eagerly awaiting your instructions.`,
diff --git a/src/events/scheduled/burst/burst.js b/src/events/scheduled/burst/burst.js
index d5d14df4f79781e56e949a0e9125c3b8ae1cab28..5bd6efbc5d2f9f90ce86a6dd2d2d595d3630133a 100644
--- a/src/events/scheduled/burst/burst.js
+++ b/src/events/scheduled/burst/burst.js
@@ -10,9 +10,14 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
 	}
 
 	execute(node) {
+		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null;
+		if (artRenderer) {
+			node.append(artRenderer.writePreamble());
+		}
+
 		for (const slave of this.actors.map(id => getSlave(id))) {
 			if (slave.womb.length > 0) {
-				node.append(birth(slave));
+				node.append(birth(slave, {artRenderer}));
 			} else {
 				node.append(pop(slave));
 			}
@@ -32,10 +37,8 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
 				He, His,
 				he, his, him
 			} = getPronouns(slave);
-			if (V.seeImages && V.seeReportImages) {
-				r.push(
-					App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"])
-				);
+			if (artRenderer) {
+				App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer);
 			}
 			r.push(`As ${slave.slaveName} is going about ${his} business with ${his} overfilled`);
 			if (slave.inflation !== 0) {
diff --git a/src/events/scheduled/murderAttempt.js b/src/events/scheduled/murderAttempt.js
index b00842c7800de7fe10a76c8df586d95c18c53397..618795bb12500d0626a613d3153178fa4d6e5a33 100644
--- a/src/events/scheduled/murderAttempt.js
+++ b/src/events/scheduled/murderAttempt.js
@@ -392,7 +392,7 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 	}
 };
 
-App.Events.MurderAttemptFollowup = class MurderAttemptTradeFollowup extends App.Events.BaseEvent {
+App.Events.MurderAttemptFollowup = class MurderAttemptFollowup extends App.Events.BaseEvent {
 	constructor(actors, params) {
 		super(actors, params);
 	}
@@ -424,7 +424,7 @@ App.Events.MurderAttemptFollowup = class MurderAttemptTradeFollowup extends App.
 	}
 
 	execute(node) {
-		const _this = this;
+		const that = this;
 		switch (this.params.variation) {
 			case "trade":
 				App.Events.addParagraph(node, tradeDeal());
@@ -440,7 +440,7 @@ App.Events.MurderAttemptFollowup = class MurderAttemptTradeFollowup extends App.
 		function tradeDeal() {
 			V.illegalDeals.trade = -1;
 			let r = [];
-			r.push(`Today you are receiving the delegation from the old world company wanting to buy into the lucrative Free Cities market. After showing them around your logistic centers and the cleaner industry areas, you leave them alone with the representatives from ${_this.params.company}.`);
+			r.push(`Today you are receiving the delegation from the old world company wanting to buy into the lucrative Free Cities market. After showing them around your logistic centers and the cleaner industry areas, you leave them alone with the representatives from ${that.params.company}.`);
 			const failChance = 20 - (V.PC.skill.trading / 10);
 			if (random(1, 100) > failChance) {
 				r.push(`The next day you receive a transaction of ${cashFormatColor(270000)}.`);
diff --git a/src/events/scheduled/pitFightNonlethal.js b/src/events/scheduled/pitFightNonlethal.js
index 04452b1a030282e703a7d0929c7cf3ccf6aa54fa..9761f9753a33ba7be28c80d85af0c810368898ce 100644
--- a/src/events/scheduled/pitFightNonlethal.js
+++ b/src/events/scheduled/pitFightNonlethal.js
@@ -627,7 +627,7 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 					cashX(500, "pit", winner);
 				}
 			} else if (loser.vagina > 0) {
-				r.push(`${winner.slaveName} wants to win badly enough that ${he} takes an extremely unpleasant shortcut to victory. The instant the fight starts, ${he} furiously goes for ${loser.slaveName}'s eyes${hasBothArms(winner) ? `, hands forming claws` : hasAnyArms(winner) ? `, ${his} hand forming a claw` : ``}. ${loser.slaveName} ${hasAnyArms(loser) ? `defends ${himself2} with ${his2} ${hasBothArms(loser) ? `arms` : `arm`}` : `tries to defend ${himself} as best ${he} can`}, at which point ${winner.slaveName} delivers a mighty cunt punt. ${loser.slaveName} goes straight down, ${his2} mouth soundlessly opening and closing and tears leaking from ${his2} closed eyes${hasAnyArms(loser) ? `while ${his} ${hasBothArms(loser) ? `hands` : `hand`} desperately shield${!hasBothArms(loser) ? `s` : ``} ${his2} outraged pussy` : ``}. ${winner.slaveName} follows ${him2} down and puts the unresisting ${girl2}'s head in a simple lock.`);
+				r.push(`${winner.slaveName} wants to win badly enough that ${he} takes an extremely unpleasant shortcut to victory. The instant the fight starts, ${he} furiously goes for ${loser.slaveName}'s eyes${hasBothArms(winner) ? `, hands forming claws` : hasAnyArms(winner) ? `, ${his} hand forming a claw` : ``}. ${loser.slaveName} ${hasAnyArms(loser) ? `defends ${himself2} with ${his2} ${hasBothArms(loser) ? `arms` : `arm`}` : `tries to defend ${himself} as best ${he} can`}, at which point ${winner.slaveName} delivers a mighty cunt punt. ${loser.slaveName} goes straight down, ${his2} mouth soundlessly opening and closing and tears leaking from ${his2} closed eyes${hasAnyArms(loser) ? ` while ${his} ${hasBothArms(loser) ? `hands` : `hand`} desperately shield${!hasBothArms(loser) ? `s` : ``} ${his2} outraged pussy` : ``}. ${winner.slaveName} follows ${him2} down and puts the unresisting ${girl2}'s head in a simple lock.`);
 
 				if (V.pit.audience === "free") {
 					r.push(`The audience is `, App.UI.DOM.makeElement("span", `not very impressed`, ["reputation", "inc"]), ` by this easy win.`);
diff --git a/src/events/scheduled/seCoursing.js b/src/events/scheduled/seCoursing.js
index 1b8f54c5b4be2b6918e9801c04fdca8720a3c88b..84a944970f03b0ec9dad767e14f42cb3cc36fb8a 100644
--- a/src/events/scheduled/seCoursing.js
+++ b/src/events/scheduled/seCoursing.js
@@ -174,7 +174,6 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
 				slave.weight = random(-20, 100);
-				slave.career = App.Data.Careers.General.young.random();
 			} else if (origin === "housewife") {
 				slave = GenerateNewSlave("XX", {minAge: 35, maxAge: 39, disableDisability: 1});
 				slave.boobs += 800;
@@ -187,8 +186,7 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 				slave.faceImplant += 20;
 				slave.anus = 1;
 				slave.vagina = 1;
-				slave.counter.anal += 1;
-				V.analTotal += 1;
+				actX(slave, "anal");
 				slave.preg = -1;
 				slave.ovaries = 1;
 				slave.skill.vaginal = 35;
diff --git a/src/events/scheduled/seFCTVinstall.js b/src/events/scheduled/seFCTVinstall.js
index 2f3c66f004f3946a81c5fd95afe081e1edd89f8f..02f2001995d5449412c5af58b7c596265cdfe154 100644
--- a/src/events/scheduled/seFCTVinstall.js
+++ b/src/events/scheduled/seFCTVinstall.js
@@ -1,4 +1,4 @@
-App.Events.SEFctvInstall = class SEHuskSlaveDelivery extends App.Events.BaseEvent {
+App.Events.SEFctvInstall = class SEFctvInstall extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
 			() => App.Events.effectiveWeek() >= 5,
diff --git a/src/events/scheduled/seFctvRemote.js b/src/events/scheduled/seFctvRemote.js
index 834a418f6097a2c9fa20bb2173bf855e699fb68d..f87d454d221c2c7342ab39db98bdbe2318a0d47c 100644
--- a/src/events/scheduled/seFctvRemote.js
+++ b/src/events/scheduled/seFctvRemote.js
@@ -286,7 +286,7 @@ App.Events.SEfctvRemote = class SEfctvRemote extends App.Events.BaseEvent {
 				r = [];
 				r.push(
 					Spoken(customer, `"Uh, that`),
-					App.UI.DOM.makeElement("span", Spoken(customer, `virgin ass!"`), "virginity loss"),
+					App.UI.DOM.makeElement("span", Spoken(customer, `virgin ass!"`), ["virginity", "loss"]),
 					`the customer exclaims.`,
 					Spoken(customer, `"How's THIS for an upgraded package. Last time I had a billing problem you folks told me where to shove it. Well. Here! It! Goes!"`),
 					`From the way they collapse over each other, it seems they orgasmed at about the same time.`
diff --git a/src/events/scheduled/seFctvWatch.js b/src/events/scheduled/seFctvWatch.js
index f001ded827e3c3497be266e005ae3c68e7424de2..5b4a72a55330de16f98efe4042902b5e3e601b7a 100644
--- a/src/events/scheduled/seFctvWatch.js
+++ b/src/events/scheduled/seFctvWatch.js
@@ -25,7 +25,7 @@ App.Events.SEfctvWatch = class SEfctvWatch extends App.Events.BaseEvent {
 			let div;
 			let span;
 			V.FCTV.pcViewership.count = V.FCTV.pcViewership.frequency;
-			let _possibleChannels = FCTV.channels();
+			let possibleChannels = FCTV.channels();
 
 			p = document.createElement("p");
 
@@ -113,7 +113,7 @@ App.Events.SEfctvWatch = class SEfctvWatch extends App.Events.BaseEvent {
 				let span;
 				const buttons = [];
 
-				for (const i of _possibleChannels) {
+				for (const i of possibleChannels) {
 					if (showChannel(i).canSelect > 0) {
 						if (selectedChannel !== i) { // Selected button
 							buttons.push(
diff --git a/src/events/scheduled/seHuskSlaveDelivery.js b/src/events/scheduled/seHuskSlaveDelivery.js
index 8f4b03d03b7fb0fa5b8be2247c587ade2134cd2a..1fc8b295e0ef6d6005b9c0912bda7e40d5021608 100644
--- a/src/events/scheduled/seHuskSlaveDelivery.js
+++ b/src/events/scheduled/seHuskSlaveDelivery.js
@@ -33,7 +33,7 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba
 		husk.slaveSurname = "";
 		husk.birthSurname = "";
 		husk.origin = "You reserved a mindless slave like $him from the Flesh Heap.";
-		applyMindbroken(husk);
+		applyMindbroken(husk, -100);
 		husk.career = "a Fuckdoll";
 
 		if (V.huskSlave.sex === 3) {
diff --git a/src/events/scheduled/seNicaeaCouncil.js b/src/events/scheduled/seNicaeaCouncil.js
index 8564c8cef97072814dab4550653bcb8d85a3a370..30bfbf853a6c6c0695a7a809e1c74bb0550383c6 100644
--- a/src/events/scheduled/seNicaeaCouncil.js
+++ b/src/events/scheduled/seNicaeaCouncil.js
@@ -82,8 +82,8 @@ App.Events.SENicaeaCouncil = class SENicaeaCouncil extends App.Events.BaseEvent
 		}
 
 		function concludeCouncil() {
-			V.nicaea.influence = 0;
 			repX(V.nicaea.influence * 10000, "event");
+			V.nicaea.influence = 0;
 			$(container).empty().append(councilInfluence());
 		}
 
diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js
index 07183058c3ade9db9a952464c99059da1f80637a..ad84394c81047c449437e7797343c3292534d0c2 100644
--- a/src/events/scheduled/sePlayerBirth.js
+++ b/src/events/scheduled/sePlayerBirth.js
@@ -10,121 +10,121 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 		V.nextLink = "Scheduled Event";
 		/** @type {boolean} */
 		let playerDead;
-		let _PCDegree = 0;
-		let _pregTypeDecrecement = WombReserveCount(V.PC, "incubator");
-		let _pregTypeDecrecementNursery = WombReserveCount(V.PC, "incubator");
-		let _concubinePresent;
-		let _seed;
+		let PCDegree = 0;
+		let pregTypeDecrecement = WombReserveCount(V.PC, "incubator");
+		let pregTypeDecrecementNursery = WombReserveCount(V.PC, "incubator");
+		let concubinePresent;
+		let seed;
 
-		let _identicalChildGen; // TODO: remove me
+		let identicalChildGen; // TODO: remove me
 
 		/* expand me with new variables to behave like slave birth */
-		let _badBirth;
+		let badBirth;
 		if (V.PC.counter.birthsTotal === 0) {
-			_badBirth = 30 + (V.PC.pregType * 4);
+			badBirth = 30 + (V.PC.pregType * 4);
 		} else {
-			_badBirth = 10;
+			badBirth = 10;
 		}
-		let _wounded = 0;
+		let wounded = 0;
 		const birthed = WombBirth(V.PC, 35);
 		/** @type {number} count of live babies after birth */
-		let _curBabies = birthed.length;
+		let curBabies = birthed.length;
 		/** @type {number} currently not used - it's just for future improvements. */
-		let _stillBirth = V.PC.womb.length;
+		let stillBirth = V.PC.womb.length;
 
 
-		let _gender;
-		if (_curBabies === 1) {
+		let gender;
+		if (curBabies === 1) {
 			if (birthed[0].genetics.gender === "XX") {
-				_gender = "XX";
+				gender = "XX";
 			} else {
-				_gender = "XY";
+				gender = "XY";
 			}
 		}
 
 		/* Difference in code below:
-		 * _curBabies - count of live babies after birth
+		 * curBabies - count of live babies after birth
 		 * V.PC.pregType = all babies in PC.
 		 * I assume that dead fetuses do not count to reputation, etc., and PC manages to hide them. This mainly for future possibilities, or early birth triggers.
 		 * PC will not support partial birth - even if she happens to be pregnant at different stages at once, undeveloped babies will be dead as result.
-		 * _stillBirth currently not used - it's just for future improvements. */
+		 * stillBirth currently not used - it's just for future improvements. */
 		V.PC.preg = 0;
 		V.PC.pregKnown = 0;
 		V.PC.labor = 0;
-		V.PC.counter.birthsTotal += _curBabies;
+		V.PC.counter.birthsTotal += curBabies;
 
 		/* setting the tallies for each type of child born */
-		let _others = 0;
-		let _self = 0;
-		let _citizens = 0;
-		let _oldMaster = 0;
-		let _arcOwner = 0;
-		let _clients = 0;
-		let _elite = 0;
-		let _lab = 0;
-		let _futaS = 0;
-		let _slavesLength = 0;
-		let _babies = [];
+		let others = 0;
+		let self = 0;
+		let citizens = 0;
+		let oldMaster = 0;
+		let arcOwner = 0;
+		let clients = 0;
+		let elite = 0;
+		let lab = 0;
+		let futaS = 0;
+		let slavesLength = 0;
+		let babies = [];
 		for (const baby of birthed) {
 			if (baby.fatherID === 0) {
-				_others++;
-				_babies.push("some guy");
+				others++;
+				babies.push("some guy");
 			} else if (baby.fatherID === -1) {
-				_self++;
-				_babies.push("your own");
+				self++;
+				babies.push("your own");
 			} else if (baby.fatherID === -2) {
-				_citizens++;
-				_babies.push("an arcology citizen");
+				citizens++;
+				babies.push("an arcology citizen");
 			} else if (baby.fatherID === -3) {
-				_oldMaster++;
-				_babies.push("your Master");
+				oldMaster++;
+				babies.push("your Master");
 			} else if (baby.fatherID === -4) {
-				_arcOwner++;
-				_babies.push("another arcology owner");
+				arcOwner++;
+				babies.push("another arcology owner");
 			} else if (baby.fatherID === -5) {
-				_clients++;
-				_babies.push("your client");
+				clients++;
+				babies.push("your client");
 			} else if (baby.fatherID === -6) {
-				_elite++;
-				_babies.push("the Societal Elite");
+				elite++;
+				babies.push("the Societal Elite");
 			} else if (baby.fatherID === -7) {
-				_lab++;
-				_babies.push("designer");
+				lab++;
+				babies.push("designer");
 			} else if (baby.fatherID === -9) {
-				_futaS++;
-				_babies.push("a Futanari Sister");
+				futaS++;
+				babies.push("a Futanari Sister");
 			} else {
-				const _babyDaddy = getSlave(baby.fatherID);
-				if (_babyDaddy) {
-					_slavesLength++;
-					_babies.push(String(_babyDaddy.slaveName));
+				const babyDaddy = getSlave(baby.fatherID);
+				if (babyDaddy) {
+					slavesLength++;
+					babies.push(String(babyDaddy.slaveName));
 				} else {
-					_others++;
-					_babies.push("some guy");
+					others++;
+					babies.push("some guy");
 				}
 			}
 		}
-		const _babiesReduced = removeDuplicates(_babies);
+		const babiesReduced = removeDuplicates(babies);
 
 		let r = [];
 
-		if ((_elite > 0 || _self > 0) && V.arcologies[0].FSRestart !== "unset") { /* for simplicity's sake, not going to allow other embryos to be added during an elite pregnancy */
+		if ((elite > 0 || self > 0) && V.arcologies[0].FSRestart !== "unset") { /* for simplicity's sake, not going to allow other embryos to be added during an elite pregnancy */
 			r.push(`Since you are heavily pregnant with`);
-			if (_elite + _self >= 2) {
+			if (elite + self >= 2) {
 				r.push(`children`);
 			} else {
 				r.push(`a child`);
 			}
 			r.push(`of the Societal Elite, you are quickly taken to the finest clinic the arcology has to offer. After a quick sedation, you awake to find your belly no longer round with child; that, and a note stating your next breeding partner and a notice that ${cashFormat(50000)} has been added to your account. The Societal Elite are <span class="green">very pleased</span> at their new addition to the ranks. You just wish you could have seen your`);
-			if (_curBabies === 1) {
+			if (curBabies === 1) {
 				r.push(`little`);
-				if (_gender === "XX") {
+				if (gender === "XX") {
 					r.push(`girl`);
 				} else {
 					r.push(`boy`);
 				}
 				r.push(`before they took`);
-				if (_gender === "XX") {
+				if (gender === "XX") {
 					r.push(`her`);
 				} else {
 					r.push(`him`);
@@ -133,16 +133,16 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				r.push(`babies before they took them`);
 			}
 			r.push(`away to be raised into`);
-			if (_curBabies > 1) {
+			if (curBabies > 1) {
 				r.push(`proper members`);
 			} else {
 				r.push(`a proper member`);
 			}
 			r.push(`of the future world.`);
-			V.PC.counter.birthElite += _elite;
+			V.PC.counter.birthElite += elite;
 			if (V.PC.ovaryAge >= 47 && V.playerAging === 2) {
 				r.push(`You are getting too old to have children; you feel like`);
-				if (_curBabies > 1) {
+				if (curBabies > 1) {
 					r.push(`they`);
 				} else {
 					r.push(`this`);
@@ -173,7 +173,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 			} = getPronouns(S.Concubine ? S.Concubine : {pronoun: App.Data.Pronouns.Kind.plural}).appendSuffix("2");
 			if (V.PC.belly < 100000) {
 				if (S.Concubine) {
-					_concubinePresent = 1;
+					concubinePresent = 1;
 				}
 				r.push(`After what feels like a`);
 				if (V.showInches === 2) {
@@ -185,7 +185,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				if (S.Nurse) {
 					const {he} = getPronouns(S.Nurse);
 					r.push(`<span class="pink">${S.Nurse.slaveName}</span> waiting for you with everything ${he} needs to be a capable midwife to you.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span>`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wraps ${his2} ${hasBothArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -207,7 +207,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						r.push(`ren`);
 					}
 					r.push(`from any dangers.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span>`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wraps ${his2} ${hasBothArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -219,7 +219,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				} else if (V.HeadGirlID !== 0) {
 					const {He, he} = getPronouns(S.HeadGirl);
 					r.push(`<span class="pink">${S.HeadGirl.slaveName}</span> is waiting for you. ${He} promises to do everything ${he} can to help you.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span>`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wraps ${his2} ${hasBothArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -228,7 +228,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						}
 						r.push(`you from behind, letting you know ${he2}'ll be here to comfort you while you labor.`);
 					}
-				} else if (_concubinePresent === 1) {
+				} else if (concubinePresent === 1) {
 					r.push(`<span class="pink">${S.Concubine.slaveName}</span> is waiting for you. ${He2} believes, if anything, that ${he2} could at least comfort you while you give birth.`);
 				} else {
 					r.push(`it quite empty. At least ${V.assistant.name} knows where you are should anything go wrong.`);
@@ -236,16 +236,16 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 			} else {
 				if (S.Concubine) {
 					if (!canWalk(S.Concubine)) {
-						_concubinePresent = 2;
+						concubinePresent = 2;
 					} else {
-						_concubinePresent = 1;
+						concubinePresent = 1;
 					}
 				}
 				r.push(`You barely make it half-way down the hall before you feel the first of your many children drop into position at the entrance to your birth canal. You try to keep going, but as it forces its way through your pelvis, spreading it wider, you're forced to the ground. Fortunately the penthouse is littered with supply rooms and closets, so you drag your laboring body into the nearest one instead. Fortunately, ${V.assistant.name} discretely directs`);
 				if (S.Nurse) {
 					const {he, him} = getPronouns(S.Nurse);
 					r.push(`<span class="pink">${S.Nurse.slaveName}</span> to you with everything ${he}'ll need to deliver your ${(V.PC.pregType > 1) ? "children" : "child"}.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span> bursts in after ${him} and circles around behind you before`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wrapping ${his2} ${hasAnyArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -257,7 +257,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				} else if (V.BodyguardID !== 0) {
 					const {He, he, his, him} = getPronouns(S.Bodyguard);
 					r.push(`<span class="pink">${S.Bodyguard.slaveName}</span> to your location. Ever since ${he} realized ${he} was protecting for not only you, but the lives you bear too, ${he} made sure to hone ${his} skills as a midwife to make sure ${he} could protect you and your unborn ${(V.PC.pregType > 1) ? "children" : "child"} from any dangers. ${He} apologizes profusely for not being there when you needed ${him} most; ${he} wanted to make sure everything was ready for your arrival.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span> bursts in after ${him} and circles around behind you before`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wrapping ${his2} ${hasAnyArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -269,7 +269,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				} else if (V.HeadGirlID !== 0) {
 					const {He, he, him} = getPronouns(S.HeadGirl);
 					r.push(`<span class="pink">${S.HeadGirl.slaveName}</span> to your location. ${He} promises to do everything ${he} can to help you.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`<span class="pink">${S.Concubine.slaveName}</span> bursts in after ${him} and circles around behind you before`);
 						if (hasAnyArms(S.Concubine)) {
 							r.push(`wrapping ${his2} ${hasAnyArms(S.Concubine) ? "arms" : "arm"} around`);
@@ -278,7 +278,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						}
 						r.push(`your contraction wracked middle. ${He2}'ll be here to comfort you while you labor.`);
 					}
-				} else if (_concubinePresent === 1) {
+				} else if (concubinePresent === 1) {
 					r.push(`<span class="pink">${S.Concubine.slaveName}</span> to your location. ${He2} believes, if anything, that ${he2} could at least comfort you while you give birth.`);
 				} else {
 					r.push(`a camera on the room you crawled into. At least ${V.assistant.name} knows where you are should anything go wrong.`);
@@ -287,7 +287,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 			App.Events.addParagraph(node, r);
 			r = [];
 			r.push(`You arrange yourself to give birth, relaxing until your body urges you to begin bearing down and pushing your child into the world.`);
-			if (_concubinePresent === 1) {
+			if (concubinePresent === 1) {
 				r.push(`${S.Concubine.slaveName} settles in beside you, one hand soothing your contraction wracked middle and the other`);
 				if (V.PC.dick !== 0) {
 					r.push(`stroking your hardening dick.`);
@@ -295,15 +295,15 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					r.push(`teasing your stiffening clit.`);
 				}
 			}
-			if (_badBirth > random(1, 100)) { /* shits going wrong */
+			if (badBirth > random(1, 100)) { /* shits going wrong */
 				if (S.Nurse) {
 					const {he, his} = getPronouns(S.Nurse);
 					r.push(`You keep pushing and pushing, but your child is not coming out.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`${S.Concubine.slaveName} shifts to massaging your gravid middle${canTalk(S.Concubine) ? ", while whispering words of encouragement into your ear" : ""} until ${S.Nurse.slaveName} shoos ${him2} away so ${he} can take over and get this baby out of you.`);
 					}
 					r.push(`${S.Nurse.slaveName} was prepared for this possibility, adjusts your position and timings, and before long is holding your <span class="lime">new baby`);
-					if (_gender === "XX") {
+					if (gender === "XX") {
 						r.push(`girl`);
 					} else {
 						r.push(`boy`);
@@ -321,7 +321,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				} else if (V.BodyguardID !== 0) {
 					const {he, his} = getPronouns(S.Bodyguard);
 					r.push(`You keep pushing and pushing, but your child is not coming out.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`${S.Concubine.slaveName} shifts to massaging your gravid middle${canTalk(S.Concubine) ? ", while whispering words of encouragement into your ear" : ""}. ${He2} begins to worry as ${his2} lover weakens in front of ${him2}. ${S.Bodyguard.slaveName} quickly pulls ${him2} away from you, fearing the worst.`);
 					}
 					r.push(`${S.Bodyguard.slaveName} read about this possibility and tries everything ${he} can to coax your child out. As time passes, ${he} notices your consciousness begin to fade as exhaustion kicks in. Fearing for your lives, and desperate to save you, ${he} draws ${his} sword from its sheath, hands unsteady from what ${he} is about to do. Carefully, ${he} slits your lower abdomen, allowing your baby-`);
@@ -342,25 +342,25 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					App.Events.addParagraph(node, r);
 					r = [];
 					r.push(`You awake some time later in the remote surgery, your stomach extremely sore; you quickly realize you're no longer round with child. As you try to rise, ${S.Bodyguard.slaveName} stops you; ${he} hefts you into a bridal carry and takes you to a recovery room, before gently placing you into a warm bed, tucking you in, and hurrying out of the room. Before you can call out, ${he} returns carrying`);
-					if (_curBabies === 1) {
+					if (curBabies === 1) {
 						r.push(`<span class="lime">your baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl`);
 						} else {
 							r.push(`boy`);
 						}
 						r.push(`</span>`);
-					} else if (_curBabies < 6) {
-						r.push(`<span class="lime">your newborn ${pregNumberName(_curBabies, 2)}</span>`);
+					} else if (curBabies < 6) {
+						r.push(`<span class="lime">your newborn ${pregNumberName(curBabies, 2)}</span>`);
 					} else {
-						r.push(`a big bassinet containing <span class="lime">your newborn pregNumberName(_curBabies, 2)</span>`);
+						r.push(`a big bassinet containing <span class="lime">your newborn ${pregNumberName(curBabies, 2)}</span>`);
 					}
 					r.push(`in ${his} arms.`);
-					_wounded = 1;
+					wounded = 1;
 				} else if (V.HeadGirlID !== 0) {
 					const {he, his, him} = getPronouns(S.HeadGirl);
 					r.push(`You keep pushing and pushing, but your child is not coming out.`);
-					if (_concubinePresent === 1) {
+					if (concubinePresent === 1) {
 						r.push(`${S.Concubine.slaveName} shifts to massaging your gravid middle${canTalk(S.Concubine) ? ", while whispering words of encouragement into your ear" : ""}. ${He2} begins to worry as ${his2} lover weakens in front of ${him2}. ${S.HeadGirl.slaveName} quickly pulls ${him2} to`);
 						if (hasBothLegs(S.Concubine)) {
 							r.push(`${his2} feet`);
@@ -393,10 +393,10 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					}
 					App.Events.addParagraph(node, r);
 					r = [];
-					r.push(`You awake some time later in a recovery room${(_concubinePresent > 0) ? `, ${S.Concubine.slaveName} beside you` : ""}, your stomach extremely sore; a quick glance at the prominent scar tells you everything you need to know. Seeing you're awake, ${S.HeadGirl.slaveName} catches your attention. In ${his} arms`);
-					if (_curBabies === 1) {
+					r.push(`You awake some time later in a recovery room${(concubinePresent > 0) ? `, ${S.Concubine.slaveName} beside you` : ""}, your stomach extremely sore; a quick glance at the prominent scar tells you everything you need to know. Seeing you're awake, ${S.HeadGirl.slaveName} catches your attention. In ${his} arms`);
+					if (curBabies === 1) {
 						r.push(`is <span class="lime">your baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl,</span>`);
 						} else {
 							r.push(`boy,</span>`);
@@ -405,14 +405,14 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`happily nursing from ${his} breast,`);
 						}
 					} else {
-						r.push(`are <span class="lime">your newborn ${pregNumberName(_curBabies, 2)},</span>`);
+						r.push(`are <span class="lime">your newborn ${pregNumberName(curBabies, 2)},</span>`);
 						if (S.HeadGirl.lactation > 0) {
 							r.push(`happily nursing from ${his} breasts,`);
 						}
 					}
 					r.push(`alive and well.`);
-					_wounded = 1;
-				} else if (_concubinePresent === 1) {
+					wounded = 1;
+				} else if (concubinePresent === 1) {
 					r.push(`You keep pushing and pushing, but your child is not coming out.`);
 					if (canWalk(S.Concubine)) {
 						r.push(`In a panic, ${S.Concubine.slaveName} carries you to the remote surgery.`);
@@ -422,9 +422,9 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					App.Events.addParagraph(node, r);
 					r = [];
 					r.push(`You awake some time later in a recovery room, your stomach extremely sore; a quick glance at the prominent scar tells you everything you need to know. A content sigh comes from beside you; ${S.Concubine.slaveName} is snuggled next to you, snoozing with`);
-					if (_curBabies === 1) {
+					if (curBabies === 1) {
 						r.push(`<span class="lime">your baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl`);
 						} else {
 							r.push(`boy`);
@@ -434,7 +434,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`Your child has managed to free one of ${S.Concubine.slaveName}'s breasts and is eagerly suckling from its milky nipple.`);
 						}
 					} else {
-						r.push(`<span class="lime">your newborn ${pregNumberName(_curBabies, 2)}</span> in ${his2} arms.`);
+						r.push(`<span class="lime">your newborn ${pregNumberName(curBabies, 2)}</span> in ${his2} arms.`);
 						if (S.Concubine.lactation > 0) {
 							r.push(`Your children have managed to free ${S.Concubine.slaveName}'s breasts and are eagerly suckling from their milky nipples.`);
 						}
@@ -458,7 +458,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`You don't know how ${he2} managed to get you here, since ${he2} can't walk${(V.PC.pregType >= 8) ? ", especially with how heavy your pregnancy was" : ""}, but you're thankful either way.`);
 						}
 					}
-					_wounded = 1;
+					wounded = 1;
 				} else {
 					r.push(`You keep pushing and pushing, but your child is not coming out. <span class="red">Something is wrong,</span> but you keep persisting.`);
 					playerDead = true;
@@ -471,20 +471,20 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				if (S.Nurse) {
 					r.push(`Under ${S.Nurse.slaveName}'s guidance, childbirth is a breeze for you.`);
 					if (V.PC.pregType === 1) {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or it would have been, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName}, ${S.Nurse.slaveName}, and your newborn getting sprayed with cum.`);
 							}
 						}
 						r.push(`${S.Nurse.slaveName} cuts the cord, swaddles your child, and hands you <span class="lime">your new baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl.</span>`);
 						} else {
 							r.push(`boy.</span>`);
 						}
 					} else {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or it would have been, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your first child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName},${S.Nurse.slaveName}, and your newborn getting sprayed with cum.`);
@@ -500,7 +500,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							} else {
 								r.push(`canal`);
 							}
-							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(_curBabies)} children and ${num(_curBabies)} intense orgasms, you're barely conscious. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
+							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(curBabies)} children and ${num(curBabies)} intense orgasms, you're barely conscious. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
 						} else {
 							r.push(`With one out, you realize`);
 							if (V.PC.pregType >= 6) {
@@ -522,26 +522,26 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							}
 							r.push(`descent; you'll be at this for awhile. With ${S.Nurse.slaveName} around, you aren't worried at all.`);
 						}
-						r.push(`${S.Nurse.slaveName} cuts the cords, swaddles your children, and hands you <span class="lime">your new ${pregNumberName(_curBabies, 2)}.</span>`);
+						r.push(`${S.Nurse.slaveName} cuts the cords, swaddles your children, and hands you <span class="lime">your new ${pregNumberName(curBabies, 2)}.</span>`);
 					}
 				} else if (V.BodyguardID !== 0) {
 					const {his} = getPronouns(S.Bodyguard);
 					r.push(`With ${S.Bodyguard.slaveName} watching over you, you feel safe enough to let your guard down and focus on giving birth. Once you are relaxed, you feel your child begin to inch down your birth canal. Before long you've completed the job without any trouble.`);
 					if (V.PC.pregType === 1) {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or it would have, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName},${S.Bodyguard.slaveName}, and your newborn getting sprayed with cum.`);
 							}
 						}
 						r.push(`${S.Bodyguard.slaveName} cuts the cord with ${his} blade, and hands you <span class="lime">your new baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl.</span>`);
 						} else {
 							r.push(`boy.</span>`);
 						}
 					} else {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or you would have, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName}, ${S.Bodyguard.slaveName}, and your newborn getting sprayed with cum.`);
@@ -557,7 +557,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							} else {
 								r.push(`canal`);
 							}
-							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(_curBabies)} children and ${num(_curBabies)} intense orgasms, you're barely conscious, nearly panicking ${S.Bodyguard.slaveName}. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
+							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(curBabies)} children and ${num(curBabies)} intense orgasms, you're barely conscious, nearly panicking ${S.Bodyguard.slaveName}. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
 						} else {
 							r.push(`With one out, you realize`);
 							if (V.PC.pregType >= 6) {
@@ -579,25 +579,25 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							}
 							r.push(`descent; you'll be at this for awhile. With ${S.Bodyguard.slaveName} around, you feel completely safe.`);
 						}
-						r.push(`${S.Bodyguard.slaveName} cuts the cords with ${his} blade, and hands you <span class="lime">your new ${pregNumberName(_curBabies, 2)}.</span>`);
+						r.push(`${S.Bodyguard.slaveName} cuts the cords with ${his} blade, and hands you <span class="lime">your new ${pregNumberName(curBabies, 2)}.</span>`);
 					}
 				} else if (V.HeadGirlID !== 0) {
 					r.push(`With ${S.HeadGirl.slaveName} waiting with everything you need, childbirth goes by without a hitch.`);
 					if (V.PC.pregType === 1) {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or it would have been, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName},${S.HeadGirl.slaveName}, and your newborn getting sprayed with cum.`);
 							}
 						}
 						r.push(`${S.HeadGirl.slaveName} cuts the cord, swaddles your child, and hands you <span class="lime">your new baby`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`girl.</span>`);
 						} else {
 							r.push(`boy.</span>`);
 						}
 					} else {
-						if (_concubinePresent === 1) {
+						if (concubinePresent === 1) {
 							r.push(`Or it would have been, had ${S.Concubine.slaveName} not driven you to an intense orgasm right as your first child entered the world.`);
 							if (V.PC.balls >= 9) {
 								r.push(`An orgasm that resulted in ${S.Concubine.slaveName},${S.HeadGirl.slaveName}, and your newborn getting sprayed with cum.`);
@@ -613,7 +613,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							} else {
 								r.push(`canal`);
 							}
-							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(_curBabies)} children and ${num(_curBabies)} intense orgasms, you're barely conscious. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
+							r.push(`and immediately pushes you back over the edge. In minutes, after ${num(curBabies)} children and ${num(curBabies)} intense orgasms, you're barely conscious. ${S.Concubine.slaveName} slides in behind you to snuggle with you as you return to your senses.`);
 						} else {
 							r.push(`With one out, you realize`);
 							if (V.PC.pregType >= 6) {
@@ -635,11 +635,11 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							}
 							r.push(`descent; you'll be at this for awhile. With ${S.HeadGirl.slaveName} around, you know everything is under control.`);
 						}
-						r.push(`${S.HeadGirl.slaveName} cuts the cords, swaddles your children, and hands you <span class="lime">your new ${pregNumberName(_curBabies, 2)}.</span>`);
+						r.push(`${S.HeadGirl.slaveName} cuts the cords, swaddles your children, and hands you <span class="lime">your new ${pregNumberName(curBabies, 2)}.</span>`);
 					}
-				} else if (_concubinePresent === 1) {
+				} else if (concubinePresent === 1) {
 					r.push(`${S.Concubine.slaveName} alternates between calming your nerves and driving your to orgasm. It works fairly well, as your child rapidly enters the world alongside a particularly powerful climax. You reach down and draw <span class="lime">your new baby`);
-					if (_gender === "XX") {
+					if (gender === "XX") {
 						r.push(`girl`);
 					} else {
 						r.push(`boy`);
@@ -668,7 +668,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					}
 				} else {
 					r.push(`You keep pushing and pushing, your child slowly working its way from your body. With the last of your strength, you bear down, freeing your child from your body at last. Panting, you gather <span class="lime">your new baby`);
-					if (_gender === "XX") {
+					if (gender === "XX") {
 						r.push(`girl`);
 					} else {
 						r.push(`boy`);
@@ -715,7 +715,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						if (V.PC.pregType >= 6) {
 							r.push(`thoroughly`);
 						}
-						r.push(`exhausted by the time you've pushed out your ${pregNumberName(_curBabies, 2)},`);
+						r.push(`exhausted by the time you've pushed out your ${pregNumberName(curBabies, 2)},`);
 						if (V.PC.pregType >= 8) {
 							r.push(`unable to even`);
 						} else {
@@ -729,70 +729,70 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 			App.Events.addParagraph(node, r);
 			r = [];
 			if (!playerDead) {
-				V.PC.counter.birthOther += _others;
-				V.PC.counter.birthSelf += _self;
-				V.PC.counter.birthCitizen += _citizens;
-				V.PC.counter.birthMaster += _oldMaster;
-				V.PC.counter.birthArcOwner += _arcOwner;
-				V.PC.counter.birthClient += _clients;
-				V.PC.counter.birthElite += _elite;
-				V.PC.counter.birthLab += _lab;
-				V.PC.counter.birthDegenerate += _slavesLength;
+				V.PC.counter.birthOther += others;
+				V.PC.counter.birthSelf += self;
+				V.PC.counter.birthCitizen += citizens;
+				V.PC.counter.birthMaster += oldMaster;
+				V.PC.counter.birthArcOwner += arcOwner;
+				V.PC.counter.birthClient += clients;
+				V.PC.counter.birthElite += elite;
+				V.PC.counter.birthLab += lab;
+				V.PC.counter.birthDegenerate += slavesLength;
 
-				if (_curBabies === 1) {
-					let _p = 0;
-					if (birthed[_p].genetics.race === V.PC.origRace) {
-						_PCDegree++;
+				if (curBabies === 1) {
+					let p = 0;
+					if (birthed[p].genetics.race === V.PC.origRace) {
+						PCDegree++;
 					}
-					if (birthed[_p].genetics.hColor === V.PC.hColor) {
-						_PCDegree++;
+					if (birthed[p].genetics.hColor === V.PC.hColor) {
+						PCDegree++;
 					}
-					if (birthed[_p].genetics.skin === V.PC.skin) {
-						_PCDegree++;
+					if (birthed[p].genetics.skin === V.PC.skin) {
+						PCDegree++;
 					}
-					if (birthed[_p].genetics.eyeColor === V.PC.eye.origColor) {
-						_PCDegree++;
+					if (birthed[p].genetics.eyeColor === V.PC.eye.origColor) {
+						PCDegree++;
 					}
 
 					r.push(`Your little`);
-					if (_gender === "XX") {
+					if (gender === "XX") {
 						r.push(`girl`);
 					} else {
 						r.push(`boy`);
 					}
 					if (V.PC.pregSource === -1) {
 						r.push(`looks exactly like you, in fact, the resemblance seems uncanny. Since`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she`);
 						} else {
 							r.push(`he`);
 						}
 						r.push(`has the exact same genetics as you,`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she'll`);
 						} else {
 							r.push(`he'll`);
 						}
 						r.push(`likely look almost identical to you when`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she's`);
 						} else {
 							r.push(`he's`);
 						}
 						r.push(`your age.`);
-					} else if (_PCDegree === 4) {
+					} else if (PCDegree === 4) {
 						r.push(`looks just like you;`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she`);
 						} else {
 							r.push(`he`);
 						}
 						r.push(`will likely grow up to closely resemble yourself.`);
-					} else if (birthed[_p].genetics.eyeColor === V.PC.eye.origColor) {
+					} else if (birthed[p].genetics.eyeColor === V.PC.eye.origColor) {
 						r.push(`has your lovely ${V.PC.eye.origColor} eyes.`);
-					} else if (_PCDegree > 0) {
+					} else if (PCDegree > 0) {
 						r.push(`looks a little like you, enough that`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she'll`);
 						} else {
 							r.push(`he'll`);
@@ -800,7 +800,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						r.push(`be recognizable as yours.`);
 					} else {
 						r.push(`looks nothing like you; it's hard to believe`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`she's your daughter`);
 						} else {
 							r.push(`he's you son`);
@@ -809,7 +809,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 
 					if (birthed[0].reserve === "incubator") {
 						r.push(`<span class="pink">You set`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`her`);
 						} else {
 							r.push(`him`);
@@ -820,7 +820,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						}
 					} else if (birthed[0].reserve === "nursery") {
 						r.push(`<span class="pink">You set`);
-						if (_gender === "XX") {
+						if (gender === "XX") {
 							r.push(`her`);
 						} else {
 							r.push(`him`);
@@ -831,54 +831,54 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						}
 					}
 					birthed.shift();
-				} else if (_curBabies > 1) {
-					let _firstChild = 1;
-					for (let _p = 0; _p < _curBabies; _p++) {
-						_PCDegree = 0;
+				} else if (curBabies > 1) {
+					let firstChild = 1;
+					for (let p = 0; p < curBabies; p++) {
+						PCDegree = 0;
 						if (birthed[0].genetics.race === V.PC.origRace) { // TODO: Fixme "0" is from TW; error?
-							_PCDegree++;
+							PCDegree++;
 						}
-						if (birthed[_p].genetics.hColor === V.PC.hColor) {
-							_PCDegree++;
+						if (birthed[p].genetics.hColor === V.PC.hColor) {
+							PCDegree++;
 						}
-						if (birthed[_p].genetics.skin === V.PC.skin) {
-							_PCDegree++;
+						if (birthed[p].genetics.skin === V.PC.skin) {
+							PCDegree++;
 						}
-						if (birthed[_p].genetics.eyeColor === V.PC.eye.origColor) {
-							_PCDegree++;
+						if (birthed[p].genetics.eyeColor === V.PC.eye.origColor) {
+							PCDegree++;
 						}
 
-						if (_firstChild === 1) {
+						if (firstChild === 1) {
 							r.push(`Your first`);
-							_firstChild = 0;
+							firstChild = 0;
 						} else {
 							r.push(`The next`);
 						}
 						r.push(`little`);
-						if (birthed[_p].genetics.gender === "XX") {
+						if (birthed[p].genetics.gender === "XX") {
 							r.push(`girl`);
 						} else {
 							r.push(`boy`);
 						}
-						if (_identicalChildGen === 1) { // TODO: fixme: completely unique variable. -_-
+						if (identicalChildGen === 1) { // TODO: fixme: completely unique variable. -_-
 							r.push(`looks exactly like the previous; they're identical twins.`);
 						} else if (V.PC.pregSource === -1) {
 							r.push(`looks exactly like`);
-							if (_p === 0) {
+							if (p === 0) {
 								r.push(`you, in fact, the resemblance seems uncanny. Since`);
-								if (birthed[_p].genetics.gender === "XX") {
+								if (birthed[p].genetics.gender === "XX") {
 									r.push(`she`);
 								} else {
 									r.push(`he`);
 								}
 								r.push(`has the exact same genetics as you,`);
-								if (birthed[_p].genetics.gender === "XX") {
+								if (birthed[p].genetics.gender === "XX") {
 									r.push(`she'll`);
 								} else {
 									r.push(`he'll`);
 								}
 								r.push(`likely look almost identical to you when`);
-								if (birthed[_p].genetics.gender === "XX") {
+								if (birthed[p].genetics.gender === "XX") {
 									r.push(`she's`);
 								} else {
 									r.push(`he's`);
@@ -888,19 +888,19 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 								r.push(`you.`);
 							}
 							r.push(`Every one of your children look this way; it's kind of hard to tell them apart.`);
-						} else if (_PCDegree === 4) {
+						} else if (PCDegree === 4) {
 							r.push(`looks just like you;`);
-							if (birthed[_p].genetics.gender === "XX") {
+							if (birthed[p].genetics.gender === "XX") {
 								r.push(`she`);
 							} else {
 								r.push(`he`);
 							}
 							r.push(`will likely grow up to closely resemble yourself.`);
-						} else if (birthed[_p].genetics.eyeColor === V.PC.eye.origColor) {
+						} else if (birthed[p].genetics.eyeColor === V.PC.eye.origColor) {
 							r.push(`has your lovely ${V.PC.eye.origColor} eyes.`);
-						} else if (_PCDegree > 0) {
+						} else if (PCDegree > 0) {
 							r.push(`looks a little like you, enough that`);
-							if (birthed[_p].genetics.gender === "XX") {
+							if (birthed[p].genetics.gender === "XX") {
 								r.push(`she'll`);
 							} else {
 								r.push(`he'll`);
@@ -908,71 +908,71 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`be recognizable as yours.`);
 						} else {
 							r.push(`looks nothing like you; it's hard to believe`);
-							if (birthed[_p].genetics.gender === "XX") {
+							if (birthed[p].genetics.gender === "XX") {
 								r.push(`she's your daughter`);
 							} else {
 								r.push(`he's your son`);
 							}
 						}
-						if (birthed[_p].reserve === "incubator") {
+						if (birthed[p].reserve === "incubator") {
 							r.push(`<span class="pink">You set`);
-							if (birthed[_p].genetics.gender === "XX") {
+							if (birthed[p].genetics.gender === "XX") {
 								r.push(`her`);
 							} else {
 								r.push(`him`);
 							}
 							r.push(`aside for incubation.</span>`);
 							if (V.incubator.tanks.length < V.incubator.capacity) {
-								App.Facilities.Incubator.newChild(generateChild(V.PC, birthed[_p], true));
+								App.Facilities.Incubator.newChild(generateChild(V.PC, birthed[p], true));
 							}
-							birthed.splice(birthed[_p], 1);
-							_p--;
-							_curBabies--;
-						} else if (birthed[_p].reserve === "nursery") {
+							birthed.splice(birthed[p], 1);
+							p--;
+							curBabies--;
+						} else if (birthed[p].reserve === "nursery") {
 							r.push(`<span class="pink">You set`);
-							if (birthed[_p].genetics.gender === "XX") {
+							if (birthed[p].genetics.gender === "XX") {
 								r.push(`her`);
 							} else {
 								r.push(`him`);
 							}
 							r.push(`aside to be raised in the penthouse.</span>`);
 							if (V.cribs.length < V.nursery) {
-								App.Facilities.Nursery.newChild(generateChild(V.PC, birthed[_p]));
+								App.Facilities.Nursery.newChild(generateChild(V.PC, birthed[p]));
 							}
-							birthed.splice(birthed[_p], 1);
-							_p--;
-							_curBabies--;
+							birthed.splice(birthed[p], 1);
+							p--;
+							curBabies--;
 						}
 					}
 
 					r.push(`All in all, you've bought a healthy group of`);
-					if (_babiesReduced.length > 2) {
-						for (let _spb = 0; _spb < _babiesReduced.length; _spb++) {
-							if (_spb < _babiesReduced.length - 1) {
-								r.push(`${_babiesReduced[_spb]},`);
+					if (babiesReduced.length > 2) {
+						for (let spb = 0; spb < babiesReduced.length; spb++) {
+							if (spb < babiesReduced.length - 1) {
+								r.push(`${babiesReduced[spb]},`);
 							} else {
-								r.push(`and${_babiesReduced[_spb]}'s`);
+								r.push(`and${babiesReduced[spb]}'s`);
 							}
 						}
-					} else if (_babiesReduced.length > 1) {
-						r.push(`${_babiesReduced[0]} and ${_babiesReduced[1]}'s`);
+					} else if (babiesReduced.length > 1) {
+						r.push(`${babiesReduced[0]} and ${babiesReduced[1]}'s`);
 					} else {
-						if (_babiesReduced[0] !== "your own" && _babiesReduced[0] !== "designer") {
-							r.push(`${_babiesReduced[0]}'s`);
+						if (babiesReduced[0] !== "your own" && babiesReduced[0] !== "designer") {
+							r.push(`${babiesReduced[0]}'s`);
 						} else {
-							r.push(_babiesReduced[0]);
+							r.push(babiesReduced[0]);
 						}
 					}
 					r.push(`babies into the world.`);
 				}
 
 
-				if (V.PC.pregSource > 0 && _curBabies > 0) {
-					let _pb = findFather(V.PC.pregSource);
-					if (_pb) {
+				if (V.PC.pregSource > 0 && curBabies > 0) {
+					let pb = findFather(V.PC.pregSource);
+					if (pb) {
 						if (V.arcologies[0].FSRestartDecoration === 100 && V.eugenicsFullControl !== 1) {
 							r.push(`Word spreads fast through your peers that you gave birth to`);
-							if (_curBabies > 1) {
+							if (curBabies > 1) {
 								r.push(`low class infants`);
 							} else {
 								r.push(`a low class child`);
@@ -980,11 +980,11 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`<span class="red">utterly devastating your standing among the Elite.</span>`);
 							V.failedElite += 200;
 						} else if (V.arcologies[0].FSChattelReligionistLaw === 1) {
-							r.push(`Rumors spread that The Prophet gave birth to a slave's ${(_curBabies > 1) ? "children" : "child"}.`);
+							r.push(`Rumors spread that The Prophet gave birth to a slave's ${(curBabies > 1) ? "children" : "child"}.`);
 							if (V.arcologies[0].FSSupremacist !== "unset") {
-								if (_pb.race !== V.arcologies[0].FSSupremacistRace) {
+								if (pb.race !== V.arcologies[0].FSSupremacistRace) {
 									r.push(`Word is that your child`);
-									if (_curBabies > 1) {
+									if (curBabies > 1) {
 										r.push(`ren were`);
 									} else {
 										r.push(`was`);
@@ -994,14 +994,14 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 								}
 							}
 							if (V.arcologies[0].FSSubjugationist !== "unset") {
-								if (_pb.race === V.arcologies[0].FSSubjugationistRace) {
-									r.push(`In addition, The Prophet's womb bore ${V.arcologies[0].FSSubjugationistRace} ${(_curBabies > 1) ? "children" : "a child"}, surely a sign to <span class="red">reject ${V.arcologies[0].FSSubjugationistRace} subjugation.</span>`);
+								if (pb.race === V.arcologies[0].FSSubjugationistRace) {
+									r.push(`In addition, The Prophet's womb bore ${V.arcologies[0].FSSubjugationistRace} ${(curBabies > 1) ? "children" : "a child"}, surely a sign to <span class="red">reject ${V.arcologies[0].FSSubjugationistRace} subjugation.</span>`);
 									V.arcologies[0].FSSubjugationist -= 120;
 								}
 							}
 						} else {
 							r.push(`Rumors spread that your child`);
-							if (_curBabies > 1) {
+							if (curBabies > 1) {
 								r.push(`ren were`);
 							} else {
 								r.push(`was`);
@@ -1009,9 +1009,9 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 							r.push(`fathered by a slave, <span class="red">harming your lasting reputation.</span>`);
 							V.PC.degeneracy += 20;
 							if (V.arcologies[0].FSSupremacist !== "unset") {
-								if (_pb.race !== V.arcologies[0].FSSupremacistRace) {
+								if (pb.race !== V.arcologies[0].FSSupremacistRace) {
 									r.push(`Furthermore, word is that your child`);
-									if (_curBabies > 1) {
+									if (curBabies > 1) {
 										r.push(`ren were`);
 									} else {
 										r.push(`was`);
@@ -1021,8 +1021,8 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 								}
 							}
 							if (V.arcologies[0].FSSubjugationist !== "unset") {
-								if (_pb.race === V.arcologies[0].FSSubjugationistRace) {
-									r.push(`In addition, there is a nasty rumor that you gave birth to ${V.arcologies[0].FSSubjugationistRace} ${(_curBabies > 1) ? "children" : "a child"}, <span class="red">devastating your lasting reputation.</span>`);
+								if (pb.race === V.arcologies[0].FSSubjugationistRace) {
+									r.push(`In addition, there is a nasty rumor that you gave birth to ${V.arcologies[0].FSSubjugationistRace} ${(curBabies > 1) ? "children" : "a child"}, <span class="red">devastating your lasting reputation.</span>`);
 									V.PC.degeneracy += 50;
 								}
 							}
@@ -1031,19 +1031,19 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				}
 
 				/* -------------------- Now curBabies counts live, birthed babies who haven't been placed in the incubator. */
-				_curBabies = birthed.length;
+				curBabies = birthed.length;
 
-				if (_curBabies > 0) {
+				if (curBabies > 0) {
 					App.Events.addParagraph(node, r);
 					r = [];
 					r.push(`Now you are faced with a decision of what to do with your`);
-					if (_pregTypeDecrecement > 0) {
+					if (pregTypeDecrecement > 0) {
 						r.push(`remaining`);
 					} else {
 						r.push(`new`);
 					}
-					r.push(`${(_curBabies > 1) ? "children" : "child"}. You're far too busy to keep`);
-					if (_curBabies > 1) {
+					r.push(`${(curBabies > 1) ? "children" : "child"}. You're far too busy to keep`);
+					if (curBabies > 1) {
 						r.push(`them`);
 					} else {
 						r.push(`it`);
@@ -1051,8 +1051,8 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					r.push(`yourself, but you could <span class="orange">send them to a boarding school to be raised until they are of age to serve as your heir.</span> Other options include sending them to <span class="orange">become a slave at a slave orphanage,</span> sending them to <span class="orange">a citizen school,</span> to be brought up coequal with the arcology's other young people, or sending them to be <span class="orange">raised privately,</span> with expert care and tutoring.`);
 					if (V.arcologies[0].FSRepopulationFocus > 40) {
 						r.push(`Of course, there are also the <span class="orange">breeding schools,</span> where your`);
-						if (_curBabies === 1) {
-							if (_gender === "XX") {
+						if (curBabies === 1) {
+							if (gender === "XX") {
 								r.push(`daughter will be taught the joys of motherhood up until she is around`);
 								if (V.minimumSlaveAge > V.fertilityAge) {
 									r.push(`${V.minimumSlaveAge}`);
@@ -1064,7 +1064,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 								r.push(`son will be taught it is his duty to fuck every slavegirl he sees without a baby bump pregnant.`);
 							}
 						} else {
-							if (_gender === "XX") {
+							if (gender === "XX") {
 								r.push(`daughters will be taught the joys of motherhood up until they are around`);
 								if (V.minimumSlaveAge > V.fertilityAge) {
 									r.push(`${V.minimumSlaveAge}`);
@@ -1072,7 +1072,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 									r.push(`${V.fertilityAge}`);
 								}
 								r.push(`years old, when they will be impregnated for the first time.`);
-								if (_curBabies > 1) {
+								if (curBabies > 1) {
 									r.push(`They say multiples run in families, so your daughters should blossom into quite the fertile breeders.`);
 								}
 							} else {
@@ -1081,7 +1081,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						}
 					}
 					if (V.policies.cash4Babies === 1) {
-						_seed = random(1, 10);
+						seed = random(1, 10);
 						r.push(`Alternatively, since it is <span class="orange">legal to sell slave babies,</span> your child should be worth quite a pretty ¤ at auction.`);
 					}
 					if (((V.eliteFail > 0 || V.eugenicsFullControl > 0) && V.PC.pregSource === -1) || V.PC.pregSource === -6) {
@@ -1108,7 +1108,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 						choices.push(new App.Events.Result(`Auction Them`, auction));
 					}
 					if (((V.eliteFail > 0 || V.eugenicsFullControl > 0) && V.PC.pregSource === -1) || V.PC.pregSource === -6) {
-						choices.push(new App.Events.Result(`Societal Elite`, elite));
+						choices.push(new App.Events.Result(`Societal Elite`, eliteRaise));
 					}
 					if (V.PC.pregSource === -9) {
 						choices.push(new App.Events.Result(`Futanari Sisters`, futa));
@@ -1123,7 +1123,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 					V.PC.preg = -2;
 				}
 
-				if (_wounded === 1) {
+				if (wounded === 1) {
 					r.push(`Things didn't quite go as planned, leaving you <span class="health.dec">weak and wounded.</span> You'll need a couple weeks to recover from the ordeal before you're back on your feet.`);
 					healthDamage(V.PC, 40);
 				}
@@ -1131,7 +1131,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 		}/* closes SE*/
 
 		/* belly sag is a thing now, USE IT! */
-		_badBirth = 0;
+		badBirth = 0;
 		WombFlush(V.PC);
 		if (V.PC.geneticQuirks.fertility + V.PC.geneticQuirks.hyperFertility >= 4) {
 			V.PC.pregWeek = -2;
@@ -1147,34 +1147,34 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 		}
 
 		function orphanage() {
-			V.slaveOrphanageTotal += _curBabies;
+			V.slaveOrphanageTotal += curBabies;
 			return `You have decided to send them to a slave orphanage to be raised to ${V.minimumSlaveAge} and sold. Perhaps you'll even see them again, though you are unlikely to recognize them if you do.`;
 		}
 
 		function citizenSchool() {
-			V.citizenOrphanageTotal += _curBabies;
+			V.citizenOrphanageTotal += curBabies;
 			return "You have decided to send them to a citizen school to become a future citizen. Perhaps you'll even see them again, though you are unlikely to recognize them if you do.";
 		}
 
 		function privateSchool() {
-			V.privateOrphanageTotal += _curBabies;
+			V.privateOrphanageTotal += curBabies;
 			return `You have decided to send them to be privately raised. Perhaps you'll even see them again, though it's unlikely that there will be any connection between you. At least you'll know they've been properly reared.`;
 		}
 
 		function breeding() {
-			V.breederOrphanageTotal += _curBabies;
+			V.breederOrphanageTotal += curBabies;
 			return `You have decided to send them to be raised into a proper breeder. Perhaps you'll even see them again, though it's unlikely you'll recognize them with their reproduction focused body.`;
 		}
 
 		function auction() {
-			cashX((1000 * _seed * _curBabies), "babyTransfer");
-			return `You send the ${(_curBabies > 1) ? "children" : "child"} to be sold at auction amongst other prestigious slaves. The winning bid for your offspring came in at <span class="yellowgreen">${cashFormat(1000 * _seed * _curBabies)}.</span>"`;
+			cashX((1000 * seed * curBabies), "babyTransfer");
+			return `You send the ${(curBabies > 1) ? "children" : "child"} to be sold at auction amongst other prestigious slaves. The winning bid for your offspring came in at <span class="yellowgreen">${cashFormat(1000 * seed * curBabies)}.</span>"`;
 		}
 
-		function elite() {
+		function eliteRaise() {
 			r = [];
 			r.push(`You have decided to gift them to the Societal Elite to be raised as`);
-			if (_curBabies > 1) {
+			if (curBabies > 1) {
 				r.push(`proper members`);
 			} else {
 				r.push(`a proper member`);
diff --git a/src/events/scheduled/seRecruiterSuccess.js b/src/events/scheduled/seRecruiterSuccess.js
index 66c6219a216bba1b34c6556b1d119d466972d959..8e2e4654adb05c8009a63a839623b82bed0ebc3b 100644
--- a/src/events/scheduled/seRecruiterSuccess.js
+++ b/src/events/scheduled/seRecruiterSuccess.js
@@ -151,7 +151,7 @@ App.Events.SERecruiterSuccess = class SERecruiterSuccess extends App.Events.Base
 		}
 
 		const contractCost = 1000;
-		const _slaveCost = slaveCost(slave) - contractCost;
+		const cost = slaveCost(slave) - contractCost;
 		const {
 			He,
 			he, him, his
@@ -180,7 +180,7 @@ App.Events.SERecruiterSuccess = class SERecruiterSuccess extends App.Events.Base
 		const choices = [];
 		if (V.cash >= contractCost) {
 			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
-			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(_slaveCost)}`));
+			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
 			V.recruiterProgress = 7;
@@ -193,7 +193,7 @@ App.Events.SERecruiterSuccess = class SERecruiterSuccess extends App.Events.Base
 		}
 
 		function sell() {
-			cashX(_slaveCost, "slaveTransfer", S.Recruiter);
+			cashX(cost, "slaveTransfer", S.Recruiter);
 			return `${slave.slaveName} accepts being resold without much fuss. ${He}'s merely exchanged one unknown owner for another. For all ${he} knows ${his} new buyer will be less abusive than you would have been. ${He} would be less complacent if ${he} knew who ${his} buyers are; ${he}'ll be immured in an arcade within the hour.`;
 		}
 
diff --git a/src/events/scheduled/seTheSirenStrikesBack.js b/src/events/scheduled/seTheSirenStrikesBack.js
index 7892dc4536a71c38fef64664d05c751d4dfe7546..de613c14be073035cff39e0303822aab33bfc59a 100644
--- a/src/events/scheduled/seTheSirenStrikesBack.js
+++ b/src/events/scheduled/seTheSirenStrikesBack.js
@@ -5,6 +5,10 @@ App.Events.SETheSirenStrikesBack = class SETheSirenStrikesBack extends App.Event
 		];
 	}
 
+	castActors() {
+		return (this.actors.length > 0); // this event must be cast when queued
+	}
+
 	execute(node) {
 		let r = [];
 
diff --git a/src/events/scheduled/seWedding.js b/src/events/scheduled/seWedding.js
index 2d3799790d973b1590351a1991dec46d22c70b4a..a4a2a9c304a6f9d6cebe8e1c522d572e47579b91 100644
--- a/src/events/scheduled/seWedding.js
+++ b/src/events/scheduled/seWedding.js
@@ -1629,20 +1629,20 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent {
 				() => {
 					const el = new DocumentFragment();
 					const r = [];
-					let _c = 0;
-					let _h = 0;
+					let c = 0;
+					let h = 0;
 					r.push(`You also proclaim your new slave ${wivesC} ${namesString} ${V.PC.slaveSurname}.`);
 					for (const slave of brides) {
-						_c += 1;
+						c += 1;
 						if (canHear(slave)) {
-							_h += 1;
+							h += 1;
 						}
 					}
-					r.push(`The new Mrs. ${V.PC.slaveSurname}${(_c > 1) ? `s` : ``}`);
-					if (_h > 0) {
-						r.push((_c === 1) ? `hears` : `hear`);
+					r.push(`The new Mrs. ${V.PC.slaveSurname}${(c > 1) ? `s` : ``}`);
+					if (h > 0) {
+						r.push((c === 1) ? `hears` : `hear`);
 					} else {
-						r.push((_c === 1) ? `understands` : `understand`);
+						r.push((c === 1) ? `understands` : `understand`);
 					}
 					r.push(`this, of course, and`);
 					const nameCheck = !solo && brides.every(b => b.slaveSurname !== V.PC.slaveSurname);
diff --git a/src/events/schools/resEndowment.js b/src/events/schools/resEndowment.js
index 4ef3f188358b1d854370ad8fa251f840aea57ad3..a61b53db698f8419a7938981794441dff88282ca 100644
--- a/src/events/schools/resEndowment.js
+++ b/src/events/schools/resEndowment.js
@@ -431,13 +431,13 @@ App.Events.RESEndowment = class RESEndowment extends App.Events.BaseEvent {
 			const frag = new DocumentFragment();
 			let r = [];
 			r.push(`You reconnect the call you had with the first matron, splitting your desktop's display to accommodate both video call windows so that you can address both at once. Then you begin to suggest a compromise that should gratify both parties:`);
-			App.Events.addParagraph(node, r);
+			App.Events.addParagraph(frag, r);
 			r = [];
 			r.push(`With their not so feminine voices, conspicuous Adam's apples, dry and barren artificial pussies, and naturally masculine hormonal balances, it is more or less an open secret that Futanari 'Sisters' are all biologically, well, men. It is considered poor taste to mention such a thing among polite company, however, as some men who own futas willfully try to ignore this fact or are otherwise are upset to be reminded of it. Your proposed remedy allows both sisters to have their way: With your extensive funding, those current Sisters who were biologically born male (all of them) will be endowed with bigger balls at the second matron's behest. Meanwhile, a new lineup of biologically female Futanari Sisters will be very rapidly inducted, transformed, cultured, trained, and readied for resale, under the expert leadership of the first matron. These new lady-futas will only have erect dicks to complement their natural fertile pussies, feminine hormones, and soft voices; nary a testicle in sight. Slaveowning society on the other hand will enjoy a wider variety of futanari slaves to choose from, opening up exciting new opportunities for owner to sate their personal preferences and perfect their harems. In 15 weeks, the absolute minimum time that all can be feasibly accomplished, everybody wins. Business will continue as usual in the Futanari Sisters until then, with no immediate change in merchandise.`);
-			App.Events.addParagraph(node, r);
+			App.Events.addParagraph(frag, r);
 			r = [];
 			r.push(`"Well, you aren't the first one to think of that." the first matron reluctantly states. "You see, there's this outcast group of Sisters who would be perfect for this, it's just... We haven't seen eye to eye for a long time." The second chimes in: "You could talk her into it, she approves of your build far more than mine. Will probably take several months though, to move them all over and integrate all the new Sisters into our fold, and to enjoy the new pussies, of course." After a moment of consideration, the first agrees. You donate the funds to the Sisters with your compliments, ensuring that neither matron completely controls the vast sum. They both understand what they have to do now, starting immediately.`);
-			App.Events.addParagraph(node, r);
+			App.Events.addParagraph(frag, r);
 			r = [];
 			r.push(`Days later, the grateful institution begins a mass marketing campaign all across the world's Free Cities, which includes adverts in FCNN, FCTV, and FC social media about the upcoming changes to their Sister inventory and their need for willing new blood and new specialists to help them bolster their ranks. You feature prominently in each and every promotional item as their foremost contributor. Thanks to this <span class="reputation inc">you will be a household name in the Free Cities for some time.</span> Such a public flex of your financial muscles has also made your relative power very clear to some in the New World, attracting important players who <span class="green">will start to show an interest</span> in doing business with you and your Free City.`);
 			V.TFS.schoolUpgrade = 3;
diff --git a/src/events/schools/resFailure.js b/src/events/schools/resFailure.js
index d8157ac29e59d370bea02e6cc2e48c0f8bb24f61..d105078b44fc29bb2c648df7f17fe5c25467c1d1 100644
--- a/src/events/schools/resFailure.js
+++ b/src/events/schools/resFailure.js
@@ -16,7 +16,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 		V.nextLink = "Scheduled Event";
 
 		const failedSchool = Array.from(App.Data.misc.schools.keys()).find(s => V[s].schoolPresent && V[s].schoolProsperity <= -10);
-		const _SCH = App.Data.misc.schools.get(failedSchool);
+		const SCH = App.Data.misc.schools.get(failedSchool);
 
 		repX(-200, "event");
 		V.arcologies[0].prosperity -= 2;
@@ -28,7 +28,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 		/** @type {App.Entity.SlaveState[]} */
 		const slaveArray = [];
 		if (failedSchool === "TSS") {
-			for (let _i = 0; _i < slavesToAdd-1; _i++) {
+			for (let i = 0; i < slavesToAdd-1; i++) {
 				const slave = GenerateNewSlave("XX", {ageOverridesPedoMode: 1});
 				slave.career = "a slave";
 				slave.butt = either(1, 2, 2, 3);
@@ -70,7 +70,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "TUO") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave(null, {minAge: V.minimumSlaveAge, maxAge: V.fertilityAge, disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch of The Utopian Orphanage right after $his graduation.";
 				slave.career = "a slave";
@@ -102,7 +102,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "TCR") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XX", {
 					minAge: V.fertilityAge+6, maxAge: 32, disableDisability: 1, ageOverridesPedoMode: 1
 				});
@@ -135,7 +135,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slave.pubicHStyle = "waxed";
 				slave.underArmHStyle = "waxed";
 				slave.heels = 1;
-				applyMindbroken(slave);
+				applyMindbroken(slave, either(-100, -100, -100, -96, -80, -70, -50));
 				slave.hStyle = "neat";
 				slave.collar = "leather with cowbell";
 				slave.brand["right thigh"] = "the logo of the Cattle Ranch";
@@ -152,7 +152,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "GRI") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XX", {disableDisability: 1});
 				slave.origin = "$He was given to you by a failed subsidiary lab of the Growth Research Institute right after $his use as a test subject ended.";
 				slave.career = "a slave";
@@ -198,7 +198,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "SCP") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XX", {disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch campus of St. Claver Preparatory after $he served as a plastic surgeon's passing final exam.";
 				slave.chem = 20;
@@ -258,7 +258,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "LDE") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XY", {disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch campus of the innovative École des Enculées right after $his graduation.";
 				slave.career = "a slave";
@@ -314,7 +314,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "NUL") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave(null, {minAge: 16, maxAge: 24, disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch campus of Nueva Universidad de Libertad right after $his graduation.";
 				slave.career = "a slave";
@@ -346,7 +346,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "TGA") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XY", {disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch campus of the intense Gymnasium-Academy right after $his majority.";
 				slave.career = "a slave";
@@ -392,7 +392,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "HA") {
-			for (let _i = 0; _i < slavesToAdd; _i++) {
+			for (let i = 0; i < slavesToAdd; i++) {
 				const slave = GenerateNewSlave("XX", {disableDisability: 1});
 				slave.origin = "$He was given to you by a failed branch campus of the Hippolyta Academy right after $his majority.";
 				slave.career = "a slave";
@@ -420,8 +420,8 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				SetBellySize(slave);
 				setHealth(slave, jsRandom(60, 80), 0, 0, 0);
 				slave.muscles = random(40, 60);
-				const _minHeight = random(170, 180);
-				slave.height = Math.clamp(Height.random(slave, {limitMult: [2, 15], spread: .1}), _minHeight, 274);
+				const minHeight = random(170, 180);
+				slave.height = Math.clamp(Height.random(slave, {limitMult: [2, 15], spread: .1}), minHeight, 274);
 				slave.waist = -15;
 				slave.shoulders = 0;
 				slave.skill.vaginal = 10;
@@ -440,7 +440,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				slaveArray.push(slave);
 			}
 		} else if (failedSchool === "TFS") {
-			for (let _i = 0; _i < slavesToAdd-1; _i++) {
+			for (let i = 0; i < slavesToAdd-1; i++) {
 				const slaveGenRange = random(1, 4);
 				let slave;
 				if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) {
@@ -708,9 +708,9 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 		const {
 			He, His,
 			he, his, him, himself, girl
-		} =getPronouns(slaveArray[0]);
-		const _he = (failedSchool !== "NUL" ? "he" : "they");
-		const _He = capFirstChar(_he);
+		} = getPronouns(slaveArray[0]);
+		const he2 = (failedSchool !== "NUL" ? "he" : "they");
+		const He2 = capFirstChar(he2);
 		const {title: Master} = getEnunciation(slaveArray[0]);
 
 		if (failedSchool === "TFS") {
@@ -735,29 +735,29 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 				new App.Events.Result(`Rape ${him}`, TFSRape, `This will cost ${cashFormat(10000)}`)
 			]);
 		} else {
-			r.push(`You receive a personal call from a senior representative of ${_SCH.title} as you've been expecting since their second missed rent payment. "I apologize," ${_he} says with some embarrassment, "but it seems our expansion into your arcology was a mistake. It's strange — the business climate seemed excellent, and other corporations are doing well."`);
-			r.push(`${_He} sighs "Nevertheless, nothing ever seemed to go as planned. We'll be shutting our ${_SCH.branchName} down immediately. In fact, it should be shut down within the hour.`);
+			r.push(`You receive a personal call from a senior representative of ${SCH.title} as you've been expecting since their second missed rent payment. "I apologize," ${he2} says with some embarrassment, "but it seems our expansion into your arcology was a mistake. It's strange — the business climate seemed excellent, and other corporations are doing well."`);
+			r.push(`${He2} sighs "Nevertheless, nothing ever seemed to go as planned. We'll be shutting our ${SCH.branchName} down immediately. In fact, it should be shut down within the hour.`);
 			if (failedSchool === "TCR") {
-				r.push(`However, we lack the funds to remove some of our finest ${_SCH.slaveNoun} and since we still owe you a little... We'd like to you to have them; we'll even have them delivered to your penthouse with the last of our credits."`);
+				r.push(`However, we lack the funds to remove some of our finest ${SCH.slaveNoun} and since we still owe you a little... We'd like to you to have them; we'll even have them delivered to your penthouse with the last of our credits."`);
 			} else {
-				r.push(`I regret to add," ${_he} says nervously, "that we're experiencing continued difficulty finding the liquidity to pay what we owe you.`);
+				r.push(`I regret to add," ${he2} says nervously, "that we're experiencing continued difficulty finding the liquidity to pay what we owe you.`);
 				if (failedSchool === "GRI") {
-					r.push(`The lab we're closing has five solid ${_SCH.slaveNoun}.`);
+					r.push(`The lab we're closing has five solid ${SCH.slaveNoun}.`);
 				} else {
-					r.push(`The branch campus we're closing has five recent ${_SCH.slaveNoun}.`);
+					r.push(`The branch campus we're closing has five recent ${SCH.slaveNoun}.`);
 				}
 				r.push(`We'd like to transfer them to you in lieu of payment."`);
-				r.push(`${_He} hurriedly ends the call.`);
+				r.push(`${He2} hurriedly ends the call.`);
 			}
 			App.Events.addParagraph(node, r);
 			r = [];
 		}
 
-		r.push(`The failure of a prominent organization within your arcology has <span class="red">affected your reputation</span> and <span class="red">your arcology's prosperity</span> slightly, but you've come out a long way ahead. You can acquire these excellent ${_SCH.slaveNoun} for a pitiful fraction of their fair price.`);
+		r.push(`The failure of a prominent organization within your arcology has <span class="red">affected your reputation</span> and <span class="red">your arcology's prosperity</span> slightly, but you've come out a long way ahead. You can acquire these excellent ${SCH.slaveNoun} for a pitiful fraction of their fair price.`);
 		App.Events.addParagraph(node, r);
 
 		App.Events.addResponses(node, [
-			new App.Events.Result(`Enslave the ${_SCH.slaveNoun} for no cost`, enslave),
+			new App.Events.Result(`Enslave the ${SCH.slaveNoun} for no cost`, enslave),
 			new App.Events.Result(`Sell your prizes immediately`, sell)
 		]);
 
@@ -768,7 +768,7 @@ App.Events.RESFailure = class RESFailure extends App.Events.BaseEvent {
 					V.REFutaSisterCheckinIDs.push(slave.ID);
 				}
 			}
-			return `${capFirstChar(_SCH.slaveNoun)} acquired.`;
+			return `${capFirstChar(SCH.slaveNoun)} acquired.`;
 		}
 
 		function sell() {
diff --git a/src/facilities/ads.js b/src/facilities/ads.js
index 6312c99e3d6900ade0f4984fd19be72be68064c3..f120aaabfa0b8f05417be78dda40f506560ac563 100644
--- a/src/facilities/ads.js
+++ b/src/facilities/ads.js
@@ -159,7 +159,7 @@ App.Ads.getMatchedCategoryCount = function(slave, facility) {
 	return matchedCategories;
 };
 
-/** Manages the ads for a facility. Use example: <<set _adMgr = new App.Ads.AdManager("brothel")>> */
+/** Manages the ads for a facility. Use example: adMgr = new App.Ads.AdManager("brothel") */
 App.Ads.AdManager = class {
 	constructor(facility) {
 		this.varPrefix = `${facility}Ads`;
diff --git a/src/facilities/arcade/arcade.js b/src/facilities/arcade/arcade.js
index bbe46fb2b50696facd8f02ae874af5148245c4eb..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";
 	}
 
@@ -93,82 +92,101 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "arcadeUpgradeInjectors",
-				prereqs: [
-					() => V.arcadeUpgradeCollectors < 1,
-				],
 				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: () => V.PC.skill.engineering += .1,
+						handler: () => {
+							V.PC.skill.engineering += .1;
+
+							App.UI.reload();
+						},
 						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,
 						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",
-				prereqs: [
-					() => V.arcadeUpgradeInjectors < 1,
-				],
 				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: () => V.PC.skill.engineering += .1,
+						handler: () => {
+							V.PC.skill.engineering += .1;
+
+							App.UI.reload();
+						},
 						note: `, increases upkeep costs, and is mutually exclusive with the injectors`,
+						prereqs: [
+							() => 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",
-				prereqs: [
-					() => V.arcadeUpgradeHealth < 0,
-				],
 				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: () => V.PC.skill.engineering += .1,
+						handler: () => {
+							V.PC.skill.engineering += .1;
+
+							App.UI.reload();
+						},
 						note: ` and will increase upkeep costs`,
 					},
 				],
 			},
 			{
 				property: "arcadeUpgradeFuckdolls",
-				prereqs: [
-					() => V.arcadeUpgradeFuckdolls === 0,
-				],
 				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: () => V.PC.skill.engineering += .1,
+						handler: () => {
+							V.PC.skill.engineering += .1;
+
+							App.UI.reload();
+						},
 						note: ` and will increase upkeep costs`,
 					},
 				],
diff --git a/src/facilities/armory/BGSelect.js b/src/facilities/armory/BGSelect.js
index 6cf9ca64096a92726a6286549959b7c5211eb78d..4f8e58c763e182a878b635dda80d0e15fd88b139 100644
--- a/src/facilities/armory/BGSelect.js
+++ b/src/facilities/armory/BGSelect.js
@@ -11,7 +11,7 @@ App.Facilities.BGSelect = function() {
 		},
 		[], "Main"
 		));
-		
+
 		div.append(App.UI.DOM.makeCheckbox("bodyguardTrains"), " Can train potential successors.");
 		f.append(div);
 	} else {
diff --git a/src/facilities/barracks.js b/src/facilities/barracks.js
new file mode 100644
index 0000000000000000000000000000000000000000..9199d0e4a53f8075549517a20d0c1657265e2571
--- /dev/null
+++ b/src/facilities/barracks.js
@@ -0,0 +1,281 @@
+App.UI.barracks = function() {
+	const node = new DocumentFragment();
+	let r = [];
+
+	r.push(`The mercenaries you retain to protect ${V.arcologies[0].name} are housed in this sector of the arcology, which is fitted out as a modern military facility. It's much less expensive to house them here than to let them live at free quarters in the living areas of the arcology. They live somewhat apart from the society they protect, down here, but`);
+	if (V.personalArms > 0 && V.invasionVictory > 0) {
+		r.push(`you're always welcome here. You're their employer, but what's more important to them is that you also fought alongside them in victorious battle.`);
+	} else {
+		r.push(`they don't resent an unannounced visit from their employer.`);
+	}
+	r.push(`As you enter the main bay of the armory, lined with modern arms and armor and a few muscular, scarred men and women looking after their gear or suiting up to stand post, you're greeted respectfully, with`);
+	if (V.personalArms > 0 && V.invasionVictory > 0) {
+		r.push(`jaunty salutes and`);
+	}
+	r.push(`formal "${properTitle()}"s${(V.personalArms > 0 && V.invasionVictory > 0) ? `, but also with smiles and nods` : ``}.`);
+	if (V.mercenaries >= 3) {
+		r.push(`Though few of the mercenaries are visible,`);
+		if (V.mercenaries >= 5) {
+			r.push(`the bay is huge. There's enough equipment for a full company here.`);
+		} else {
+			r.push(`there's enough equipment for a full platoon here.`);
+		}
+	}
+
+	if (V.mercenariesTitle !== "mercenaries") {
+		r.push(`They've taken to their role as ${V.mercenariesTitle}.`);
+		switch (V.mercenariesTitle) {
+			case "Knights":
+				r.push(`Every set of gear has some kind of chivalric device on it, and the heavier sets of powered armor are accented with a lot of burnished steel.`);
+				break;
+			case "Evocati":
+				r.push(`The heavier sets of powered armor have Roman standards mounted on their backs, and officers' helmets are distinguished by horsehair crests.`);
+				break;
+			case "Black Eagles":
+				r.push(`Their ultra-heavy Imperial Plate is painted universally black and yellow, and prominently marked with the crest of your noble house. The officer's helmets have golden eagles painted over the faceplate to mark their status.`);
+				break;
+			case "Shorn Ones":
+				r.push(`The bigger sets of power armor are adorned with multiple ornaments and painted with symbols of the gods and victory.`);
+				break;
+			case "Imperial Guards":
+				r.push(`Their prototype armor is equipped with the latest weapons and their Imperial Chinese war banner strikes fear into the foes.`);
+				break;
+			case "Medjay":
+				r.push(`The gear is accented with bronze and animal skins. Some of the heavier armored helmets even have faceplates styled after Pharaonic death masks.`);
+				break;
+			case "Samurai":
+				r.push(`The gear is functional, but it has a distinctive Sengoku style to it. A ceramic wakizashi is an almost universal tertiary weapon.`);
+				break;
+			case "Janissaries":
+				r.push(`They consider themselves a caste apart, and keep to themselves, priding themselves on relentless training and perpetual readiness.`);
+				break;
+			case "Knights Templar":
+				r.push(`All the armor includes a modernized version of a white surcoat emblazoned with the symbol of the new faith.`);
+				break;
+			case "Immortals":
+				r.push(`The lighting in the bay has been lowered, and the gear is styled to be menacing. There's a sense of leashed danger here.`);
+				break;
+			case "Vast Legions":
+				r.push(`Their bulky, heavily armored prototype armor strikes terror into foes and causes the earth to shake when they walk.`);
+				break;
+			case "Surgical Corps":
+				r.push(`Their prototype armor is equipped with the latest medical equipment.`);
+				break;
+			case "Inglorious Bitches":
+				r.push(`Their garish neon pink prototype armor shines brightly.`);
+				break;
+			case "Thousand Sons":
+				r.push(`Their prototype armor is designed to preserve a sample of the wearer's genetic material in the event of death.`);
+				break;
+			case "Guardians of the Unborn":
+				r.push(`Their gear is designed to be accommodating to pregnant women and even includes a special kit in case a baby needs delivering and they're the only ones around.`);
+				break;
+			case "Shadowed Hand":
+				r.push(`Their armor prominently displays the symbol of the Societal Elite and is designed to make it perfectly clear that they mean business.`);
+				break;
+			case "Asgardians":
+				r.push(`Their armor has been modified to allow the wearers' muscular arms to remain visible, and the heavier armor seems to be equipped with capes.`);
+				break;
+			case "Tasters":
+				r.push(`Their armor has been modified to handle all sorts of waistlines. They contain numerous pockets and containers; it's not unusual to see a merc offering someone a needed pick-me-up.`);
+				break;
+			case "Knights of the Blood":
+				r.push(`Their gear is adorned with the badges and ensigns of racialist societies, and posters from the same sources are visible on the walls.`);
+				break;
+			case "Knights of the Purge":
+				r.push(`Their prototype armor is equipped with the latest weapons.`);
+				break;
+			case "Wardens":
+				r.push(`Their gear is designed to take their foes alive and relatively unharmed, though lethal force can be applied if need be.`);
+				break;
+			case "Purifiers":
+				r.push(`Their prototype armor is equipped with a cleansing flamethrower. In addition to striking fear into their foes it also cooks a mean steak.`);
+				break;
+			case "Abstemious":
+				r.push(`Their sleek prototype armor is equipped with advanced restraining weapons.`);
+				break;
+			case "Rangers":
+				r.push(`Their gear has a heavy Western influence; everyone carries heavy revolvers everywhere, and the armor sports rope lariats for lassoing 'cattle.'`);
+				break;
+			case "Shepherds":
+				r.push(`Their gear has a rather gaudy appearance; it makes it easier to attract wayward bimbos that way when they wander off and get lost.`);
+				break;
+			case "Geniuses":
+				r.push(`Their prototype armor is extremely complex to control, but those who can reap the benefits.`);
+				break;
+			case "Caretakers":
+				r.push(`Their towering prototype armor lets them stand out in a crowd and guide the way for those lost underfoot.`);
+				break;
+			case "Titans":
+				r.push(`Their prototype armor towers over the average civilian and compacts for easy storage despite its size.`);
+		}
+	}
+	r.push(`There are doors to magazines, armories, and training areas to all sides, and muffled gunfire can be heard from the latter.`);
+
+	App.Events.addParagraph(node, r);
+	r = [];
+
+	r.push(`You head up a deck, to the staff area, and up one more, to look into the living area. It's comfortable and very well-kept, since they have a large number of slaves here to look after them. Relaxing mercenaries are scattered around the common areas, and most are enjoying a slave or two.`);
+	if (V.FSAnnounced) {
+		const {
+			HeU, HisU,
+			heU, hisU, himU, himselfU, girlU
+		} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
+		r.push(`They're obviously adopting the customs of ${V.arcologies[0].name}.`);
+		let vignette = 0;
+		if (V.arcologies[0].FSSubjugationist !== "unset" && V.arcologies[0].FSSubjugationistRace) {
+			r.push(`A mercenary is fingering ${addA(V.arcologies[0].FSSubjugationistRace)} ${girlU}'s`);
+			if (V.seeDicks !== 100) {
+				r.push(`pussy.`);
+			} else {
+				r.push(`anus.`);
+			}
+			r.push(`${HeU}'s wincing a little; ${heU} must be new here.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSSupremacist !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary, a woman, is being seen to by a multicultural bunch of subhumans of different races. She has one eating her out while two more are rubbing her feet.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSGenderRadicalist !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary, who's rather obviously earned enough money to pay for the surgeries and drugs to turn herself into an imposing futanari, is pounding a dickgirl slave.`);
+			vignette++;
+		} else if (V.arcologies[0].FSGenderFundamentalist !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary is fucking a slave`);
+			if (V.arcologies[0].FSRestart !== "unset") {
+				r.push(`lotus style. His hands are greedily following ${hisU} womanly curves as they bang.`);
+			} else {
+				r.push(`doggy style. He's massaging ${hisU} rounded belly as ${heU} enjoys ${hisU} first foray into motherhood.`);
+			}
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSPaternalist !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary is making out with a pretty slave. An old romantic movie is playing on a wallscreen in front of them, forgotten.`);
+			vignette++;
+		} else if (V.arcologies[0].FSDegradationist !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary is using a slave as a footrest as he relaxes. ${HeU} has a huge dildo up ${hisU} ass, and whenever ${heU} moves, he uses a foot to shove it farther inside ${himU}.`);
+			vignette++;
+		}
+		if (V.arcologies[0].FSIntellectualDependency !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary is player strip poker with a pouting bimbo. ${HeU}'s completely nude and unaware that the game is over, not that the merc minds.`);
+			vignette++;
+		} else if (V.arcologies[0].FSSlaveProfessionalism !== "unset") {
+			r.push(`${anotherMerc(vignette)} mercenary is practicing assembling and disassembling his sidearm under the learned eyes of his assisting slave. ${HeU} is making sure ${hisU} master is well prepared for the future and stroking his dick each time he does it right.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSBodyPurist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is idly playing with a slave's natural breasts as he watches a wallscreen. He's being gentle and ${heU} doesn't seem to mind.`);
+			vignette++;
+		} else if (V.arcologies[0].FSTransformationFetishist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is fucking a bimbo slave doggy style. ${HisU} fake tits are so huge that the motion is making them slap together under ${himU}.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is getting a blowjob from a young slave. He's playing with ${hisU}`);
+			if (V.seeDicks !== 100) {
+				r.push(`fresh pussy`);
+			} else {
+				r.push(`tight little anus`);
+			}
+			r.push(`as ${heU} sucks his dick.`);
+			vignette++;
+		} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is getting a massage from a mature slave. ${HeU}'s wearing a towel, but he sneaks a hand back and steals it, freeing ${hisU} heavy breasts.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is getting a lap dance from a lithe slave. ${HeU}'s moving ${hisU} cute butt lower and lower, getting ready to impale ${himselfU} on his raging erection.`);
+			vignette++;
+		} else if (V.arcologies[0].FSAssetExpansionist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is almost hidden by a slave he's got in his lap. He has his head buried between ${hisU} monstrous breasts, and it's not clear how he's breathing.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSPetiteAdmiration !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary has a petite slave sitting on a weight bar. Each rep buries ${hisU} butt in his face.`);
+			vignette++;
+		} else if (V.arcologies[0].FSStatuesqueGlorification !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is having sex with a rather tall slave against the lockers. He has to stand on a nearby bench in order to properly penetrate ${himU}.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSPastoralist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is drinking a slave's milk, straight from the nipple, while idly massaging ${hisU} other breast, bringing out a thin stream of milk.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is doing push-ups with a well-endowed slave sitting on his back to add weight. ${HeU}'s counting his reps for him.`);
+			vignette++;
+		} else if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is doing squats with a rather portly slave sitting on his shoulders to add weight. ${HeU} pops a cookie into his mouth with each completed set.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSChattelReligionist !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is mounting a praying slave from behind. It doesn't distract ${himU}; ${hisU} quiet devotions become more fervent as he fucks ${himU}.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSRepopulationFocus !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is being ridden by an enormously pregnant slave. He's massaging ${hisU} taut belly as she uses ${hisU} hands to support ${hisU} sore boobs.`);
+			vignette++;
+		} else if (V.arcologies[0].FSRestart !== "unset") {
+			r.push(`${yetAnotherMerc(vignette)} mercenary is being serviced by a slave with a visibly smooth crotch. He has a dildo rammed in ${hisU} ass and moves it along with ${hisU} sucking.`);
+			vignette++;
+		}
+
+		if (V.arcologies[0].FSRomanRevivalist !== "unset") {
+		} else if (V.arcologies[0].FSNeoImperialist !== "unset") {
+		} else if (V.arcologies[0].FSAztecRevivalist !== "unset") {
+		} else if (V.arcologies[0].FSEgyptianRevivalist !== "unset") {
+		} else if (V.arcologies[0].FSEdoRevivalist !== "unset") {
+		} else if (V.arcologies[0].FSArabianRevivalist !== "unset") {
+		} else if (V.arcologies[0].FSChineseRevivalist !== "unset") {
+		}
+	}
+
+	if (V.mercenariesHelpCorp > 0) {
+		const {
+			HeU,
+			heU, hisU, himU, himselfU, girlU
+		} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
+		App.UI.DOM.appendNewElement("p", node, `As you leave, a squad moves thunderously into the bay, fresh from a slave raid on behalf of your corporation. Most of their captures have been dropped off with the corporate receivers, but they've been given a pretty ${girlU} who isn't a good training prospect for the corporate brand, a common reward. The squad looks after their weapons and armor first, an inviolable rule, and as they do, they leave their naked slave standing in the middle of the bay, ignored. ${HeU} isn't even bound, but ${heU}'s standing nude and alone amongst modern mercenaries, so ${heU} knows that resistance is futile. So ${heU} does the only thing left available to ${himU}: try to cover ${himselfU} with ${hisU} hands and cry.`);
+	}
+
+	App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+		"Decommission the armory and return this sector to manufacturing",
+		() => {
+			App.Arcology.cellUpgrade(V.building, App.Arcology.Cell.Manufacturing, "Barracks", "Manufacturing");
+			V.barracks = 0;
+		}, [], "Main",
+	));
+	App.Events.addParagraph(node, r);
+	return node;
+
+	function anotherMerc(vignette) {
+		if (vignette >= 3) {
+			return `Yet another`;
+		} else if (vignette >= 2) {
+			return `A third`;
+		} else if (vignette) {
+			return `Another`;
+		} else {
+			return `A`;
+		}
+	}
+
+	function yetAnotherMerc(vignette) {
+		if (vignette >= V.FSCreditCount) {
+			return `Finally, a`;
+		} else {
+			return anotherMerc(vignette);
+		}
+	}
+};
diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js
index 673b6b1a184a1a46890ff5aa091cb05b5e59c868..6df116ffc667083ecee42499b19c174f1802478c 100644
--- a/src/facilities/bodyModification/bodyModification.js
+++ b/src/facilities/bodyModification/bodyModification.js
@@ -402,8 +402,9 @@ App.UI.bodyModification = function(slave, cheat = false) {
 		if (slave.anusTat === 0) {
 			tattooChoiceNames.add("bleached");
 		}
+		const sortedTattooChoiceNames = Array.from(tattooChoiceNames).sort((a, b) => a > b ? 1 : -1);
 		let linkArray = [];
-		for (const style of tattooChoiceNames) {
+		for (const style of sortedTattooChoiceNames) {
 			if (tattooChoice === style) {
 				linkArray.push(App.UI.DOM.disabledLink(capFirstChar(style), ["Currently selected"]));
 			} else {
@@ -859,15 +860,15 @@ App.UI.bodyModification = function(slave, cheat = false) {
 		let r = [];
 		const bodyPartData = App.Data.Slave.body.get(V.scarTarget.local);
 
-		for (const _scarName in slave.scar) {
+		for (const scarName in slave.scar) {
 			const scarDiv = document.createElement("div");
-			scarDiv.append(`${His} ${_scarName} is marked with ${App.Desc.expandScarString(slave, _scarName)}: `);
+			scarDiv.append(`${His} ${scarName} is marked with ${App.Desc.expandScarString(slave, scarName)}: `);
 			scarDiv.append(
 				App.UI.DOM.link(
 					"Remove Scar",
 					() => {
 						scarApplied = false;
-						delete slave.scar[_scarName];
+						delete slave.scar[scarName];
 						billSurgery();
 						degradation -= 10;
 						refresh();
@@ -894,8 +895,8 @@ App.UI.bodyModification = function(slave, cheat = false) {
 					r.push(`${He} already has ${V.scarDesign.local} scars on ${his} ${V.scarTarget.local}. You can make it worse.`);
 				} else {
 					// check how much scarring is on this part
-					const _scarTotalValue = (Object.values(slave.scar[V.scarTarget.local])).reduce((a, b) => a + b, 0);
-					if (_scarTotalValue) {
+					const scarTotalValue = (Object.values(slave.scar[V.scarTarget.local])).reduce((a, b) => a + b, 0);
+					if (scarTotalValue) {
 						r.push(`That would be a new kind of scar to add to the growing collection on ${his} ${V.scarTarget.local}. Life can always be worse for a slave.`);
 					}
 				}
@@ -904,30 +905,30 @@ App.UI.bodyModification = function(slave, cheat = false) {
 				App.UI.DOM.link(
 					"Scar",
 					() => {
-						let _scarArray;
+						let scarArray;
 						if (V.scarTarget.local === "entire body" && V.scarDesign.local.includes("whip")) {
 							// Special case for whipping scene, produces two kinds of scars
 							App.Medicine.Modification.addScourged(slave);
 						} else {
 							// Normal entire body scarring
 							if (V.scarTarget.local === "entire body") {
-								_scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"];
+								scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"];
 								if (getLeftArmID(slave) === 0) {
-									_scarArray.push("left upper arm");
+									scarArray.push("left upper arm");
 								}
 								if (getRightArmID(slave) === 0) {
-									_scarArray.push("right upper arm");
+									scarArray.push("right upper arm");
 								}
 								if (getLeftLegID(slave) === 0) {
-									_scarArray.push("left thigh");
+									scarArray.push("left thigh");
 								}
 								if (getRightLegID(slave) === 0) {
-									_scarArray.push("right thigh");
+									scarArray.push("right thigh");
 								}
 							} else { // Single scar
-								_scarArray = [V.scarTarget.local];
+								scarArray = [V.scarTarget.local];
 							}
-							for (const scar of _scarArray) {
+							for (const scar of scarArray) {
 								App.Medicine.Modification.addScar(slave, scar, V.scarDesign.local);
 								degradation += 10;
 							}
@@ -1125,8 +1126,9 @@ App.UI.brandSelect = function(category, slave, cheat = false) {
 
 	function symbolOptions(brandList) {
 		const list = App.Medicine.Modification.Brands[brandList];
-		const array = [];
-		for (const brand in list) {
+		const sortedKeys = Object.keys(list).sort((a, b) => list[a].displayName > list[b].displayName ? 1 : -1);
+		const linkArray = [];
+		for (const brand of sortedKeys) {
 			const frag = new DocumentFragment();
 			if (!cheat && list[brand].hasOwnProperty("requirements")) {
 				if (!isOfficial && !list[brand].requirements(slave)) {
@@ -1145,9 +1147,9 @@ App.UI.brandSelect = function(category, slave, cheat = false) {
 					}
 				)
 			);
-			array.push(frag);
+			linkArray.push(frag);
 		}
-		return App.UI.DOM.generateLinksStrip(array);
+		return App.UI.DOM.generateLinksStrip(linkArray);
 	}
 
 	function check(brand) {
diff --git a/src/facilities/brothel/brothel.js b/src/facilities/brothel/brothel.js
index 0e6e542f0f75e9d2520f4bc7ba28b2c3ffc1dd91..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";
 	}
 
@@ -43,10 +42,10 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 			"Chinese Revivalist": `is furnished as an old Chinese pleasure house, with each girl set up in her own low room. They stand outside the doors, luring customers back one by one.`,
 			"Chattel Religionist": `is decorated as a place of carnal worship. The air is scented by censers, and the slaves here maintain an air of holiness even when being sodomized in public.`,
 			"Degradationist": `is decorated to look like a dungeon. The décor involves a lot of black leather and burnished steel, and the slaves on offer are mostly chained to beds and walls.`,
-			"Asset Expansionist": `is clean and full of soft couches and chairs for its' pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`,
-			"Transformation Fetishist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`,
-			"Repopulationist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage.`,
-			"Eugenics": `is sterile and clean. Interactive screens on the walls list the whores and their modifications in clinical detail.`,
+			"Repopulationist": `is clean and full of soft couches and chairs for its pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`,
+			"Eugenics": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`,
+			"Asset Expansionist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage.`,
+			"Transformation Fetishist": `is sterile and clean. Interactive screens on the walls list the whores and their modifications in clinical detail.`,
 			"Gender Radicalist": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting every possible combination of human sexual congress.`,
 			"Gender Fundamentalist": `is decorated to look like an old world whorehouse. Screens on the walls are showing pornography starring the whores, with prices flashing after each sex act.`,
 			"Physical Idealist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping on a stage. There is a distinct smell of sweat, and there is as much emphasis on the strippers' muscles as their breasts.`,
@@ -58,7 +57,7 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 			"Youth Preferentialist": `is decorated to look like the sort of bar old world students visit on spring break. Vapid music is playing, and when whores aren't with customers, they dance and make out with each other to attract some.`,
 			"Body Purist": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting idealized human forms in the act of love.`,
 			"Slimness Enthusiast": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting slim, girlish figures playing, dancing, and loving.`,
-			"Hedonistic": `is comfortable and full of soft couches and chairs for its' overweight whores to lounge upon between clients ${V.arcologies[0].FSHedonisticDecadenceResearch === 1 ? `and enjoy a plate of snacks` : `and enjoy a big cup of slave food`}. The smells of fresh baked goods are pumped into the facility to mask the smell of sweat. It's not unusual for a client to fuck a whore right on her chosen couch, since the effort of moving is often too much.`,
+			"Hedonistic": `is comfortable and full of soft couches and chairs for its overweight whores to lounge upon between clients ${V.arcologies[0].FSHedonisticDecadenceResearch === 1 ? `and enjoy a plate of snacks` : `and enjoy a big cup of slave food`}. The smells of fresh baked goods are pumped into the facility to mask the smell of sweat. It's not unusual for a client to fuck a whore right on her chosen couch, since the effort of moving is often too much.`,
 			"Intellectual Dependency": `is decorated to look like a club. The sexually charged atmosphere has the whores horny and making out with each other. Customers are expected to come in, grab a bimbo to their tastes, and pull them off to have a good time.`,
 			"Slave Professionalism": `is decorated to look like a high-class bordello. Courtesans are expected to greet and entice customers to join them for a night they'll never forget.`,
 			"Petite Admiration": `is decorated to look like an old world whorehouse. The whores have personal platforms to stand on for inspection from their taller customers.`,
@@ -111,11 +110,11 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 						: V.brothelAdsXX
 							? `sucking cock and being assfucked while their dicks flop around.`
 							: `sucking dick and taking anal, and the ones that have pussies are being fucked there, too.`} The ads are shown on media across ${V.arcologies[0].name}. ${V.brothelAdsXX === 1 && V.brothelAdsImplanted === 1 && V.brothelAdsStacked === 1
-					? `As a result, ${V.brothelName} is known as the place to go if you want to rent a${V.brothelAdsPreg ? `pregnant` : ``} bimbo's pussy.`
+					? `As a result, ${V.brothelName} is known as the place to go if you want to rent a${V.brothelAdsPreg ? ` pregnant` : ``} bimbo's pussy.`
 					: V.brothelAdsXX === 1 && V.brothelAdsOld === 1
-						? `As a result, ${V.brothelName} is known as the place to go if you want to rent a${V.brothelAdsPreg ? `pregnant` : ``} MILF's tits.`
+						? `As a result, ${V.brothelName} is known as the place to go if you want to rent a${V.brothelAdsPreg ? ` pregnant` : ``} MILF's tits.`
 						: V.brothelAdsXX === 1 && V.brothelAdsOld === -3
-							? `As a result, ${V.brothelName} is known as the place to go if you want to rent${V.brothelAdsPreg ? ` a pregnant` : ``}${V.brothelAdsStacked ? V.brothelAdsPreg !== 1 ? `an` : `` : `oppai`} loli.`
+							? `As a result, ${V.brothelName} is known as the place to go if you want to rent${V.brothelAdsPreg ? ` a pregnant` : ``}${V.brothelAdsStacked ? V.brothelAdsPreg !== 1 ? ` an` : `` : `oppai`} loli.`
 							: V.brothelAdsXX === 1 && V.brothelAdsPreg === 1
 								? `As a result, ${V.brothelName} is known as the place to go if you want to pound some pregnant pussy.`
 								: V.brothelAdsXX === -1 && V.brothelAdsStacked === 1
@@ -134,23 +133,33 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]}*/
+	/** @returns {FC.IUpgrade[]}*/
 	get upgrades() {
 		return [
 			{
 				property: "brothelUpgradeDrugs",
-				prereqs: [
-					() => V.brothelUpgradeDrugs === 0,
-				],
 				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`,
 					},
+					{
+						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/brothel/brothelAds.js b/src/facilities/brothel/brothelAds.js
index ffe8b39335fdcdcf86487c635d7e7c0b607d1897..18fc869b86717fbe2cb78518aafb34e5da1f43aa 100644
--- a/src/facilities/brothel/brothelAds.js
+++ b/src/facilities/brothel/brothelAds.js
@@ -44,7 +44,7 @@ App.Facilities.Brothel.ads = function() {
 				text.push(`${capFirstChar(V.brothelName)} is decorated to look like a dungeon. The décor involves a lot of black leather and burnished steel, and the slaves on offer are mostly chained to beds and walls.`);
 				break;
 			case "Repopulationist":
-				text.push(`${capFirstChar(V.brothelName)} is clean and full of soft couches and chairs for its' pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`);
+				text.push(`${capFirstChar(V.brothelName)} is clean and full of soft couches and chairs for its pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`);
 				break;
 			case "Eugenics":
 				text.push(`${capFirstChar(V.brothelName)} is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`);
@@ -174,15 +174,15 @@ App.Facilities.Brothel.ads = function() {
 
 	function spending() {
 		const div = App.UI.DOM.makeElement("div", null, ['margin-bottom']);
-		const text = [];
+		let text = [];
 		const links = [];
 
 		if (V.brothelAdsSpending >= 5000) {
-			text.push(`Advertisements based on these scenes run constantly in media across the arcology, and there's an active merchandising campaign underway to promote your whores.`);
+			text.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}, and there's an active merchandising campaign underway to promote your whores.`);
 		} else if (V.brothelAdsSpending >= 4000) {
-			text.push(`Advertisements based on these scenes run constantly in media across the arcology.`);
+			text.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}.`);
 		} else if (V.brothelAdsSpending >= 3000) {
-			text.push(`Advertisements based on these scenes are run in media across the arcology.`);
+			text.push(`Advertisements based on these scenes are run in media across ${V.arcologies[0].name}.`);
 		} else if (V.brothelAdsSpending >= 2000) {
 			text.push(`Advertisements based on these scenes run regularly in arcology media.`);
 		} else if (V.brothelAdsSpending >= 1000) {
@@ -190,8 +190,10 @@ App.Facilities.Brothel.ads = function() {
 		} else {
 			text.push(`${V.arcologies[0].name} has a robust internal media that could be used to bring customers into the brothel.`);
 		}
+		App.Events.addNode(div, text, "p", "scene-intro");
 
-		text.push(`You are spending ${cashFormatColor(V.brothelAdsSpending)} each week to advertise ${V.brothelName}.`);
+		text = [];
+		text.push(`You are spending ${cashFormatColor(V.brothelAdsSpending, true)} each week to advertise ${V.brothelName}.`);
 
 		if (V.lastWeeksCashIncome.brothelAds > 0) {
 			text.push(`Last week's ads increased profits by ${cashFormatColor(V.lastWeeksCashIncome.brothelAds)}${App.Entity.facilities.brothel.hostedSlaves > 1 ? ` and increased business for your whores` : ``}, and cost ${cashFormatColor(V.lastWeeksCashExpenses.brothelAds)}.`);
@@ -202,7 +204,6 @@ App.Facilities.Brothel.ads = function() {
 		if (V.brothelAdsSpending >= 1000) {
 			links.push(App.UI.DOM.link(`Decrease`, () => {
 				V.brothelAdsSpending -= 1000;
-
 				App.UI.reload();
 			}));
 		} else {
@@ -211,7 +212,6 @@ App.Facilities.Brothel.ads = function() {
 		if (V.brothelAdsSpending < 5000) {
 			links.push(App.UI.DOM.link(`Increase`, () => {
 				V.brothelAdsSpending += 1000;
-
 				App.UI.reload();
 			}));
 		} else {
diff --git a/src/facilities/cellblock/cellblock.js b/src/facilities/cellblock/cellblock.js
index 6eef8d1108d46f396230d606575ab85fe3500610..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";
 	}
 
@@ -50,15 +49,15 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 			"Chinese Revivalist": `is furnished in a severely medieval Chinese style. There is one refinement, but it's of exquisite cruelty. Somewhere out of sight, water is dripping into an urn, drop by drop... drop... drop... drop...`,
 			"Chattel Religionist": `is built of cold stone. Most of the cells are unfurnished little cubes inside which the only bed is the bare floor. A few are smaller still, so that the inmates can neither stand nor lie flat.`,
 			"Degradationist": `is a nightmare. Everything is made of metal, and almost everything menaces with spikes of steel. Inmates must carefully avoid the walls of their own cells if they wish to avoid being stabbed.`,
-			"Repopulationist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Eugenics": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Asset Expansionist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's bimbofication. Day and night, inmates are confronted with the sight of themselves dyed, pierced, tattooed, gaped, filled with implants, or all of these.`,
-			"Transformation Fetishist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who abuses an inmate does so in full view of every other slave here, keeping the jailbirds in a state of constant fear that they're next.`,
-			"Gender Radicalist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who rapes an inmate does so in full view of every other slave here, keeping the bitches in a state of constant fear that their asses are next.`,
-			"Gender Fundamentalist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. Everyone outside the cells is $arcologies[0].FSSupremacistRace, and everyone inside them is not. The darkness of history is palpable here.`,
-			"Physical Idealist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. The inmates inside the cells are $arcologies[0].FSSubjugationistRace, and everyone outside them is not. The darkness of history is palpable here.`,
-			"Supremacist": `is a straightforward prison, with two exceptions. One cell style features a screen displaying plans for its inmate's impregnation, the other is covered with mirrors for its inmate to watch her pregnancy grow. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Subjugationist": `is designed to make very clear to its inmates that they are subhuman. Many screens showcasing their inadequacy intermingled with propaganda play on nonstop loops.`,
+			"Asset Expansionist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Transformation Fetishist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Gender Radicalist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's bimbofication. Day and night, inmates are confronted with the sight of themselves dyed, pierced, tattooed, gaped, filled with implants, or all of these.`,
+			"Gender Fundamentalist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who abuses an inmate does so in full view of every other slave here, keeping the jailbirds in a state of constant fear that they're next.`,
+			"Physical Idealist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who rapes an inmate does so in full view of every other slave here, keeping the bitches in a state of constant fear that their asses are next.`,
+			"Supremacist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. Everyone outside the cells is $arcologies[0].FSSupremacistRace, and everyone inside them is not. The darkness of history is palpable here.`,
+			"Subjugationist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. The inmates inside the cells are $arcologies[0].FSSubjugationistRace, and everyone outside them is not. The darkness of history is palpable here.`,
+			"Repopulationist": `is a straightforward prison, with two exceptions. One cell style features a screen displaying plans for its inmate's impregnation, the other is covered with mirrors for its inmate to watch her pregnancy grow. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Eugenics": `is designed to make very clear to its inmates that they are subhuman. Many screens showcasing their inadequacy intermingled with propaganda play on nonstop loops.`,
 			"Paternalist": `is a prison, but a modern and scientific one. The cells, the common areas, and even the color of the walls are all carefully designed to communicate the feeling that inmates can better themselves.`,
 			"Pastoralist": `requires its inmates to drink as much breast milk as they can hold. This sounds like a small thing, but for an unbroken slave, conquering the revulsion of drinking another slave's milk is an important step.`,
 			"Maturity Preferentialist": `is subtly designed to make very clear to its inmates that they are sex objects. Many screens showing pornography make it clear to the maturest slave here that they're still an object of lust, and will be used to slake others' pleasure.`,
@@ -91,17 +90,16 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "cellblockUpgrade",
-				prereqs: [],
 				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: () => {
@@ -109,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 1024184500fe4c385db567999e300f0e8b4ad882..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";
 	}
 
@@ -92,66 +91,76 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility {
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "clinicUpgradeScanner",
-				prereqs: [],
 				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",
-				prereqs: [],
 				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",
-				prereqs: [
-					() => V.clinicUpgradeFilters > 0,
-				],
 				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.clinicUpgradePurge < 1,
+							() => V.clinicUpgradeFilters > 0,
 						],
 					},
 					{
-						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 079cf29e539778440955a8f67b194fd009ca114c..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";
 	}
 
@@ -38,7 +37,7 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 		}
 
 		if (V.clubAdsSpending > 0) {
-			text.push(`Screens outside the entrance are showing softcore music videos to advertise _clubNameCaps.`);
+			text.push(`Screens outside the entrance are showing softcore music videos to advertise ${V.clubName}.`);
 
 			if (V.clubAdsOld === 1) {
 				text.push(`The featured strippers are all MILFs.`);
@@ -72,7 +71,7 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 
 			if (V.seePreg) {
 				if (V.clubAdsPreg === 1) {
-					text.push(`Most of strippers have firm, rounded bellies.`);
+					text.push(`Most of the strippers have firm, rounded bellies.`);
 				} else if (V.clubAdsPreg === -1) {
 					text.push(`Most of the strippers have firm, flat bellies.`);
 				} else {
@@ -261,22 +260,25 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "clubUpgradePDAs",
-				prereqs: [],
 				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/club/clubAdvertisement.js b/src/facilities/club/clubAdvertisement.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b0036b238fb17a3079afe73f1f52d172aad86c2
--- /dev/null
+++ b/src/facilities/club/clubAdvertisement.js
@@ -0,0 +1,199 @@
+App.Facilities.Club.ads = function() {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const clubNameCaps = capFirstChar(V.clubName);
+	switch (V.clubDecoration) {
+		case "Roman Revivalist":
+			r.push(`${clubNameCaps} is decorated like a Roman villa's entertainment rooms. There is a lot of white stone, plaster, and terracotta.`);
+			break;
+		case "Neo-Imperialist":
+			r.push(`${clubNameCaps} is a genuine temple of Imperial decadence. The blaze of bright neon lights flash and strobe on a mass of sweaty bodies, sleek speakers blaring synthetic music as banners with your family's crest flutter above the serenity of mindless dance. The stoic stone figures of Imperial Knights watching the entrance provide a stark contrast to the Bacchian passion of the dancers.`);
+			break;
+		case "Aztec Revivalist":
+			r.push(`${clubNameCaps} is decorated with obsidian figures inserted in the lime walls and giant oak pillars that give a homey feeling to the otherwise cold building.`);
+			break;
+		case "Egyptian Revivalist":
+			r.push(`${clubNameCaps} is decorated like a room in an ancient Egyptian palace. There are columns of warm stone and pools of clear water full of aquatic plants.`);
+			break;
+		case "Edo Revivalist":
+			r.push(`${clubNameCaps} is furnished as an Edo period theater. Performances of the traditional Japanese arts can be seen here, though more modern dancing happens in the evenings. In either case, geisha girls are present and willing.`);
+			break;
+		case "Arabian Revivalist":
+			r.push(`${clubNameCaps} is designed like an open plaza in an Arabian palace, with a raised stage in the center for erotic dancing. Diaphanous, flowing curtains billow across the space, dispersing the narcotic smoke billowing from a score of hookahs.`);
+			break;
+		case "Chinese Revivalist":
+			r.push(`${clubNameCaps} is furnished as an old Chinese disorderly house. It's intentionally packed in so that closeness and good cheer is obligatory here; prominent citizens share tables while their hangers-on jostle for room.`);
+			break;
+		case "Chattel Religionist":
+			r.push(`${clubNameCaps} isn't a religious establishment, but it almost looks like one. It's clean and proper, with beams of natural light that come down to highlight holy sex slaves' bodies.`);
+			break;
+		case "Degradationist":
+			r.push(`${clubNameCaps} has a perverted, debauched appearance. The décor is utilitarian so it can be cleaned easily, and the reason is obvious. Many patrons have brought their own slaves to publicly rape here.`);
+			break;
+		case "Repopulationist":
+			r.push(`${clubNameCaps} has a gaudy appearance. There are lots of deep soft chairs for pregnant patrons and slaves to rest in and screens showing girls with large bellies lining the walls.`);
+			break;
+		case "Eugenics":
+			r.push(`${clubNameCaps} has a gaudy appearance. There are screens lining the walls discouraging unprotected slave sex. The real action happens in the several exclusive rooms reserved for society's best.`);
+			break;
+		case "Asset Expansionist":
+			r.push(`${clubNameCaps} has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing off big tits and plush asses.`);
+			break;
+		case "Transformation Fetishist":
+			r.push(`${clubNameCaps} has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing off huge fake tits and plastic dick sucking lips.`);
+			break;
+		case "Gender Radicalist":
+			r.push(`${clubNameCaps} has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing closeups of cocks fucking every imaginable orifice.`);
+			break;
+		case "Gender Fundamentalist":
+			r.push(`${clubNameCaps} has an old world appearance, a decidedly throwback atmosphere harking back to the glory days of cultures past.`);
+			break;
+		case "Physical Idealist":
+			r.push(`${clubNameCaps} isn't a gym, but it smells like one. The dancing is rough and competitive, and the drinks are rich with protein.`);
+			break;
+		case "Supremacist":
+			r.push(`${clubNameCaps} is decorated like an upper-class gentleman's club in the old countries of ${V.arcologies[0].FSSupremacistRace} people.`);
+			break;
+		case "Subjugationist":
+			r.push(`${clubNameCaps} is decorated like an upper-class gentleman's club in the old countries which favored ${V.arcologies[0].FSSubjugationistRace} slaves.`);
+			break;
+		case "Paternalist":
+			r.push(`${clubNameCaps} is handsome and well-kept, even romantic. Though the slaves here are sex slaves, every provision is made to encourage them to enjoy themselves.`);
+			break;
+		case "Body Purist":
+			r.push(`${clubNameCaps} is gorgeous, decorated and kept in the height of fashionable night establishment style. The music is cutting edge and everything and everyone is elegant.`);
+			break;
+		case "Slimness Enthusiast":
+			r.push(`${clubNameCaps} is distinctly gaudy, with lots of sugary drinks on offer. The music and décor are of a decidedly bubblegum quality.`);
+			break;
+		case "Pastoralist":
+			r.push(`${clubNameCaps} is decorated to resemble a frontier disorderly house. The drinks are pounded straight, and there's a set of swinging doors for bad men to part dramatically as they enter.`);
+			break;
+		case "Maturity Preferentialist":
+			r.push(`${clubNameCaps} is surprisingly elegant. The music consists of refined remixes of traditional dance music, offering slaves and citizens the chance to dance beautifully together.`);
+			break;
+		case "Youth Preferentialist":
+			r.push(`${clubNameCaps} is deafeningly loud. There's a bright light show running, offering staccato glimpses of the scene out on the dance floor.`);
+			break;
+		case "Hedonistic":
+			r.push(`${clubNameCaps} has a gaudy appearance. The dance floor is extra large to accommodate its extra wide dancers, though bodies grinding against each other is an inevitability. Plenty of roomy, comfortable booths encircle the room for an exhausted citizen to relax with his plush dance partner, and a wide selection of greasy food accompanies the drinks.`);
+			if (V.arcologies[0].FSHedonisticDecadenceResearch === 1) {
+				r.push(`Platters of food are complementary for feeding slaves`);
+			} else {
+				r.push(`Feeders are available in the booths to feed tired slaves`);
+			}
+			r.push(`while they get fondled.`);
+			break;
+		case "Intellectual Dependency":
+			r.push(`${clubNameCaps} is distinctly gaudy and easy for slaves to move around in. The dancing is as energetic and sexual, and the drinks sugary and sweet.`);
+			break;
+		case "Slave Professionalism":
+			r.push(`${clubNameCaps} is decorated like an upper-class gentleman's club. It is where a true courtesan works their craft.`);
+			break;
+		case "Petite Admiration":
+			r.push(`${clubNameCaps} has a gaudy appearance. The dance floor is surrounded by raised platforms so even the shortest slave can be seen by the crowd.`);
+			break;
+		case "Statuesque Glorification":
+			r.push(`${clubNameCaps} has a tiered appearance. The booths and bar are positioned overlooking the dance floor so patrons may loom over the dancing slaves even when seated.`);
+	}
+
+	if (V.clubAdsSpending > 0) {
+		r.push(`Screens outside the entrance are showing softcore music videos to advertise ${V.clubName}.`);
+		if (V.clubAdsOld === 1) {
+			r.push(`The featured strippers are all MILFs.`);
+		} else if (V.clubAdsOld === -1) {
+			r.push(`The featured strippers are all nice and young.`);
+		} else if (V.clubAdsOld === -2) {
+			r.push(`The featured strippers are all teenagers.`);
+		} else if (V.clubAdsOld === -3) {
+			r.push(`The featured strippers are all lolis.`);
+		} else {
+			r.push(`The featured strippers vary in age.`);
+		}
+		if (V.clubAdsStacked === 1) {
+			r.push(`Lots of bouncing breasts and butts`);
+		} else if (V.clubAdsStacked === -1) {
+			r.push(`Lots of trim breasts and shapely butts`);
+		} else {
+			r.push(`A variety of breast and butt sizes and shapes`);
+		}
+		r.push(`are on display, and`);
+		if (V.clubAdsImplanted === 1) {
+			r.push(`most of these are augmented by implants.`);
+		} else if (V.clubAdsImplanted === -1) {
+			r.push(`they're all natural.`);
+		} else {
+			r.push(`some are augmented by implants.`);
+		}
+		if (V.seePreg === 1) {
+			if (V.clubAdsPreg === 1) {
+				r.push(`Most of the strippers have firm, rounded bellies.`);
+			} else if (V.clubAdsPreg === -1) {
+				r.push(`Most of the strippers have firm, flat bellies.`);
+			} else {
+				r.push(`Some of the strippers are pregnant.`);
+			}
+		}
+		if (V.clubAdsModded === 1) {
+			r.push(`Everything is heavily pierced and tattooed.`);
+		} else if (V.clubAdsModded === -1) {
+			r.push(`Everything is free of tattoos and piercings.`);
+		} else {
+			r.push(`Some of these assets are tattooed and pierced, and some aren't.`);
+		}
+		r.push(`The strippers get naked quickly, and show off`);
+		if (V.clubAdsXX === 1) {
+			r.push(`their pussies and assholes.`);
+		} else if (V.clubAdsXX === -1) {
+			r.push(`their assholes.`);
+		} else {
+			r.push(`their holes.`);
+		}
+	}
+
+	if (V.clubAdsSpending >= 5000) {
+		r.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}, and there's an active merchandising campaign underway to promote your club and its girls.`);
+	} else if (V.clubAdsSpending >= 4000) {
+		r.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}.`);
+	} else if (V.clubAdsSpending >= 3000) {
+		r.push(`Advertisements based on these scenes are run in media across ${V.arcologies[0].name}.`);
+	} else if (V.clubAdsSpending >= 2000) {
+		r.push(`Advertisements based on these scenes run regularly in arcology media.`);
+	} else if (V.clubAdsSpending >= 1000) {
+		r.push(`Advertisements based on these scenes run occasionally in arcology media.`);
+	} else {
+		r.push(`${V.arcologies[0].name} has a robust internal media that could be used to bring patrons into the club.`);
+	}
+	App.Events.addNode(node, r, "p", "scene-intro");
+
+	App.Events.addNode(node, [`You are spending ${cashFormatColor(V.clubAdsSpending, true)} each week to advertise ${V.clubName}.`]);
+
+	const linkArray = [];
+	if (V.clubAdsSpending >= 1000) {
+		linkArray.push(App.UI.DOM.link(`Decrease`, () => {
+			V.clubAdsSpending -= 1000;
+			App.UI.reload();
+		}));
+	} else {
+		linkArray.push(App.UI.DOM.disabledLink(`Decrease`, [`Minimum reached`]));
+	}
+	if (V.clubAdsSpending < 5000) {
+		linkArray.push(App.UI.DOM.link(`Increase`, () => {
+			V.clubAdsSpending += 1000;
+			App.UI.reload();
+		}));
+	} else {
+		linkArray.push(App.UI.DOM.disabledLink(`Increase`, [`Maximum reached`]));
+	}
+
+
+	App.UI.DOM.appendNewElement("div", node, App.UI.DOM.generateLinksStrip(linkArray), ['indent']);
+
+	App.UI.DOM.appendNewElement("h2", node, `Design ${clubNameCaps} Ad Campaign`);
+
+	App.UI.DOM.appendNewElement("div", node, `Will replace relevant variety bonuses`, "note");
+	node.append(App.Ads.report("club", true));
+
+	return node;
+};
diff --git a/src/facilities/dairy/freeRangeDairyAssignmentScene.js b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
index c22b6a839e67e14ff390ce683f935e74c627b27c..2cce90b7af17277dc28f46a85268f674604d549f 100644
--- a/src/facilities/dairy/freeRangeDairyAssignmentScene.js
+++ b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
@@ -10,9 +10,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 		he, him, his, himself
 	} = getPronouns(slave);
 
-	if (V.seeImages) {
-		App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]);
-	}
+	App.UI.DOM.drawOneSlaveRight(node, slave);
 
 	r.push(`${slave.slaveName} reports to the dairy.`);
 	if (slave.energy > 90 ) {
@@ -40,7 +38,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 			aroused = true;
 			r.push(`${He} cannot help but to feel aroused at the view of all those udders being thoroughly milked.`);
 			if (slave.sexualFlaw === "breast growth") {
-				r.push(`${He} is already fantasizing of having ${his} breasts expanded to ridiculous proportions${(slave.lactation > 0) ? `so ${he} can produce even more milk` : ""}.`);
+				r.push(`${He} is already fantasizing of having ${his} breasts expanded to ridiculous proportions${(slave.lactation > 0) ? ` so ${he} can produce even more milk` : ""}.`);
 			}
 		} else if (slave.fetish === "pregnancy" && V.dairyPregSetting === 1) {
 			aroused = true;
@@ -65,9 +63,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 				he2, his2, him2,
 			} = getPronouns(cow).appendSuffix("2");
 			aroused = true;
-			if (V.seeImages) {
-				App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(cow, 2, 0), ["imageRef", "medImg"]);
-			}
+			App.UI.DOM.drawOneSlaveRight(node, cow);
 			r.push(`The hyper-endowed cum-cow ${cow.slaveName} is the pride of ${V.dairyName}. ${He2} is limply hanging on ${his2} milking chair, panting heavily because of the constant suction on ${his2} dick. ${He2} is obviously nearing climax. Soon,`);
 			if (hasAnyNaturalEyes(cow)) {
 				r.push(his2);
@@ -162,17 +158,13 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 		const {
 			He2
 		} = getPronouns(assayedSlave).appendSuffix("2");
-		if (V.seeImages === 1) {
-			App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(assayedSlave, 2, 0), ["imageRef", "medImg"]);
-		}
+		App.UI.DOM.drawOneSlaveRight(node, assayedSlave);
 		r.push(`${His} ${assayType} ${assayedSlave.slaveName} is at the dairy, too. ${He2} is in the adjacent stall. The two of them are going to be milked right next to each other.`);
 	}
 	App.Events.addParagraph(node, r);
 	r = [];
 
-	if (S.Milkmaid && V.seeImages === 1) {
-		App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(S.Milkmaid, 2, 0), ["imageRef", "medImg"]);
-	}
+	App.UI.DOM.drawOneSlaveRight(node, S.Milkmaid);
 	r.push(`The only "furniture" in the stall looks like a dentist's chair. Despite the medical appearance, when ${he}`);
 	if (slave.devotion > 90) {
 		r.push(`eagerly`);
@@ -486,11 +478,10 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 		r.push(`The suction on ${his} dick stops, allowing ${his} abused member to go soft and have some rest.`);
 	}
 	if (slave.balls > 0 && slave.scrotum > 0) {
-		r.push(`${His} balls rest, dangling down and relieved. They already started to produce more cum. They seem to wait for their next chance to unload.`);
+		r.push(`${His} balls rest, dangling down and relieved. They have already started to produce more cum. They seem to wait for their next chance to unload.`);
 	}
 	App.Events.addParagraph(node, r);
 	App.Events.addParagraph(node, [`The next milking cycle will start soon.`]);
 	/* MILKING ROUTINE END */
-	App.Events.addParagraph(node, r);
 	return node;
 };
diff --git a/src/facilities/dairy/industrialDairyAssignmentScene.js b/src/facilities/dairy/industrialDairyAssignmentScene.js
index d50fed9fd816b4499338a790403c3e76d30d03d9..5ed236cdd06f7ba53ee4ff02deea53f6f49da532 100644
--- a/src/facilities/dairy/industrialDairyAssignmentScene.js
+++ b/src/facilities/dairy/industrialDairyAssignmentScene.js
@@ -1,5 +1,4 @@
 App.Facilities.Dairy.industrialAssignmentScene = function(slave) {
-// :: Industrial Dairy Assignment Scene [nobr]
 	const node = new DocumentFragment();
 
 	V.nextButton = "Continue";
@@ -16,7 +15,7 @@ App.Facilities.Dairy.industrialAssignmentScene = function(slave) {
 	App.Events.drawEventArt(node, slave);
 
 
-	r.push(`When ${slave.slaveName}reports to the dairy, it's to the`);
+	r.push(`When ${slave.slaveName} reports to the dairy, it's to the`);
 	if (canSee(slave)) {
 		r.push(`sight of an unoccupied milking machine waiting for ${him},`);
 	} else {
@@ -494,7 +493,7 @@ App.Facilities.Dairy.industrialAssignmentScene = function(slave) {
 			slave.vagina = 3;
 		}
 		r.push(`The machine detects that ${he} requires the attention of the preparatory raper before it can penetrate ${him} successfully, and holds ${him} in place while the raper slides along its track in the ceiling. It comes to rest above the slave's defenseless body and extends its implements towards ${him}. ${He} can't see or hear it, but ${he} senses that something's happening and shivers.`);
-		if (V.dairyPregSetting > 1 && V.dairyPregSetting > 1 && isFertile(slave) && slave.vagina < 3 && slave.mpreg !== 1) {
+		if (V.dairyPregSetting > 1 && V.dairyPregSetting > 1 && isFertile(slave) && slave.vagina < 3 && slave.mpreg !== 1) { // TODO: Correct one of the identical sub-expressions on both sides of operator "&&"
 			r.push(`${His} pussy is nowhere near ready to accept the passage of drugs and cum in and new slaves out. The new machine lubes ${him} thoroughly and then`);
 			if (slave.vagina === 0) {
 				r.push(`takes ${his} virginity`);
@@ -505,7 +504,7 @@ App.Facilities.Dairy.industrialAssignmentScene = function(slave) {
 		}
 		if (V.dairyStimulatorsSetting > 1 && slave.anus < 3) {
 			r.push(`${He}'ll be drinking through ${his} mouth almost constantly, but that won't be enough. ${He}'ll have to absorb hydration and nutrition from both ends to keep up with the outflow ${he}'ll produce.`);
-			if (V.dairyPregSetting > 1 && V.dairyPregSetting > 1 && isFertile(slave) && slave.vagina < 3 && slave.mpreg !== 1) {
+			if (V.dairyPregSetting > 1 && V.dairyPregSetting > 1 && isFertile(slave) && slave.vagina < 3 && slave.mpreg !== 1) { // TODO: Correct one of the identical sub-expressions on both sides of operator "&&"
 				r.push(`It`);
 			} else {
 				r.push(`The new machine`);
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 7de1c998c4efddbe03b113d7be60809c89e359b0..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";
 	}
 
@@ -131,89 +130,132 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "pump",
-				prereqs: [],
 				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),
-						handler: () => V.PC.skill.engineering += 0.1,
+						cost: 5000 * V.upgradeMultiplierArcology,
+						handler: () => {
+							V.PC.skill.engineering += 0.1;
+
+							App.UI.reload();
+						},
 						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,
 			},
 			{
 				property: "fertilizer",
-				prereqs: [
-					() => V.farmyardUpgrades.pump > 0,
-				],
 				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),
-						handler: () => V.PC.skill.engineering += 0.1,
+						cost: 10000 * V.upgradeMultiplierArcology,
+						handler: () => {
+							V.PC.skill.engineering += 0.1;
+
+							App.UI.reload();
+						},
 						note: `, moderately increases crop yield, and slightly increases upkeep costs`,
+						prereqs: [
+							() => 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,
 			},
 			{
 				property: "hydroponics",
-				prereqs: [
-					() => V.farmyardUpgrades.fertilizer > 0,
-				],
 				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),
-						handler: () => V.PC.skill.engineering += 0.1,
+						cost: 20000 * V.upgradeMultiplierArcology,
+						handler: () => {
+							V.PC.skill.engineering += 0.1;
+
+							App.UI.reload();
+						},
 						note: ` and moderately decreases upkeep costs`,
+						prereqs: [
+							() => 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,
 			},
 			{
 				property: "seeds",
-				prereqs: [
-					() => V.farmyardUpgrades.hydroponics > 0,
-				],
 				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),
-						handler: () => V.PC.skill.engineering += 0.1,
+						cost: 25000 * V.upgradeMultiplierArcology,
+						handler: () => {
+							V.PC.skill.engineering += 0.1;
+
+							App.UI.reload();
+						},
 						note: `, moderately increases crop yield, and slightly increases upkeep costs`,
+						prereqs: [
+							() => 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,
 			},
 			{
 				property: "machinery",
-				prereqs: [
-					() => V.farmyardUpgrades.seeds > 0,
-				],
 				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),
-						handler: () => V.PC.skill.engineering += 0.1,
+						cost: 50000 * V.upgradeMultiplierArcology,
+						handler: () => {
+							V.PC.skill.engineering += 0.1;
+
+							App.UI.reload();
+						},
 						note: `, moderately increases crop yield, and slightly increases upkeep costs`,
+						prereqs: [
+							() => 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/farmyard/shows/saFarmyardShows.js b/src/facilities/farmyard/shows/saFarmyardShows.js
index e264ddd7baf74266905bee2f709aca8b65303efc..0c98ea20140204b511fc9147f24ce70084477332 100644
--- a/src/facilities/farmyard/shows/saFarmyardShows.js
+++ b/src/facilities/farmyard/shows/saFarmyardShows.js
@@ -8,8 +8,8 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 	const {he, him, his, hers, He, His} = getPronouns(slave);
 	const incomeStats = getSlaveStatisticData(slave, V.facility.farmyard);
 	const arcology = V.arcologies[0];
-	const _beautiful = beautiful(slave);
-	const _pretty = pretty(slave);
+	const beautyString = beautiful(slave);
+	const prettyString = pretty(slave);
 
 	const heavyMods = SlaveStatsChecker.modScore(slave).total > 20;
 
@@ -288,9 +288,9 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 	// TODO: add checks for family and relationships
 
 	if (slave.face > 40) {
-		r.push(`${He} is so ${_beautiful} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
+		r.push(`${He} is so ${beautyString} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
 	} else if (slave.face > 10) {
-		r.push(`${He} is so ${_pretty} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
+		r.push(`${He} is so ${prettyString} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
 	} else if (slave.face < -10) {
 		r.push(`${His} audience isn't willing to pay as much because of how unattractive ${his} face is.`);
 	} else if (slave.face < -40) {
diff --git a/src/pregmod/geneLab.js b/src/facilities/geneLab.js
similarity index 89%
rename from src/pregmod/geneLab.js
rename to src/facilities/geneLab.js
index 18eb5545766bfcca3d78865c5b435f989db6bf10..bb9e9b908ef614b401635ee631d05142c520253c 100644
--- a/src/pregmod/geneLab.js
+++ b/src/facilities/geneLab.js
@@ -1,12 +1,12 @@
 App.UI.geneLab = function() {
 	const node = new DocumentFragment();
-	const _PCSkillCheck = Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier);
+	const PCSkillCheck = Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier);
 
 	App.UI.DOM.appendNewElement("h2", node, `The Gene Lab`);
 
 	if (V.geneticMappingUpgrade === 1) {
 		App.UI.DOM.appendNewElement("div", node, `The gene lab is fully operational. It is capable of mapping a slave's genes, identifying genetic traits and abnormalities. It can be used to modify a slave's genome should you obtain the data necessary to adjust it.`, "note");
-		const cost = Math.trunc(500000*V.upgradeMultiplierArcology);
+		const cost = Math.trunc(500000 * V.upgradeMultiplierArcology);
 		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
 			"Upgrade the genome mapper",
 			() => {
@@ -47,7 +47,7 @@ App.UI.geneLab = function() {
 		}
 		if (V.geneticMappingUpgrade >= 2) {
 			if (V.geneticFlawLibrary !== 1) {
-				const anomaliesCost = 100000*_PCSkillCheck;
+				const anomaliesCost = 100000 * PCSkillCheck;
 				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
 					"Purchase designs for inducing genetic anomalies",
 					() => {
@@ -62,8 +62,8 @@ App.UI.geneLab = function() {
 			}
 		}
 		if (V.seeCats === 1) {
-			if (V.geneticMappingUpgrade >=2 && V.projectN.status === 0) {
-				const catCost = 150000*_PCSkillCheck;
+			if (V.geneticMappingUpgrade >= 2 && V.projectN.status === 0) {
+				const catCost = 150000 * PCSkillCheck;
 				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
 					"Hire a team of renowned bioengineers and geneticists to splice the human genome with cat DNA and fulfill the destiny of mankind - creating catgirls",
 					() => {
@@ -78,7 +78,7 @@ App.UI.geneLab = function() {
 				App.UI.DOM.appendNewElement("div", node, `You've started to get into contact with a number of renowned old-world biologists and genetic engineers to pursue the creation of a biological catgirl. They should be arriving soon.`);
 			}
 			if (V.projectN.status === 2) {
-				App.UI.DOM.appendNewElement("div", node, `You've gathered together a team of some of the old world's foremost scientific minds in the fields of genetic engineering, who've turned your genelab into a workplace for what they've dubbed "Project N", or the "Cat Project". One white-bearded man looks up from a large computer screen showing a series of complicated genetic sequences as you enter.`);
+				App.UI.DOM.appendNewElement("div", node, `You've gathered together a team of some of the old world's foremost scientific minds in the fields of genetic engineering, who've turned your gene lab into a workplace for what they've dubbed "Project N", or the "Cat Project". One white-bearded man looks up from a large computer screen showing a series of complicated genetic sequences as you enter.`);
 			}
 			if (V.projectN.status === 3) {
 				App.UI.DOM.appendNewElement("div", node, `The geneticist team has started to make serious progress on project N. In a central tube filled with thick green liquid, a small mass of pinkish material floats in suspended animation, referred to by the biologists as "Subject Delta". A series of screens next to the tube read out low-functioning vitals and other essential information.`);
@@ -92,7 +92,7 @@ App.UI.geneLab = function() {
 			if (V.projectN.status === 6) {
 				App.UI.DOM.appendNewElement("div", node, `Project N is complete. Dr. Nieskowitz and his team are currently monitoring various functions of the genetic laboratory, though you could set them to work engineering another catgirl if you give them the funding to do so. It will take approximately a month to create another catgirl. The genetic engineering tube is currently empty.`);
 			}
-			const engineerCatCost = 20000*_PCSkillCheck;
+			const engineerCatCost = 20000 * PCSkillCheck;
 			if (V.projectN.status === 6 && V.seeCats === 1) {
 				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
 					"Engineer me a Catgirl",
@@ -137,7 +137,7 @@ App.UI.geneLab = function() {
 				}
 			}
 			if (V.projectN.status === 9) {
-				r.push(`The bomb set by the Sons of Sekhmet destroyed large parts of the genelab and killed most of the personnel, including ${V.subjectDeltaName}'s tube. After the death of Doctor Nieskowitz, you haven't just lost ${V.subjectDeltaName} herself, but also the knowledge used to create her. It's doubtful that there's anyone left in the world who can finish what he started.`);
+				r.push(`The bomb set by the Sons of Sekhmet destroyed large parts of the gene lab and killed most of the personnel, including ${V.subjectDeltaName}'s tube. After the death of Doctor Nieskowitz, you haven't just lost ${V.subjectDeltaName} herself, but also the knowledge used to create her. It's doubtful that there's anyone left in the world who can finish what he started.`);
 			}
 			App.Events.addParagraph(node, r);
 		}
@@ -145,10 +145,10 @@ App.UI.geneLab = function() {
 
 	App.UI.DOM.appendNewElement("h2", node, `Genetic Harvesting`);
 
-	const humanCloning = 100000*_PCSkillCheck;
-	if (V.cloningSystem !== 1 && V.rep <= 18000*_PCSkillCheck) {
+	const humanCloning = 100000 * PCSkillCheck;
+	if (V.cloningSystem !== 1 && V.rep <= 18000 * PCSkillCheck) {
 		App.UI.DOM.appendNewElement("div", node, `You lack the reputation needed to access methods for human cloning`, "note");
-	} else if ((V.cloningSystem !== 1) && (V.rep > 18000*_PCSkillCheck)) {
+	} else if ((V.cloningSystem !== 1) && (V.rep > 18000 * PCSkillCheck)) {
 		if (V.organFarmUpgrade === 0) {
 			App.UI.DOM.appendNewElement("div", node, `An organ farm is needed to grow the blank embryo to serve as a clone base`, "note");
 		} else {
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/implantManufactory.js b/src/facilities/implantManufactory.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0a08f1b650ba4fc783d334d119195e6a2d30f89
--- /dev/null
+++ b/src/facilities/implantManufactory.js
@@ -0,0 +1,159 @@
+App.UI.implantManufactory = function() {
+	const node = new DocumentFragment();
+
+	const PCSkillCheck = Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier);
+
+	App.UI.DOM.appendNewElement("h1", node, "The Implant Manufactory");
+
+	App.UI.DOM.appendNewElement("p", node, `The implant manufactory is running smoothly. It can cheaply produce advanced implants and has freed you from relying on outside sources for specialty implants. It can easily produce more complex implants should you obtain the schematics necessary to build them.`, "scene-intro");
+
+	App.UI.DOM.appendNewElement("h2", node, "Implant Production");
+
+	App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of producing customized fillable implants.");
+
+	if (V.meshImplants > 0) {
+		App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of producing supportive mesh breast implants.");
+	} else {
+		if (V.rep <= 10000 * PCSkillCheck) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access plans for supportive breast implants.", "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Purchase plans for supportive mesh breast implants",
+				() => {
+					cashX(forceNeg(40000 * PCSkillCheck), "capEx");
+					V.meshImplants = 1;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(40000 * PCSkillCheck)}. Will allow the construction of organic and supportive mesh breast implants.`
+			));
+		}
+	}
+
+	if (V.UterineRestraintMesh === 1) {
+		App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of producing supportive mesh uterine implants.");
+	}
+
+	if (V.bellyImplants === 0) {
+		if (V.rep <= 2000 * PCSkillCheck) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access experimental fillable abdominal implants.", "note");
+		} else {
+			const cost = 30000 * PCSkillCheck;
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Purchase schematics for fillable abdominal implants",
+				() => {
+					cashX(forceNeg(cost), "capEx");
+					V.bellyImplants = 1;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(cost)}. Will allow the construction of fillable abdominal implants for the autosurgery.`
+			));
+		}
+	} else if (V.bellyImplants > 0) {
+		App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting fillable abdominal implants.");
+		if (V.bellyImplants === 1 && V.cervixImplants === 0) { /* show only after belly implants already researched */
+			if (V.rep <= 6000 * PCSkillCheck) { /* nanotech like technology much more impressive and costly than simple implant */
+				App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access experimental cervix filter micropumps schematics for abdominal implants.", "note");
+			} else {
+				const cost = 70000 * PCSkillCheck;
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+					"Purchase schematics for cervix filter micropumps",
+					() => {
+						cashX(forceNeg(cost), "capEx");
+						V.cervixImplants = 1;
+						App.UI.reload();
+					}, [], "",
+					`Costs ${cashFormat(cost)}. Will allow the construction of cervix filter micropumps for fillable abdominal implants using the autosurgery.`
+				));
+			}
+		} else if (V.cervixImplants === 1) {
+			App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting cervix filter micropumps for fillable abdominal implants.");
+			if (V.rep <= 8000 * PCSkillCheck) {
+				App.UI.DOM.appendNewElement("div", node, "You lack the reputation to obtain conversion kits for rectal filter micropumps.", "note");
+			} else {
+				const cost = 60000 * PCSkillCheck;
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+					"Purchase conversion kits for rectal filter micropumps",
+					() => {
+						cashX(forceNeg(cost), "capEx");
+						V.cervixImplants = 2;
+						App.UI.reload();
+					}, [], "",
+					`Costs ${cashFormat(cost)}. Will allow the construction of the anal equivalent of the cervix micropumps using the autosurgery.`
+				));
+			}
+		} else if (V.cervixImplants > 1) {
+			App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting cervix and rectal filter micropumps for fillable abdominal implants.");
+		}
+	}
+
+	if (V.seePreg !== 0) {
+		App.UI.DOM.appendNewElement("h2", node, "Fertility Implants");
+
+		if (V.fertilityImplant === 1) {
+			App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting fertility enhancing implants for ovaries.");
+		} else if (V.fertilityImplant === 0 && (V.rep <= 3000 * PCSkillCheck)) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access fertility boosting ovarian implants.", "note");
+		} else {
+			const cost = 10000 * PCSkillCheck;
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Purchase schematics for fertility enhancing ovarian implants",
+				() => {
+					cashX(forceNeg(cost), "capEx");
+					V.fertilityImplant = 1;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(cost)}. Will allow the construction of implants that encourage multiple eggs being released during ovulation.`
+			));
+		}
+
+		if (V.sympatheticOvaries === 1) {
+			App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting implants that synchronize ovum release.");
+		}
+
+		if (V.seeHyperPreg === 1 && V.seeExtreme === 1) {
+			if (V.permaPregImplant === 0) {
+				if (V.rep <= 4000 * PCSkillCheck) {
+					App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access experimental pregnancy generator schematics.", "note");
+				} else {
+					const cost = 40000 * PCSkillCheck;
+					App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+						"Purchase schematics for an experimental implantable pregnancy generator",
+						() => {
+							cashX(forceNeg(cost), "capEx");
+							V.permaPregImplant = 1;
+							App.UI.reload();
+						}, [], "",
+						`Costs ${cashFormat(cost)}. Will allow the construction of implants that force perpetual pregnancy.`
+					));
+				}
+			} else if (V.permaPregImplant > 0) {
+				App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of crafting pregnancy generators.");
+			}
+			if (V.PGHack === 1) {
+				App.UI.DOM.appendNewElement("div", node, "The tools required to hack the firmware of basic pregnancy generator implants have been produced by the manufactory for use in the remote surgery.");
+			}
+		}
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Fluid Production Implants");
+
+	if (V.prostateImplants !== 1) {
+		if (V.rep <= 3000 * PCSkillCheck) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access plans for prostate implants.", "note");
+		} else {
+			const cost = 30000 * PCSkillCheck;
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Purchase plans for ejaculation enhancing prostate implants",
+				() => {
+					cashX(forceNeg(cost), "capEx");
+					V.prostateImplants = 1;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(cost)}. Will allow the construction of a prostate implant designed to stimulate fluid production for massive ejaculations. Beware of leaking and dehydration.`
+			));
+		}
+	} else if (V.prostateImplants > 0) {
+		App.UI.DOM.appendNewElement("div", node, "The manufactory is capable of producing ejaculation enhancing prostate implants.");
+	}
+	return node;
+};
diff --git a/src/facilities/incubator/incubatorInteract.js b/src/facilities/incubator/incubatorInteract.js
index 95474dc655744758028b9fa9906d34c6c1da683c..d8a71145fddd475f4254a330262970249fedd6e9 100644
--- a/src/facilities/incubator/incubatorInteract.js
+++ b/src/facilities/incubator/incubatorInteract.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 App.UI.incubator = function() {
 	V.nextButton = "Back to Main";
 	V.nextLink = "Main";
@@ -932,7 +933,7 @@ App.UI.incubator = function() {
 							linkArray.push(App.UI.DOM.makeElement("span", `Ovaries are already prepared.`, "detail"));
 						}
 					}
-					if (V.incubator.tanks[i].dick === 0) {
+					if (V.incubator.tanks[i].dick === 0 && (V.seeDicks > 0 || V.makeDicks > 0)) {
 						if (tankOrgans.penis !== 1) {
 							linkArray.push(
 								makeLink("Prepare penis", () => { App.Medicine.OrganFarm.growIncubatorOrgan(V.incubator.tanks[i], "penis"); }, refresh)
@@ -1588,25 +1589,17 @@ App.UI.incubator = function() {
 
 	function release() {
 		const multiple = (V.incubator.setting.bulkRelease === 1) && V.incubator.tanks.filter(t => t.growTime <= 0).length > 1;
-
-		const singleRelease = () => {
-			const baby = V.incubator.tanks.find(t => t.growTime <= 0);
-			V.incubator.tanks.delete(baby);
-			V.readySlave = baby;
-			V.incubator.readySlaves = 0;
-		};
-
-		const multipleRelease = () => {
-			V.newSlavePool = V.incubator.tanks.deleteWith(t => t.growTime <= 0);
-			V.incubator.readySlaves = 0;
-		};
-
-		if (V.incubator.readySlaves === 1) {
+		const getTanks = () => {
 			if (multiple) {
-				return App.UI.DOM.passageLink(`Release ready tanks`, "Incubator Retrieval Workaround", multipleRelease);
+				V.newSlavePool = V.incubator.tanks.deleteWith(t => t.growTime <= 0);
 			} else {
-				return App.UI.DOM.passageLink(`Release ready tank`, "Incubator Retrieval Workaround", singleRelease);
+				const baby = V.incubator.tanks.find(t => t.growTime <= 0);
+				V.incubator.tanks.delete(baby);
+				V.readySlave = baby;
 			}
+		};
+		if (V.incubator.readySlaves === 1) {
+			return App.UI.DOM.passageLink(`Release ready ${multiple ? "tanks": "tank"}`, "Incubator Retrieval Workaround", getTanks);
 		}
 		return new DocumentFragment();
 	}
@@ -1635,7 +1628,7 @@ App.UI.incubator = function() {
 	 * @param {string} [note]
 	 * @returns {HTMLElement}
 	 */
-	function choice(title, func, passage = "", note) {
+	function choice(title, func, passage = "", note) { // TODO: Regular parameters should not come after default parameters.
 		const div = document.createElement("div");
 		div.classList.add("choices");
 		div.append(
diff --git a/src/facilities/incubator/incubatorRetrievalWorkaround.js b/src/facilities/incubator/incubatorRetrievalWorkaround.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5143892c275e48ee41e5b80877f15c5fc22d955
--- /dev/null
+++ b/src/facilities/incubator/incubatorRetrievalWorkaround.js
@@ -0,0 +1,112 @@
+// @ts-nocheck
+App.UI.incubatorRetrievalWorkaround = function() {
+	V.incubator.readySlaves = 0;
+	const animalBabyWarning = (slave) => {
+		if (slave.father === -8) {
+			Dialog.setup("Attention");
+			const frag = new DocumentFragment();
+			frag.append(`As the farmyard is currently is WIP, Animal fathered children shouldn't be here! Affected slave: ${slave.slaveName}.`);
+			App.UI.DOM.appendNewElement("div", frag, "Please either; Close this dialog and then load a previous save and then either abort the pregnancy or sell/discard this slave.");
+			App.UI.DOM.appendNewElement("div", frag, 
+				App.UI.DOM.link("Alternatively, remove this slave and try again.", () => {
+					if (V.readySlave) {
+						V.readySlave = 0;
+					} else if (V.newSlavePool) {
+						V.newSlavePool.deleteAt(slave); 
+					}
+					if (Dialog.isOpen()) {
+						Dialog.close();
+					}
+				}, [], (V.readySlave ? "Incubator" : "Incubator Retrieval Workaround"))
+			);
+			$(Dialog.body()).empty().append(frag);
+			Dialog.open();
+		}
+	}
+	const parent = (slave, type) => {
+		const r = new DocumentFragment();
+		const missingTableEntry = V.missingTable[slave[type]];
+		const missingSlave = missingTableEntry ? `Your former slave, ${missingTableEntry.slaveName}.` : `Unknown.`;
+		animalBabyWarning(slave);
+		r.append(`${capFirstChar(type)}: `);
+		if (slave[type] > 0) {
+			const tempParent = getSlave(slave[type]);
+			if (!tempParent) {
+				r.append(`Unknown.`);
+			} else {
+				r.append(`${SlaveFullName(tempParent)}`);
+			}
+		} else if (slave[type] === -1) {
+			r.append(`${PlayerName()}`);
+		} else if (type === "father") {
+			if (slave.father === -2) {
+				r.append(`Unknown citizen.`);
+			} else if (slave.father === -3) {
+				r.append(`Your former Master.`);
+			} else if (slave.father === -4) {
+				r.append(`Another arcology's owner.`);
+			} else if (slave.father === -5) {
+				r.append(`One of your clients.`);
+			} else if (slave.father === -6) {
+				r.append(`Societal Elite.`);
+			} else if (slave.father === -7) {
+				r.append(`Lab crafted.`);
+			} else if (slave.father === -9) {
+				r.append(`Futanari Sister.`);
+			} else {
+				r.append(`${missingSlave}`);
+			}
+		} else {
+			r.append(`${missingSlave}`);
+		}
+		return r;
+	};
+	const checkOrgans = (slave) => {
+		if (V.incubator.organs.length > 0) {
+			for (const organ of V.incubator.organs.filter(o => o.ID === slave.ID)) {
+				const newOrgan = {type: organ.type, weeksToCompletion: organ.weeksToCompletion, ID: slave.ID};
+				if (newOrgan.weeksToCompletion <= 0) {
+					V.completedOrgans.push(organ);
+				} else {
+					V.organs.push(newOrgan);
+				}
+				V.incubator.organs.deleteAt(organ);
+			}
+		}
+	};
+
+	const node = new DocumentFragment();
+	if (V.readySlave) {
+		const {he, his, him} = getPronouns(V.readySlave);
+		animalBabyWarning(V.readySlave);
+		App.UI.DOM.appendNewElement("p", node, `${V.readySlave.slaveName} has been discharged from ${V.incubator.name} and is ready for ${his} first ever inspection.`);
+		App.UI.DOM.appendNewElement("div", node, App.Desc.longSlave(V.readySlave));
+		if (V.readySlave.tankBaby !== -3) {
+			checkOrgans(V.readySlave);
+			App.UI.DOM.appendNewElement("div", node, App.UI.newChildIntro(V.readySlave));
+		} else {
+			const price = Math.trunc(slaveCost(V.readySlave)/3);
+			V.activeSlave = V.readySlave; // V.activeSlave is used by Husk Slave Swap Workaround
+			node.append(`A husk is ready to be used.`);
+			App.UI.DOM.appendNewElement("div", node, `As expected, ${he} is a complete vegetable, but that is what you wanted after all. You lack the facilities to care for ${him} in this state, so you should do what you are planning quickly. Or you could sell ${him} to the Flesh Heap.`, "note");
+			if (V.cash >= V.surgeryCost) {
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.passageLink("Contact the bodyswap surgeon.", "Husk Slave Swap Workaround", null, "Will significantly increase the selected slave's upkeep."));
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.passageLink("Sell the husk to Flesh Heap.", "Main", () => { cashX(price, "slaveTransfer"); }, `This body can be bought by the Flesh Heap for ${cashFormat(price)}.`));
+			} else {
+				cashX(price, "slaveTransfer");
+				App.UI.DOM.appendNewElement("span", node, `You can't sustain ${him} and thus must sell ${him} for ${cashFormat(price)}.`, "note");
+			}
+		}
+	} else if (V.newSlavePool) {
+		App.UI.DOM.appendNewElement("p", node, `The following slaves were discharged from ${V.incubator.name}:`);
+		for (const slave of V.newSlavePool) {
+			App.UI.DOM.appendNewElement("div", node, `Name: ${SlaveFullName(slave)}`);
+			App.UI.DOM.appendNewElement("div", node, parent(slave, "mother"));
+			App.UI.DOM.appendNewElement("div", node, parent(slave, "father"));
+			newSlave(slave);
+			checkOrgans(slave);
+		}
+		delete V.newSlavePool;
+	}
+	return node;
+};
diff --git a/src/facilities/incubator/incubatorRetrievalWorkaround.tw b/src/facilities/incubator/incubatorRetrievalWorkaround.tw
deleted file mode 100644
index efa13fb8b7b22e6b3295377de79e6c3e932a5690..0000000000000000000000000000000000000000
--- a/src/facilities/incubator/incubatorRetrievalWorkaround.tw
+++ /dev/null
@@ -1,116 +0,0 @@
-:: Incubator Retrieval Workaround [nobr]
-
-<<set $returnTo = "Main", $nextLink = "Incubator", $nextButton = "Continue">>
-
-<<if $readySlave != 0>>
-	<<setLocalPronouns $readySlave>>
-	$readySlave.slaveName has been discharged from <<= $incubator.name>> and is ready for $his first ever inspection.
-
-	<br><br>
-
-	<<includeDOM App.Desc.longSlave($readySlave)>>
-	<<if $readySlave.tankBaby != 3>>
-		<<if $incubator.organs.length > 0>>
-			<<for _irw = 0; _irw < $incubator.organs.length; _irw++>>
-				<<if $incubator.organs[_irw].ID == $readySlave.ID>>
-					<<set _newOrgan = {type: $incubator.organs[_irw].type, weeksToCompletion: $incubator.organs[_irw].weeksToCompletion, ID: $readySlave.ID}>>
-					<<if _newOrgan.weeksToCompletion <= 0>>
-						<<set $completedOrgans.push($incubator.organs[_irw])>>
-					<<else>>
-						<<set $organs.push(_newOrgan)>>
-					<</if>>
-					<<set $incubator.organs.deleteAt(_irw), _irw-->>
-				<</if>>
-			<</for>>
-		<</if>>
-		<<includeDOM App.UI.newChildIntro($readySlave)>>
-	<<else>>
-		<<set $activeSlave = $readySlave>> /* $activeSlave is used by Husk Slave Swap Workaround */
-		A husk is ready to be used.
-		<br>
-		//As expected, $he is a complete vegetable, but that is what you wanted after all. You lack the facilities to care for $him in this state, so you should do what you are planning quickly. Or you could sell $him to the Flesh Heap.//
-		<<set _price = Math.trunc(slaveCost($readySlave)/3)>>
-		<span id="result">
-		<<if $cash >= $surgeryCost>>
-			<br>[[Contact the bodyswap surgeon.|Husk Slave Swap Workaround]] //Will significantly increase the selected slave's upkeep.//
-			<br>[[Sell the husk to Flesh Heap.|Main][cashX(_price, "slaveTransfer")]]
-			//This body can be bought by the Flesh Heap for <<print cashFormat(_price)>>//.
-		<<else>>
-			<<run cashX(_price, "slaveTransfer")>>
-			//You can't sustain $him and thus must sell $him for <<print cashFormat(_price)>>.//
-		<</if>>
-		</span>
-	<</if>>
-<<else>>
-	The following slaves were discharged from <<= $incubator.name>>:
-
-	<<for _irw = 0; _irw < $newSlavePool.length; _irw++>>
-		<br><br>
-		<<set _newSlave = $newSlavePool[_irw]>>
-
-		Name: <<= SlaveFullName(_newSlave)>>
-		<br>Mother:
-		<<if _newSlave.mother > 0>>
-			<<set _tempMom = getSlave(_newSlave.mother)>>
-			<<if ndef _tempMom>>
-				Unknown.
-			<<else>>
-				<<= SlaveFullName(_tempMom)>>
-			<</if>>
-		<<elseif _newSlave.mother == -1>>
-			<<= PlayerName()>>.
-		<<else>>
-			Your former slave, $missingTable[_newSlave.mother].slaveName.
-		<</if>>
-		<br>Father:
-		<<if _newSlave.father > 0>>
-			<<set _tempDad = getSlave(_newSlave.father)>>
-			<<if ndef _tempDad>>
-				Unknown.
-			<<else>>
-				<<= SlaveFullName(_tempDad)>>
-			<</if>>
-		<<elseif _newSlave.father == -1>>
-			<<= PlayerName()>>.
-		<<elseif _newSlave.father == -2>>
-			Unknown citizen.
-		<<elseif _newSlave.father == -3>>
-			Your former Master.
-		<<elseif _newSlave.father == -4>>
-			Another arcology's owner.
-		<<elseif _newSlave.father == -5>>
-			One of your clients.
-		<<elseif _newSlave.father == -6>>
-			Societal Elite.
-		<<elseif _newSlave.father == -7>>
-			Lab crafted.
-		<<elseif _newSlave.father == -8>>
-			//Error! Animal fathered children shouldn't be here!//
-		<<elseif _newSlave.father == -9>>
-			Futanari Sister.
-		<<else>>
-			<<if def $missingTable[_newSlave.father]>>
-				Your former slave, $missingTable[_newSlave.father].slaveName.
-			<<else>>
-				Unknown.
-			<</if>>
-		<</if>>
-
-		<<run newSlave(_newSlave)>>
-		<<if $incubator.organs.length > 0>>
-			<<for _irw2 = 0; _irw2 < $incubator.organs.length; _irw2++>>
-				<<if $incubator.organs[_irw2].ID == $newSlavePool[_irw].ID>>
-					<<set _newOrgan = {type: $incubator.organs[_irw2].type, weeksToCompletion: $incubator.organs[_irw2].weeksToCompletion, ID: _newSlave.ID}>>
-					<<if _newOrgan.weeksToCompletion <= 0>>
-						<<set $completedOrgans.push($incubator.organs[_irw2])>>
-					<<else>>
-						<<set $organs.push(_newOrgan)>>
-					<</if>>
-					<<set $incubator.organs.deleteAt(_irw2), _irw2-->>
-				<</if>>
-			<</for>>
-		<</if>>
-
-	<</for>>
-	<<set $newSlavePool = 0>>
-<</if>>
diff --git a/src/facilities/masterSuite/masterSuite.js b/src/facilities/masterSuite/masterSuite.js
index 785e5a31f0dbc7247a6f43c240ee925012802246..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;
@@ -149,10 +148,10 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Chinese Revivalist": `as though it were the innermost sanctum of the Forbidden City. A massive bed fills the central space. The walls are gorgeous gilded hand-carved screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates an enormous stone platform that serves as a bed where penitents give their bodies to their ${properMaster()}.`,
 				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace crouch in the center of the space in the form of a massive poster bed with curtains of chain mail.`,
-				"Asset Expansionist": `comfortably, with lots of cushions and seats for pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available. There's a huge, reinforced, low to the ground bed in the middle of the suite.`,
-				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. There's a huge bed in the middle of the suite, with hidden compartments containing condoms and spermicides.`,
-				"Repopulationist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
-				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available. There's a huge, reinforced, low to the ground bed in the middle of the suite.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. There's a huge bed in the middle of the suite, with hidden compartments containing condoms and spermicides.`,
+				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
+				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
 				"Gender Radicalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls in the butt lots of fun. There's a huge bed in the middle of the suite, with straps to restrain slave girls who don't want to be fucked in the butt, but they're concealed for now.`,
 				"Gender Fundamentalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls nice and enjoyable. There's a huge bed in the middle of the suite, with straps to restrain slave girls who don't want to be fucked, but they're concealed for now.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. There's a huge bed in the middle of the space, and there are mirrors almost everywhere, including on the ceiling over the bed.`,
@@ -183,10 +182,10 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Chinese Revivalist": `as though it were the innermost sanctum of the Forbidden City. The walls are gorgeous gilded hand-carved screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates the central space.`,
 				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace decorate the walls.`,
-				"Asset Expansionist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. There are various specialized toys, as well as, lotions and creams readily available.`,
-				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
-				"Repopulationist": `comfortably, with the convenience of massive-breasted slaves in mind. There are lots of handrails, cushions, and low tables, covered with creams, lubricants, and sex toys.`,
-				"Eugenics": `comfortably, with the convenience of bimbos in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and sex toys.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. There are various specialized toys, as well as, lotions and creams readily available.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
+				"Asset Expansionist": `comfortably, with the convenience of massive-breasted slaves in mind. There are lots of handrails, cushions, and low tables, covered with creams, lubricants, and sex toys.`,
+				"Transformation Fetishist": `comfortably, with the convenience of bimbos in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and sex toys.`,
 				"Gender Radicalist": `comfortably, with the convenience of dickgirls in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and vibrating butt plugs.`,
 				"Gender Fundamentalist": `comfortably, with the convenience and pleasure of slavegirls in mind. There are lots of makeup dressers with mirrors, soft divans, and low tables, covered with creams, lubricants, and vibrators.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. The entire area is filled with the heady odors of sweat, metabolites, and sex.`,
@@ -216,11 +215,11 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Arabian Revivalist": `as a beguiling haze of Arabian decadence. Soft cushions are scattered across the floor and piled against the walls to provide something for dusky, naked bodies to recline on. Gauzy curtains partition the room into a number of cozy dens.`,
 				"Chinese Revivalist": `like the mansion of a senior mandarin of ancient China. The walls are gorgeous hand-carved wooden screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates the bed where penitents give their bodies to their ${properTitle()}.`,
-				"Degradationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available.`,
-				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
-				"Transformation Fetishist": `with a gothic grandeur. Blood-red upholstery and hardwood menace. There are numerous places where resistant slaves can be restrained.`,
-				"Repopulationist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible.`,
-				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
+				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace. There are numerous places where resistant slaves can be restrained.`,
+				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible.`,
+				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible.`,
 				"Gender Radicalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls in the butt lots of fun. The straps to restrain slave girls who don't want to be fucked in the butt are concealed for now.`,
 				"Gender Fundamentalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls nice and enjoyable. The straps to restrain slave girls who don't want to be fucked are concealed for now.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. There are mirrors almost everywhere, including on the ceiling over the bed.`,
@@ -260,17 +259,16 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "masterSuiteUpgradeLuxury",
-				prereqs: [],
 				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
@@ -279,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
@@ -288,21 +291,33 @@ 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",
-				prereqs: [
-					() => !!V.seePreg,
-				],
 				tiers: [
 					{
-						value: 2,
-						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.`,
 					},
 				],
 			},
@@ -322,14 +337,14 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						get text() {
 							return `Pregnant slaves have no extra luxuries to reduce stress.`;
 						},
-						link: `Lighter duties`,
+						link: `Normal duties`,
 						value: 0,
 					},
 					{
 						get text() {
 							return `Pregnant slaves are being given some luxuries to reduce stress.`;
 						},
-						link: `Normal duties`,
+						link: `Lighter duties`,
 						value: 1,
 					},
 				],
diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js
index d6e5b13bc1af82a796709c713ff3a89d7252a808..616f13542dd39c5faecb42931acff435d3d1157c 100644
--- a/src/facilities/nursery/utils/nurseryUtils.js
+++ b/src/facilities/nursery/utils/nurseryUtils.js
@@ -508,7 +508,7 @@ App.Facilities.Nursery.nameChild = function nameChild(child) {
 		const {He2, he2, his2} = getPronouns(mother).appendSuffix('2');
 		if (mother.ID === V.ConcubineID) {
 			r += `<br>
-			<<link "Permit your Concubine to name _his2 daughter">>
+			<<link "Permit your Concubine to name ${his2} daughter">>
 				<<replace "#naming">>`;
 			parentNames(mother, child);
 			child.birthName = child.slaveName;
diff --git a/src/facilities/organFarmPassage.js b/src/facilities/organFarmPassage.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7a3c5d773c6d7977c2f098b0fde808b9b8b8c01
--- /dev/null
+++ b/src/facilities/organFarmPassage.js
@@ -0,0 +1,125 @@
+App.UI.organFarm = function() {
+	const node = new DocumentFragment();
+	const PCSkillCheck = Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier);
+
+	App.UI.DOM.appendNewElement("h1", node, "The Organ Farm");
+
+	if (V.organFarmUpgrade > 2) {
+		App.UI.DOM.appendNewElement("div", node, `The organ farm is running smoothly. It can rapidly grow tailored organs for implantation in slaves. It can easily produce altered variants should you obtain the data necessary to create them.`, "scene-intro");
+	} else if (V.organFarmUpgrade > 1) {
+		App.UI.DOM.appendNewElement("div", node, `The organ farm is running smoothly. It can quickly grow tailored organs for implantation in slaves, though there will be side-effects. It can easily produce altered variants should you obtain the data necessary to create them.`, "scene-intro");
+	} else if (V.organFarmUpgrade > 0) {
+		App.UI.DOM.appendNewElement("div", node, `The organ farm is running smoothly. It can grow tailored organs for implantation in slaves. It can easily produce altered variants should you obtain the data necessary to create them.`, "scene-intro");
+	}
+
+	if (V.organFarmUpgrade < 3 && V.rep <= 10000 * PCSkillCheck) {
+		App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access experimental organ farm parts.", "note");
+	} else if (V.dispensary === 0 && V.organFarmUpgrade === 2) {
+		App.UI.DOM.appendNewElement("div", node, "An upgraded pharmaceutical fabricator is required by the perfected organ farm.", "note");
+	} else if (V.dispensary === 0 && V.organFarmUpgrade === 1) {
+		App.UI.DOM.appendNewElement("div", node, "A pharmaceutical fabricator is required to produce the chemicals for the accelerated organ farm.", "note");
+	} else if (V.dispensaryUpgrade === 0 && V.organFarmUpgrade === 2) {
+		App.UI.DOM.appendNewElement("div", node, "The pharmaceutical fabricator must be upgraded in order to produce the drugs required by the perfected organ farm.", "note");
+	} else if (V.organs.length > 0) {
+		App.UI.DOM.appendNewElement("div", node, "The organ farm cannot be upgraded while it is use.", "note");
+	} else if (V.rep > 10000 * PCSkillCheck) {
+		if (V.organFarmUpgrade === 2) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Upgrade the organ farm to the cutting edge model",
+				() => {
+					cashX(forceNeg(150000 * PCSkillCheck), "capEx");
+					V.organFarmUpgrade = 3;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(150000 * PCSkillCheck)}. Will allow the organ farm to rapidly grow organs without risk to the implantee's health.`
+			));
+		} else if (V.organFarmUpgrade === 1) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Upgrade the organ farm with an experimental growth accelerator",
+				() => {
+					cashX(forceNeg(75000 * PCSkillCheck), "capEx");
+					V.organFarmUpgrade = 2;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(75000 * PCSkillCheck)}. Will allow the organ farm to quickly grow organs. Implanted organs may cause health issues.`
+			));
+		}
+	}
+
+	if (V.youngerOvaries > 0) {
+		App.UI.DOM.appendNewElement("div", node, "The organ farm is capable of growing fertile ovaries for postmenopausal slaves.");
+	} else {
+		if (V.rep <= 10000 * PCSkillCheck) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access designs for cloning fertile ovaries for menopausal slaves.", "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Purchase designs for cloning fertile ovaries for menopausal slaves",
+				() => {
+					cashX(forceNeg(30000 * PCSkillCheck), "capEx");
+					V.youngerOvaries = 1;
+					App.UI.reload();
+				}, [], "",
+				`Costs ${cashFormat(30000 * PCSkillCheck)}. Will allow the growth of younger, fertile ovaries for menopausal slaves. Restored fertility will only last for a couple years at most.`
+			));
+		}
+	}
+
+
+	if (V.asexualReproduction === 1) {
+		App.UI.DOM.appendNewElement("div", node, "The organ farm is capable of growing modified ovary pairs capable of self-fertilization.");
+	}
+
+	if (V.seePreg !== 0 && V.seeBestiality === 1 && V.experimental.animalOvaries === 1) {
+		if (V.animalOvaries < 1) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the required designs for cloning animal ovaries for slaves.", "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, "The organ farm is capable of growing animal ovaries for slaves.");
+		}
+
+		if (V.animalTesticles < 1) {
+			App.UI.DOM.appendNewElement("div", node, "You lack the required designs for cloning animal testicles for slaves.", "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, "The organ farm is capable of growing animal testicles for slaves.");
+		}
+
+		if (V.arcologies[0].FSGenderRadicalistResearch === 1) {
+			if (V.animalMpreg < 1) {
+				App.UI.DOM.appendNewElement("div", node, "You lack the required designs for cloning animal anal wombs and ovaries for slaves.", "note");
+			} else {
+				App.UI.DOM.appendNewElement("div", node, "The organ farm is capable of growing animal anal wombs and ovaries for slaves.");
+			}
+		}
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Organ Production");
+	App.UI.DOM.appendNewElement("p", node, App.Medicine.OrganFarm.currentlyGrowing());
+
+	App.UI.DOM.appendNewElement("h2", node, "Future Societies Research");
+
+	if (V.seePreg !== 0) {
+		if (V.arcologies[0].FSGenderRadicalistDecoration === 100) {
+			if (V.arcologies[0].FSGenderRadicalistResearch === 0) {
+				if (V.rep >= 10000 * PCSkillCheck) {
+					App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+						"Fund research into developing male pregnancy methods",
+						() => {
+							cashX(forceNeg(50000 * PCSkillCheck), "capEx");
+							V.arcologies[0].FSGenderRadicalistResearch = 1;
+							App.UI.reload();
+						}, [], "",
+						`Costs ${cashFormat(50000 * PCSkillCheck)}. Will allow cloning and production of anal uteri and ovaries.`
+					));
+				} else {
+					App.UI.DOM.appendNewElement("div", node, "You lack the reputation to access the research necessary to develop anal uteri and ovaries.", "note");
+				}
+			} else {
+				App.UI.DOM.appendNewElement("div", node, "The organ farm has been upgraded with schematics for modified uteri and ovaries.");
+			}
+		} else if (V.arcologies[0].FSGenderRadicalistResearch === 1) {
+			App.UI.DOM.appendNewElement("div", node, "The organ farm has been upgraded with schematics for modified uteri and ovaries.", "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, "Gender Radicalist focused research unavailable.", "note");
+		}
+	}
+	return node;
+};
diff --git a/src/facilities/penthouse/HGSelect.js b/src/facilities/penthouse/HGSelect.js
index 1edf1ac610825548a7d8c4680d1466a39c890579..ff8fc97c4511b233f7a7b4b04f18f25181705ffb 100644
--- a/src/facilities/penthouse/HGSelect.js
+++ b/src/facilities/penthouse/HGSelect.js
@@ -27,7 +27,8 @@ App.Facilities.HGSelect = function() {
 		[], "Main"
 		));
 
-		App.UI.DOM.appendNewElement("div", f, `Slave training	${HGName} will prioritize enabled items in the following order`, "bold");
+		App.UI.DOM.appendNewElement("div", f, `Slave training`, "bold");
+		App.UI.DOM.appendNewElement("div", f, `${HGName} will prioritize enabled items in the following order`, "note");
 
 		div.append(App.UI.DOM.makeCheckbox("headGirlTrainsHealth"), " Health");
 		App.UI.DOM.appendNewElement("div", f, div, "indent");
@@ -37,30 +38,30 @@ App.Facilities.HGSelect = function() {
 		App.UI.DOM.appendNewElement("div", f, div, "indent");
 
 		if (V.headGirlTrainsFlaws) {
-			r.push(`${HGName} will train flaws.`,);
+			r.push(`${HGName} will remove flaws.`,);
 		} else if (V.headGirlSoftensFlaws) {
-			r.push(`${HGName} will softern flaws into quirks.`);
+			r.push(`${HGName} will soften flaws into quirks.`);
 		} else if (V.headGirlOverridesQuirks) {
 			r.push(`${HGName} will override quirks.`);
 		} else {
 			r.push(`${HGName} will ignore flaws.`);
 		}
 
-		links.push(App.UI.DOM.link(" Override quirks", () => {
+		links.push(App.UI.DOM.link("Override quirks", () => {
 			V.headGirlTrainsFlaws = 0;
 			V.headGirlSoftensFlaws = 0;
 			V.headGirlOverridesQuirks = 1;
 		},
 		[], passage()
 		));
-		links.push(App.UI.DOM.link(" Soften flaws", () => {
+		links.push(App.UI.DOM.link("Soften flaws", () => {
 			V.headGirlTrainsFlaws = 0;
 			V.headGirlSoftensFlaws = 1;
 			V.headGirlOverridesQuirks = 0;
 		},
 		[], passage()
 		));
-		links.push(App.UI.DOM.link(" Train flaws", () => {
+		links.push(App.UI.DOM.link("Remove flaws", () => {
 			V.headGirlTrainsFlaws = 1;
 			V.headGirlSoftensFlaws = 0;
 			V.headGirlOverridesQuirks = 0;
@@ -68,7 +69,7 @@ App.Facilities.HGSelect = function() {
 		[], passage()
 		));
 
-		links.push(App.UI.DOM.link(" Ignore flaws", () => {
+		links.push(App.UI.DOM.link("Ignore flaws", () => {
 			V.headGirlTrainsFlaws = 0;
 			V.headGirlSoftensFlaws = 0;
 			V.headGirlOverridesQuirks = 0;
@@ -92,7 +93,7 @@ App.Facilities.HGSelect = function() {
 		r = [];
 		if (V.HGSeverity === 1) {
 			r.push(`${HGName} will be <span class="bold">aggressive</span> when punishing, with rape strongly encouraged.`);
-			r.push(App.UI.DOM.link(" Moderate", () => {
+			r.push(App.UI.DOM.link("Moderate", () => {
 				V.HGSeverity = 0;
 			},
 			[], passage()
@@ -100,12 +101,12 @@ App.Facilities.HGSelect = function() {
 		} else if (V.HGSeverity === 0) {
 			links = [];
 			r.push(`${HGName} will be <span class="bold">moderate</span> when punishing, carefully selecting appropriate consequences.`);
-			links.push(App.UI.DOM.link(" Be aggressive", () => {
+			links.push(App.UI.DOM.link("Be aggressive", () => {
 				V.HGSeverity = 1;
 			},
 			[], passage()
 			));
-			links.push(App.UI.DOM.link(` Apply restrictions`, () => {
+			links.push(App.UI.DOM.link(`Apply restrictions`, () => {
 				V.HGSeverity = -1;
 			},
 			[], passage()
@@ -113,7 +114,7 @@ App.Facilities.HGSelect = function() {
 			r.push(App.UI.DOM.generateLinksStrip(links));
 		} else if (V.HGSeverity === -1) {
 			r.push(`${HGName} will be <span class="bold">respectful</span> when punishing, treating slaves decently.`);
-			r.push(App.UI.DOM.link(" Be stricter", () => {
+			r.push(App.UI.DOM.link("Be stricter", () => {
 				V.HGSeverity = 0;
 			},
 			[], passage()
@@ -124,14 +125,14 @@ App.Facilities.HGSelect = function() {
 		r = [];
 		if (V.HGPiercings === 1) {
 			r.push(`${HGName} is <span class="bold">allowed</span> to use piercings as a tool to improve slaves' attitudes.`);
-			r.push(App.UI.DOM.link(" Disallow", () => {
+			r.push(App.UI.DOM.link("Disallow", () => {
 				V.HGPiercings = 0;
 			},
 			[], passage()
 			));
 		} else {
 			r.push(`${HGName} is <span class="bold">not allowed</span> to use piercings as a tool to improve slaves' attitudes.`);
-			r.push(App.UI.DOM.link(" Allow", () => {
+			r.push(App.UI.DOM.link("Allow", () => {
 				V.HGPiercings = 1;
 			},
 			[], passage()
@@ -143,14 +144,14 @@ App.Facilities.HGSelect = function() {
 		App.UI.DOM.appendNewElement("div", f, "Behavior towards you: ", "underline");
 		if (V.HGFormality === 1) {
 			r.push(`${HGName} will be <span class="bold">formal:</span> you will always be called ${getWrittenTitle(S.HeadGirl)}, just like any other slave.`);
-			r.push(App.UI.DOM.link(" Allow private informality", () => {
+			r.push(App.UI.DOM.link("Allow private informality", () => {
 				V.HGFormality = 0;
 			},
 			[], passage()
 			));
 		} else {
 			r.push(`${HGName} is allowed to be <span class="bold">informal:</span> in private, you can be called ${properTitle()}.`);
-			r.push(App.UI.DOM.link(" Maintain complete formality", () => {
+			r.push(App.UI.DOM.link("Maintain complete formality", () => {
 				V.HGFormality = 1;
 			},
 			[], passage()
diff --git a/src/facilities/penthouse/penthousePassage.js b/src/facilities/penthouse/penthousePassage.js
index 281b29509d94abda5dc41ed114ec6af248703284..a6d66fbc63cde6d0421097cf66a154a4e30f036f 100644
--- a/src/facilities/penthouse/penthousePassage.js
+++ b/src/facilities/penthouse/penthousePassage.js
@@ -39,7 +39,7 @@ App.UI.managePenthouse = function() {
 				)
 			);
 		} else if (V.SF.FS.Tension > 100) {
-			App.UI.DOM.appendNewElement("div", el, App.SF.fsIntegration.badOutcome_Firebase());
+			App.UI.DOM.appendNewElement("div", el, App.SF.fsIntegration.badOutcomeFirebase());
 		}
 		return el;
 	}
@@ -415,14 +415,14 @@ App.UI.managePenthouse = function() {
 
 		r = [];
 		if (V.boobAccessibility > 0 || V.pregAccessibility > 0 || V.dickAccessibility > 0 || V.ballsAccessibility > 0 || V.buttAccessibility > 0) {
-			const _removeCost = Math.trunc((5000 * (V.boobAccessibility + V.pregAccessibility + V.dickAccessibility + V.ballsAccessibility + V.buttAccessibility)) * V.upgradeMultiplierArcology);
+			const removeCost = Math.trunc((5000 * (V.boobAccessibility + V.pregAccessibility + V.dickAccessibility + V.ballsAccessibility + V.buttAccessibility)) * V.upgradeMultiplierArcology);
 			App.UI.DOM.appendNewElement(
 				"div",
 				el,
 				App.UI.DOM.link(
 					"Remove the accessibility renovations",
 					() => {
-						cashX(forceNeg(_removeCost), "capEx");
+						cashX(forceNeg(removeCost), "capEx");
 						V.boobAccessibility = 0;
 						V.pregAccessibility = 0;
 						V.dickAccessibility = 0;
@@ -431,7 +431,7 @@ App.UI.managePenthouse = function() {
 					},
 					[],
 					"Manage Penthouse",
-					`Will cost ${cashFormat(_removeCost)}`
+					`Will cost ${cashFormat(removeCost)}`
 				),
 				"detail"
 			);
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/salon/salonPassage.js b/src/facilities/salon/salonPassage.js
index c6d257eb7c3561b331f86f9bd422a48b5ea856dc..d3e87143beb432230929f06a364a740664404ac0 100644
--- a/src/facilities/salon/salonPassage.js
+++ b/src/facilities/salon/salonPassage.js
@@ -59,11 +59,17 @@ App.UI.salon = function(slave, cheat = false) {
 			.addValue("Cosmetic glasses", "glasses", billMod);
 		if (getBestVision(slave) !== 0 && anyVisionEquals(slave, 1)) {
 			option.addValue("Corrective glasses", "corrective glasses", billMod);
-			option.addValue("Corrective contacts", "corrective contacts", billMod);
+			if (hasAnyEyes(slave)) {
+				option.addValue("Corrective contacts", "corrective contacts", billMod);
+			}
 		} else {
 			option.addValue("Blurring glasses", "blurring glasses", billMod);
-			option.addValue("Blurring contacts", "blurring contacts", billMod);
-			option.addComment("Blurring options are annoying and impede performance on some assignments.");
+			if (hasAnyEyes(slave)) {
+				option.addValue("Blurring contacts", "blurring contacts", billMod);
+			}
+			if (getBestVision(slave) !== 0) {
+				option.addComment("Blurring options are annoying and impede performance on some assignments.");
+			}
 		}
 		el.append(options.render());
 
@@ -434,12 +440,12 @@ App.UI.salon = function(slave, cheat = false) {
 		}
 
 		// Pubic hair
-		const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+		const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 		r = [];
-		const hasPubes = (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1);
+		const hasPubes = (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless" && slave.physicalAge >= pubertyAge - 1);
 		if (hasPubes) {
 			r.push(`${His}`);
-			if (slave.physicalAge < _pubertyAge) {
+			if (slave.physicalAge < pubertyAge) {
 				r.push(`wispy pubic hair, which is just starting to grow in,`);
 			} else if (slave.pubicHStyle === "in a strip") {
 				r.push(`pubic hair, which is shaved into a strip,`);
@@ -477,10 +483,10 @@ App.UI.salon = function(slave, cheat = false) {
 
 		// Armpit hair
 		r = [];
-		const hasPitHair = (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1);
+		const hasPitHair = (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless" && slave.physicalAge >= pubertyAge - 1);
 		if (hasPitHair) {
 			r.push(`${His}`);
-			if (slave.physicalAge < _pubertyAge) {
+			if (slave.physicalAge < pubertyAge) {
 				r.push(`wispy underarm hair`);
 			} else {
 				r.push(`${slave.underArmHStyle} underarm hair`);
diff --git a/src/facilities/schoolroom/schoolroom.js b/src/facilities/schoolroom/schoolroom.js
index 52c2298d98bfa348f37f3cd330adeea5abae349f..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";
 	}
 
@@ -92,70 +91,85 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "schoolroomUpgradeSkills",
-				prereqs: [],
 				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",
-				prereqs: [],
 				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",
-				prereqs: [
-					() => V.arcologies[0].FSIntellectualDependency > 80,
-				],
 				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,
+						prereqs: [
+							() => 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,
+						prereqs: [
+							() => 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",
-				prereqs: [],
 				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}`,
@@ -165,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}`,
@@ -174,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 f5a053165c50b412d503015773576f17eed0c8b4..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";
 	}
 
@@ -89,22 +88,25 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "servantsQuartersUpgradeMonitoring",
-				prereqs: [],
 				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 e886e959a3959b5e1c5e672a6ad80c2dd04f9a19..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";
 	}
 
@@ -94,23 +93,26 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility {
 		};
 	}
 
-	/** @returns {FC.Facilities.Upgrade[]} */
+	/** @returns {FC.IUpgrade[]} */
 	get upgrades() {
 		return [
 			{
 				property: "spaUpgrade",
-				prereqs: [],
 				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/analyzePlayerPregnancy.js b/src/facilities/surgery/analyzePlayerPregnancy.js
index 809cadc7cc45064e0c3eb4112683a06521d6b69b..4812d2792430edecbf3f2fe186ca9312fd63ff32 100644
--- a/src/facilities/surgery/analyzePlayerPregnancy.js
+++ b/src/facilities/surgery/analyzePlayerPregnancy.js
@@ -1,5 +1,4 @@
 App.UI.analyzePCPregnancy = function() {
-	//:: Analyze PC Pregnancy [nobr]
 	const node = new DocumentFragment();
 
 	if (lastVisited("Incubator") === 1) {
@@ -10,16 +9,16 @@ App.UI.analyzePCPregnancy = function() {
 	V.nextButton = "Continue";
 	V.nextLink = V.storedLink;
 
-	const _WL = V.PC.womb.length;
-	const _incubatorReservations = WombReserveCount(V.PC, "incubator");
-	const _nurseryReservations = WombReserveCount(V.PC, "nursery");
-	const _freeTanks = V.incubator.capacity - V.incubator.tanks.length;
-	const _freeCribs = V.nursery - V.cribs.length;
-	const _reservedChildren = FetusGlobalReserveCount("incubator");
-	const _reservedChildrenNursery = FetusGlobalReserveCount("nursery");
+	const WL = V.PC.womb.length;
+	const incubatorReservations = WombReserveCount(V.PC, "incubator");
+	const nurseryReservations = WombReserveCount(V.PC, "nursery");
+	const freeTanks = V.incubator.capacity - V.incubator.tanks.length;
+	const freeCribs = V.nursery - V.cribs.length;
+	const reservedChildren = FetusGlobalReserveCount("incubator");
+	const reservedChildrenNursery = FetusGlobalReserveCount("nursery");
 	let linkArray = [];
 
-	if (_WL === 0) {
+	if (WL === 0) {
 		setTimeout(() => Engine.play("Manage Personal Affairs"), Engine.minDomActionDelay);
 	} else {
 		App.UI.DOM.appendNewElement("p", node, `You make yourself comfortable and prep your stomach for examination.`, "scene-intro");
@@ -33,7 +32,7 @@ App.UI.analyzePCPregnancy = function() {
 		if (V.incubator.capacity > 0 || V.nursery > 0) {
 			let div = App.UI.DOM.appendNewElement("div", p);
 			if (V.incubator.capacity > 0) {
-				if (_incubatorReservations > 0) {
+				if (incubatorReservations > 0) {
 					linkArray.push(App.UI.DOM.link(
 						`Remove all of your children from ${V.incubator.name}`,
 						() => {
@@ -43,7 +42,7 @@ App.UI.analyzePCPregnancy = function() {
 						"Analyze PC Pregnancy"
 					));
 				}
-				if (_incubatorReservations < _WL && (_reservedChildren + _WL - _incubatorReservations <= _freeTanks)) {
+				if (incubatorReservations < WL && (reservedChildren + WL - incubatorReservations <= freeTanks)) {
 					linkArray.push(App.UI.DOM.link(
 						`Keep all of your children in ${V.incubator.name}`,
 						() => {
@@ -53,7 +52,7 @@ App.UI.analyzePCPregnancy = function() {
 						[],
 						"Analyze PC Pregnancy"
 					));
-				} else if (_incubatorReservations < _WL) {
+				} else if (incubatorReservations < WL) {
 					App.UI.DOM.appendNewElement("span", div, `There is not enough free space in ${V.incubator.name} for the rest of your children.`);
 				}
 				div.append(App.UI.DOM.generateLinksStrip(linkArray));
@@ -62,7 +61,7 @@ App.UI.analyzePCPregnancy = function() {
 			linkArray = [];
 			div = App.UI.DOM.appendNewElement("div", p);
 			if (V.nursery > 0) {
-				if (_nurseryReservations > 0) {
+				if (nurseryReservations > 0) {
 					linkArray.push(App.UI.DOM.link(
 						`Remove all of your children from ${V.nurseryName}`,
 						() => {
@@ -72,7 +71,7 @@ App.UI.analyzePCPregnancy = function() {
 						"Analyze Pregnancy"
 					));
 				}
-				if (_nurseryReservations < _WL && (_reservedChildrenNursery + _WL - _nurseryReservations <= _freeCribs)) {
+				if (nurseryReservations < WL && (reservedChildrenNursery + WL - nurseryReservations <= freeCribs)) {
 					linkArray.push(App.UI.DOM.link(
 						`Keep all of your children in ${V.incubator.name}`,
 						() => {
@@ -82,7 +81,7 @@ App.UI.analyzePCPregnancy = function() {
 						[],
 						"Analyze Pregnancy"
 					));
-				} else if (_nurseryReservations < _WL) {
+				} else if (nurseryReservations < WL) {
 					App.UI.DOM.appendNewElement("span", div, `There is not enough free space in ${V.nurseryName} for the rest of your children.`);
 				}
 				div.append(App.UI.DOM.generateLinksStrip(linkArray));
diff --git a/src/facilities/surgery/analyzePregnancy.js b/src/facilities/surgery/analyzePregnancy.js
index 08229f5d8584fef10c42032c9864866e27bf6778..3633562c44e0a03b7ff1fdff0c4f1ad8e4712c21 100644
--- a/src/facilities/surgery/analyzePregnancy.js
+++ b/src/facilities/surgery/analyzePregnancy.js
@@ -80,13 +80,13 @@ globalThis.analyzePregnancies = function(mother, cheat) {
 				if (cheat) {
 					option.showTextBox().pulldown()
 						.addValue("hairless")
-						.addValue("hair");
+						.addValue("bushy");
 				}
 				option = options.addOption(`Armpit hair: ${capFirstChar(genes.underArmHStyle)}`, "underArmHStyle", genes);
 				if (cheat) {
 					option.showTextBox().pulldown()
 						.addValue("hairless")
-						.addValue("hair");
+						.addValue("bushy");
 				}
 				if (genes.markings === "freckles" || genes.markings === "heavily freckled") {
 					option = options.addOption(`Markings: ${capFirstChar(genes.markings)}`, "markings", genes);
@@ -250,13 +250,12 @@ App.UI.analyzePregnancy = function() {
 	V.nextLink = V.storedLink;
 	const slave = getSlave(V.AS);
 
-	const _WL = slave.womb.length;
-	const _incubatorReservations = WombReserveCount(slave, "incubator");
-	const _nurseryReservations = WombReserveCount(slave, "nursery");
-	const _freeTanks = V.incubator.capacity - V.incubator.tanks.length;
-	const _freeCribs = V.nursery - V.cribs.length;
-	const _reservedChildren = FetusGlobalReserveCount("incubator");
-	const _reservedChildrenNursery = FetusGlobalReserveCount("nursery");
+	const WL = slave.womb.length;
+	const incubatorReservations = WombReserveCount(slave, "incubator");
+	const nurseryReservations = WombReserveCount(slave, "nursery");
+	const freeTanks = V.incubator.capacity - V.incubator.tanks.length;
+	const freeCribs = V.nursery - V.cribs.length;
+	const reservedChildren = FetusGlobalReserveCount("incubator");
 	let linkArray = [];
 
 	const {
@@ -270,15 +269,15 @@ App.UI.analyzePregnancy = function() {
 
 	App.UI.DOM.appendNewElement("h2", node, "Overall statistics");
 	let p = App.UI.DOM.appendNewElement("p", node);
-	const _cc = Math.round(slave.bellyPreg);
-	const _safeCC = Math.round(slave.pregAdaptation * 2000);
+	const cc = Math.round(slave.bellyPreg);
+	const safeCC = Math.round(slave.pregAdaptation * 2000);
 	if (V.geneticMappingUpgrade > 0) {
 		App.UI.DOM.appendNewElement("div", p, `Estimated physical degree of pregnancy adaptation: ${num(Math.round(slave.pregAdaptation))}`);
-		App.UI.DOM.appendNewElement("div", p, `Estimated safe ${(slave.ovaries === 1 || slave.mpreg === 1) ? `womb` : `abdominal`} volume: ${num(_safeCC)}cc`);
+		App.UI.DOM.appendNewElement("div", p, `Estimated safe ${(slave.ovaries === 1 || slave.mpreg === 1) ? `womb` : `abdominal`} volume: ${num(safeCC)}cc`);
 	}
 	App.UI.DOM.appendNewElement("div", p, `Current fetal count: ${slave.womb.length}`);
 	App.Events.addNode(p, [
-		`Estimated ${(slave.ovaries === 1 || slave.mpreg === 1) ? `womb` : `abdominal`} volume: ${(_safeCC < _cc && V.geneticMappingUpgrade > 0) ? `<span class="red">${num(_cc)}</span>` : num(_cc)}cc`
+		`Estimated ${(slave.ovaries === 1 || slave.mpreg === 1) ? `womb` : `abdominal`} volume: ${(safeCC < cc && V.geneticMappingUpgrade > 0) ? `<span class="red">${num(cc)}</span>` : num(cc)}cc`
 	], "div");
 
 
@@ -290,7 +289,7 @@ App.UI.analyzePregnancy = function() {
 		if (V.incubator.capacity > 0 || V.nursery > 0) {
 			let div = App.UI.DOM.appendNewElement("div", p);
 			if (V.incubator.capacity > 0) {
-				if (_incubatorReservations > 0) {
+				if (incubatorReservations > 0) {
 					linkArray.push(App.UI.DOM.link(
 						`Remove all of ${his} children from ${V.incubator.name}`,
 						() => WombChangeReserveType(slave, "incubator", ""),
@@ -298,7 +297,7 @@ App.UI.analyzePregnancy = function() {
 						"Analyze Pregnancy"
 					));
 				}
-				if (_incubatorReservations < _WL && (_reservedChildren + _WL - _incubatorReservations <= _freeTanks)) {
+				if (incubatorReservations < WL && (reservedChildren + WL - incubatorReservations <= freeTanks)) {
 					linkArray.push(App.UI.DOM.link(
 						`Keep all of ${his} children in ${V.incubator.name}`,
 						() => {
@@ -308,7 +307,7 @@ App.UI.analyzePregnancy = function() {
 						[],
 						"Analyze Pregnancy"
 					));
-				} else if (_incubatorReservations < _WL) {
+				} else if (incubatorReservations < WL) {
 					App.UI.DOM.appendNewElement("span", div, `There is not enough free space in ${V.incubator.name} for the rest of ${his} children.`);
 				}
 				div.append(App.UI.DOM.generateLinksStrip(linkArray));
@@ -317,7 +316,7 @@ App.UI.analyzePregnancy = function() {
 			linkArray = [];
 			div = App.UI.DOM.appendNewElement("div", p);
 			if (V.nursery > 0) {
-				if (_nurseryReservations > 0) {
+				if (nurseryReservations > 0) {
 					linkArray.push(App.UI.DOM.link(
 						`Remove all of ${his} children from ${V.nurseryName}`,
 						() => WombChangeReserveType(slave, "nursery", ""),
@@ -325,7 +324,7 @@ App.UI.analyzePregnancy = function() {
 						"Analyze Pregnancy"
 					));
 				}
-				if (_nurseryReservations < _WL && (FetusGlobalReserveCount("nursery") + _WL - _nurseryReservations <= _freeCribs)) {
+				if (nurseryReservations < WL && (FetusGlobalReserveCount("nursery") + WL - nurseryReservations <= freeCribs)) {
 					linkArray.push(App.UI.DOM.link(
 						`Keep all of ${his} children in ${V.incubator.name}`,
 						() => {
@@ -335,7 +334,7 @@ App.UI.analyzePregnancy = function() {
 						[],
 						"Analyze Pregnancy"
 					));
-				} else if (_nurseryReservations < _WL) {
+				} else if (nurseryReservations < WL) {
 					App.UI.DOM.appendNewElement("span", div, `There is not enough free space in ${V.nurseryName} for the rest of ${his} children.`);
 				}
 				div.append(App.UI.DOM.generateLinksStrip(linkArray));
diff --git a/src/facilities/surgery/remoteSurgery.js b/src/facilities/surgery/remoteSurgery.js
index 0fb3d5a145f1619a39062797f15d036cd741a627..4e047cb2ed2222362fcad4ac840ca4323bba2b76 100644
--- a/src/facilities/surgery/remoteSurgery.js
+++ b/src/facilities/surgery/remoteSurgery.js
@@ -35,8 +35,8 @@ App.UI.SlaveInteract.remoteSurgery = function(slave) {
 	tabBar.customNode = f;
 
 	tabBar.addTab("Hair and Face", "hairAndFace", App.UI.surgeryPassageHairAndFace(slave, refresh));
-	tabBar.addTab("Upper", "upper", App.UI.surgeryPassageUpper(slave));
-	tabBar.addTab("Lower", "lower", App.UI.surgeryPassageLower(slave));
+	tabBar.addTab("Upper", "upper", App.UI.surgeryPassageUpper(slave, refresh));
+	tabBar.addTab("Lower", "lower", App.UI.surgeryPassageLower(slave, refresh));
 	tabBar.addTab("Structural", "structural", App.UI.surgeryPassageStructural(slave, refresh));
 	tabBar.addTab("Exotic", "exotic", App.UI.surgeryPassageExotic(slave));
 	if (V.seeExtreme) {
diff --git a/src/facilities/surgery/surgeryPassageFaceAndHair.js b/src/facilities/surgery/surgeryPassageFaceAndHair.js
index d9acf4ae813a773f7500e77e8766d28a22f95d0b..42718b8ad68d104d36359d0f295c453c246c1383 100644
--- a/src/facilities/surgery/surgeryPassageFaceAndHair.js
+++ b/src/facilities/surgery/surgeryPassageFaceAndHair.js
@@ -13,12 +13,12 @@ App.UI.surgeryPassageHairAndFace = function(slave, refreshParent, cheat = false)
 
 	function content() {
 		const frag = new DocumentFragment();
-		const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+		const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 		const {
 			His, He,
 			his, him
 		} = getPronouns(slave);
-		const _artificiality = faceSurgeryArtificiality();
+		const artificiality = faceSurgeryArtificiality();
 
 		App.UI.DOM.appendNewElement("h3", frag, `Hair:`);
 		frag.append(
@@ -71,9 +71,9 @@ App.UI.surgeryPassageHairAndFace = function(slave, refreshParent, cheat = false)
 			const r = [];
 			if ((slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless") || (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless")) {
 				r.push(`${He}`);
-				if (slave.physicalAge >= _pubertyAge) {
+				if (slave.physicalAge >= pubertyAge) {
 					r.push(`naturally grows`);
-				} else if (slave.physicalAge >= _pubertyAge - 1) {
+				} else if (slave.physicalAge >= pubertyAge - 1) {
 					r.push(`is beginning to grow`);
 				} else {
 					r.push(`will someday grow`);
@@ -158,13 +158,13 @@ App.UI.surgeryPassageHairAndFace = function(slave, refreshParent, cheat = false)
 				} else if (V.surgeryUpgrade) {
 					r.push(`The advanced surgical suite will reduce this effect.`);
 				}
-				if (slave.faceImplant + _artificiality > 95) {
+				if (slave.faceImplant + artificiality > 95) {
 					r.push(App.UI.DOM.makeElement("span", `${(slave.faceImplant !== 0) ? `Further facial` : `Facial`} surgery will create a severe uncanny valley effect.`, "yellow"));
-				} else if (slave.faceImplant + _artificiality > 60 && slave.faceImplant <= 60) {
+				} else if (slave.faceImplant + artificiality > 60 && slave.faceImplant <= 60) {
 					r.push(App.UI.DOM.makeElement("span", `${(slave.faceImplant !== 0) ? `Further facial` : `Facial`}surgery will be extremely obvious.`, "yellow"));
-				} else if (slave.faceImplant + _artificiality > 30 && slave.faceImplant <= 30) {
+				} else if (slave.faceImplant + artificiality > 30 && slave.faceImplant <= 30) {
 					r.push(App.UI.DOM.makeElement("span", `${(slave.faceImplant !== 0) ? `Further facial` : `Facial`} surgery will eliminate a natural appearance.`, "yellow"));
-				} else if (slave.faceImplant + _artificiality > 5 && slave.faceImplant <= 5) {
+				} else if (slave.faceImplant + artificiality > 5 && slave.faceImplant <= 5) {
 					r.push(App.UI.DOM.makeElement("span", `${(slave.faceImplant !== 0) ? `Further facial` : `Facial`} surgery will disturb a perfectly natural appearance.`, "yellow"));
 				} else {
 					r.push(`A single facial surgery is not projected to significantly impact artificiality.`);
diff --git a/src/facilities/surgery/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js
index 3a112227152f20177b01588fbc04466214434093..f6165bbaeb41195d2503e828b908f14d60b8ad31 100644
--- a/src/facilities/surgery/surgeryPassageLower.js
+++ b/src/facilities/surgery/surgeryPassageLower.js
@@ -1,23 +1,23 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
+ * @param {()=>void} refreshParent
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
-
-App.UI.surgeryPassageLower = function(slave, cheat = false) {
+App.UI.surgeryPassageLower = function(slave, refreshParent, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
 
 	function content() {
 		const frag = new DocumentFragment();
-		// const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+		// const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 		const {
 			His, He,
 			his, he, him
 		} = getPronouns(slave);
-		// const _artificiality = 25 - (5 * Math.trunc(V.PC.skill.medicine / 50)) - (5 * V.surgeryUpgrade);
+		// const artificiality = 25 - (5 * Math.trunc(V.PC.skill.medicine / 50)) - (5 * V.surgeryUpgrade);
 
 		App.UI.DOM.appendNewElement("h3", frag, `Butt:`);
 		frag.append(butt(), asshole());
@@ -107,7 +107,7 @@ App.UI.surgeryPassageLower = function(slave, cheat = false) {
 			App.Events.addNode(el, r, "div");
 
 			const surgeries = App.Medicine.Surgery.sizingProcedures.butt(slave, App.Medicine.Surgery.allSizingOptions());
-			const surgeryLinks = surgeries.map(s => App.Medicine.Surgery.makeObjectLink("Surgery Degradation", s, slave));
+			const surgeryLinks = surgeries.map(s => App.Medicine.Surgery.makeLink(s, refresh, cheat));
 			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(surgeryLinks), "choices");
 			return el;
 		}
@@ -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) {
@@ -950,8 +952,7 @@ App.UI.surgeryPassageLower = function(slave, cheat = false) {
 					func();
 				}
 				if (cheat) {
-					jQuery(container).empty().append(content());
-					App.Events.refreshEventArt(slave);
+					refresh();
 				} else {
 					V.surgeryType = surgeryType;
 					// TODO: pass if it affected health or not?
@@ -964,4 +965,10 @@ App.UI.surgeryPassageLower = function(slave, cheat = false) {
 			tooltip
 		);
 	}
+
+	function refresh() {
+		jQuery(container).empty().append(content());
+		App.Events.refreshEventArt(slave);
+		refreshParent();
+	}
 };
diff --git a/src/facilities/surgery/surgeryPassageUpper.js b/src/facilities/surgery/surgeryPassageUpper.js
index 1bf50a55a5fcefdfdc116c18caff7b561243ce79..3f2577f89fafbd942746059063b6d1d4736c1b9c 100644
--- a/src/facilities/surgery/surgeryPassageUpper.js
+++ b/src/facilities/surgery/surgeryPassageUpper.js
@@ -1,11 +1,11 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
+ * @param {()=>void} refreshParent
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
-
-App.UI.surgeryPassageUpper = function(slave, cheat = false) {
+App.UI.surgeryPassageUpper = function(slave, refreshParent, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -121,9 +121,9 @@ App.UI.surgeryPassageUpper = function(slave, cheat = false) {
 				r.push(`no implants.`);
 			}
 			App.Events.addNode(el, r, "div");
-			const _surgeries = App.Medicine.Surgery.sizingProcedures.boobs(slave, App.Medicine.Surgery.allSizingOptions());
-			const _surgeryLinks = _surgeries.map(s => App.Medicine.Surgery.makeObjectLink("Surgery Degradation", s, slave));
-			App.UI.DOM.appendNewElement("div", el, (App.UI.DOM.generateLinksStrip(_surgeryLinks)), "choices");
+			const surgeries = App.Medicine.Surgery.sizingProcedures.boobs(slave, App.Medicine.Surgery.allSizingOptions());
+			const surgeryLinks = surgeries.map(s => App.Medicine.Surgery.makeLink(s, refresh, cheat));
+			App.UI.DOM.appendNewElement("div", el, (App.UI.DOM.generateLinksStrip(surgeryLinks)), "choices");
 
 			r = [];
 			const linkArray = [];
@@ -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");
@@ -830,8 +814,7 @@ App.UI.surgeryPassageUpper = function(slave, cheat = false) {
 					func();
 				}
 				if (cheat) {
-					jQuery(container).empty().append(content());
-					App.Events.refreshEventArt(slave);
+					refresh();
 				} else {
 					V.surgeryType = surgeryType;
 					// TODO: pass if it affected health or not?
@@ -844,4 +827,10 @@ App.UI.surgeryPassageUpper = function(slave, cheat = false) {
 			tooltip
 		);
 	}
+
+	function refresh() {
+		jQuery(container).empty().append(content());
+		App.Events.refreshEventArt(slave);
+		refreshParent();
+	}
 };
diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js
index b7e8e2a7e9429b0d32b70e44fc721f03f5eab3c8..6073f0de91a3fbb052585dc684bb2fba6f3b9d0a 100644
--- a/src/futureSocieties/fsPassage.js
+++ b/src/futureSocieties/fsPassage.js
@@ -1,7 +1,7 @@
 App.UI.fsPassage = function() {
 	const arc = V.arcologies[0];
 	V.FSReminder = 0;
-	const _FSCredits = FutureSocieties.availCredits();
+	const FSCredits = FutureSocieties.availCredits();
 	setup();
 
 	V.nextButton = "Back";
@@ -124,7 +124,7 @@ App.UI.fsPassage = function() {
 	function overview() {
 		const el = new DocumentFragment();
 		const r = [];
-		if (_FSCredits > 0) {
+		if (FSCredits > 0) {
 			r.push(App.UI.DOM.makeElement("span", `${arc.name}'s society is ready to begin accepting a new societal direction.`, "yellow"));
 		} else if (V.FSGotRepCredits >= 3) {
 			r.push(`Your society is so radically changed that it is starting to take on a life of its own. The major decisions about its direction have been made.`);
@@ -356,7 +356,7 @@ App.UI.fsPassage = function() {
 			r.push(`${arc.FSSupremacistRace} superiority.`);
 			r.push(activeFS("FSSupremacist"));
 		} else {
-			if (_FSCredits > 0) {
+			if (FSCredits > 0) {
 				r.push(
 					App.UI.DOM.link(
 						"Racial Supremacism",
@@ -399,7 +399,7 @@ App.UI.fsPassage = function() {
 			r.push(`${arc.FSSubjugationistRace} inferiority.`);
 			r.push(activeFS("FSSubjugationist"));
 		} else {
-			if (_FSCredits > 0) {
+			if (FSCredits > 0) {
 				r.push(
 					App.UI.DOM.link(
 						"Racial Subjugationism",
@@ -449,7 +449,7 @@ App.UI.fsPassage = function() {
 					r.push(`the belief that mass breeding will save humanity.`);
 					r.push(activeFS("FSRepopulationFocus", ["boughtItem.clothing.maternityLingerie", "boughtItem.clothing.maternityDress", "boughtItem.clothing.belly"]));
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(
 							App.UI.DOM.link(
 								"Repopulation Efforts",
@@ -482,7 +482,7 @@ App.UI.fsPassage = function() {
 						r.push(`The Societal Elite exist as the highest class, allowing you access to all manner of benefits`);
 					}
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(
 							App.UI.DOM.link(
 								"Eugenics",
@@ -513,7 +513,7 @@ App.UI.fsPassage = function() {
 				r.push(`intellectual dependency, a belief that slaves should be airheaded, horny and fully dependent on their owners.`);
 				r.push(activeFS("FSIntellectualDependency", ["boughtItem.clothing.bimbo"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Intellectual Dependency",
@@ -537,7 +537,7 @@ App.UI.fsPassage = function() {
 				r.push(`slave professionalism, a focus on smart, refined, altogether perfect slaves.`);
 				r.push(activeFS("FSSlaveProfessionalism", ["boughtItem.clothing.courtesan"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Slave Professionalism",
@@ -566,7 +566,7 @@ App.UI.fsPassage = function() {
 					r.push(`a radical redefinition of gender that identifies powerful people as male, and everyone else as female.`);
 					r.push(activeFS("FSGenderRadicalist"));
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(
 							App.UI.DOM.link(
 								"Gender radicalism",
@@ -591,7 +591,7 @@ App.UI.fsPassage = function() {
 				r.push(`gender traditionalism, including a societal preference for feminine slaves ${(V.seePreg !== 0) ? ` and support for slave pregnancy` : ``}.`);
 				r.push(activeFS("FSGenderFundamentalist", ["boughtItem.clothing.bunny"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Gender traditionalism",
@@ -623,7 +623,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of slave improvement, including slaves' health, mental well-being, and education.`);
 				r.push(activeFS("FSPaternalist", ["boughtItem.clothing.conservative"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Paternalism",
@@ -647,7 +647,7 @@ App.UI.fsPassage = function() {
 				r.push(`slave degradation, a belief that slaves are not human and should not be treated decently.`);
 				r.push(activeFS("FSDegradationist", ["boughtItem.clothing.chains"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Degradationism",
@@ -675,7 +675,7 @@ App.UI.fsPassage = function() {
 				r.push(`societal disapproval of implant surgery.`);
 				r.push(activeFS("FSBodyPurist"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Body Purism",
@@ -699,7 +699,7 @@ App.UI.fsPassage = function() {
 				r.push(`societal fetishization of implant surgery.`);
 				r.push(activeFS("FSTransformationFetishist"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Transformation Fetishism",
@@ -727,7 +727,7 @@ App.UI.fsPassage = function() {
 				r.push(`an accentuated societal preference for younger slaves.`);
 				r.push(activeFS("FSYouthPreferentialist"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Youth Preferentialism",
@@ -751,7 +751,7 @@ App.UI.fsPassage = function() {
 				r.push(`a societal preference for older women.`);
 				r.push(activeFS("FSMaturityPreferentialist"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Maturity Preferentialism",
@@ -779,7 +779,7 @@ App.UI.fsPassage = function() {
 				r.push(`an accentuated societal preference for short slaves.`);
 				r.push(activeFS("FSPetiteAdmiration"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Petite Admiration",
@@ -803,7 +803,7 @@ App.UI.fsPassage = function() {
 				r.push(`a societal fixation on tallness.`);
 				r.push(activeFS("FSStatuesqueGlorification"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Statuesque Glorification",
@@ -831,7 +831,7 @@ App.UI.fsPassage = function() {
 				r.push(`enthusiasm for slaves with girlish figures.`);
 				r.push(activeFS("FSSlimnessEnthusiast"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Slimness Enthusiasm",
@@ -855,7 +855,7 @@ App.UI.fsPassage = function() {
 				r.push(`societal hunger for huge assets.`);
 				r.push(activeFS("FSAssetExpansionist"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Asset Expansionism",
@@ -881,7 +881,7 @@ App.UI.fsPassage = function() {
 			r.push(`societal normalization of slave milking.`);
 			r.push(activeFS("FSPastoralist", ["boughtItem.clothing.western"]));
 		} else {
-			if (_FSCredits > 0) {
+			if (FSCredits > 0) {
 				r.push(
 					App.UI.DOM.link(
 						"Slave Pastoralism",
@@ -907,7 +907,7 @@ App.UI.fsPassage = function() {
 				r.push(`societal reverence for the idealized human form, including height, health and muscle.`);
 				r.push(activeFS("FSPhysicalIdealist", ["boughtItem.clothing.oil"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Physical Idealism",
@@ -931,7 +931,7 @@ App.UI.fsPassage = function() {
 				r.push(`societal normalization of overindulgence and immediate gratification. Be it food, drink, sex, drugs or whatever one's desire may be.`);
 				r.push(activeFS("FSHedonisticDecadence"));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Hedonistic Decadence",
@@ -959,7 +959,7 @@ App.UI.fsPassage = function() {
 				r.push(`a new strain of religion that emphasizes the slaveholding portions of religious history.`);
 				r.push(activeFS("FSChattelReligionist", ["boughtItem.clothing.habit"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Chattel Religionism",
@@ -1000,13 +1000,13 @@ App.UI.fsPassage = function() {
 					} else {
 						r.push(withdrawRel(25));
 					}
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						if (arc.FSNull < V.FSLockinLevel) {
 							r.push(advanceRel(25));
 						}
 					}
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(MulticulturalismRel(25));
 					}
 				}
@@ -1017,13 +1017,13 @@ App.UI.fsPassage = function() {
 					} else {
 						r.push(withdrawRel(17));
 					}
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						if (arc.FSNull < V.FSLockinLevel) {
 							r.push(advanceRel(17));
 						}
 					}
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(MulticulturalismRel(17));
 					}
 				}
@@ -1034,13 +1034,13 @@ App.UI.fsPassage = function() {
 					} else {
 						r.push(withdrawRel(15));
 					}
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						if (arc.FSNull < V.FSLockinLevel) {
 							r.push(advanceRel(15));
 						}
 					}
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(MulticulturalismRel(15));
 					}
 				}
@@ -1051,13 +1051,13 @@ App.UI.fsPassage = function() {
 					} else {
 						r.push(withdrawRel(20));
 					}
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						if (arc.FSNull < V.FSLockinLevel) {
 							r.push(advanceRel(20));
 						}
 					}
 				} else {
-					if (_FSCredits > 0) {
+					if (FSCredits > 0) {
 						r.push(MulticulturalismRel(20));
 					}
 				}
@@ -1130,7 +1130,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of a new Rome.`);
 				r.push(activeFS("FSRomanRevivalist", ["boughtItem.clothing.toga"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Roman Revivalism",
@@ -1154,7 +1154,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of a new Imperial Society.`);
 				r.push(activeFS("FSNeoImperialist", ["boughtItem.clothing.imperialarmor", "boughtItem.clothing.imperialsuit"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Neo-Imperialism",
@@ -1178,7 +1178,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of a new Aztec Empire.`);
 				r.push(activeFS("FSAztecRevivalist", ["boughtItem.clothing.huipil"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Aztec Revivalism",
@@ -1202,7 +1202,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of Pharaoh's Egypt.`);
 				r.push(activeFS("FSEgyptianRevivalist", ["boughtItem.clothing.egypt"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Egyptian Revivalism",
@@ -1227,7 +1227,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of Edo Japan.`);
 				r.push(activeFS("FSEdoRevivalist", ["boughtItem.clothing.kimono"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Edo Revivalism",
@@ -1251,7 +1251,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of the Sultanate of old.`);
 				r.push(activeFS("FSArabianRevivalist", ["boughtItem.clothing.harem"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Arabian Revivalism",
@@ -1275,7 +1275,7 @@ App.UI.fsPassage = function() {
 				r.push(`a vision of ancient China.`);
 				r.push(activeFS("FSChineseRevivalist", ["boughtItem.clothing.qipao"]));
 			} else {
-				if (_FSCredits > 0) {
+				if (FSCredits > 0) {
 					r.push(
 						App.UI.DOM.link(
 							"Chinese Revivalism",
diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 4f6155cb7bfba0db57020f5b3076d8a1dcc534db..b1e643e14e4025dcbe8fa525de0732c505286759 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -68,169 +68,44 @@ SLAVE ASSIGNMENTS:
 <<case "Career Experience">>
 	Slaves may retain useful experience from their lives before enslavement. Freedom and slavery are so different that the bonuses slaves get are minor. Careers fall into categories, each with its own bonus; these are:
 
-	<br><br><br>__Grateful__ (offering a potential bonus to @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.grateful.length; $i++>>
-		<<if $i == App.Data.Careers.General.grateful.length-1>>
-			and <<print App.Data.Careers.General.grateful[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.grateful[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Menial__ (offering a potential bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.menial.length; $i++>>
-		<<if $i == App.Data.Careers.General.menial.length-1>>
-			and <<print App.Data.Careers.General.menial[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.menial[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Servant__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("keeping your estate", "Servitude")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.servant.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.servant.length-1>>
-			and <<print App.Data.Careers.Leader.servant[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.servant[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Entertainment__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("public service", "Public Service")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.entertainment.length; $i++>>
-		<<if $i == App.Data.Careers.General.entertainment.length-1>>
-			and <<print App.Data.Careers.General.entertainment[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.entertainment[$i]>>,
-		<</if>>
-	<</for>>
-	If a slave has been in the arcology for a long time and is intelligent, she can qualify for this bonus without career experience.
-
-	<br><br><br>__Sex work__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("whoring", "Whoring")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.whore.length; $i++>>
-		<<if $i == App.Data.Careers.General.whore.length-1>>
-			and <<print App.Data.Careers.General.whore[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.whore[$i]>>,
-		<</if>>
-	<</for>>
+	<br><br><br>__Grateful__ (offering a potential bonus to @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@), including slaves who were <<print toSentence(App.Data.Careers.General.grateful)>>.
+
+	<br><br><br>__Menial__ (offering a potential bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@), including slaves who were <<print toSentence(App.Data.Careers.General.menial)>>.
+
+	<br><br><br>__Servant__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("keeping your estate", "Servitude")>>), including slaves who were <<print toSentence(App.Data.Careers.General.servant)>>.
+
+	<br><br><br>__Entertainment__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("public service", "Public Service")>>), including slaves who were <<print toSentence(App.Data.Careers.General.entertainment)>>.
+	If a slave has a lot of entertainment experience, she can qualify for this bonus without career experience.
+
+	<br><br><br>__Sex work__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("whoring", "Whoring")>>), including slaves who were <<print toSentence(App.Data.Careers.General.whore)>>.
 	If a slave is very sexually experienced, she can qualify for this bonus without career experience.
 
-	<br><br><br>__Leadership__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Head Girl", "Head Girl")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.HG.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.HG.length-1>>
-			and <<print App.Data.Careers.Leader.HG[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.HG[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Procuring__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Madam", "Madam")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.madam.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.madam.length-1>>
-			and <<print App.Data.Careers.Leader.madam[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.madam[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Musical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("DJ", "DJ")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.DJ.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.DJ.length-1>>
-			and <<print App.Data.Careers.Leader.DJ[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.DJ[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Defensive__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Bodyguard", "Bodyguard")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.bodyguard.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.bodyguard.length-1>>
-			and <<print App.Data.Careers.Leader.bodyguard[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.bodyguard[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Convincing__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Recruiter", "Recruiter")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.recruiter.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.recruiter.length-1>>
-			and <<print App.Data.Careers.Leader.recruiter[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.recruiter[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Security__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Wardeness", "Wardeness")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.wardeness.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.wardeness.length-1>>
-			and <<print App.Data.Careers.Leader.wardeness[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.wardeness[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Medical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Nurse", "Nurse")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.nurse.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.nurse.length-1>>
-			and <<print App.Data.Careers.Leader.nurse[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.nurse[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Counseling__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.attendant.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.attendant.length-1>>
-			and <<print App.Data.Careers.Leader.attendant[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.attendant[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Nannying__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Matron", "Matron")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.matron.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.matron.length-1>>
-			and <<print App.Data.Careers.Leader.matron[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.matron[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Accounting__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Stewardess", "Stewardess")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.stewardess.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.stewardess.length-1>>
-			and <<print App.Data.Careers.Leader.stewardess[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.stewardess[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Husbandry__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Milkmaid", "Milkmaid")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.milkmaid.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.milkmaid.length-1>>
-			and <<print App.Data.Careers.Leader.milkmaid[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.milkmaid[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Farming__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Farmer", "Farmer")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.farmer.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.farmer.length-1>>
-			and <<print App.Data.Careers.Leader.farmer[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.farmer[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Teaching__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Schoolteacher", "Schoolteacher")>>, including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.schoolteacher.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.schoolteacher.length-1>>
-			and <<print App.Data.Careers.Leader.schoolteacher[$i]>>,
-		<<else>>
-			<<print App.Data.Careers.Leader.schoolteacher[$i]>>,
-		<</if>>
-	<</for>>
+	<br><br><br>__Leadership__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Head Girl", "Head Girl")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.HG)>>.
+
+	<br><br><br>__Procuring__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Madam", "Madam")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.madam)>>.
+
+	<br><br><br>__Musical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("DJ", "DJ")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.DJ)>>.
+
+	<br><br><br>__Defensive__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Bodyguard", "Bodyguard")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.bodyguard)>>.
+
+	<br><br><br>__Convincing__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Recruiter", "Recruiter")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.recruiter)>>.
+
+	<br><br><br>__Security__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Wardeness", "Wardeness")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.wardeness)>>.
+
+	<br><br><br>__Medical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Nurse", "Nurse")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.nurse)>>.
+
+	<br><br><br>__Counseling__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.attendant)>>.
+
+	<br><br><br>__Nannying__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Matron", "Matron")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.matron)>>.
+
+	<br><br><br>__Accounting__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Stewardess", "Stewardess")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.stewardess)>>.
+
+	<br><br><br>__Husbandry__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Milkmaid", "Milkmaid")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.milkmaid)>>.
+
+	<br><br><br>__Farming__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Farmer", "Farmer")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.farmer)>>.
+
+	<br><br><br>__Teaching__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Schoolteacher", "Schoolteacher")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.schoolteacher)>>.
+
 	<br><br>Slaves who have been in slavery long enough that it is effectively their career get a bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "Devotion")>>.@@ Slaves can forget their career experience in an industrialized Dairy, but if they do so and remain sane, they will get a special bonus to both @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "Devotion")>>@@ and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>.@@
 
 	<br><br>Facility heads and working slaves can gain work experience to provide the same benefit as having a relevant career. Intelligence is the deciding factor in how long this will take, brilliant slaves can achieve this ideally in about fourteen weeks, while borderline retarded slaves can take up two hundred weeks (Assuming that the slave's intelligence doesn't change at all and the dice roll is consistent).
@@ -620,11 +495,11 @@ SLAVE BEHAVIORAL FLAWS
 
 
 <<case "Hates Men">>
-	''Hates men '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, strong attraction to men, or the <<= App.Encyclopedia.Dialog.linkSC("boob fetish", "Boob Fetishists")>>. The <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> instead. This flaw can also be removed by serving a player character or another slave with a dick.
+	''Hates men '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, or the <<= App.Encyclopedia.Dialog.linkSC("boob fetish", "Boob Fetishists")>>. Strong attraction to men or the <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> instead. This flaw can also be removed by serving a player character or another slave with a dick.
 
 
 <<case "Hates Women">>
-	''Hates women '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, strong attraction to men, or the <<= App.Encyclopedia.Dialog.linkSC("cumslut", "Cumsluts")>> fetish. The <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> instead. This flaw can also be removed by serving a player character or another slave with a vagina.
+	''Hates women '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, or the <<= App.Encyclopedia.Dialog.linkSC("cumslut", "Cumsluts")>> fetish. Strong attraction to women or the <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> instead. This flaw can also be removed by serving a player character or another slave with a vagina.
 
 
 <<case "Liberated">>
diff --git a/src/gui/favorite.js b/src/gui/favorite.js
index 8a0447090154abb12f96f1ae2810b1eca1864cb4..97204b9bfee948bfe41e1ca34b93cc7e60ef0036 100644
--- a/src/gui/favorite.js
+++ b/src/gui/favorite.js
@@ -1,14 +1,19 @@
 /** Render a link that toggles the slave's favorite status
  * @param {App.Entity.SlaveState} slave
+ * @param {function():void} [handler]
  * @returns {HTMLAnchorElement}
  */
-App.UI.favoriteToggle = function(slave) {
+App.UI.favoriteToggle = function(slave, handler) {
 	function favLink() {
 		const linkID = `fav-link-${slave.ID}`;
 		if (V.favorites.includes(slave.ID)) {
 			const link = App.UI.DOM.link(String.fromCharCode(0xe800), () => {
 				V.favorites.delete(slave.ID);
 				$(`#${linkID}`).replaceWith(favLink());
+
+				if (handler) {
+					handler();
+				}
 			});
 			link.classList.add("icons", "favorite");
 			link.id = linkID;
@@ -17,6 +22,10 @@ App.UI.favoriteToggle = function(slave) {
 			const link = App.UI.DOM.link(String.fromCharCode(0xe801), () => {
 				V.favorites.push(slave.ID);
 				$(`#${linkID}`).replaceWith(favLink());
+
+				if (handler) {
+					handler();
+				}
 			});
 			link.classList.add("icons", "not-favorite");
 			link.id = linkID;
diff --git a/src/gui/mainMenu/AlphaDisclaimer.js b/src/gui/mainMenu/AlphaDisclaimer.js
index 2331346dd71a29e9600ea636e26f649add10cc8f..becd267a2b3191a331d3fbe60ca91627b999884c 100644
--- a/src/gui/mainMenu/AlphaDisclaimer.js
+++ b/src/gui/mainMenu/AlphaDisclaimer.js
@@ -17,13 +17,16 @@ App.Intro.alphaDisclaimer = function() {
 	]);
 
 	App.UI.DOM.appendNewElement("h2", node, "Please note");
-	App.Events.addParagraph(node, [
+	const p = App.UI.DOM.appendNewElement("p", node);
+	App.Events.addNode(p, [
 		App.UI.DOM.makeElement("span", `This is an alpha.`, "bold"),
-		`That means the game is missing content, is full of bugs, is imbalanced, and is generally in an incomplete state. The game will keep a start of turn autosave. If you encounter a bug, we strongly recommend you reload your start of turn autosave immediately. Please submit your feedback and bug reports at https://gitgud.io/pregmodfan/fc-pregmod/issues/. Consider attaching a save file and screenshot of the problem.`,
-		App.UI.DOM.makeElement("div", App.Events.makeNode([`Pregmod is a modification of the original <i>Free Cities</i> created by FCdev, which can be seen at https://freecitiesblog.blogspot.com/.`])),
-		App.UI.DOM.makeElement("div", `version: ${V.ver}, mod version: ${V.pmodVer}, build: ${V.releaseID}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`, "note"),
-		App.UI.DOM.makeElement("div", `4.0.0 is an alpha release. This means the new player content has minimal implementation.`, "bold"), /* remove me with 4.0.0! */
-	]);
+		`That means the game is missing content, is full of bugs, is imbalanced, and is generally in an incomplete state. The game will keep a start of turn autosave. If you encounter a bug, we strongly recommend you reload your start of turn autosave immediately. Please submit your feedback and bug reports <a href='https://gitgud.io/pregmodfan/fc-pregmod/issues/' target='_blank'>here</a>. Consider attaching a save file and screenshot of the problem.`,
+	], "div");
+	App.Events.addNode(p, [`Pregmod is a modification of the original <i>Free Cities</i> ${V.ver} created by FCdev, which can be seen <a href='https://freecitiesblog.blogspot.com/' target='_blank'>here</a>.`], "div");
+
+
+	App.Events.addNode(p, [`mod version: ${V.pmodVer}, build: ${V.releaseID}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`], "div", "note");
+	App.Events.addNode(p, [`4.0.0 is an alpha release. This means the new player content has minimal implementation.`], "div", "bold"); /* remove me with 4.0.0! */
 
 	App.Events.addResponses(node, [
 		new App.Events.Result(`More version info`, versionInfo)
@@ -39,10 +42,10 @@ App.Intro.alphaDisclaimer = function() {
 
 	function versionInfo() {
 		const frag = new DocumentFragment();
-		App.Events.addParagraph(frag, [
+		App.Events.addNode(frag, [
 			App.UI.DOM.makeElement("span", "Mod: expanded age ranges and other tweaks 2016-08-30", ["green", "note"]),
 			App.UI.DOM.makeElement("span", `+SV`, "darkred"),
-		]);
+		], "div");
 		App.UI.DOM.appendNewElement("div", frag, "Mod: extra preg content and other crap", ["green", "note"]);
 		App.UI.DOM.appendNewElement("div", frag, "Saves from versions prior to 0.6 are not compatible.", "bold");
 
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index d35bea0cc9243b28ec2a2fa94de88a6ff52e7437..b22f7a2f99ed286f0e4596f3b71efe813df9b946 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -39,7 +39,27 @@ App.UI.optionsPassage = function() {
 			.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
 		el.append(options.render());
 
-		App.UI.DOM.appendNewElement("div", el, `This save was created using FC version ${V.ver} build ${V.releaseID}. You are currently playing version: ${App.Version.base}, mod version: ${App.Version.pmod}, build: ${App.Version.release}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`);
+		const table = App.UI.DOM.appendNewElement("table", el);
+		let row;
+		fillRow([
+			`You are currently playing:`,
+			`FC version: ${App.Version.base},`,
+			`mod version: ${App.Version.pmod},`,
+			`build: ${App.Version.release}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`
+		]);
+		fillRow([
+			`This save was created using:`,
+			App.UI.DOM.makeElement("span", `FC version: ${V.ver},`, (V.ver !== App.Version.base)? "yellow": null),
+			``,
+			App.UI.DOM.makeElement("span", `build: ${V.releaseID}.`, (V.releaseID !== App.Version.release) ? "red" : null)
+		]);
+
+		function fillRow(contents) {
+			row = App.UI.DOM.appendNewElement("tr", table);
+			for (const content of contents) {
+				App.UI.DOM.appendNewElement("td", row, content);
+			}
+		}
 
 		links = [];
 		links.push(App.UI.DOM.passageLink("Apply Backwards Compatibility Update", "Backwards Compatibility"));
@@ -112,29 +132,15 @@ App.UI.optionsPassage = function() {
 
 		if ((V.releaseID >= 1000) || V.ver.startsWith("0.9") || V.ver.startsWith("0.8") || V.ver.startsWith("0.7") || V.ver.startsWith("0.6")) {
 			App.UI.DOM.appendNewElement("h3", el, `NEW GAME PLUS`);
-			r = [];
-			r.push(`You can begin a new game with up to five (or more) of your current slaves, although starting resources other than these slaves will be reduced. New Game Plus`);
-			r.push(App.UI.DOM.makeElement("span", "MAY", "yellow"));
-			r.push(`work across versions. To attempt to migrate a save across versions:`);
-			App.Events.addNode(el, r, "div", "note");
-
-			const ngpInstructions = document.createElement("ol");
-			App.UI.DOM.appendNewElement("li", ngpInstructions, "Save on this screen", "note");
-			App.UI.DOM.appendNewElement("li", ngpInstructions, "Re-open the .html in a new tab then load the above save.", "note");
-			App.UI.DOM.appendNewElement(
-				"li",
-				ngpInstructions,
-				App.UI.DOM.link(
-					"Activate New Game Plus.",
-					() => {
-						V.ui = "start";
-					},
-					[],
-					"New Game Plus"
-				),
-				"note"
-			);
-			el.append(ngpInstructions);
+			App.UI.DOM.appendNewElement("div", el, `You can begin a new game with up to five (or more) of your current slaves, although starting resources other than these slaves will be reduced.`);
+			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+				"Activate New Game Plus.",
+				() => {
+					V.ui = "start";
+				},
+				[],
+				"New Game Plus"
+			));
 		} else {
 			App.UI.DOM.appendNewElement("div", el, `New Game Plus is not available because this game was not started with a compatible version.`, "note");
 		}
@@ -144,6 +150,7 @@ App.UI.optionsPassage = function() {
 	function mods() {
 		const el = new DocumentFragment();
 		let options;
+		let option;
 
 		options = new App.UI.OptionsGroup();
 
@@ -156,9 +163,11 @@ App.UI.optionsPassage = function() {
 			.addValue("Disabled", 0).off()
 			.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div>");
 
-		options.addOption("Catmod is currently", "seeCats")
-			.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
-			.addComment("Will not murder existing catgirls, you have to do that yourself.");
+		option = options.addOption("Catmod is currently", "seeCats")
+			.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
+		if (V.seeCats) {
+			option.addComment(`Disabling Catmod will not murder existing catgirls, you have to do that yourself. <span style="font-style:normal">😿</span>`);
+		}
 
 		el.append(options.render());
 
@@ -510,8 +519,7 @@ App.UI.optionsPassage = function() {
 				.addValue("Manual", 1).on().addValue("Automatic", 0).off();
 		}
 
-		option = options.addCustomOption("Genetics array")
-			.addButton("Run test", () => { }, "test genetics");
+		option = options.addCustomOption("Genetics array");
 		if (V.cheatMode === 1) {
 			option.addButton("Edit Genetics", () => { }, "Edit Genetics");
 		} else {
@@ -1076,10 +1084,11 @@ App.UI.artOptions = function() {
 	const el = new DocumentFragment();
 	let options = new App.UI.OptionsGroup();
 
-	const art = App.UI.DOM.appendNewElement("span", el);
-	art.style.position = "relative";
-	art.style.zIndex = "-1";
-	App.Events.drawEventArt(art, BaseSlave());
+	const art = App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(BaseSlave(), 2, 0), ["imageRef", "medImg"]);
+	art.style.float = "none";
+	art.style.display = "block";
+	art.style.marginLeft = "auto";
+	art.style.marginRight = "auto";
 
 	options.addOption("Images are", "seeImages")
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
@@ -1114,7 +1123,7 @@ App.UI.artOptions = function() {
 			options.addOption("Clothing erection bulges are", "showClothingErection")
 				.addValue("Enabled", true).on().addValue("Disabled", false).off();
 		} else if (V.imageChoice === 4) {
-			options.addComment(`<a href='https://mega.nz/folder/rtAzEYTS#5a5KO_rqq_BB8eqtOuhEow' target='_blank'> Download the WebGL art assets</a> and place the 'webgl' folder into the resources/ folder where this HTML file is. 
+			options.addComment(`<a href='https://mega.nz/folder/Sgp0lQbY#L1iG-jMQUeztUFuFqj-ryw' target='_blank'> Download the WebGL art assets</a> and place the 'webgl' folder into the resources/ folder where this HTML file is. 
 			Then <b>refresh</b> the page.
 			Create the resources folder if it does not exist. <span class="warning">(Android/MacOS not supported)</span>`);
 
@@ -1123,6 +1132,14 @@ App.UI.artOptions = function() {
 				.addComment("This effectively multiplies the resolution of the render before downsampling again. Use a smaller factor for low-end GPU's.");
 			options.addOption("Zoom speed", "setZoomSpeed")
 				.addValue("0.25", 0.25).off().addValue("0.5", 0.5).off().addValue("1", 1).on().addValue("2", 2).off().addValue("4", 4).off();
+			options.addOption("Face culling", "setFaceCulling")
+				.addValue("Enabled", true).off().addValue("Disabled", false).on()
+				.addComment("Wether to draw the backside of the model, affects transparent surfaces such as hair. Enabling is recommended for low-end GPU's.");
+			options.addOption("Texture resolution", "setTextureResolution")
+				.addValue("1024", 1024).on().addValue("2048", 2048).off().addValue("4096", 4096).off()
+				.addComment("Refresh the page to take affect.");
+			options.addOption("Color burn", "setColorBurn")
+				.addValue("Enabled", true).on().addValue("Disabled", false).off();
 		}
 
 		options.addOption("PA avatar art is", "seeAvatar")
diff --git a/src/gui/options/optionsGroup.js b/src/gui/options/optionsGroup.js
index 8c74fc90916a0033944ffcc7649b589e9336ee0b..6e5ea6fedc63249bbdadc8e1d133f635f0fd20f7 100644
--- a/src/gui/options/optionsGroup.js
+++ b/src/gui/options/optionsGroup.js
@@ -103,7 +103,7 @@ App.UI.OptionsGroup = (function() {
 		}
 
 		/**
-		 * @param {string|HTMLElement} comment string can be HTML
+		 * @param {string|DocumentFragment|HTMLElement} comment string can be HTML
 		 * @returns {OptionButtonRow}
 		 */
 		addComment(comment) {
diff --git a/src/gui/storyCaption.js b/src/gui/storyCaption.js
index 34a34abf4505bee3f03bb10e7c728a2f6a04ece7..3b7faf0c43d6d5cbb9bbfb8a0a3cffd28f40581f 100644
--- a/src/gui/storyCaption.js
+++ b/src/gui/storyCaption.js
@@ -468,20 +468,20 @@ App.UI.storyCaption = function() {
 
 	function startingGirls() {
 		// @ts-ignore // In starting girls we know that there is always an active slave
-		let _slaveCost = startingSlaveCost(V.activeSlave);
+		let cost = startingSlaveCost(V.activeSlave);
 		const p = document.createElement("p");
 
-		if (_slaveCost > V.cash) {
+		if (cost > V.cash) {
 			const div = document.createElement("div");
 			div.classList.add("cash", "dec");
 			div.append("This slave will cost ",
-				App.UI.DOM.makeElement("span", cashFormat(_slaveCost), "bold"), ".",
+				App.UI.DOM.makeElement("span", cashFormat(cost), "bold"), ".",
 				App.UI.DOM.makeElement("div", `You only have: ${cashFormat(V.cash)}.`));
 			p.append(div);
 		} else {
 			const div = document.createElement("div");
 			div.append("This slave will cost ",
-				App.UI.DOM.makeElement("span", cashFormat(_slaveCost), "cash"), ".",
+				App.UI.DOM.makeElement("span", cashFormat(cost), "cash"), ".",
 				App.UI.DOM.makeElement("div", `You have ${cashFormat(V.cash)}.`));
 			p.append(div);
 		}
diff --git a/src/interaction/artificialInsemination.js b/src/interaction/artificialInsemination.js
index f438f81bb5f259115c9d623c5cb7d912d6d00c7f..03a5c2cf719d1918f904590200485eef5a5ed49f 100644
--- a/src/interaction/artificialInsemination.js
+++ b/src/interaction/artificialInsemination.js
@@ -44,11 +44,11 @@ App.UI.SlaveInteract.artificialInsemination = function() {
 		App.UI.DOM.appendNewElement("p", f, "Incubator settings are resulting in large-scale fluid secretion.", "scene-intro");
 		r = [];
 		any = false;
-		for (const _tank of V.incubator.tanks) {
-			if (_tank.balls > 0 && _tank.dick > 0 && canBreed(getSlave(V.AS), _tank)) {
+		for (const tank of V.incubator.tanks) {
+			if (tank.balls > 0 && tank.dick > 0 && canBreed(getSlave(V.AS), tank)) {
 				r.push(App.UI.DOM.makeElement("div",
-					App.UI.DOM.passageLink(_tank.slaveName, "Surgery Degradation", () => {
-						inseminate(getSlave(V.AS), _tank);
+					App.UI.DOM.passageLink(tank.slaveName, "Surgery Degradation", () => {
+						inseminate(getSlave(V.AS), tank);
 					})
 				));
 				any = true;
diff --git a/src/interaction/discard.js b/src/interaction/discard.js
index ed15c7c3d27cea282a90a88213c822a2e1fa558d..4da2b73d4fa3a2ded0e5bbe8535565aa3fc6eff0 100644
--- a/src/interaction/discard.js
+++ b/src/interaction/discard.js
@@ -28,6 +28,9 @@ App.Interact.discard = function(slave) {
 
 		cashX(cost, "slaveTransfer");
 		removeSlave(slave);
+		V.nextButton = "Back to Main";
+		V.nextLink = "Main";
+		App.Utils.scheduleSidebarRefresh();
 	}));
 
 	App.UI.DOM.appendNewElement("div", result, App.UI.DOM.passageLink(`Put ${him} up for sale instead`, "Sell Slave"));
diff --git a/src/interaction/policies/breederProposal.js b/src/interaction/policies/breederProposal.js
index 865c4cf6e8f0610bd75a4029e59d16272f9fcd9c..33a9c020ba0276fcec88d5cb9fb536bef180e0d7 100644
--- a/src/interaction/policies/breederProposal.js
+++ b/src/interaction/policies/breederProposal.js
@@ -4,7 +4,7 @@ App.UI.breederProposal = function() {
 
 	App.UI.DOM.appendNewElement("p", node, `You draft a proposal to the Societal Elite proposing the use of specially tested slaves as breeding stock. If they can pass the tests required to join the Societal Elite; even as slaves, their bodies can prove valuable to furthering eugenics. They will gain no additional rights, but their wombs will be used to birth Elite children; helping stave off potential threats of inbreeding and adding possible missed beneficial traits into the Elite's gene pool.`);
 
-	App.UI.DOM.appendNewElement("div", node, `Within the hour, you are called before${(V.eugenicsFullControl === 1) ? ` what's left of` : ``}the Societal Elite.`);
+	App.UI.DOM.appendNewElement("div", node, `Within the hour, you are called before${(V.eugenicsFullControl === 1) ? ` what's left of` : ``} the Societal Elite.`);
 
 	const {
 		girlP
diff --git a/src/interaction/policies/coursingAssociation.js b/src/interaction/policies/coursingAssociation.js
index e91237452fdecf9a2fb5401d489bbbe28444a4c2..aaa780153aa066133ed061d2c8fe0e7a506c0ac9 100644
--- a/src/interaction/policies/coursingAssociation.js
+++ b/src/interaction/policies/coursingAssociation.js
@@ -1,5 +1,4 @@
 App.UI.coursingAssociation = function() {
-	//	:: Coursing Association [nobr]
 	const node = new DocumentFragment();
 
 	App.Events.addParagraph(node, [`You are a member of ${V.arcologies[0].name}'s Coursing Association. Coursing is a Free Cities revival of the old sport of hunting rabbits and hares with sighthounds, with the typically Free Cities amendments that the hares are replaced by newly enslaved people, the sighthounds are replaced by trained slaves, and the killing of the hare is replaced by rape. Truly, a sport of gentlemen.`]);
diff --git a/src/interaction/prostheticConfig.js b/src/interaction/prostheticConfig.js
index 29ac95ee6722cfc96375527a19aedbf4a1209984..60ecd99005b8afd647e4c58bf27dece9cc1d6540 100644
--- a/src/interaction/prostheticConfig.js
+++ b/src/interaction/prostheticConfig.js
@@ -54,14 +54,14 @@ App.UI.prostheticsConfig = function(slave) {
 			const eyeContainer = document.createElement("div");
 			eyeContainer.classList.add("eyeContainer", "choices");
 
-			let _on = 0;
-			let _blur = 0;
-			let _off = 0;
+			let on = 0;
+			let blur = 0;
+			let off = 0;
 			if (getLeftEyeType(slave) === 3) {
 				App.UI.DOM.appendNewElement("div", eyeContainer, "Left:");
 				let div = document.createElement("div");
 				if (getLeftEyeVision(slave) !== 2) {
-					_on++;
+					on++;
 					div.append(App.UI.DOM.passageLink("[ON]", "Prosthetics Configuration", () => eyeSurgery(slave, "left", "fix")));
 				} else {
 					div.append("[ON]");
@@ -70,7 +70,7 @@ App.UI.prostheticsConfig = function(slave) {
 				div = document.createElement("div");
 
 				if (getLeftEyeVision(slave) !== 1) {
-					_blur++;
+					blur++;
 					div.append(App.UI.DOM.passageLink("[BLUR]", "Prosthetics Configuration", () => eyeSurgery(slave, "left", "blur")));
 				} else {
 					div.append("[BLUR]");
@@ -78,7 +78,7 @@ App.UI.prostheticsConfig = function(slave) {
 				eyeContainer.append(div);
 				div = document.createElement("div");
 				if (getLeftEyeVision(slave) !== 0) {
-					_off++;
+					off++;
 					div.append(App.UI.DOM.passageLink("[OFF]", "Prosthetics Configuration", () => eyeSurgery(slave, "left", "blind")));
 				} else {
 					div.append("[OFF]");
@@ -89,7 +89,7 @@ App.UI.prostheticsConfig = function(slave) {
 				App.UI.DOM.appendNewElement("div", eyeContainer, "Right:");
 				let div = document.createElement("div");
 				if (getRightEyeVision(slave) !== 2) {
-					_on++;
+					on++;
 					div.append(App.UI.DOM.passageLink("[ON]", "Prosthetics Configuration", () => eyeSurgery(slave, "right", "fix")));
 				} else {
 					div.append("[ON]");
@@ -98,7 +98,7 @@ App.UI.prostheticsConfig = function(slave) {
 				div = document.createElement("div");
 
 				if (getRightEyeVision(slave) !== 1) {
-					_blur++;
+					blur++;
 					div.append(App.UI.DOM.passageLink("[BLUR]", "Prosthetics Configuration", () => eyeSurgery(slave, "right", "blur")));
 				} else {
 					div.append("[BLUR]");
@@ -106,7 +106,7 @@ App.UI.prostheticsConfig = function(slave) {
 				eyeContainer.append(div);
 				div = document.createElement("div");
 				if (getRightEyeVision(slave) !== 0) {
-					_off++;
+					off++;
 					div.append(App.UI.DOM.passageLink("[OFF]", "Prosthetics Configuration", () => eyeSurgery(slave, "right", "blind")));
 				} else {
 					div.append("[OFF]");
@@ -116,7 +116,7 @@ App.UI.prostheticsConfig = function(slave) {
 			if (hasBothCyberneticEyes(slave)) {
 				App.UI.DOM.appendNewElement("div", eyeContainer, "Both:");
 				let div = document.createElement("div");
-				if (_on > 0) {
+				if (on > 0) {
 					div.append(App.UI.DOM.passageLink("[ON]", "Prosthetics Configuration", () => eyeSurgery(slave, "both", "fix")));
 				} else {
 					div.append("[ON]");
@@ -124,14 +124,14 @@ App.UI.prostheticsConfig = function(slave) {
 				eyeContainer.append(div);
 				div = document.createElement("div");
 
-				if (_blur > 0) {
+				if (blur > 0) {
 					div.append(App.UI.DOM.passageLink("[BLUR]", "Prosthetics Configuration", () => eyeSurgery(slave, "both", "blur")));
 				} else {
 					div.append("[BLUR]");
 				}
 				eyeContainer.append(div);
 				div = document.createElement("div");
-				if (_off > 0) {
+				if (off > 0) {
 					div.append(App.UI.DOM.passageLink("[OFF]", "Prosthetics Configuration", () => eyeSurgery(slave, "both", "blind")));
 				} else {
 					div.append("[OFF]");
diff --git a/src/interaction/prostheticLabPassage.js b/src/interaction/prostheticLabPassage.js
index 80770e48122410aab6ef8fdf2de93bb6a6abcec1..bc3b76f0ee5e08dae170b8e346e463540eb78ae5 100644
--- a/src/interaction/prostheticLabPassage.js
+++ b/src/interaction/prostheticLabPassage.js
@@ -1,5 +1,4 @@
 App.UI.prostheticLab = function() {
-	// :: Prosthetic Lab [nobr jump-to-safe jump-from-safe]
 	const node = new DocumentFragment();
 
 	let r = [];
@@ -12,10 +11,10 @@ App.UI.prostheticLab = function() {
 	if (V.adjustProsthetics.length > V.adjustProstheticsCompleted) {
 		App.UI.DOM.appendNewElement("h2", node, "External contract workers");
 		App.UI.DOM.appendNewElement("div", node, `Currently adjusting these prosthetics:`);
-		for (const _p of V.adjustProsthetics) {
-			if (_p.workLeft > 0) {
+		for (const p of V.adjustProsthetics) {
+			if (p.workLeft > 0) {
 				App.UI.DOM.appendNewElement("div", node,
-					`${capFirstChar(App.Data.prosthetics[_p.id].name)} for ${SlaveFullName(V.slaves[V.slaveIndices[_p.slaveID]])}`,
+					`${capFirstChar(App.Data.prosthetics[p.id].name)} for ${SlaveFullName(V.slaves[V.slaveIndices[p.slaveID]])}`,
 					"indent"
 				);
 			}
@@ -174,19 +173,19 @@ App.UI.prostheticLab = function() {
 		App.UI.DOM.appendNewElement("h3", node, "Tasks");
 
 		if (V.researchLab.tasks.length > 0) {
-			let _j = 0;
+			let j = 0;
 			if (V.researchLab.speed > 0) {
 				App.UI.DOM.appendNewElement("div", node, `The following tasks are queued:`);
 			} else {
 				App.UI.DOM.appendNewElement("div", node, `You have projects planned but without researchers you won't be able to work on them:`);
 			}
 
-			for (let _i = 0; _i < V.researchLab.tasks.length; _i++) {
+			for (let i = 0; i < V.researchLab.tasks.length; i++) {
 				const r = [];
-				switch (V.researchLab.tasks[_i].type) {
+				switch (V.researchLab.tasks[i].type) {
 					case "research":
 						r.push(`You`);
-						if (_i === 0) {
+						if (i === 0) {
 							r.push(`are researching`);
 						} else {
 							r.push(`plan to research`);
@@ -194,36 +193,36 @@ App.UI.prostheticLab = function() {
 						break;
 					case "craft":
 						r.push(`You`);
-						if (_i === 0) {
+						if (i === 0) {
 							r.push(`are constructing`);
 						} else {
 							r.push(`plan to construct`);
 						}
 						break;
 					case "craftFit":
-						r.push(`For <span class="noteworthy">${SlaveFullName(V.slaves[V.slaveIndices[V.researchLab.tasks[_i].slaveID]])}</span> you`);
-						if (_i === 0) {
+						r.push(`For <span class="noteworthy">${SlaveFullName(V.slaves[V.slaveIndices[V.researchLab.tasks[i].slaveID]])}</span> you`);
+						if (i === 0) {
 							r.push(`are constructing`);
 						} else {
 							r.push(`plan to construct`);
 						}
 						break;
 					default:
-						r.push(`<span class="error">Error: Unknown V.researchLab.tasks[_i].type: ${V.researchLab.tasks[_i].type}</span > `);
+						r.push(`<span class="error">Error: Unknown V.researchLab.tasks[_i].type: ${V.researchLab.tasks[i].type}</span > `);
 				}
-				_j += V.researchLab.tasks[_i].workLeft;
-				r.push(`<span class="noteworthy">${capFirstChar(App.Data.prosthetics[V.researchLab.tasks[_i].id].name)}.</span>`);
+				j += V.researchLab.tasks[i].workLeft;
+				r.push(`<span class="noteworthy">${capFirstChar(App.Data.prosthetics[V.researchLab.tasks[i].id].name)}.</span>`);
 				if (V.researchLab.speed > 0) {
-					r.push(`Finished in approximately ${(Math.floor(_j / V.researchLab.speed) + 1)} week(s).`);
+					r.push(`Finished in approximately ${(Math.floor(j / V.researchLab.speed) + 1)} week(s).`);
 				}
 
 				r.push(App.UI.DOM.link(
-					(V.researchLab.tasks[_i].type === "research") ? "Cancel: Will not return investments." : "Cancel",
+					(V.researchLab.tasks[i].type === "research") ? "Cancel: Will not return investments." : "Cancel",
 					() => {
-						if (V.researchLab.tasks[_i].type === "research") {
-							V.prosthetics[V.researchLab.tasks[_i].id].research = 0;
+						if (V.researchLab.tasks[i].type === "research") {
+							V.prosthetics[V.researchLab.tasks[i].id].research = 0;
 						}
-						V.researchLab.tasks.deleteAt(_i);
+						V.researchLab.tasks.deleteAt(i);
 						App.UI.reload();
 					}
 				));
@@ -236,22 +235,23 @@ App.UI.prostheticLab = function() {
 		App.UI.DOM.appendNewElement("h3", node, "Research");
 
 		App.UI.DOM.appendNewElement("div", node, `Available research projects:`);
-		for (let _p of App.Data.prostheticIDs) {
-			if (V.prosthetics[_p].research === 0) {
-				if (_p !== "erectile") { /* excludes erectile */
+		for (let p of App.Data.prostheticIDs) {
+			if (V.prosthetics[p].research === 0) {
+				if (p !== "erectile") { /* excludes erectile */
 					// <div class="indent">
-					if (App.Data.prosthetics[_p].level <= V.prostheticsUpgrade) {
+					if (App.Data.prosthetics[p].level <= V.prostheticsUpgrade) {
 						App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
-							`Reverse engineer ${addA(App.Data.prosthetics[_p].name)}`,
+							`Reverse engineer ${addA(App.Data.prosthetics[p].name)}`,
 							() => {
-								cashX(forceNeg(App.Data.prosthetics[_p].costs), "labResearch");
-								V.prosthetics[_p].research = -1;
-								V.researchLab.tasks.push({type: "research", id: _p, workLeft: App.Data.prosthetics[_p].research});
+								cashX(forceNeg(App.Data.prosthetics[p].costs), "labResearch");
+								V.prosthetics[p].research = -1;
+								V.researchLab.tasks.push({type: "research", id: p, workLeft: App.Data.prosthetics[p].research});
+								App.UI.reload();
 							}, [], "",
-							`Costs ${cashFormat(App.Data.prosthetics[_p].costs)} of initial investment.`
+							`Costs ${cashFormat(App.Data.prosthetics[p].costs)} of initial investment.`
 						), "indent");
 					} else {
-						App.UI.DOM.appendNewElement("div", node, `You need better contracts to get the required research material for reverse engineering ${addA(App.Data.prosthetics[_p].name)}.`, "note");
+						App.UI.DOM.appendNewElement("div", node, `You need better contracts to get the required research material for reverse engineering ${addA(App.Data.prosthetics[p].name)}.`, "note");
 					}
 				}
 			}
@@ -260,13 +260,13 @@ App.UI.prostheticLab = function() {
 		App.UI.DOM.appendNewElement("h3", node, "Manufacture");
 
 		r.push(`Available building projects:`);
-		for (let _p of App.Data.prostheticIDs) {
-			if (V.prosthetics[_p].research === 1) {
-				if (_p !== "erectile") { /* excludes erectile*/
+		for (let p of App.Data.prostheticIDs) {
+			if (V.prosthetics[p].research === 1) {
+				if (p !== "erectile") { /* excludes erectile*/
 					App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
-						`Build ${addA(App.Data.prosthetics[_p].name)}`,
+						`Build ${addA(App.Data.prosthetics[p].name)}`,
 						() => {
-							V.researchLab.tasks.push({type: "craft", id: _p, workLeft: App.Data.prosthetics[_p].craft});
+							V.researchLab.tasks.push({type: "craft", id: p, workLeft: App.Data.prosthetics[p].craft});
 							App.UI.reload();
 						}
 					), "indent");
diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js
index dcd96b949d677144831db76df159ae4ea1560274..cadfaacd5043554819a8d5d7dae338540b80a388 100644
--- a/src/interaction/sellSlave.js
+++ b/src/interaction/sellSlave.js
@@ -52,8 +52,8 @@ App.Interact.sellSlave = function(slave) {
 			t.push(`${He} tries to conceal ${his} terror at going from a trustworthy slave master to the cruel and uncertain world outside your penthouse, but ${he} fails.`);
 		}
 	}
-
-	cost = slaveCost(slave);
+	const costObj = slaveCost(slave, false, false, false, true);
+	cost = costObj.cost;
 	cost = (random(70, 80) * Math.trunc(cost / 100));
 
 	if (slave.breedingMark === 1 && V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") {
@@ -341,7 +341,7 @@ App.Interact.sellSlave = function(slave) {
 					t.push(`${His} background should make ${him} a bit more trusting.`);
 				} else if (App.Data.Careers.General.menial.includes(slave.career)) {
 					t.push(`${His} background should make ${him} a bit more tractable.`);
-				} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+				} else if (App.Data.Careers.General.servant.includes(slave.career)) {
 					t.push(`${His} background should make ${him} a good servant.`);
 				}
 			}
@@ -397,7 +397,7 @@ App.Interact.sellSlave = function(slave) {
 			if (slave.skill.wardeness >= V.masteredXP && !App.Data.Careers.Leader.wardeness.includes(slave.career)) {
 				careers.push("Wardeness");
 			}
-			if (slave.skill.servant >= V.masteredXP && !App.Data.Careers.Leader.servant.includes(slave.career)) {
+			if (slave.skill.servant >= V.masteredXP && !App.Data.Careers.General.servant.includes(slave.career)) {
 				careers.push("Servant");
 			}
 			if (slave.skill.entertainer >= V.masteredXP && !App.Data.Careers.General.entertainment.includes(slave.career)) {
@@ -903,7 +903,7 @@ App.Interact.sellSlave = function(slave) {
 		App.UI.DOM.appendNewElement("span", relist, ` This will cost ${cashFormat(500)}`);
 	}
 	if (V.debugMode) {
-		App.UI.DOM.appendNewElement("div", scene, `Base slave cost: `).append(App.UI.DOM.cashFormat(cost));
+		App.UI.DOM.appendNewElement("div", scene, `Estimated value: `).append(costObj.report);
 	}
 	const buyerKeys = [];
 	for (const [key, obj] of buyers) {
diff --git a/src/interaction/siCustom.js b/src/interaction/siCustom.js
index 49442c34c6a1a584be6c5db11cf60dc2a8de2b14..3cfde0243b1b2a4cbc9e31186f432dce1217d3b9 100644
--- a/src/interaction/siCustom.js
+++ b/src/interaction/siCustom.js
@@ -11,23 +11,29 @@ App.UI.SlaveInteract.custom = function(slave, refresh) {
 
 	const el = document.createElement('div');
 
-	el.appendChild(intro());
+	el.append(intro());
 
 	App.UI.DOM.appendNewElement("h3", el, `Art`);
-	el.appendChild(customSlaveImage());
-	el.appendChild(customHairImage());
+	el.append(
+		customSlaveImage(),
+		customHairImage()
+	);
 
 	App.UI.DOM.appendNewElement("h3", el, `Names`);
-	el.appendChild(playerTitle());
-	el.appendChild(slaveFullName());
+	el.append(
+		playerTitle(),
+		slaveFullName()
+	);
 
 	App.UI.DOM.appendNewElement("h3", el, `Description`);
-	el.appendChild(hair());
-	el.appendChild(eyeColor());
-	el.appendChild(customTattoo());
-	el.appendChild(customOriginStory());
-	el.appendChild(customDescription());
-	el.appendChild(customLabel());
+	el.append(
+		hair(),
+		eyeColor(),
+		customTattoo(),
+		customOriginStory(),
+		customDescription(),
+		customLabel()
+	);
 
 	return el;
 
diff --git a/src/interaction/siDescription.js b/src/interaction/siDescription.js
index cbf71e275f2aece1644c9b3154409a40d75b6024..b24edf931f997596a1dec77510d81b973a965f14 100644
--- a/src/interaction/siDescription.js
+++ b/src/interaction/siDescription.js
@@ -3,15 +3,17 @@ App.UI.SlaveInteract.description = function(slave) {
 	const descriptionLink = document.createElement("div");
 	descriptionLink.style.fontStyle = "italic";
 	descriptionLink.id = "description-link";
-	if (V.seeDetails === 1) {
-		descriptionLink.append(showOptions());
-		el.append(descriptionLink);
 
+	if (V.seeDetails === 1) {
 		const descriptionOptions = document.createElement("div");
+
 		descriptionOptions.id = "description-options";
 		el.append(descriptionOptions);
 
 		el.append(App.Desc.longSlave(slave, {noArt: true}));
+
+		descriptionLink.append(showOptions());
+		el.append(descriptionLink);
 	} else {
 		descriptionLink.append(
 			App.UI.DOM.link(
diff --git a/src/interaction/siFinancial.js b/src/interaction/siFinancial.js
index c5300f4e18c661b199241b16eefabffbccb0c913..c6d2f9cdadb17f1851bd81e522d63aeab1fab920 100644
--- a/src/interaction/siFinancial.js
+++ b/src/interaction/siFinancial.js
@@ -11,6 +11,7 @@ App.UI.SlaveInteract.financial = function(slave, refresh) {
 		He, His,
 		his, him
 	} = getPronouns(slave);
+
 	if (V.studio === 1) {
 		App.UI.DOM.appendNewElement("h3", el, "Media");
 		slave.porn.spending = Math.clamp(Math.ceil(slave.porn.spending / 1000) * 1000, 0, 5000);
diff --git a/src/interaction/siModify.js b/src/interaction/siModify.js
index 166c8bb194984cec08b318803e3b87818595b44b..e95089968f71eaeb21ed77f932be72f84e8c4b96 100644
--- a/src/interaction/siModify.js
+++ b/src/interaction/siModify.js
@@ -8,7 +8,7 @@ App.UI.SlaveInteract.modify = function(slave) {
 
 	const isAgent = [Job.AGENT, Job.AGENTPARTNER].includes(slave.assignment);
 
-	App.UI.DOM.appendNewElement('p', el, isAgent ? "Recall your agent to modify them." : "Take slave to another room.", "scene-intro");
+	App.UI.DOM.appendNewElement('p', el, isAgent ? "Recall your agent to modify them." : "Take slave to another room.", ["scene-intro"]);
 
 	if (isAgent) {
 		return el;
diff --git a/src/interaction/siNavigation.js b/src/interaction/siNavigation.js
index 5a85742402b39aed1cc03325f583a9997b8bd38a..c3c7b95432a96a96b8de212f648d899c238b0919 100644
--- a/src/interaction/siNavigation.js
+++ b/src/interaction/siNavigation.js
@@ -16,24 +16,46 @@ App.UI.SlaveInteract.navigation = function(slave) {
 		);
 	}
 
-	App.UI.DOM.appendNewElement("span", p, App.UI.Hotkeys.hotkeys("prev-slave"), "hotkey");
-	const prevSpan = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Prev", "Slave Interact",
-		() => { V.AS = App.UI.SlaveInteract.placeInLine(slave)[0]; }), "adjacent-slave");
-	prevSpan.id = "prev-slave";
-	p.append(" ", prevSpan);
-
-	const centerSpan = document.createElement("span");
-	centerSpan.classList.add("interact-name");
-
-	App.UI.DOM.appendNewElement("span", centerSpan, slave.slaveName, "slave-name");
-	centerSpan.append(" ", App.UI.favoriteToggle(slave));
-	p.append(centerSpan);
-
-	const nextSpan = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Next", "Slave Interact",
-		() => { V.AS = App.UI.SlaveInteract.placeInLine(slave)[1]; }), "adjacent-slave");
-	nextSpan.id = "next-slave";
-	p.append(nextSpan, " ");
-	App.UI.DOM.appendNewElement("span", p, App.UI.Hotkeys.hotkeys("next-slave"), "hotkey");
+	const placeInLine = App.UI.SlaveInteract.placeInLine(slave);
+	const div = App.UI.DOM.appendNewElement("div", p, null);
+	const previous = App.UI.DOM.makeElement("span", null, ['adjacent-slave', 'margin-right']);
+	const next = App.UI.DOM.makeElement("span", null, ['adjacent-slave', 'margin-left']);
+	const name = App.UI.DOM.makeElement("h1", slave.slaveName, ['slave-name', 'h1']);
+
+	name.style.display = 'inline-block';
+
+	previous.id = "prev-slave";
+	next.id = "next-slave";
+
+	previous.append(
+		App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("prev-slave"), ['hotkey']),
+		App.UI.DOM.makeElement("span", App.UI.DOM.passageLink(" Prev ", "Slave Interact",
+			() => { V.AS = placeInLine[0]; }),
+		),
+	);
+	next.append(
+		App.UI.DOM.makeElement("span", App.UI.DOM.passageLink(" Next ", "Slave Interact",
+			() => { V.AS = placeInLine[1]; }), ["adjacent-slave"]),
+		App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("next-slave"), ['hotkey']),
+	);
+
+	function content() {
+		const frag = new DocumentFragment();
+
+		frag.append(
+			previous,
+			name,
+			' ',
+			App.UI.DOM.makeElement("span", App.UI.favoriteToggle(slave, () => {
+				App.UI.DOM.replace(div, content());
+			}), ['h1']),
+			next,
+		);
+
+		return frag;
+	}
+
+	div.append(content());
 
 	return p;
 };
diff --git a/src/interaction/siPhysicalRegimen.js b/src/interaction/siPhysicalRegimen.js
index 6792d0d8d4b525c9d9993fe77c5de96b022b8d34..246b35141b5aac082ba8b8640fdcc02d9d284389 100644
--- a/src/interaction/siPhysicalRegimen.js
+++ b/src/interaction/siPhysicalRegimen.js
@@ -12,19 +12,24 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 		He,
 		His
 	} = getPronouns(slave);
+
 	const el = new DocumentFragment();
-	el.append(drugs());
-	el.append(curatives());
-	el.append(aphrodisiacs());
-	el.append(fertility());
-	el.append(incubator());
-	el.append(nursery());
-	el.append(breederEligibility());
-	el.append(bloating());
-	el.append(hormones());
-	el.append(diet());
-	el.append(dietBase());
-	el.append(snacks());
+
+	el.append(
+		drugs(),
+		curatives(),
+		aphrodisiacs(),
+		fertility(),
+		incubator(),
+		nursery(),
+		breederEligibility(),
+		bloating(),
+		hormones(),
+		diet(),
+		dietBase(),
+		snacks()
+	);
+
 	return el;
 
 	function drugs() {
@@ -546,9 +551,9 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 
 	function incubator() {
 		const reservedChildren = FetusGlobalReserveCount("incubator");
-		let _reservedIncubator = WombReserveCount(slave, "incubator");
-		let _reservedNursery = WombReserveCount(slave, "nursery");
-		let _WL = slave.womb.length;
+		let reservedIncubator = WombReserveCount(slave, "incubator");
+		let reservedNursery = WombReserveCount(slave, "nursery");
+		let WL = slave.womb.length;
 		let el = document.createElement('div');
 		const linkArray = [];
 
@@ -556,46 +561,46 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 			if (slave.preg > 0 && slave.broodmother === 0 && slave.pregKnown === 1 && slave.eggType === "human") {
 				if ((slave.assignment !== Job.DAIRY || V.dairyPregSetting === 0) && (slave.assignment !== Job.FARMYARD || V.farmyardBreeding === 0)) {
 					let title = document.createElement('div');
-					if (_WL - _reservedNursery === 0) {
+					if (WL - reservedNursery === 0) {
 						title.textContent = `${His} children are already reserved for ${V.nurseryName}`;
 						title.style.fontStyle = "italic";
 					} else {
 						const freeTanks = (V.incubator.capacity - V.incubator.tanks.length);
-						if (_reservedIncubator > 0) {
-							if (_WL === 1) {
+						if (reservedIncubator > 0) {
+							if (WL === 1) {
 								title.textContent = `${His} child `;
-							} else if (_reservedIncubator < _WL) {
-								title.textContent = `${_reservedIncubator} of ${his} children `;
-							} else if (_WL === 2) {
+							} else if (reservedIncubator < WL) {
+								title.textContent = `${reservedIncubator} of ${his} children `;
+							} else if (WL === 2) {
 								title.textContent = `Both of ${his} children `;
 							} else {
-								title.textContent = `All ${_reservedIncubator} of ${his} children `;
+								title.textContent = `All ${reservedIncubator} of ${his} children `;
 							}
 							title.textContent += ` will be placed in ${V.incubator.name}. `;
-							if ((_reservedIncubator + _reservedNursery < _WL) && (reservedChildren < freeTanks)) {
+							if ((reservedIncubator + reservedNursery < WL) && (reservedChildren < freeTanks)) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep another child`, () => wombUpdateIncubator(1, true))
 								);
-								if (_reservedIncubator > 0) {
+								if (reservedIncubator > 0) {
 									linkArray.push(
 										App.UI.DOM.link(`Keep one less child`, () => wombUpdateIncubator(1, false))
 									);
 								}
-								if (_reservedIncubator > 1) {
+								if (reservedIncubator > 1) {
 									linkArray.push(
 										App.UI.DOM.link(`Keep none of ${his} children`, () => wombUpdateIncubator(9999, false))
 									);
 								}
-								if ((reservedChildren + _WL - _reservedIncubator) <= freeTanks) {
+								if ((reservedChildren + WL - reservedIncubator) <= freeTanks) {
 									linkArray.push(
 										App.UI.DOM.link(`Keep the rest of ${his} children`, () => wombUpdateIncubator(9999, true))
 									);
 								}
-							} else if ((_reservedIncubator === _WL) || (reservedChildren === freeTanks) || (_reservedIncubator - _reservedNursery >= 0)) {
+							} else if ((reservedIncubator === WL) || (reservedChildren === freeTanks) || (reservedIncubator - reservedNursery >= 0)) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep one less child`, () => wombUpdateIncubator(1, false))
 								);
-								if (_reservedIncubator > 1) {
+								if (reservedIncubator > 1) {
 									linkArray.push(
 										App.UI.DOM.link(`Keep none of ${his} children`, () => wombUpdateIncubator(9999, false))
 									);
@@ -613,12 +618,12 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 								tank.textContent += `s`;
 							}
 							tank.textContent += `.`;
-							let _cCount = (_WL > 1 ? "a" : "the");
+							let cCount = (WL > 1 ? "a" : "the");
 							linkArray.push(
-								App.UI.DOM.link(`Keep ${_cCount} child`, () => wombUpdateIncubator(1, true))
+								App.UI.DOM.link(`Keep ${cCount} child`, () => wombUpdateIncubator(1, true))
 							);
 							title.appendChild(tank);
-							if ((_WL > 1) && (reservedChildren + _WL) <= freeTanks) {
+							if ((WL > 1) && (reservedChildren + WL) <= freeTanks) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep all of ${his} children`, () => wombUpdateIncubator(9999, true))
 								);
@@ -651,27 +656,27 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 			const reservedChildrenNursery = FetusGlobalReserveCount("nursery");
 			let reservedIncubator = WombReserveCount(slave, "incubator");
 			let reservedNursery = WombReserveCount(slave, "nursery");
-			let _WL = slave.womb.length;
+			let WL = slave.womb.length;
 			if (slave.preg > 0 && slave.broodmother === 0 && slave.pregKnown === 1 && slave.eggType === "human") {
 				if ((slave.assignment !== Job.DAIRY || V.dairyPregSetting === 0) && (slave.assignment !== Job.FARMYARD || V.farmyardBreeding === 0)) {
 					let title = document.createElement('div');
 					const linkArray = [];
-					if (_WL - reservedIncubator === 0) {
+					if (WL - reservedIncubator === 0) {
 						title.textContent = `${His} children are already reserved for ${V.incubator.name}`;
 						title.style.fontStyle = "italic";
 					} else {
 						const freeCribs = (V.nursery - V.cribs.length);
 						if (reservedNursery > 0) {
-							if (_WL === 1) {
+							if (WL === 1) {
 								title.textContent = `${His} child will be placed in ${V.nurseryName}. `;
-							} else if (reservedNursery < _WL) {
+							} else if (reservedNursery < WL) {
 								title.textContent = `_reservedNursery of ${his} children will be placed in ${V.nurseryName}.`;
-							} else if (_WL === 2) {
+							} else if (WL === 2) {
 								title.textContent = `Both of ${his} children will be placed in ${V.nurseryName}. `;
 							} else {
 								title.textContent = `All ${reservedNursery} of ${his} children will be placed in ${V.nurseryName}. `;
 							}
-							if ((reservedIncubator + reservedNursery < _WL) && (reservedChildrenNursery < freeCribs)) {
+							if ((reservedIncubator + reservedNursery < WL) && (reservedChildrenNursery < freeCribs)) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep another child`, () => wombUpdateNursery(1, true))
 								);
@@ -686,12 +691,12 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 										App.UI.DOM.link(`Keep none of ${his} children`, () => wombUpdateNursery(9999, false))
 									);
 								}
-								if ((reservedChildrenNursery + _WL - reservedNursery) <= freeCribs) {
+								if ((reservedChildrenNursery + WL - reservedNursery) <= freeCribs) {
 									linkArray.push(
 										App.UI.DOM.link(`Keep the rest of ${his} children`, () => wombUpdateNursery(9999, true))
 									);
 								}
-							} else if ((reservedNursery === _WL) || (reservedChildrenNursery === freeCribs) || (reservedNursery - reservedIncubator >= 0)) {
+							} else if ((reservedNursery === WL) || (reservedChildrenNursery === freeCribs) || (reservedNursery - reservedIncubator >= 0)) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep one less child`, () => wombUpdateNursery(1, false))
 								);
@@ -714,12 +719,12 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 								crib.textContent += `s`;
 							}
 							crib.textContent += `.`;
-							let _cCount = (_WL > 1 ? "a" : "the");
+							let cCount = (WL > 1 ? "a" : "the");
 							linkArray.push(
-								App.UI.DOM.link(`Keep ${_cCount} child`, () => wombUpdateNursery(1, true))
+								App.UI.DOM.link(`Keep ${cCount} child`, () => wombUpdateNursery(1, true))
 							);
 							title.appendChild(crib);
-							if ((_WL > 1) && (reservedChildrenNursery + _WL) <= freeCribs) {
+							if ((WL > 1) && (reservedChildrenNursery + WL) <= freeCribs) {
 								linkArray.push(
 									App.UI.DOM.link(`Keep all of ${his} children`, () => wombUpdateNursery(9999, true))
 								);
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index 38dec6cc4d89dad50327ce1f548d4e537eb00d5c..19623750589fc9914cad521987717d8f609da1a1 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -46,7 +46,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 	array = [];
 	if (slave.useRulesAssistant === 0) {
 		App.UI.DOM.appendNewElement("span", p, `Not subject `, ["bold", "gray"]);
-		App.UI.DOM.appendNewElement("span", p, `to the Rules Assistant.`, "gray");
+		App.UI.DOM.appendNewElement("span", p, `to the Rules Assistant. `, "gray");
 		array.push(
 			App.UI.DOM.link(
 				`Include ${him}`,
@@ -181,10 +181,10 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 		div = document.createElement("div");
 		div.append("Typical punishment: ");
 		choices = [
-			{value: "confinement"},
-			{value: "whipping"},
-			{value: "chastity"},
-			{value: "situational"},
+			{value: "confinement", tooltip: App.UI.DOM.combineNodes(`Increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` when the slave is punished.`)},
+			{value: "whipping", tooltip: App.UI.DOM.combineNodes(`Significantly increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` at the cost of `, App.UI.DOM.makeElement("span", `health`, ["health", "dec"]), ` when the slave is punished.`)},
+			{value: "chastity", tooltip: App.UI.DOM.combineNodes(`Increases both `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` and `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]),  ` at the cost of `, App.UI.DOM.makeElement("span", `libido`, ["libido", "dec"]), ` when the slave is punished.`)},
+			{value: "situational", tooltip: App.UI.DOM.combineNodes(`Increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` when the slave is punished.`)},
 		];
 		div.append(listChoices(choices, "punishment"));
 		p.append(div);
@@ -193,10 +193,10 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 		div = document.createElement("div");
 		div.append("Typical reward: ");
 		choices = [
-			{value: "relaxation"},
-			{value: "drugs"},
-			{value: "orgasm"},
-			{value: "situational"},
+			{value: "relaxation", tooltip: App.UI.DOM.combineNodes(`Improves `, App.UI.DOM.makeElement("span", `health`, ["health", "inc"]), ` when a reward is earned.`)},
+			{value: "drugs", tooltip: App.UI.DOM.combineNodes(`Significantly improves `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]), ` at the cost of `, App.UI.DOM.makeElement("span", `health`, ["health", "dec"]), ` when a reward is earned.`)},
+			{value: "orgasm", tooltip: App.UI.DOM.combineNodes(`Improves `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]), ` and raises `, App.UI.DOM.makeElement("span", `libido`, ["libido", "inc"]), ` when a reward is earned.`)},
+			{value: "situational", tooltip: App.UI.DOM.combineNodes(`Improves `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]), ` when a reward is earned.`)},
 		];
 		div.append(listChoices(choices, "reward"));
 		p.append(div);
@@ -272,7 +272,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 	 * @typedef {Object} listChoice
 	 * @property {string} value
 	 * @property {string} [title]
-	 * @property {string} [tooltip]
+	 * @property {string|HTMLElement|DocumentFragment} [tooltip]
 	 * @property {Array<string>} [disabled]
 	 */
 
@@ -295,7 +295,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 				links.push(
 					App.UI.DOM.disabledLink(
 						title,
-						["Current Setting"]
+						c.tooltip ? ["Current Setting", c.tooltip] : ["Current Setting"]
 					)
 				);
 			} else {
diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js
index 9eb502029ddf7e8b470a03478782adf441f2b666..92d6e8c6416ceae92970853fb5b7c0878cae1cfe 100644
--- a/src/interaction/siWardrobe.js
+++ b/src/interaction/siWardrobe.js
@@ -19,6 +19,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) {
 
 	function contents() {
 		const frag = new DocumentFragment();
+
 		if (slave.fuckdoll === 0) {
 			frag.append(filtersDOM());
 			frag.append(chooseHerOwn());
@@ -322,13 +323,13 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) {
 
 		el.appendChild(label);
 
-		let array = Array.from(App.Data.slaveWear.mouthAccessory.keys());
+		let array = Array.from(App.Data.mouthAccessory.keys());
 
 		// Sort
-		array = array.sort((a, b) => (App.Data.slaveWear.mouthAccessory.get(a).name > App.Data.slaveWear.mouthAccessory.get(b).name) ? 1 : -1);
+		array = array.sort((a, b) => (App.Data.mouthAccessory.get(a).name > App.Data.mouthAccessory.get(b).name) ? 1 : -1);
 		const sortedMap = new Map([]);
 		for (const name of array) {
-			sortedMap.set(name, App.Data.slaveWear.mouthAccessory.get(name));
+			sortedMap.set(name, App.Data.mouthAccessory.get(name));
 		}
 
 		let links = document.createElement('div');
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index e62da5b7ebc1228fafdf3c7c0431acf3534b9cfd..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"),
 					});
 				}
@@ -669,8 +669,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 					if (slave.broodmother < 2) {
 						sexOptions.push({
 							text: `Send ${him} to live with your agent ${SlaveFullName(lover)}`,
-							goto: `Agent Company`,
-							update: {subSlave: lover}
+							goto: `Agent Company`
 						});
 					} else {
 						sexOptions.push({text: `A hyper-broodmother cannot be sent to live with your agent`});
@@ -694,8 +693,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			if (slave.devotion >= 100 && slave.relationship < 0 && slave.relationship > -3) {
 				sexOptions.push({
 					text: `Talk to ${him} about relationships`,
-					goto: `Matchmaking`,
-					update: {subSlave: 0}
+					goto: `Matchmaking`
 				});
 			}
 			if ((V.policies.mixedMarriage === 1 || V.cheatMode === 1) && slave.relationship !== 5 && slave.relationship !== -3) {
diff --git a/src/interaction/subordinateTargeting.js b/src/interaction/subordinateTargeting.js
new file mode 100644
index 0000000000000000000000000000000000000000..39314d625557b6ef67eccf4a183f175ba09acae2
--- /dev/null
+++ b/src/interaction/subordinateTargeting.js
@@ -0,0 +1,66 @@
+App.UI.subordinateTargeting = function() {
+	const node = new DocumentFragment();
+	const slave = getSlave(V.AS);
+	let r = [];
+	const {
+		he, him, himself
+	} = getPronouns(slave);
+
+	if (slave.subTarget === V.AS) {
+		slave.subTarget = 0;
+	} else if (slave.subTarget === -1) {
+		if (V.universalRulesImpregnation !== "Stud" || V.AS !== V.StudID) {
+			slave.subTarget = 0;
+		}
+	}
+	if (slave.assignment !== "be a subordinate slave") {
+		assignJob(slave, "be a subordinate slave");
+	}
+	const st = getSlave(slave.subTarget);
+	r.push(slave.slaveName);
+	if (st) {
+		r.push(`will submit to <span class='slave-name'>${st.slaveName}</span> this week.`);
+	} else if (slave.subTarget === -1) {
+		r.push(`is acting as your Stud and is tasked with keeping your chattel pregnant.`);
+	} else {
+		r.push(`has not been given to any particular slave, so ${he} will have to offer ${himself} to everyone this week.`);
+		slave.subTarget = 0;
+	}
+	App.Events.addParagraph(node, r);
+
+	if (slave.subTarget === -1) {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			`Reign ${him} in`,
+			() => {
+				slave.subTarget = 0;
+				V.StudID = 0;
+				App.UI.reload();
+			}
+		));
+	} else {
+		if (V.universalRulesImpregnation === "Stud" && V.StudID === 0) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Stud",
+				() => {
+					slave.subTarget = -1;
+					V.StudID = V.AS;
+					App.UI.reload();
+				}
+			));
+		}
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"None",
+			() => {
+				slave.subTarget = 0;
+				App.UI.reload();
+			}
+		));
+		App.UI.DOM.appendNewElement("h2", node, `Select a slave for ${him} to submit to, sexually:`);
+		node.append(App.UI.SlaveList.slaveSelectionList(
+			s => s.devotion >= -20 && s.fuckdoll === 0 && V.AS !== s.ID &&
+			(!isAmputee(getSlave(V.AS)) || !isAmputee(s)),
+			(s) => App.UI.DOM.passageLink(SlaveFullName(s), 'Subordinate Targeting', () => { getSlave(V.AS).subTarget = s.ID; }),
+		));
+	}
+	return node;
+};
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 701e7878aa843a3f9c1534823100f1d8c006af4e..f0e7f63c8b13d1f8d51ae535908dca8cfb52a968 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1310,22 +1310,22 @@ globalThis.DefaultRules = (function() {
 		}
 
 		/** @type {{drug: FC.Drug, weight: number}[]} */
-		let _priorities = [];
-		drugs(slave, "boobs", rule.growth.boobs, _priorities, 200);
-		drugs(slave, "butt", rule.growth.butt, _priorities, 1);
-		drugs(slave, "lips", rule.growth.lips, _priorities, 1);
-		drugs(slave, "dick", rule.growth.dick, _priorities, 1);
-		drugs(slave, "balls", rule.growth.balls, _priorities, 1);
-
-		if (_priorities.length > 0) {
-			const action = _priorities.reduce((acc, cur) => (acc.weight > cur.weight) ? acc : cur);
+		let priorities = [];
+		drugs(slave, "boobs", rule.growth.boobs, priorities, 200);
+		drugs(slave, "butt", rule.growth.butt, priorities, 1);
+		drugs(slave, "lips", rule.growth.lips, priorities, 1);
+		drugs(slave, "dick", rule.growth.dick, priorities, 1);
+		drugs(slave, "balls", rule.growth.balls, priorities, 1);
+
+		if (priorities.length > 0) {
+			const action = priorities.reduce((acc, cur) => (acc.weight > cur.weight) ? acc : cur);
 			if (slave.drugs !== action.drug) {
 				slave.drugs = action.drug;
 				r += `<br>${slave.slaveName} has been put on ${slave.drugs}, since `;
 				if (action.drug.startsWith("intensive")) {
 					r += `${he}'s healthy enough to take them, and `;
 				}
-				if (_priorities.length > 1) {
+				if (priorities.length > 1) {
 					r += `that part of ${his} body is `;
 					if (!isNaN(action.weight)) {
 						r += `${Math.trunc(action.weight * 100)}% `;
@@ -1819,12 +1819,12 @@ globalThis.DefaultRules = (function() {
 			if (slave.balls === 0) {
 				if ((rule.gelding !== undefined) && (rule.gelding !== null)) {
 					if (slave.hormones !== rule.gelding) {
-						const _oldHormones = slave.hormones;
+						const oldHormones = slave.hormones;
 						slave.hormones = rule.gelding;
 						if (slave.indentureRestrictions >= 2) {
 							slave.hormones = Math.clamp(slave.hormones, -1, 1);
 						}
-						if (slave.hormones !== _oldHormones) {
+						if (slave.hormones !== oldHormones) {
 							r += `<br>${slave.slaveName} is a gelding, so ${he} has been put on the appropriate hormonal regime.`;
 						}
 					}
@@ -1832,12 +1832,12 @@ globalThis.DefaultRules = (function() {
 			} else if (slave.balls > 0) {
 				if ((rule.XY !== undefined) && (rule.XY !== null)) {
 					if (slave.hormones !== rule.XY) {
-						const _oldHormones = slave.hormones;
+						const oldHormones = slave.hormones;
 						slave.hormones = rule.XY;
 						if (slave.indentureRestrictions >= 2) {
 							slave.hormones = Math.clamp(slave.hormones, -1, 1);
 						}
-						if (slave.hormones !== _oldHormones) {
+						if (slave.hormones !== oldHormones) {
 							r += `<br>${slave.slaveName} is a shemale, so ${he} has been put on the appropriate hormonal regime.`;
 						}
 					}
@@ -1853,12 +1853,12 @@ globalThis.DefaultRules = (function() {
 	function ProcessFemaleHormones(slave, rule) {
 		if ((slave.vagina > -1) && (slave.dick === 0) && (rule.XX !== undefined) && (rule.XX !== null)) {
 			if (slave.hormones !== rule.XX) {
-				const _oldHormones = slave.hormones;
+				const oldHormones = slave.hormones;
 				slave.hormones = rule.XX;
 				if (slave.indentureRestrictions >= 2) {
 					slave.hormones = Math.clamp(slave.hormones, -1, 1);
 				}
-				if (slave.hormones !== _oldHormones) {
+				if (slave.hormones !== oldHormones) {
 					r += `<br>${slave.slaveName} is a female, so ${he} has been put on the appropriate hormonal regime.`;
 				}
 			}
@@ -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/SetBellySize.js b/src/js/SetBellySize.js
index 0e2218877886dc4777bd8144e39ef5deed4c1e49..f5189b82926ee5f3a97602eea198e58acec2c2a4 100644
--- a/src/js/SetBellySize.js
+++ b/src/js/SetBellySize.js
@@ -4,7 +4,7 @@
 globalThis.SetBellySize = function(slave) {
 	WombNormalizePreg(slave); /* now with support for legacy code that advances pregnancy by setting .preg++ */
 
-	const _implantSize = (slave.bellyImplant > 0) ? slave.bellyImplant : 0;
+	const implantSize = (slave.bellyImplant > 0) ? slave.bellyImplant : 0;
 
 	if (slave.inflation === 3) {
 		slave.bellyFluid = 10000;
@@ -16,5 +16,5 @@ globalThis.SetBellySize = function(slave) {
 		slave.bellyFluid = 0;
 	}
 
-	slave.belly = slave.bellyPreg + slave.bellyFluid + _implantSize;
+	slave.belly = slave.bellyPreg + slave.bellyFluid + implantSize;
 };
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 15948ec5a44c04b33b83318e30ec9e45f52e08d2..b9c5ff8c04cf17e0b346c4472b80685683e20852 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -1889,26 +1889,12 @@ App.Entity.SlaveState = class SlaveState {
 		this.faceAccessory = "none";
 		/**
 		 * may accept strings, use at own risk
-		 * * "none"
-		 * * "dildo gag"
-		 * * "massive dildo gag"
-		 * * "ball gag"
-		 * * "bit gag"
-		 * * "ring gag"
+		 * @type {FC.WithNone<FC.MouthAccessory>}
 		 */
 		this.mouthAccessory = "none";
 		/**
 		 * may accept strings, use at own risk
-		 * * "none"
-		 * * "heels"
-		 * * "pumps"
-		 * * "extreme heels"
-		 * * "boots"
-		 * * "flats"
-		 * * "platform heels"
-		 * * "extreme heels"
-		 * * "extreme platform heels"
-		 * * "platform shoes"
+		 * @type {FC.WithNone<FC.Shoes>}
 		 */
 		this.shoes = "none";
 		/**
diff --git a/src/js/SpacedTextAccumulator.js b/src/js/SpacedTextAccumulator.js
new file mode 100644
index 0000000000000000000000000000000000000000..98dc3fdbef1630eebb4b2c028219034c55052d4a
--- /dev/null
+++ b/src/js/SpacedTextAccumulator.js
@@ -0,0 +1,93 @@
+globalThis.SpacedTextAccumulator = class SpacedTextAccumulator {
+	/** @param {HTMLElement|DocumentFragment} [container] */
+	constructor(container) {
+		/** @type {HTMLElement|DocumentFragment} */
+		this._container = container || new DocumentFragment();
+		/** @type {(string|HTMLElement|DocumentFragment)[]} */
+		this._accumulator = [];
+		this._checked = false;
+
+		this._checkScope();
+	}
+
+	/** check that the accumulator isn't carrying strings outside of a single render pass, since that's almost certainly a bug */
+	_checkScope() {
+		if (V.debugMode && !this._checked) {
+			this._checked = true;
+			setTimeout(() => {
+				if (this._accumulator.length > 0) {
+					throw new Error(`Text accumulator contains stray fragments: ${toSentence(this._accumulator.map(e => `'${e.toString()}'`))}`);
+				}
+				this._checked = false; // reset
+			}, 0);
+		}
+	}
+
+	/** get a reference the underlying container */
+	container() {
+		this._checkScope();
+		return this._container;
+	}
+
+	/** add new sentences or sentence fragments to the accumulator; may contain HTML strings or DOM objects
+	 * @param {(string|HTMLElement|DocumentFragment)[]} items
+	 */
+	push(...items) {
+		this._checkScope();
+		return this._accumulator.push(...items);
+	}
+
+	/** write the contents of the accumulator to a container and clear the accumulator
+	 * @param {ParentNode} container
+	 * @private
+	 */
+	_accumulatorToContainer(container) {
+		this._checkScope();
+		$(container).append(...App.Events.spaceSentences(this._accumulator));
+		this._accumulator = [];
+	}
+
+	/** write the accumulated sentence or sentence fragments directly into the underlying container, separated by spaces */
+	toChildren() {
+		this._accumulatorToContainer(this._container);
+	}
+
+	/** assemble an element from the accumulated sentences or sentence fragments, separated by spaces
+	 * @template {keyof HTMLElementTagNameMap} K
+	 * @param {K} element
+	 * @param {string|Array<string>} [classNames]
+	 */
+	toNode(element, classNames) {
+		const el = App.UI.DOM.makeElement(element, null, classNames);
+		this._accumulatorToContainer(el);
+		this._container.append(el);
+	}
+
+	/** assemble a paragraph from the accumulated sentences or sentence fragments, separated by spaces */
+	toParagraph() {
+		return this.toNode("p");
+	}
+
+	/** modify the last element in the accumulator to add some text, WITHOUT adding a space between them (i.e. for punctuation)
+	 * @param {string} text - strings only!
+	 */
+	addToLast(text) {
+		const lastEl = this._accumulator.pop();
+		if (!lastEl) {
+			// add to WHAT now? just stick it in there (that's what she said)
+			this._accumulator.push(text);
+		} else if (typeof lastEl === 'string') {
+			// fast case - concatenate two strings
+			this._accumulator.push(lastEl + text);
+		} else if (lastEl instanceof DocumentFragment) {
+			// fast case - if it's already a fragment, just append to it - can't do this for ParentNode in general because of styles, etc
+			$(lastEl).append(text);
+			this._accumulator.push(lastEl);
+		} else {
+			// slow case - parse the text and push it into a DocumentFragment with the existing Node
+			const frag = new DocumentFragment();
+			$(frag).append(lastEl, text);
+			this._accumulator.push(frag);
+		}
+	}
+};
diff --git a/src/js/assignJS.js b/src/js/assignJS.js
index 8ef3d419636439ab1b813ddd8c39dc049058882e..c5be95ee701831ef63eee43b88a69fcb1e8ebdbe 100644
--- a/src/js/assignJS.js
+++ b/src/js/assignJS.js
@@ -473,8 +473,8 @@ globalThis.assignJobSafely = function(slave, assignmentStr) {
 globalThis.removeJob = function(slave, assignment, saveRecord = false) {
 	if (!slave) {
 		// it is well-formed, but does nothing, to remove an assignment from nobody.
-		// this lets us call <<run removeJob(_S.HeadGirl, Job.HEADGIRL)>> and similar,
-		// without first checking to see whether a slave is really assigned to _S.HeadGirl or not.
+		// this lets us call removeJob(S.HeadGirl, Job.HEADGIRL) and similar,
+		// without first checking to see whether a slave is really assigned to S.HeadGirl or not.
 		return '';
 	}
 
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index dbd4c00a620b2a48d03a41fb185f3a832df6ff05..9059b66256f2bca02dbbc3e85f2483cb021f69fc 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -10,8 +10,13 @@ App.Events.SEBirth = class SEBirth extends App.Events.BaseEvent {
 	}
 
 	execute(node) {
+		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null;
+		if (artRenderer) {
+			node.append(artRenderer.writePreamble());
+		}
+
 		for (const slave of this.actors.map(id => getSlave(id))) {
-			node.append(birth(slave));
+			node.append(birth(slave, {artRenderer}));
 			node.append(sectionBreak());
 		}
 		V.birthIDs = [];
@@ -32,8 +37,9 @@ App.Events.SEBirth = class SEBirth extends App.Events.BaseEvent {
  * @param {object} [obj]
  * @param {boolean} [obj.birthStorm]
  * @param {boolean} [obj.cSection]
+ * @param {App.Art.SlaveArtBatch} [obj.artRenderer]
  */
-globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {}) {
+globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRenderer = null} = {}) {
 	const el = document.createElement("p");
 	el.style.overflow = "hidden"; // Keep image from floating into the next slave.
 	let p;
@@ -59,8 +65,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 		he, his, him, himself, wife, girl
 	} = getPronouns(slave);
 	const hands = (hasBothArms(slave)) ? "hands" : "hand";
-	if (V.seeImages && V.seeReportImages) {
-		App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 2), ["imageRef", "medImg"]);
+	if (artRenderer) {
+		App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer);
 	}
 	el.append(titleText());
 	suddenBirthCheck();
@@ -2213,7 +2219,10 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 		let r = [];
 		const tempSub = getSlave(slave.subTarget);
 		const HGL = App.Entity.facilities.headGirlSuite.employeesIDs().size;
-		let his2, He2, he2, him2;
+		let his2;
+		let He2;
+		let he2;
+		let him2;
 		const {HeU, hisU, heU, himU, himselfU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
 		const children = slave.pregType > 1 ? `children` : `child`;
 		const childrenAre = slave.pregType > 1 ? `children are` : `child is`;
@@ -2655,7 +2664,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 									r.push(`${He} begins desperately begging to be taken back to ${his} bed; instead you pull ${him} towards the couch and take a seat with ${him} in your lap, back against your front. Blushing thoroughly, ${he} gives a meek protest before focusing on the coming birth, rather than your wandering hands. ${He} begins to push out ${firstText} baby${UH}.`);
 									humiliation = 1;
 								}
-								r.push(`${His} child is promptly taken and, following a shower and a fresh change of clothes, ${he} is helped back to your office${(slave.devotion < -20) ? `where you are waiting to enjoy ${his} still very gravid body` : ``}.`);
+								r.push(`${His} child is promptly taken and, following a shower and a fresh change of clothes, ${he} is helped back to your office${(slave.devotion < -20) ? ` where you are waiting to enjoy ${his} still very gravid body` : ``}.`);
 							} else {
 								r.push(`While sitting nearby, ${slave.slaveName}'s water breaks, startling ${him}. ${He} looks to you for guidance and you shake your head "no". Without permission to leave ${he}`);
 								if (slave.devotion > 50) {
@@ -2689,7 +2698,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 									r.push(`${He} attempts to leave your office and return to ${his} bed, but you catch ${his} arm before ${he} slips out of reach. You order ${him} to strip and give you a show. Blushing thoroughly, ${he} gives a meek performance before falling to the floor. ${He} begins to push out ${firstText} baby${UH}.`);
 									humiliation = 1;
 								}
-								r.push(`${His} child is promptly taken and, following a shower and a fresh change of clothes, ${he} waddles back into your office${(slave.devotion < -20) ? `where you are waiting to enjoy ${his} still very gravid body` : ``}.`);
+								r.push(`${His} child is promptly taken and, following a shower and a fresh change of clothes, ${he} waddles back into your office${(slave.devotion < -20) ? ` where you are waiting to enjoy ${his} still very gravid body` : ``}.`);
 							} else {
 								r.push(`While standing nearby, ${slave.slaveName}'s water breaks, startling ${him}. ${He} looks to you for guidance and you shake your head "no". Without permission to leave ${he}`);
 								if (slave.devotion > 50) {
@@ -3419,7 +3428,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 				case Job.TEACHER:
 					if (!canWalk(slave)) {
 						if (random(1, 20) > suddenBirth) {
-							r.push(`${He} calls for ${his} teaching aid to help position ${him} so the class may receive a lesson on childbirth. ${He} begins working on birthing ${firstText} baby, fully aware of ${his} watching students. ${He} demonstrates the proper ways to labor and how to deliver a baby${(slave.geneticQuirks.uterineHypersensitivity === 2) ? `even if your body is wracked by nonstop orgasm` : ``}. ${He} explains the infant's future as ${his} child taken and excuses the class for a short break in order to freshen up. Upon their return, ${he} begins a lesson on being a broodmother, as there is always a curious face locked onto ${his} still very gravid middle.`);
+							r.push(`${He} calls for ${his} teaching aid to help position ${him} so the class may receive a lesson on childbirth. ${He} begins working on birthing ${firstText} baby, fully aware of ${his} watching students. ${He} demonstrates the proper ways to labor and how to deliver a baby${(slave.geneticQuirks.uterineHypersensitivity === 2) ? ` even if your body is wracked by nonstop orgasm` : ``}. ${He} explains the infant's future as ${his} child taken and excuses the class for a short break in order to freshen up. Upon their return, ${he} begins a lesson on being a broodmother, as there is always a curious face locked onto ${his} still very gravid middle.`);
 							humiliation = 1;
 						} else {
 							r.push(`While teaching a lesson, ${slave.slaveName}'s water breaks. Sensing ${he} wouldn't be able to make it to the birthing area, ${he} instead chooses to act on the opportunity. Today's lesson will be on childbirth.`);
@@ -3435,7 +3444,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 							} else {
 								r.push(`is`);
 							}
-							r.push(`a regular occurrence in ${his} life and it would be a waste to not work it into ${his} lesson plan. ${He} wiggles ${himself} into a comfortable spot and begins working on birthing ${firstText} baby, fully aware of ${his} watching students. ${He} demonstrates the proper ways to labor and how to deliver a baby${(slave.geneticQuirks.uterineHypersensitivity === 2) ? `even if your body is wracked by nonstop orgasm` : ``}. ${He} explains the infant's future as ${his} child is taken and excuses the class for a short break in order to freshen up. Upon their return, ${he} begins a lesson on being a broodmother, as there is always a curious face locked onto ${his} still very gravid middle.`);
+							r.push(`a regular occurrence in ${his} life and it would be a waste to not work it into ${his} lesson plan. ${He} wiggles ${himself} into a comfortable spot and begins working on birthing ${firstText} baby, fully aware of ${his} watching students. ${He} demonstrates the proper ways to labor and how to deliver a baby${(slave.geneticQuirks.uterineHypersensitivity === 2) ? ` even if your body is wracked by nonstop orgasm` : ``}. ${He} explains the infant's future as ${his} child is taken and excuses the class for a short break in order to freshen up. Upon their return, ${he} begins a lesson on being a broodmother, as there is always a curious face locked onto ${his} still very gravid middle.`);
 							humiliation = 1;
 						} else {
 							r.push(`While teaching a lesson, ${slave.slaveName}'s water breaks. Sensing ${he} wouldn't be able to make it to the birthing area, ${he} instead chooses to act on the opportunity. Today's lesson will be on childbirth.`);
@@ -4061,7 +4070,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 
 	function hyperBroodmotherBirth() {
 		const el = document.createElement("p");
-		let he2, his2;
+		let he2;
+		let his2;
 		const r = [];
 		const tempSub = getSlave(slave.subTarget);
 		const pbw = random(1, 100);
@@ -4917,7 +4927,9 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 
 	function birthDescription() {
 		const el = document.createElement("p");
-		let He2, he2, his2;
+		let He2;
+		let he2;
+		let his2;
 		const r = [];
 		const HGL = App.Entity.facilities.headGirlSuite.hostedSlaves;
 		const babies = slave.pregType > 1 ? `babies` : `baby`;
@@ -5189,7 +5201,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 								r.push(`${He} begins desperately begging to be taken back to ${his} bed; instead you pull ${him} towards the couch and take a seat with ${him} in your lap, back against your front. Blushing thoroughly, ${he} gives a meek protest before focusing on the coming birth, rather than your wandering hands.`);
 								humiliation = 1;
 							}
-							r.push(`${He} begins to push out ${his} ${babies}${UH}. ${His} ${childrenAre} promptly taken and, following a shower and a fresh change of clothes, ${he} is helped back to your office${(slave.devotion < -20) ? `where you are waiting to enjoy ${his} exhausted body` : ``}.`);
+							r.push(`${He} begins to push out ${his} ${babies}${UH}. ${His} ${childrenAre} promptly taken and, following a shower and a fresh change of clothes, ${he} is helped back to your office${(slave.devotion < -20) ? ` where you are waiting to enjoy ${his} exhausted body` : ``}.`);
 						}
 					} else {
 						if (slave.fetish === "mindbroken") {
@@ -5618,7 +5630,9 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 
 	function ampBirth() {
 		const el = document.createElement("p");
-		let He2, he2, his2;
+		let He2;
+		let he2;
+		let his2;
 		const r = [];
 		const babies = slave.pregType > 1 ? `babies` : `baby`;
 		const children = slave.pregType > 1 ? `children` : `child`;
@@ -5999,7 +6013,10 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 
 	function suddenBirthScene() {
 		const el = document.createElement("p");
-		let He2, he2, his2, him2;
+		let He2;
+		let he2;
+		let his2;
+		let him2;
 		const {
 			HeU,
 			heU, himU, himselfU, girlU
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index efbf4fc48616ef60c5076bc8f564e5ebedf47a3e..21c3b37531e63426a3ccf40edd38e757a71940f1 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -766,11 +766,11 @@ globalThis.calculateCosts = (function() {
 
 	// player expenses
 	function getPCTrainingCosts() {
-		const PA = Object.values(PersonalAttention);
+		const trainingPA = [PersonalAttention.TRADE, PersonalAttention.WAR, PersonalAttention.SLAVING, PersonalAttention.ENGINEERING, PersonalAttention.MEDICINE, PersonalAttention.HACKING];
 		const currentPA = V.personalAttention;
 		let costs = 0;
 		if (V.PC.actualAge >= V.IsInPrimePC && V.PC.actualAge < V.IsPastPrimePC) {
-			if (PA.includes(currentPA) && currentPA !== PersonalAttention.MAID && currentPA !== PersonalAttention.SUPPORTHG) {
+			if (trainingPA.includes(currentPA)) {
 				costs += 10000 * V.AgeEffectOnTrainerPricingPC;
 			}
 		}
@@ -871,7 +871,7 @@ globalThis.calculateCosts = (function() {
 		if (slave.assignment === Job.QUARTER) {
 			effectiveness *= 1.1;
 		}
-		if (App.Data.Careers.Leader.servant.includes(slave.career) || slave.skill.servant >= V.masteredXP) {
+		if (App.Data.Careers.General.servant.includes(slave.career) || slave.skill.servant >= V.masteredXP) {
 			effectiveness *= 1.1;
 		}
 		effectiveness = Math.trunc(effectiveness * restEffects(slave) / 10);
@@ -2199,7 +2199,7 @@ The new system will still happily spend your money, but it will also record it i
 
 Let's say you were going to spend 100 on your favorite slave with cashX. You might try:
 
-<<run cashX(-100, "slaveMod", _slave)>>
+<<run cashX(-100, "slaveMod", slave)>>
 
 There we go!
 1. -100 taken from your account
@@ -2210,7 +2210,7 @@ cashX can be used in JS as well, and can be included in [[]] style links.
 
 Make sure that expenses arrive in the COST slot as a negative, they are often positive in code. Use the new function forceNeg or pass it along on a temporary variable if needed.
 
-Costs don't have to be numbers either, you can use variables. <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>>. forceNeg makes sure that whatever value _ContractCost has is negative, and will therefore be recorded as an expense. You don't have to use it if you're sure the number you are passing along is negative.
+Costs don't have to be numbers either, you can use variables. <<run cashX(forceNeg(ContractCost), "slaveTransfer", slave)>>. forceNeg makes sure that whatever value ContractCost has is negative, and will therefore be recorded as an expense. You don't have to use it if you're sure the number you are passing along is negative.
 
 A full list of categories (slaveMod, slaveTransfer, event) are in App.Data.Records.LastWeeksCash(). It's important to match your cost to one of those categories (or add a new one there, and display it in costsBudget.tw.)
 
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 260dbdc368fc277dd72f4e26be28894f6feabdab..1ca2c43de8fdeb645c3459bab715377361b20533 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -20,102 +20,7 @@ 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 (V.HeadGirlID !== 0) {
-					if (eventSlave.assignment !== Job.QUARTER) {
-						if (eventSlave.ID === V.HeadGirlID) {
-							if (eventSlave.trust > 50) {
-								V.RESSevent.push("trusting HG");
-							}
-						}
-					}
-				}
-
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.rules.living === "spare") {
-						if (eventSlave.devotion <= 20) {
-							if (eventSlave.devotion > -10) {
-								V.RESSevent.push("sleeping ambivalent");
-							}
-							if (eventSlave.trust < -20) {
-								V.RESSevent.push("bad dream");
-							}
-						}
-					}
-
-					if (eventSlave.devotion <= 50) {
-						if (eventSlave.devotion >= -20) {
-							if (eventSlave.weekAcquired > 0) {
-								if (V.week - eventSlave.weekAcquired < 10) {
-									if (eventSlave.energy > 20) {
-										if (eventSlave.anus !== 0) {
-											if (eventSlave.vagina !== 0) {
-												V.RESSevent.push("ignorant horny");
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
 				if (eventSlave.assignment !== Job.QUARTER) {
-					if (V.modRequestsAllowed > 0) {
-						if (eventSlave.trust > 50) {
-							if (eventSlave.devotion > 20) {
-								if (eventSlave.dick !== 0 || eventSlave.vagina !== -1) {
-									if (eventSlave.nipples !== "fuckable") {
-										if (eventSlave.rules.speech === "permissive") {
-											if (eventSlave.corsetPiercing === 0) {
-												if (eventSlave.tonguePiercing === 0) {
-													if (eventSlave.anusPiercing === 0) {
-														if (eventSlave.nipplesPiercing === 0) {
-															if (eventSlave.dickPiercing === 0) {
-																if (eventSlave.vaginaPiercing === 0) {
-																	if (eventSlave.lipsTat === 0 || eventSlave.lipsTat === "none") {
-																		if (eventSlave.vaginaTat === 0 || eventSlave.vaginaTat === "none") {
-																			V.RESSevent.push("mods please");
-																		}
-																	}
-																}
-															}
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-
 					if (eventSlave.muscles > 5) {
 						if (eventSlave.devotion > 20) {
 							if (eventSlave.diet !== "slimming") {
@@ -173,38 +78,6 @@ if(eventSlave.drugs === "breast injections") {
 */
 				}
 
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.devotion < -50) {
-						if (eventSlave.trust >= -20) {
-							if (eventSlave.rules.speech === "restrictive") {
-								V.RESSevent.push("vocal disobedience");
-							}
-						}
-					}
-				}
-
-				if (V.boobAccessibility !== 1 && V.ballsAccessibility !== 1 && V.pregAccessibility !== 1) {
-					if (eventSlave.boobs > 10000) {
-						if (eventSlave.devotion >= -20) {
-							if (V.slaves.length > 2) {
-								if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-									V.RESSevent.push("huge tits");
-								}
-							}
-						}
-					}
-				}
-
-				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) {
@@ -215,34 +88,6 @@ if(eventSlave.drugs === "breast injections") {
 					}
 				}
 
-				if (eventSlave.devotion > 50) {
-					if (eventSlave.trust > 20) {
-						if (eventSlave.physicalAge > 37) {
-							if (eventSlave.anus > 0) {
-								if (eventSlave.vagina > 0) {
-									V.RESSevent.push("devoted old");
-								}
-							}
-						}
-					}
-				}
-
-				if (eventSlave.fetish === "humiliation" || eventSlave.energy > 95) {
-					if (eventSlave.devotion <= 50) {
-						if (eventSlave.devotion >= -20) {
-							if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-								if (eventSlave.vagina !== 0) {
-									if (eventSlave.anus !== 0) {
-										if (eventSlave.fetishKnown === 1) {
-											V.RESSevent.push("fearful humiliation");
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
 				if (V.spa > 0) {
 					if (eventSlave.boobs > 2000) {
 						if (eventSlave.devotion > 20) {
@@ -368,31 +213,6 @@ if(eventSlave.drugs === "breast injections") {
 				}
 			}
 
-			if (V.seeAge === 1) {
-				if (eventSlave.actualAge < 18) {
-					if (eventSlave.devotion > 20) {
-						if (eventSlave.ovaries === 1) {
-							if (eventSlave.pubertyXX === 0) {
-								if (eventSlave.preg === 0) {
-									if (eventSlave.physicalAge + eventSlave.birthWeek / 52 >= eventSlave.pubertyAgeXX - 0.5) {
-										V.RESSevent.push(...Array.from({length: 10}, () => "first period"));
-									}
-								}
-							}
-						}
-						if (canPenetrate(eventSlave)) {
-							if (eventSlave.balls > 0) {
-								if (eventSlave.pubertyXY === 0) {
-									if (eventSlave.physicalAge + eventSlave.birthWeek / 52 >= eventSlave.pubertyAgeXY - 0.5) {
-										V.RESSevent.push(...Array.from({length: 10}, () => "wet dreams"));
-									}
-								}
-							}
-						}
-					}
-				}
-			} /* closes aging exemption */
-
 			if (eventSlave.assignment !== Job.QUARTER) {
 				if (eventSlave.boobs > 600) {
 					if (eventSlave.boobShape === "torpedo-shaped") {
@@ -431,72 +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.balls > 0) {
-				if (eventSlave.scrotum > 0) {
-					if (eventSlave.chastityPenis === 1) {
-						if (eventSlave.devotion <= 95) {
-							if (eventSlave.energy > 50) {
-								if (eventSlave.energy < 95) {
-									if (eventSlave.devotion >= -20 || eventSlave.trust < -20) {
-										V.RESSevent.push("cage relief");
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-
-			if (V.PC.dick > 0) {
-				if (V.PC.boobs >= 300) {
-					if (canSee(eventSlave)) {
-						if (eventSlave.devotion <= 50) {
-							if (eventSlave.devotion >= -20) {
-								if (((eventSlave.attrXY <= 35) && (eventSlave.attrXX > 65)) || ((eventSlave.attrXX <= 35) && (eventSlave.attrXY > 65))) {
-									V.RESSevent.push("dickgirl PC");
-								}
-							}
-						}
-					}
-				}
-			}
-
-			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) {
@@ -506,70 +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.devotion <= 20) {
-				if (eventSlave.devotion >= -50) {
-					V.RESSevent.push("resistant shower");
-				}
-			}
-
-			if (eventSlave.rules.release.masturbation === 0 && !App.Utils.hasNonassignmentSex(eventSlave)) {
-				if (eventSlave.need) {
-					if (eventSlave.devotion >= -20) {
-						if (eventSlave.trust >= -50) {
-							V.RESSevent.push("desperately horny");
-						}
-					}
-				}
-			}
-
-			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.dick > 0) {
-				if (eventSlave.balls === 0) {
-					if (eventSlave.genes === "XY") {
-						if (eventSlave.devotion <= 50) {
-							if (eventSlave.trust < -50) {
-								if (eventSlave.anus > 0) {
-									if (canDoAnal(eventSlave)) {
-										V.RESSevent.push("resistant gelding");
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-
-			if ([Job.PUBLIC, Job.WHORE].includes(eventSlave.assignment)) {
-				if (eventSlave.vagina !== 0) {
-					if (eventSlave.anus !== 0) {
-						if (canDoAnal(eventSlave)) {
-							if (eventSlave.devotion <= 50) {
-								V.RESSevent.push("used whore");
-							}
-						}
-					}
-				}
-			}
-
 			if (eventSlave.assignment === Job.PUBLIC) {
 				if (eventSlave.devotion >= -20) {
 					if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
@@ -588,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) {
@@ -607,16 +293,6 @@ if(eventSlave.drugs === "breast injections") {
 					}
 				}
 			}
-
-			if (eventSlave.assignment !== Job.QUARTER) {
-				if (eventSlave.rules.speech === "restrictive") {
-					if (eventSlave.devotion > 60) {
-						if (eventSlave.trust >= -20) {
-							V.RESSevent.push("restricted profession");
-						}
-					}
-				}
-			}
 		} /* closes mute exempt */
 		if (eventSlave.assignment !== Job.QUARTER) {
 			if (eventSlave.boobs > 25000) {
@@ -638,20 +314,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.minorInjury === "sore ass") {
-			if (eventSlave.devotion <= 50) {
-				V.RESSevent.push("sore ass");
-			}
-		}
-
-		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) {
@@ -704,22 +366,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.rules.release.masturbation === 1) {
-			if (eventSlave.belly < 300000) {
-				if (eventSlave.anus > 2) {
-					if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) {
-						if (eventSlave.fetish !== "none") {
-							if (canHold(eventSlave)) {
-								if (canDoAnal(eventSlave)) {
-									V.RESSevent.push("loose buttslut");
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
 		if (eventSlave.boobs > 1200) {
 			if (eventSlave.areolaeShape !== "circle") {
 				if (eventSlave.devotion > 50) {
@@ -728,72 +374,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.assignment !== Job.QUARTER) {
-			if (eventSlave.behavioralFlaw === "arrogant") {
-				if (eventSlave.devotion < -50) {
-					if (eventSlave.trust >= -50) {
-						V.RESSevent.push("rebellious arrogant");
-					}
-				}
-			}
-		}
-
-		if (V.seePreg !== 0) {
-			if (eventSlave.bellyPreg >= 10000) {
-				V.RESSevent.push("hugely pregnant");
-			}
-		}
-
-		if (eventSlave.hormoneBalance >= 50) {
-			if (eventSlave.vagina === -1) {
-				if (eventSlave.balls >= 0) {
-					if (eventSlave.devotion > 20 || eventSlave.trust < -20) {
-						if (eventSlave.devotion <= 50) {
-							if (eventSlave.fetish !== "buttslut") {
-								if (eventSlave.rules.speech === "permissive") {
-									V.RESSevent.push("hormone dysfunction");
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.vaginaPiercing > 1) {
-			if (eventSlave.nipplesPiercing > 1) {
-				if (eventSlave.clitPiercing > 1) {
-					if (eventSlave.devotion > 20 || eventSlave.trust < -20) {
-						if (eventSlave.devotion <= 50) {
-							if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-								V.RESSevent.push("heavy piercing");
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.fetishKnown === 1) {
-			if (eventSlave.fetish === "cumslut" || eventSlave.energy > 95) {
-				if ([Job.PUBLIC, Job.WHORE, Job.GLORYHOLE].includes(eventSlave.assignment)) {
-					if (eventSlave.devotion > 20) {
-						if (V.PC.dick !== 0) {
-							V.RESSevent.push("cumslut whore");
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.anus === 0) {
-			if (eventSlave.devotion < -20) {
-				if (eventSlave.trust >= -20) {
-					V.RESSevent.push("resistant anal virgin");
-				}
-			}
-		}
-
 		if (V.PC.dick !== 0) {
 			if (eventSlave.bellyPreg >= 300000) {
 				V.RESSevent.push("hyperpreg stuck");
@@ -831,9 +411,6 @@ globalThis.populateEventArray = function(RESS = V.RESSevent.length, RESSTR = V.R
 	for (i = 0; i < RECI; i++) {
 		events.push("RECI");
 	}
-	if (events.length === 0) {
-		events.push("RE no event");
-	}
 
 	return events;
 };
diff --git a/src/js/ibcJS.js b/src/js/ibcJS.js
index 938c44a0cba32df56e31814fadc424ff173f6530..8375a8346de0d2b9720b206b67099f5c8305140c 100644
--- a/src/js/ibcJS.js
+++ b/src/js/ibcJS.js
@@ -11,6 +11,8 @@
 
 //  TODO: replace snake_case with camelCase
 
+/* eslint-disable camelcase */
+/* eslint-disable eqeqeq */
 globalThis.ibc = (() => {
 	// These IDs are considered to be unknown parents
 	let or_null = (s) => specificCharacterID(s) ? s : null;
@@ -149,11 +151,11 @@ globalThis.ibc = (() => {
 	};
 
 	let kinship = (mother, father) => {
-		let _coeff = 0;
+		let coeffNum = 0;
 		if (!mother || !father) {
-			_coeff = 0;
+			coeffNum = 0;
 		} else if (mother === father) {
-			_coeff = 0.5 * (1 + coeff(mother));
+			coeffNum = 0.5 * (1 + coeff(mother));
 		} else {
 			let cf = 0;
 			let cmn = common(mother, father);
@@ -202,10 +204,10 @@ globalThis.ibc = (() => {
 				});
 			});
 
-			_coeff = cf;
+			coeffNum = cf;
 		}
 
-		return _coeff;
+		return coeffNum;
 	};
 
 	// Determine the coefficient of inbreeding of a node `n`
diff --git a/src/js/pregJS.js b/src/js/pregJS.js
index a9b3dbaa556e82281bba82fc04585a4040d3742b..a124fa7a0264521b51c825d81ac4c04d864b0948 100644
--- a/src/js/pregJS.js
+++ b/src/js/pregJS.js
@@ -421,7 +421,7 @@ globalThis.setPregType = function(actor) {
  * Penetrative ability, ability to become pregnant, and canBreed() must be checked outside of this. Designed to assume .eggType === "human".
  * @param {App.Entity.SlaveState | App.Entity.PlayerState} target is the slave to get pregnant. Also accepts the PC.
  * @param {number} chance is the % chance to conceive.
- * @param {number} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this.
+ * @param {0|1|2} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this.
  * @param {number} [fatherID] is the ID of her sire or 0 if undefined.
  * @returns {string}
  */
diff --git a/src/js/relationshipChecks.js b/src/js/relationshipChecks.js
index 86c50e712b0ffa71d35a5f63cb69f89cd23310eb..449e5a49db90f02c0a7415268c7e6e1b02a6a893 100644
--- a/src/js/relationshipChecks.js
+++ b/src/js/relationshipChecks.js
@@ -92,9 +92,9 @@ globalThis.contextualIntro = function(context, actor, asLink = false, insertComm
 		r += preamble() + rivalryTerm(context);
 	}
 
-	const _relative = relativeTerm(context, actor);
-	if (_relative) {
-		r += preamble() + _relative;
+	const relative = relativeTerm(context, actor);
+	if (relative) {
+		r += preamble() + relative;
 	}
 
 	if (r !== ``) {
diff --git a/src/js/removeSlave.js b/src/js/removeSlave.js
index 4dcacd4f845193792e3608552502fc67bfddd9fd..a2a818de48eff4372f50c809f627e098293759e7 100644
--- a/src/js/removeSlave.js
+++ b/src/js/removeSlave.js
@@ -183,16 +183,16 @@ globalThis.removeSlave = function(slave) {
 		V.organs.deleteWith(s => s.ID === AS_ID);
 		V.completedOrgans.deleteWith(s => s.ID === AS_ID);
 
-		for (let _o = 0; _o < V.adjustProsthetics.length; _o++) {
-			if (V.adjustProsthetics[_o].ID === AS_ID) {
-				V.adjustProsthetics.deleteAt(_o);
+		for (let o = 0; o < V.adjustProsthetics.length; o++) {
+			if (V.adjustProsthetics[o].ID === AS_ID) {
+				V.adjustProsthetics.deleteAt(o);
 				V.adjustProstheticsCompleted--;
-				_o--;
+				o--;
 			}
 		}
 
-		const _geneIndex = V.genePool.findIndex(s => s.ID === AS_ID);
-		if (_geneIndex !== -1) {
+		const geneIndex = V.genePool.findIndex(s => s.ID === AS_ID);
+		if (geneIndex !== -1) {
 			let keep = false;
 			if (V.traitor !== 0) {
 				if (isImpregnatedBy(V.traitor, slave) || V.traitor.ID === AS_ID) {
@@ -218,7 +218,7 @@ globalThis.removeSlave = function(slave) {
 				});
 			}
 			if (!keep) {
-				V.genePool.deleteAt(_geneIndex);
+				V.genePool.deleteAt(geneIndex);
 			}
 		}
 		Object.values(V.missingTable).forEach(s => {
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 9845e5a93bab869a15fb50f0ac6ec10c59104934..6b96e8f8c0d2817f3511801bb756f4874f4861f6 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -2002,7 +2002,7 @@ App.RA.options = (function() {
 
 	class GagList extends ListSelector {
 		constructor() {
-			const pairs = [["No gag", "none"]].concat(isItemAccessible.array(App.Data.slaveWear.mouthAccessory ));
+			const pairs = [["No gag", "none"]].concat(isItemAccessible.array(App.Data.mouthAccessory ));
 			super("Gag", pairs);
 			this.setValue(current_rule.set.mouthAccessory );
 			this.onchange = (value) => current_rule.set.mouthAccessory = value;
diff --git a/src/js/rulesAutosurgery.js b/src/js/rulesAutosurgery.js
index cb96326919ca434c3790a572c86f53da0be046e2..b2653c4061e0636518b2d12463553eb00a405161 100644
--- a/src/js/rulesAutosurgery.js
+++ b/src/js/rulesAutosurgery.js
@@ -2,7 +2,6 @@
 globalThis.rulesAutosurgery = (function() {
 	"use strict";
 
-	let r;
 	return rulesAutoSurgery;
 
 	/**
@@ -11,14 +10,14 @@ globalThis.rulesAutosurgery = (function() {
 	 * @returns {string}
 	 */
 	function rulesAutoSurgery(slave, overrideRules) {
-		r = "";
+		let r = "";
 		const surgeries = [];
 		const thisSurgery = overrideRules || surgeryFromRules(slave);
 		if (slave.health.health >= -20) {
 			CommitSurgery(slave, thisSurgery, surgeries);
 		}
 		if (surgeries.length > 0) {
-			r += `${capFirstChar(V.assistant.name)}, ordered to apply surgery, gives ${slave.slaveName} ${surgeries.length > 1 ? `${surgeries.length} surgeries` : 'a single operation'}: <span class="lime">${toSentence(surgeries)}.</span>`;
+			r += `${capFirstChar(V.assistant.name)}, ordered to apply surgery, gives ${slave.slaveName} ${surgeries.length > 1 ? `${surgeries.length} surgeries` : 'a single operation'}: <span class="lime">${capFirstChar(toSentence(surgeries))}.</span>`;
 		}
 		return r;
 	}
@@ -121,22 +120,33 @@ globalThis.rulesAutosurgery = (function() {
 			}
 			if (!shallShrink && !shallGrow) { return; }
 
-			const surgeryOptions = App.Medicine.Surgery.sizingProcedures.bodyPart(bodyPart, slave, options)
-				.filter(surgery => surgery.action !== undefined)
-				.sort(sorter);
+			let surgeryOptions = App.Medicine.Surgery.sizingProcedures.bodyPart(bodyPart, slave, options);
+			surgeryOptions = surgeryOptions
+				.filter(surgery => surgery.disabledReasons.length === 0);
+			surgeryOptions = surgeryOptions.sort(sorter);
+
 			for (const so of surgeryOptions) {
-				if ((shallShrink && App.RA.shallShrink(slave[`${bodyPart}Implant`], target, so.targetEffect)) ||
-					(shallGrow && App.RA.shallGrow(slave[`${bodyPart}Implant`], target, so.targetEffect))) {
-					surgeries.push(`surgery to ${so.description}`);
-					App.Medicine.Surgery.commit(so, slave);
+				if (shallShrink && App.RA.shallShrink(slave[`${bodyPart}Implant`], target, so.changeValue) ||
+					shallGrow && App.RA.shallGrow(slave[`${bodyPart}Implant`], target, so.changeValue)
+				) {
+					const [diff, reaction] = App.Medicine.Surgery.apply(so, false);
+
+					const result1 = reaction.reaction(slave, diff);
+					const result2 = reaction.outro(slave, diff, result1);
+
+					App.Utils.Diff.applyDiff(slave, diff);
+
+					slave.devotion += result1.devotion + result2.devotion;
+					slave.trust += result1.trust + result2.trust;
+
+					// TODO shortReaction and devotion/trust changes
+
+					surgeries.push(`${so.description}`);
 					break;
 				}
 			}
 		}
 
-		// NOTE: App.RA.shallShrink() and App.RA.shallGrow() return 'false' when target is 'null'
-		// Hence they have to be first conditions in the '&&' chains to avoid type errors
-		// (reading properties of the 'null' object)
 		if (slave.health.health < -20 && surgeries.length >= 3) {
 			return `<span class='red'>Either this slave is extremely unwell or they are assigned to have more than two surgeries.</span>`;
 		}
diff --git a/src/js/salon.js b/src/js/salon.js
index 4b61934b1d1e48509ff7a27d9193935cfff450d5..b6e973a78c2c4eeddecc703ed6ceb9d12b92c590 100644
--- a/src/js/salon.js
+++ b/src/js/salon.js
@@ -69,8 +69,8 @@ App.Medicine.Modification.eyeSelector = function(entity, cheat = false) {
 	function assembleList(name, list, callback, selected) {
 		const links = [];
 
-		for (let i = 0; i < list.length; i++) {
-			addToggle(list[i], callback, links, list[i] === selected);
+		for (const item of list) {
+			addToggle(item, callback, links, item === selected);
 		}
 
 		const div = document.createElement("div");
@@ -344,7 +344,7 @@ App.Medicine.Salon.ears = function(slave, cheat = false) {
 	}
 
 	function apply() {
-		App.Event.refreshEventArt(slave);
+		App.Events.refreshEventArt(slave);
 		jQuery(container).empty().append(content());
 	}
 };
@@ -377,14 +377,11 @@ App.Medicine.Salon.tail = function(slave, cheat = false) {
 
 	function tailDye() {
 		const frag = new DocumentFragment();
-		let div;
-		let p;
+		let r = [];
 		frag.append(`${His} tail is ${slave.tailColor}.`);
 
-		div = document.createElement("div");
-		div.classList.add("choices");
 		if (slave.origHColor !== slave.hColor) {
-			div.append(
+			r.push(
 				App.UI.DOM.link(
 					"Match current hair",
 					() => {
@@ -394,31 +391,27 @@ App.Medicine.Salon.tail = function(slave, cheat = false) {
 						}
 						App.UI.reload();
 					}
-				)
+				),
+				"or",
+				App.UI.DOM.makeElement("span", "choose a new one: ", "note")
 			);
-			div.append(" or ");
-			App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note");
 		} else {
-			App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} tail:`, "note");
+			r.push(App.UI.DOM.makeElement("span", `Choose a dye color before dyeing ${his} tail:`, "note"));
 		}
-		frag.append(div);
+		App.Events.addNode(frag, r, "div", "choices");
 
-		div = document.createElement("div");
-		div.classList.add("choices");
-		div.append(`Colors: `);
-		div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary));
-		frag.append(div);
+		App.Events.addNode(frag, [
+			`Colors:`,
+			createList(App.Medicine.Modification.Color.Primary, updatePrimary)
+		], "div", "choices");
 
-		div = document.createElement("div");
-		div.classList.add("choices");
-		div.append(`Highlights: `);
-		div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary));
-		frag.append(div);
+		App.Events.addNode(frag, [
+			`Highlights:`,
+			createList(App.Medicine.Modification.Color.Secondary, updateSecondary)
+		], "div", "choices");
 
 		if (primaryTailColor !== 0) {
-			p = document.createElement("p");
-			p.classList.add("choices");
-			p.append(
+			App.Events.addNode(frag, [
 				App.UI.DOM.link(
 					`Color ${his} tail`,
 					() => {
@@ -428,10 +421,9 @@ App.Medicine.Salon.tail = function(slave, cheat = false) {
 						}
 						App.UI.reload(); // discard selections after locking them in.
 					}
-				)
-			);
-			p.append(` ${primaryTailColor}${secondaryTailColor} now?`);
-			frag.append(p);
+				),
+				`${primaryTailColor}${secondaryTailColor} now?`
+			], "p", "choices");
 		}
 		return frag;
 	}
@@ -456,7 +448,7 @@ App.Medicine.Salon.tail = function(slave, cheat = false) {
 	}
 
 	function apply() {
-		App.Event.refreshEventArt(slave);
+		App.Events.refreshEventArt(slave);
 		jQuery(container).empty().append(tailDye());
 	}
 };
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 2436c2d11cfc1b3c84fb666ce724426b9c17ca42..8003662e2caaca6858e750e27e3c945270bfe219 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -1341,7 +1341,7 @@ globalThis.BeautyArray = (function() {
 		if (arcology.FSTransformationFetishist > 20) {
 			if (slave.lips > 70) {
 				if (slave.lipsImplant / slave.lips < 0.5) {
-					adjustBeauty("Lips: Transformation Fetishist", -(((slave.lips / 10) + (arcology.FSTransformationFetishist / 20))));
+					adjustBeauty("Lips: Transformation Fetishist", -((slave.lips / 10) + (arcology.FSTransformationFetishist / 20)));
 				}
 			}
 			if (slave.hips === 3) {
@@ -2271,15 +2271,120 @@ globalThis.FResultTooltip = function(slave, forSale = 0) {
  * @param {boolean} [isStartingSlave=false] is the slave a "starting slave"
  * @param {boolean} [followLaws=false] Apply cost variations from enacted Slave Market Regulations
  * @param {boolean} [isSpecial=false] is this slave a special/hero slave
- * @returns {number}
+ * @param {boolean} [returnDOM]
+ * @returns {number|Object}
  */
-globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false) {
+globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false, returnDOM = false) {
 	const milked = App.SlaveAssignment.getMilked(slave, 1.0, true);
-	const beauty = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial);
-	if ((milked.cash * 52) > beauty && !isStartingSlave) { // Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible.
-		return milked.cash * 52;
+	const beautyObj = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial);
+	const cost = beautyObj.cost;
+	/** Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. */
+	const milkYear = milked.cash * 52;
+	if ((milkYear) > cost && !isStartingSlave) {
+		const milkSpan = App.UI.DOM.makeElement("span", cashFormat(milkYear));
+		if (V.cheatMode || V.debugMode) {
+			milkSpan.tabIndex = 0;
+			milkSpan.classList.add("has-tooltip");
+			tippy(milkSpan, {
+				content: `Value as a cow is greater than their value as a sex object.  Value is based on a year's fluids with current body.`,
+				placement: "right", interactive: true, trigger: "click"
+			});
+		}
+		return returnDOM ? {cost: milkYear, report: milkSpan} : milkYear;
 	} else {
-		return beauty;
+		return returnDOM ? {cost: cost, report: costTooltip()} : cost;
+	}
+
+	function costTooltip() {
+		// Make a link. Clicking the link will display detailed info about that over the top of the page (tooltip-style)
+		const span = App.UI.DOM.makeElement("span", cashFormat(cost));
+		if (V.cheatMode || V.debugMode) {
+			span.tabIndex = 0;
+			span.classList.add("has-tooltip");
+			tippy(span, {
+				content: costDisplay(),
+				placement: "right", interactive: true, trigger: "click"
+			});
+		}
+		return span;
+
+		/** Upon the link being clicked, set up some links to sort the info and a span to show it in
+		 * @returns {HTMLElement}
+		 */
+		function costDisplay() {
+			let criteria = "value";
+			let direction = "descending";
+
+			// Heading line that handles sorting
+			const el = document.createElement('div');
+			el.classList.add("tip-details");
+
+			el.appendChild(document.createTextNode(`Sort by: `));
+			el.appendChild(App.UI.DOM.generateLinksStrip([
+				App.UI.DOM.link("Text", () => {
+					criteria = "text";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Value", () => {
+					criteria = "value";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Ascending", () => {
+					direction = "ascending";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Descending", () => {
+					direction = "descending";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, [])
+			]));
+
+			let cheatFResultContents = App.UI.DOM.appendNewElement("div", el, costFrame());
+
+			App.UI.DOM.appendNewElement("div", el, "A slave's base value is modified by an additive multiplier.", "note");
+
+			return el;
+
+			/** Set up the frame that contains the info
+			 * @returns {HTMLDivElement}
+			 */
+			function costFrame() {
+				let el = document.createElement("div");
+				el.classList.add("grid-2columns-auto");
+
+				let sortedBeautyMapKeys;
+				if (criteria === "text") {
+					if (direction === "descending") {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a > b) ? 1 : -1);
+					} else {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a < b) ? 1 : -1);
+					}
+				} else if (criteria === "value") {
+					if (direction === "descending") {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) < beautyObj.map.get(b)) ? 1 : -1);
+					} else {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) > beautyObj.map.get(b)) ? 1 : -1);
+					}
+				}
+
+				for (const key of sortedBeautyMapKeys) {
+					let value = beautyObj.map.get(key);
+					value = (Math.floor(value * 10) / 10);
+
+					let className;
+					if (value > 0) {
+						className = "green";
+					} else if (value < 0) {
+						className = "red";
+					}
+					App.UI.DOM.appendNewElement("div", el, value.toString(), className);
+
+					App.UI.DOM.appendNewElement("div", el, capFirstChar(key));
+				}
+
+				return el;
+			}
+		}
 	}
 };
 
@@ -2289,13 +2394,14 @@ globalThis.slaveCostBeauty = (function() {
 	let arcology;
 	let multiplier;
 	let cost;
+	const map = new Map([]);
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
 	 * @param {boolean} isStartingSlave is the slave a "starting slave"
 	 * @param {boolean} followLaws Apply cost variations from enacted Slave Market Regulations
 	 * @param {boolean} isSpecial is this slave a special/hero slave
-	 * @returns {number}
+	 * @returns {Object}
 	 */
 	function slaveCost(slave, isStartingSlave, followLaws, isSpecial) {
 		arcology = V.arcologies[0];
@@ -2321,7 +2427,7 @@ globalThis.slaveCostBeauty = (function() {
 		if (isStartingSlave) {
 			calcStartingSlaveCost(slave);
 		}
-		return cost;
+		return {cost: cost, map: map};
 	}
 
 	/**
@@ -2329,32 +2435,32 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcGenitalsCost(slave) {
 		if (slave.vagina === 0 && slave.counter.vaginal === 0) {
-			multiplier += 0.2;
+			updateMultiplyer(`virgin`, 0.2);
 		}
 		if (slave.anus === 0 && slave.counter.anal === 0) {
-			multiplier += 0.2;
+			updateMultiplyer(`anal virgin`, 0.2);
 		}
 		// Boosted these to 20% to account for the fact that it limits the skill that can be attained
 		if (slave.vagina > -1 && arcology.FSRestartSMR === 1) {
 			if (slave.dick > 0) {
 				if (slave.ovaries === 0 && slave.balls === 0) {
-					multiplier += 0.8;
+					updateMultiplyer(`castrated`, 0.8);
 				}
 			}
 		} else if (slave.vagina > -1) {
 			if (slave.dick > 0) {
 				if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === -1) {
-					multiplier += 0.2;
+					updateMultiplyer(`dick`, 0.2);
 					if (slave.ovaries > 0) {
 						if (slave.balls > 0) {
-							multiplier += 0.8;
+							updateMultiplyer(`futa`, 0.8);
 						}
 					}
 				} else {
-					multiplier += 0.1;
+					updateMultiplyer(`dick`, 0.1);
 					if (slave.ovaries > 0) {
 						if (slave.balls > 0) {
-							multiplier += 0.2;
+							updateMultiplyer(`futa`, 0.2);
 						}
 					}
 				}
@@ -2369,20 +2475,20 @@ globalThis.slaveCostBeauty = (function() {
 	function calcDevotionTrustCost(slave, isSpecial) {
 		if (isSpecial === true) {
 			if (slave.devotion > 50) {
-				multiplier += slave.devotion / 200;
+				updateMultiplyer(`special devotion`, slave.devotion / 200);
 			}
 			if (slave.trust > 50) {
-				multiplier += slave.trust / 200;
+				updateMultiplyer(`special trust`, slave.trust / 200);
 			}
 		} else {
-			multiplier += slave.devotion / 200;
+			updateMultiplyer(`devotion`, slave.devotion / 200);
 			if (slave.devotion < -20) {
 				if (slave.trust > 0) {
-					multiplier -= slave.trust / 200;
+					updateMultiplyer(`trust with low devotion`, -slave.trust / 200);
 				}
 			} else {
 				if (slave.trust > 0) {
-					multiplier += slave.trust / 200;
+					updateMultiplyer(`trust with devotion`, slave.trust / 200);
 				}
 			}
 		}
@@ -2393,31 +2499,31 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPreferencesCost(slave) {
 		if (slave.behavioralFlaw !== "none") {
-			multiplier -= 0.1;
+			updateMultiplyer(`behavioral flaw`, -0.1);
 		}
 		if (slave.behavioralQuirk !== "none") {
-			multiplier += 0.1;
+			updateMultiplyer(`behavioral quirk`, 0.1);
 		}
 		if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") {
-			multiplier += 0.3;
+			updateMultiplyer(`sexual flaw, but a breeder`, 0.3);
 		} else if (slave.sexualFlaw !== "none") {
-			multiplier -= 0.1;
+			updateMultiplyer(`sexual flaw`, -0.1);
 		}
 		if (slave.sexualQuirk !== "none") {
-			multiplier += 0.1;
+			updateMultiplyer(`sexual quirk`, 0.1);
 		}
 		if (slave.fetishKnown === 1) {
 			if (slave.fetish === "mindbroken") {
-				multiplier -= 0.3;
+				updateMultiplyer(`mindbroken`, -0.3);
 			} else if (slave.fetish !== "none") {
-				multiplier += slave.fetishStrength / 1000;
+				updateMultiplyer(`fetish`, slave.fetishStrength / 1000);
 			}
 		} else {
-			multiplier -= 0.1;
+			updateMultiplyer(`unknown fetish`, -0.1);
 		}
 		if (slave.attrKnown === 1) {
 			if (slave.energy > 95) {
-				multiplier += 0.2;
+				updateMultiplyer(`high attraction`, 0.2);
 			}
 		}
 	}
@@ -2427,37 +2533,37 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPregCost(slave) {
 		if (slave.mpreg === 1) {
-			multiplier += 0.2;
+			updateMultiplyer(`mpreg`, 0.2);
 		}
 		if (arcology.FSRepopulationFocusSMR === 1) {
 			if (slave.preg < -1) {
-				multiplier -= 0.5;
+				updateMultiplyer(`repopulationist sterile`, -0.5);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier += 1;
+				updateMultiplyer(`repopulationist mega preg`, 1);
 			} else if (slave.bellyPreg >= 120000) {
-				multiplier += 0.5;
+				updateMultiplyer(`repopulationist very preg`, 0.5);
 			} else if (slave.preg > slave.pregData.normalBirth / 4) {
-				multiplier += 0.1;
+				updateMultiplyer(`repopulationist showing`, 0.1);
 			}
 		} else if (arcology.FSRestartSMR === 1) {
 			if (slave.preg < -1) {
-				multiplier += 0.5;
+				updateMultiplyer(`restart sterile`, 0.5);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier -= 2.5;
+				updateMultiplyer(`restart mega preg`, -2.5);
 			} else if (slave.bellyPreg >= 30000) {
-				multiplier -= 1.5;
+				updateMultiplyer(`restart very preg`, -1.5);
 			} else if (slave.preg > slave.pregData.normalBirth / 4) {
-				multiplier -= 1.0;
+				updateMultiplyer(`restart showing`, -1.0);
 			}
 		} else {
 			if (slave.preg < -1) {
-				multiplier -= 0.1;
+				updateMultiplyer(`sterile`, -0.1);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier -= 1.5;
+				updateMultiplyer(`mega preg`, -1.5);
 			} else if (slave.bellyPreg >= 120000) {
-				multiplier -= 0.5;
+				updateMultiplyer(`very preg`, -0.5);
 			} else if (slave.bellyPreg >= 500 || slave.pregKnown === 1) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart showing`, -0.1);
 			}
 		}
 	}
@@ -2467,14 +2573,14 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPrestigeCost(slave) {
 		if (slave.prestige > 0) {
-			multiplier += 0.7 * slave.prestige;
+			updateMultiplyer(`prestige`, 0.7 * slave.prestige);
 		}
 		if (slave.porn.prestige === 3) {
-			multiplier += 1.5;
+			updateMultiplyer(`porn prestige`, 1.5);
 		} else if (slave.porn.prestige === 2) {
-			multiplier += 0.7;
+			updateMultiplyer(`porn prestige`, 0.7);
 		} else if (slave.porn.prestige === 1) {
-			multiplier += 0.2;
+			updateMultiplyer(`porn prestige`, 0.2);
 		}
 	}
 
@@ -2484,86 +2590,86 @@ globalThis.slaveCostBeauty = (function() {
 	function calcFSCost(slave) {
 		if (arcology.FSSupremacistLawME !== 0) {
 			if (slave.race !== arcology.FSSupremacistRace) {
-				multiplier -= 0.1;
+				updateMultiplyer(`supremacist race`, -0.1);
 			}
 		}
 		if (arcology.FSSubjugationistLawME !== 0) {
 			if (slave.race === arcology.FSSubjugationistRace) {
-				multiplier -= 0.2;
+				updateMultiplyer(`subjugationist race`, -0.2);
 			}
 		}
 		if (V.seeCats === 1 && slave.race === "catgirl") {
 			if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 1) {
-				multiplier += 0.5;
+				updateMultiplyer(`catgirl`, 0.5);
 			} else if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 0) {
-				multiplier += 0.9;
+				updateMultiplyer(`catgirl`, 0.9);
 			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 0) {
-				multiplier -= 0.5;
-			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 1) {
-				multiplier += 0.5;
-			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 0) {
-				multiplier += 0.9;
+				updateMultiplyer(`catgirl`, -0.5);
+			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techReleased === 1) {
+				updateMultiplyer(`catgirl`, 0.5);
+			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techReleased === 0) {
+				updateMultiplyer(`catgirl`, 0.9);
 			}
 			if (arcology.FSEgyptianRevivalist !== "unset") {
-				multiplier += 0.2;
+				updateMultiplyer(`egyptian catgirl`, 0.2);
 			}
 			if (arcology.FSTransformationFetishist !== "unset") {
-				multiplier += 0.2;
+				updateMultiplyer(`transformation catgirl`, 0.2);
 			}
 		}
 		if (arcology.FSRepopulationFocusSMR !== 0) {
 			if (slave.preg > 0) {
-				multiplier += 0.1;
+				updateMultiplyer(`repopulationist preg`, 0.1);
 			}
 		} else if (arcology.FSRestartSMR !== 0) {
 			if (slave.dick > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart smr dick`, -0.1);
 			}
 			if (slave.balls > 0) {
-				multiplier -= 0.2;
+				updateMultiplyer(`restart smr balls`, -0.2);
 			}
 			if (slave.vagina > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart smr vagina`, -0.1);
 			}
 			if (slave.ovaries > 0) {
-				multiplier -= 0.5;
+				updateMultiplyer(`restart smr ovaries`, -0.5);
 			}
 		}
 		if (arcology.FSGenderFundamentalistSMR !== 0) {
 			if (slave.dick > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender fundamentalist smr dick`, -0.1);
 			}
 			if (slave.balls > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender fundamentalist smr balls`, -0.1);
 			}
 		} else if (arcology.FSGenderRadicalist !== "unset") {
 			if (slave.dick > 0) {
-				multiplier += 0.1;
+				updateMultiplyer(`gender radicalist dick`, 0.1);
 			}
 			if (slave.balls > 0 && arcology.FSGenderRadicalistLawFuta !== 2 && arcology.FSGenderRadicalistLawFuta !== 4) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender radicalist balls`, -0.1);
 			}
 		}
 		if (arcology.FSPetiteAdmirationSMR !== 0 || arcology.FSStatuesqueGlorificationSMR !== 0) {
 			if (heightPass(slave)) {
-				multiplier += 0.1;
+				updateMultiplyer(`petite admiration smr`, 0.1);
 			} else {
-				multiplier -= 0.1;
+				updateMultiplyer(`petite admiration smr`, -0.1);
 			}
 		}
 		if (arcology.FSSlaveProfessionalism !== "unset") {
-			multiplier += 0.1 * (slave.intelligence / 20);
+			updateMultiplyer(`slave professionalism`, 0.1 * (slave.intelligence / 20));
 		}
 		if (arcology.FSHedonisticDecadenceSMR !== 0) {
 			if (slave.weight > 60 && slave.muscles < 5) {
-				multiplier += 0.1;
+				updateMultiplyer(`hedonistic decadence smr`, 0.1);
 			}
 		}
 		if (arcology.FSArabianRevivalist > 50) {
-			multiplier += 0.1;
+			updateMultiplyer(`arabian revivalist`, 0.1);
 		}
 		if (arcology.FSNeoImperialist > 40) {
-			multiplier += 0.1;
+			updateMultiplyer(`neo imperialist`, 0.1);
 		}
 	}
 
@@ -2573,21 +2679,18 @@ globalThis.slaveCostBeauty = (function() {
 	function calcAgeCost(slave) {
 		if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
 			if (slave.birthWeek === 0) {
-				multiplier += 0.4;
+				updateMultiplyer(`birthWeek`, 0.4);
 			} else if (slave.birthWeek < 4) {
-				multiplier += 0.1;
+				updateMultiplyer(`birthWeek`, 0.1);
 			}
-		} else if (slave.physicalAge === V.minimumSlaveAge) {
-			if (slave.birthWeek === 0) {
-				multiplier += 0.2;
-			} else if (slave.birthWeek < 4) {
-				multiplier += 0.05;
-			}
-		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+		} else if (
+			slave.physicalAge === V.minimumSlaveAge ||
+			(slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset"))
+		) {
 			if (slave.birthWeek === 0) {
-				multiplier += 0.2;
+				updateMultiplyer(`birthWeek`, 0.2);
 			} else if (slave.birthWeek < 4) {
-				multiplier += 0.05;
+				updateMultiplyer(`birthWeek`, 0.05);
 			}
 		}
 	}
@@ -2598,102 +2701,102 @@ globalThis.slaveCostBeauty = (function() {
 	function calcCareersCost(slave) {
 		if (slave.career !== 0) {
 			if (slave.career === "a slave") {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.bodyguard.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.wardeness.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.attendant.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.nurse.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.matron.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.schoolteacher.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.stewardess.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.milkmaid.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.farmer.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.madam.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.DJ.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.HG.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.recruiter.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.General.entertainment.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.whore.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.grateful.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.menial.includes(slave.career)) {
-				multiplier += 0.05;
-			} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
+			} else if (App.Data.Careers.General.servant.includes(slave.career)) {
+				updateMultiplyer(`career`, 0.05);
 			}
 		}
 		if (V.week - slave.weekAcquired >= 20 && slave.skill.entertainment >= 100) {
 			if (!App.Data.Careers.General.entertainment.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`entertainment career`, 0.05);
 			}
 		}
 		if (slave.counter.oral + slave.counter.anal + slave.counter.vaginal + slave.counter.mammary + slave.counter.penetrative > 1000) {
 			if (!App.Data.Careers.General.whore.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`whore career`, 0.05);
 			}
 		}
 		if (!App.Data.Careers.Leader.bodyguard.includes(slave.career) && slave.skill.bodyguard >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good bodyguard`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.wardeness.includes(slave.career) && slave.skill.wardeness >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good wardeness`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.attendant.includes(slave.career) && slave.skill.attendant >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good attendant`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.nurse.includes(slave.career) && slave.skill.nurse >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good nurse`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.matron.includes(slave.career) && slave.skill.matron >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good matron`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.schoolteacher.includes(slave.career) && slave.skill.teacher >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good teacher`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.stewardess.includes(slave.career) && slave.skill.stewardess >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good stewardess`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.milkmaid.includes(slave.career) && slave.skill.milkmaid >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good milkmaid`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.farmer.includes(slave.career) && slave.skill.farmer >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good farmer`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.madam.includes(slave.career) && slave.skill.madam >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good madam`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.DJ.includes(slave.career) && slave.skill.DJ >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good DJ`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.HG.includes(slave.career) && slave.skill.headGirl >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good headGirl`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.recruiter.includes(slave.career) && slave.skill.recruiter >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good recruiter`, 0.1);
 		}
-		if (!App.Data.Careers.Leader.servant.includes(slave.career) && slave.skill.servant >= V.masteredXP) {
-			multiplier += 0.05;
+		if (!App.Data.Careers.General.servant.includes(slave.career) && slave.skill.servant >= V.masteredXP) {
+			updateMultiplyer(`good servant`, 0.05);
 		}
 		if (!App.Data.Careers.General.entertainment.includes(slave.career) && slave.skill.entertainer >= V.masteredXP) {
-			multiplier += 0.05;
+			updateMultiplyer(`good entertainer`, 0.05);
 		}
 		if (!App.Data.Careers.General.whore.includes(slave.career) && slave.skill.whore >= V.masteredXP) {
-			multiplier += 0.05;
+			updateMultiplyer(`good whore`, 0.05);
 		}
 	}
 
@@ -2704,24 +2807,24 @@ globalThis.slaveCostBeauty = (function() {
 		const totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant, -130, 130);
 		/* make absolutely certain we do not use +-131 in the next line
 		 */
-		multiplier += Math.floor((Math.asin(totalInt / 131)) * 50) / 50;
+		updateMultiplyer(`intelligence`, Math.floor((Math.asin(totalInt / 131)) * 50) / 50);
 		if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") {
-			multiplier += 0.5;
+			updateMultiplyer(`child`, 0.5);
 		}
 		if (slave.geneticQuirks.albinism === 2) {
-			multiplier += 0.2;
+			updateMultiplyer(`albinism`, 0.2);
 		}
 		if (V.rep > 10000) {
-			multiplier += 0.1 * (Object.getOwnPropertyNames(slave.brand).length);
+			updateMultiplyer(`high rep brand`, 0.1 * (Object.getOwnPropertyNames(slave.brand).length));
 		} else if (V.rep < 5000) {
-			multiplier -= 0.1 * (Object.getOwnPropertyNames(slave.brand).length);
+			updateMultiplyer(`low rep brand`, -0.1 * (Object.getOwnPropertyNames(slave.brand).length));
 		}
-		multiplier -= getLimbCount(slave, 0) * 0.05;
+		updateMultiplyer(`limbs`, -getLimbCount(slave, 0) * 0.05);
 		if (!canSee(slave)) {
-			multiplier -= 0.2;
+			updateMultiplyer(`vision`, -0.2);
 		}
 		if (slave.hears === -2) {
-			multiplier -= 0.1;
+			updateMultiplyer(`hearing`, -0.1);
 		}
 	}
 
@@ -2730,13 +2833,19 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcIndentureCost(slave) {
 		if (slave.indenture > -1) {
-			multiplier -= 0.1 * slave.indentureRestrictions;
-			multiplier -= (260 - slave.indenture) / 260;
+			updateMultiplyer(`indenture level`, -0.1 * slave.indentureRestrictions);
+			updateMultiplyer(`indenture time`, -(260 - slave.indenture) / 260);
 		} else if (V.seeAge === 1 && slave.actualAge >= (V.retirementAge - 5)) {
+			/**
+			 * replaced something like:
+			 * multiplier *= (V.retirementAge - slave.actualAge) / 5;
+			 * but allows us to save the intended difference to the multiplier for records, instead of modifying it directly
+			 */
+			const retireCalc = (tillRetire) => (multiplier * tillRetire / 5) - multiplier;
 			if (V.policies.retirement.physicalAgePolicy === 0) {
-				multiplier *= (V.retirementAge - slave.actualAge) / 5;
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.actualAge));
 			} else {
-				multiplier *= (V.retirementAge - slave.physicalAge) / 5;
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.physicalAge));
 			}
 		}
 	}
@@ -2807,11 +2916,18 @@ globalThis.slaveCostBeauty = (function() {
 		startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10);
 		cost += cost * startingSlaveMultiplier;
 		cost = 500 * Math.trunc(cost / 500);
-		if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+		if (isPCCareerInCategory("slaver")) {
 			cost /= 2;
 		}
 	}
 
+	function updateMultiplyer(string, value) {
+		if (value) {
+			map.set(string, value);
+			multiplier += value;
+		}
+	}
+
 	return slaveCost;
 })();
 
diff --git a/src/js/slaveExpenses.js b/src/js/slaveExpenses.js
index e05dbc1c30330ccd38efe74bd458aefb668cbe0f..7aa54a24094c1b50929a2992b07b230df8911736 100644
--- a/src/js/slaveExpenses.js
+++ b/src/js/slaveExpenses.js
@@ -59,9 +59,9 @@ globalThis.slaveImpactLongTerm = function(slave) {
 	let p;
 	let div;
 	let span;
-	let _Cost;
-	let _Expense;
-	let _Income;
+	let cost;
+	let expense;
+	let income;
 	let text;
 
 	// Background and original cost
@@ -71,13 +71,13 @@ globalThis.slaveImpactLongTerm = function(slave) {
 	div = document.createElement("div");
 	div.classList.add("indent");
 	if (slave.slaveCost < 0) {
-		const cost = App.UI.DOM.cashFormat(slave.slaveCost);
-		cost.textContent += `.`;
-		div.append(`You bought ${him} for `, cost);
-		_Cost = slave.slaveCost;
+		const costSpan = App.UI.DOM.cashFormat(slave.slaveCost);
+		costSpan.textContent += `.`;
+		div.append(`You bought ${him} for `, costSpan);
+		cost = slave.slaveCost;
 	} else if (slave.slaveCost === 0) {
 		div.append(`You spent nothing to acquire ${him}.`);
-		_Cost = slave.slaveCost;
+		cost = slave.slaveCost;
 	} else {
 		text = `You have no record of how much `;
 		if (slave.origin !== 0) {
@@ -87,21 +87,21 @@ globalThis.slaveImpactLongTerm = function(slave) {
 		}
 		text += ` cost.`;
 		div.append(text);
-		_Cost = 0;
+		cost = 0;
 	}
 	frag.append(div);
 
 	// Lifetime totals, assistant gated
 	if (V.assistant.power > 0) {
-		const _weeksOwned = V.week - slave.weekAcquired;
+		const weeksOwned = V.week - slave.weekAcquired;
 		// Lifetime expense
 		div = document.createElement("div");
 		div.classList.add("indent");
 		if (slave.lifetimeCashExpenses < 0) {
 			text = `In ${his} `;
-			if (_weeksOwned > 0) {
-				text += `${_weeksOwned} `;
-				if (_weeksOwned === 1) {
+			if (weeksOwned > 0) {
+				text += `${weeksOwned} `;
+				if (weeksOwned === 1) {
 					text += `week`;
 				} else {
 					text += `weeks`;
@@ -113,10 +113,10 @@ globalThis.slaveImpactLongTerm = function(slave) {
 			const cash = (App.UI.DOM.cashFormat(slave.lifetimeCashExpenses));
 			cash.textContent += `.`;
 			div.append(text, cash);
-			_Expense = slave.lifetimeCashExpenses;
+			expense = slave.lifetimeCashExpenses;
 		} else {
 			div.append(`You have no record of ${him} costing you any ¤.`);
-			_Expense = 0;
+			expense = 0;
 		}
 		frag.append(div);
 
@@ -125,9 +125,9 @@ globalThis.slaveImpactLongTerm = function(slave) {
 		div.classList.add("indent");
 		if (slave.lifetimeCashIncome > 0) {
 			text = `In ${his} `;
-			if (_weeksOwned > 0) {
-				text += `${_weeksOwned} `;
-				if (_weeksOwned === 1) {
+			if (weeksOwned > 0) {
+				text += `${weeksOwned} `;
+				if (weeksOwned === 1) {
 					text += `week`;
 				} else {
 					text += `weeks`;
@@ -139,10 +139,10 @@ globalThis.slaveImpactLongTerm = function(slave) {
 			const cash = App.UI.DOM.cashFormat(slave.lifetimeCashIncome);
 			cash.textContent += `.`;
 			div.append(text, cash);
-			_Income = slave.lifetimeCashIncome;
+			income = slave.lifetimeCashIncome;
 		} else {
 			div.append(`You have no record of ${him} making you any ¤.`);
-			_Income = 0;
+			income = 0;
 		}
 		frag.append(div);
 
@@ -150,15 +150,15 @@ globalThis.slaveImpactLongTerm = function(slave) {
 		div = document.createElement("div");
 		div.classList.add("indent");
 		div.append(`Overall, `);
-		if ((_Income + _Cost + _Expense) > 0) {
+		if ((income + cost + expense) > 0) {
 			div.append(`you have made `);
-			div.append(App.UI.DOM.cashFormat(_Income + _Cost + _Expense));
+			div.append(App.UI.DOM.cashFormat(income + cost + expense));
 			div.append(` net from ${his} labors.`);
-		} else if ((_Income + _Cost + _Expense) === 0) {
+		} else if ((income + cost + expense) === 0) {
 			div.append(`${he} is even in cost and income.`);
 		} else {
 			div.append(`${he} has cost you `);
-			const cash = App.UI.DOM.cashFormat(_Income + _Cost + _Expense);
+			const cash = App.UI.DOM.cashFormat(income + cost + expense);
 			cash.textContent += `.`;
 			div.append(cash);
 		}
@@ -167,7 +167,7 @@ globalThis.slaveImpactLongTerm = function(slave) {
 		// Reputation:
 		p = document.createElement("p");
 		if (slave.lifetimeRepIncome !== 0 || slave.lifetimeRepExpenses !== 0) {
-			let _repTotal = (slave.lifetimeRepIncome + slave.lifetimeRepExpenses);
+			let repTotal = (slave.lifetimeRepIncome + slave.lifetimeRepExpenses);
 			if (V.cheatMode === 1 || V.debugMode === 1) {
 				if (slave.lifetimeRepIncome !== 0) {
 					div = document.createElement("div");
@@ -205,12 +205,12 @@ globalThis.slaveImpactLongTerm = function(slave) {
 				div.classList.add("indent");
 				div.append(`Overall then, ${he} has changed your reputation by `);
 				span = document.createElement("span");
-				if (_repTotal > 0) {
+				if (repTotal > 0) {
 					span.classList.add("green");
-				} else if (_repTotal < 0) {
+				} else if (repTotal < 0) {
 					span.classList.add("red");
 				}
-				span.append(num(_repTotal));
+				span.append(num(repTotal));
 				div.append(span);
 				p.append(div);
 			} else {
@@ -218,11 +218,11 @@ globalThis.slaveImpactLongTerm = function(slave) {
 				div = document.createElement("div");
 				div.classList.add("indent");
 				div.append(`Overall, ${he} has `);
-				if (_repTotal === 0) {
+				if (repTotal === 0) {
 					div.append(`had no impact on `);
-				} else if (_repTotal > 0) {
+				} else if (repTotal > 0) {
 					App.UI.DOM.appendNewElement("span", div, `increased `, "green");
-				} else if (_repTotal < 0) {
+				} else if (repTotal < 0) {
 					App.UI.DOM.appendNewElement("span", div, `decreased `, "red");
 				}
 				div.append(`your reputation.`);
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index f7f7396916c5974f0a30bbb0e62de2bf6d1e1b16..0ed4b483aa0567f186ac4a928eae1c2d84309869 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -75,10 +75,10 @@ App.UI.SlaveList.render = function() {
 			}
 		}
 
-		for (const _sid of IDs) {
-			let ss = renderSlave(_sid, interactionLink, showTransfers, postNote);
+		for (const sid of IDs) {
+			let ss = renderSlave(sid, interactionLink, showTransfers, postNote);
 			let slaveDiv = document.createElement("div");
-			slaveDiv.id = `slave-${_sid}`;
+			slaveDiv.id = `slave-${sid}`;
 			slaveDiv.classList.add("slaveSummary");
 			if (V.slavePanelStyle === 2) {
 				slaveDiv.classList.add("card");
@@ -365,14 +365,14 @@ App.UI.SlaveList.render = function() {
 		const res = document.createDocumentFragment();
 
 		/* Useful for finding weird combinations — usages of this passage that don't yet generate the quick index.
-		*	<<print 'pass/count/indexed/flag::[' + passageName + '/' + _Count + '/' + _indexed + '/' + V.SlaveSummaryFiler + ']'>>
+		*	<<print 'pass/count/indexed/flag::[' + passageName + '/' + Count + '/' + indexed + '/' + V.SlaveSummaryFiler + ']'>>
 		*/
 
 		if (IDs.length > 1 && passageName === "Main") {
-			const _buttons = [];
-			let _offset = -50;
+			const buttons = [];
+			let offset = -50;
 			if (/Select/i.test(passageName)) {
-				_offset = -25;
+				offset = -25;
 			}
 			/*
 			 * we want <button data-quick-index="<<= listID>>">...
@@ -393,20 +393,20 @@ App.UI.SlaveList.render = function() {
 			listIndex.id = `list_index${listID}`;
 
 			for (const sID of IDs) {
-				const _IndexSlave = slaveStateById(sID);
-				const _indexSlaveName = SlaveFullName(_IndexSlave);
-				const _devotionClass = getSlaveDevotionClass(_IndexSlave);
-				const _trustClass = getSlaveTrustClass(_IndexSlave);
-				_buttons.push({
-					"data-name": _indexSlaveName,
-					"data-scroll-to": `#slave-${_IndexSlave.ID}`,
-					"data-scroll-offset": _offset,
-					"data-devotion": _IndexSlave.devotion,
-					"data-trust": _IndexSlave.trust,
-					"class": `${_devotionClass} ${_trustClass}`
+				const IndexSlave = slaveStateById(sID);
+				const indexSlaveName = SlaveFullName(IndexSlave);
+				const devotionClass = getSlaveDevotionClass(IndexSlave);
+				const trustClass = getSlaveTrustClass(IndexSlave);
+				buttons.push({
+					"data-name": indexSlaveName,
+					"data-scroll-to": `#slave-${IndexSlave.ID}`,
+					"data-scroll-offset": offset,
+					"data-devotion": IndexSlave.devotion,
+					"data-trust": IndexSlave.trust,
+					"class": `${devotionClass} ${trustClass}`
 				});
 			}
-			if (_buttons.length > 0) {
+			if (buttons.length > 0) {
 				V.sortQuickList = V.sortQuickList || 'Devotion';
 				makeElement(listIndex, "em", "Sorting: ");
 				const qlSort = makeElement(listIndex, "span", V.sortQuickList, "strong");
@@ -432,8 +432,8 @@ App.UI.SlaveList.render = function() {
 				makeElement(listIndex, "br");
 				const qlWrapper = makeElement(listIndex, "div", undefined, ["quick-list", "devotion"]);
 				qlWrapper.id = "qlWrapper";
-				for (const _button of _buttons) {
-					const btn = makeElement(listIndex, 'button', _button['data-name'], undefined, _button);
+				for (const button of buttons) {
+					const btn = makeElement(listIndex, 'button', button['data-name'], undefined, button);
 					btn.onclick = App.UI.quickBtnScrollToHandler;
 				}
 			}
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index 1e1048b8b327e212f390123acb37fc66adbc472b..db6bfbd4cda085cd1d3bcc3f0c97d058d914b628 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -270,12 +270,12 @@ App.UI.SlaveSummaryImpl = function() {
 			const block = makeBlock();
 			const cssClassName = "lightgreen";
 			if (slave.mother > 0) {
-				const _ssj = V.slaves.find(s => s.ID === slave.mother);
-				if (_ssj) {
-					helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+				const ssj = V.slaves.find(s => s.ID === slave.mother);
+				if (ssj) {
+					helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					addText(block, "'s ");
 					let spanText = getPronouns(slave).daughter;
-					if (slave.relationshipTarget === _ssj.ID) {
+					if (slave.relationshipTarget === ssj.ID) {
 						spanText += `${bits.and}${relationshipTerm(slave)}`;
 						handled = 1;
 					}
@@ -294,12 +294,12 @@ App.UI.SlaveSummaryImpl = function() {
 				makeSpan(block, bits.makeBit(getPronouns(slave).daughter), cssClassName);
 			}
 			if (slave.father > 0 && slave.father !== slave.mother) {
-				const _ssj = V.slaves.find(s => s.ID === slave.father);
-				if (_ssj) {
-					helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+				const ssj = V.slaves.find(s => s.ID === slave.father);
+				if (ssj) {
+					helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					addText(block, "'s ");
 					let spanText = getPronouns(slave).daughter;
-					if (slave.relationshipTarget === _ssj.ID) {
+					if (slave.relationshipTarget === ssj.ID) {
 						spanText += `${bits.and}${relationshipTerm(slave)}`;
 						handled = 1;
 					}
@@ -327,12 +327,12 @@ App.UI.SlaveSummaryImpl = function() {
 				}
 			}
 			if (slave.daughters === 1) {
-				const _ssj = V.slaves.find(s => s.mother === slave.ID || s.father === slave.ID);
-				if (_ssj) {
-					helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+				const ssj = V.slaves.find(s => s.mother === slave.ID || s.father === slave.ID);
+				if (ssj) {
+					helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					addText(block, "'s ");
-					let spanText = relativeTerm(_ssj, slave);
-					if (slave.relationshipTarget === _ssj.ID) {
+					let spanText = relativeTerm(ssj, slave);
+					if (slave.relationshipTarget === ssj.ID) {
 						spanText += `${bits.and}${relationshipTerm(slave)}`;
 						handled = 1;
 					}
@@ -348,12 +348,12 @@ App.UI.SlaveSummaryImpl = function() {
 				}
 			}
 			if (slave.sisters === 1) {
-				const _ssj = V.slaves.find(s => areSisters(s, slave) > 0);
-				if (_ssj) {
-					helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+				const ssj = V.slaves.find(s => areSisters(s, slave) > 0);
+				if (ssj) {
+					helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					addText(block, "'s ");
 					let spanText = getPronouns(slave).sister;
-					if (slave.relationshipTarget === _ssj.ID) {
+					if (slave.relationshipTarget === ssj.ID) {
 						spanText += `${bits.and}${relationshipTerm(slave)}`;
 						handled = 1;
 					}
@@ -369,9 +369,9 @@ App.UI.SlaveSummaryImpl = function() {
 				}
 			}
 			if (slave.relationship > 0 && handled !== 1) {
-				const _ssj = V.slaves.find(s => s.ID === slave.relationshipTarget);
-				if (_ssj) {
-					helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+				const ssj = V.slaves.find(s => s.ID === slave.relationshipTarget);
+				if (ssj) {
+					helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					addText(block, "'s ");
 					makeSpan(block, bits.makeBit(relationshipTerm(slave)), cssClassName);
 				}
@@ -1020,12 +1020,12 @@ App.UI.SlaveSummaryImpl = function() {
 		 */
 		function short_skills(slave, c) {
 			const sd = data.short.skills;
-			let _SSkills = (slave.skill.anal + slave.skill.oral);
-			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+			let SSkills = (slave.skill.anal + slave.skill.oral);
+			if (((SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
 				helpers.makeStyledSpan(c, sd.mss);
 			} else {
-				_SSkills += slave.skill.vaginal;
-				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(sd.sex, [_SSkills, slave.vagina >= 0 ? 1 : 0]), Math.trunc(_SSkills), true);
+				SSkills += slave.skill.vaginal;
+				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(sd.sex, [SSkills, slave.vagina >= 0 ? 1 : 0]), Math.trunc(SSkills), true);
 				helpers.makeRatedStyledSpan(c, sd.whoring, slave.skill.whoring, 0, true);
 				helpers.makeRatedStyledSpan(c, sd.entertainment, slave.skill.entertainment, 0, true);
 			}
@@ -1074,12 +1074,12 @@ App.UI.SlaveSummaryImpl = function() {
 		 */
 		function long_skills(slave, c) {
 			const sd = data.long.skills;
-			let _SSkills = (slave.skill.anal + slave.skill.oral);
-			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+			let SSkills = (slave.skill.anal + slave.skill.oral);
+			if (((SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
 				helpers.makeStyledSpan(c, sd.mss);
 			} else {
-				_SSkills += slave.skill.vaginal;
-				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(sd.sex, [_SSkills, slave.vagina >= 0 ? 1 : 0]), Math.trunc(_SSkills), true);
+				SSkills += slave.skill.vaginal;
+				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(sd.sex, [SSkills, slave.vagina >= 0 ? 1 : 0]), Math.trunc(SSkills), true);
 				helpers.makeRatedStyledSpan(c, sd.whoring, slave.skill.whoring, 0, true);
 				helpers.makeRatedStyledSpan(c, sd.entertainment, slave.skill.entertainment, 0, true);
 			}
@@ -1531,17 +1531,17 @@ App.UI.SlaveSummaryImpl = function() {
 		function short_rival(slave, c) {
 			if (slave.rivalry !== 0) {
 				const block = makeBlock(c, "lightsalmon");
-				const _ssj = V.slaves.find(s => s.ID === slave.rivalryTarget);
-				if (_ssj) {
+				const ssj = V.slaves.find(s => s.ID === slave.rivalryTarget);
+				if (ssj) {
 					if (slave.rivalry <= 1) {
 						block.textContent = 'Disl ';
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					} else if (slave.rivalry <= 2) {
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 						addText(block, "'s rival");
 					} else {
 						block.textContent = 'Hates ';
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 					}
 				}
 			}
@@ -1575,21 +1575,21 @@ App.UI.SlaveSummaryImpl = function() {
 		function long_rival(slave, c) {
 			if (slave.rivalry !== 0) {
 				const block = makeBlock(c);
-				const _ssj = V.slaves.find(s => s.ID === slave.rivalryTarget);
-				if (_ssj) {
+				const ssj = V.slaves.find(s => s.ID === slave.rivalryTarget);
+				if (ssj) {
 					if (slave.rivalry <= 1) {
 						makeSpan(block, "Dislikes", "lightsalmon");
 						addText(block, ' ');
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 						addText(block, '.');
 					} else if (slave.rivalry <= 2) {
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 						addText(block, "'s ");
 						makeSpan(block, "rival.", "lightsalmon");
 					} else {
 						makeSpan(block, "Hates", "lightsalmon");
 						addText(block, ' ');
-						helpers.referenceSlaveWithPreview(block, _ssj, SlaveFullName(_ssj));
+						helpers.referenceSlaveWithPreview(block, ssj, SlaveFullName(ssj));
 						addText(block, '.');
 					}
 				}
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index 034e8969d58b7f0e49d5e8e43df93aeaa8a03c9c..f6e7a907a9a175f3ed600ab6028293d74f2bb58e 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -1126,3 +1126,24 @@ globalThis.getGeneticSkinColor = function(slave) {
 	}
 	return slave.origSkin;
 };
+
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+globalThis.canBeReceptrix = function(slave) {
+	return (
+		(slave.ovaries > 0 || slave.mpreg > 0) &&
+		isSlaveAvailable(slave) &&
+		slave.preg >= 0 &&
+		slave.preg < 4 &&
+		slave.pregWeek >= 0 &&
+		slave.pubertyXX === 1 &&
+		slave.pregType < 12 &&
+		slave.bellyImplant === -1 &&
+		slave.broodmother === 0 &&
+		slave.inflation <= 2 &&
+		slave.physicalAge < 70
+	);
+};
diff --git a/src/js/upgrade.js b/src/js/upgrade.js
new file mode 100644
index 0000000000000000000000000000000000000000..3dae4c386f200df899779eb90c16ab9e9e2c1229
--- /dev/null
+++ b/src/js/upgrade.js
@@ -0,0 +1,120 @@
+/** @implements {FC.IUpgrade} */
+App.Upgrade = class Upgrade {
+	/**
+	 * @param {string} property The variable name of the property.
+	 * @param {FC.IUpgradeTier[]} tiers A list of tiers available for the upgrade.
+	 * @param {Object} [object] Any object to attach the upgrade to, if not the default `V`.
+	 */
+	constructor(property, tiers, object = V) {
+		/** @private */
+		this._property = property;
+
+		/** @private */
+		this._div = document.createElement("div");
+		/** @private @type {Object} */
+		this._object = object || V;
+		/** @private @type {FC.IUpgradeTier[]} */
+		this._tiers = tiers;
+	}
+
+	/**
+	 * Puts the different sections together into one passage.
+	 *
+	 * @private
+	 * @returns {DocumentFragment}
+	 */
+	 _assemble() {
+		const frag = new DocumentFragment();
+
+		this.tiers.forEach(tier => {
+			const {
+				value, link, text, upgraded, handler, note, prereqs, nodes,
+			} = tier;
+
+			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);
+				}
+			}
+		});
+
+		return frag;
+	}
+
+	/**
+	 * Renders the upgrade onscreen.
+	 *
+	 * @returns {HTMLDivElement}
+	 */
+	 render() {
+		this._div.append(this._assemble());
+
+		return this._div;
+	}
+
+	/**
+	 * Refreshes the upgrade onscreen.
+	 *
+	 * @returns {void}
+	 */
+	 refresh() {
+		App.UI.DOM.replace(this._div, this._assemble());
+	}
+
+	/**
+	 * Adds new tiers to the upgrade.
+	 *
+	 * @param {FC.IUpgradeTier[]} tiers
+	 * @returns {this}
+	 */
+	addTiers(...tiers) {
+		this._tiers.push(...tiers);
+
+		return this;
+	}
+
+	/**
+	 * The variable name of the property.
+	 *
+	 * @returns {string}
+	 */
+	get property() {
+		return this._property;
+	}
+
+	/**
+	 * All tiers that are available.
+	 *
+	 * @returns {FC.IUpgradeTier[]}
+	 */
+	get tiers() {
+		return this._tiers;
+	}
+
+	/**
+	 * The object the upgrade is attached to.
+	 *
+	 * @returns {Object}
+	 */
+	get object() {
+		return this._object;
+	}
+};
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index c75292dc954224af2ebcff6b4dc61ee4433aad4e..314b1100149dec7c6c30dccf2f6f5927d8568355 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -98,7 +98,7 @@ App.UI.DOM.link = function(linkText, handler, args = [], passage = "", tooltip =
 /**
  * Creates a span for an link with tooltip containing the reasons why it is disabled
  * @param {string} link
- * @param {string[]} reasons
+ * @param {(string|DocumentFragment|HTMLElement)[]} reasons
  * @returns {HTMLSpanElement}
  */
 App.UI.DOM.disabledLink = function(link, reasons) {
@@ -106,12 +106,12 @@ App.UI.DOM.disabledLink = function(link, reasons) {
 	let tooltip;
 	if (reasons.length === 1) {
 		tooltip = document.createElement("span");
-		tooltip.textContent = reasons[0];
+		tooltip.append(reasons[0]);
 	} else {
 		tooltip = document.createElement("ul");
 		for (const li of reasons.map(r => {
 			const li = document.createElement("li");
-			li.textContent = r;
+			li.append(r);
 			return li;
 		})) {
 			tooltip.appendChild(li);
@@ -425,12 +425,22 @@ Macro.add("includeDOM", {
 	}
 });
 
-App.UI.DOM.cashFormat = function(s) {
+/**
+ * Formats the given number as currency.
+ *
+ * Positive values returns in green, negative values return in red, unless the invert parameter is set.
+ * @param {number} s The number to format.
+ * @param {boolean} [invert] Whether or not to invert the numbers (i.e. display positive numbers in red, and negative numbers in green).
+ * @returns {HTMLSpanElement}
+ */
+App.UI.DOM.cashFormat = function(s, invert) {
 	const span = document.createElement("span");
-	if (s < 0) { // Display red if the value is negative, unless invert is true
-		span.classList.add("red");
-	} else if (s !== 0) { // Yellow for positive
-		span.classList.add("cash");
+	if ((invert && s > 0) || s < 0) {
+		// Display in red (WITHOUT a negative sign) if the value is negative, unless invert is true
+		span.classList.add("cash", "dec");
+	} else if (s !== 0) {
+		// Yellow for positive
+		span.classList.add("cash", "inc");
 	}
 	span.textContent = cashFormat(Math.trunc(s));
 	return span;
@@ -532,7 +542,7 @@ App.UI.DOM.makeRow = function(table, ...items) {
 
 /**
  * Creates a checkbox.
- * @param arg - item to be checked. Currently only designed to with items that have values of 0 - 1.
+ * @param {string} arg - item to be checked. Currently only designed to with items that have values of 0 - 1.
  */
 App.UI.DOM.makeCheckbox = function(arg) {
 	const checkbox = document.createElement("input");
@@ -544,3 +554,19 @@ App.UI.DOM.makeCheckbox = function(arg) {
 	};
 	return checkbox;
 };
+
+/**
+ * Draw a single medium-sized slave image, floating to the right of a block of text.
+ * If you're rendering simple scene-wide art where the relationship between text and image location isn't important, @see App.Events.drawEventArt instead.
+ * @param {ParentNode} node
+ * @param {App.Entity.SlaveState} slave
+ * @param {App.Art.SlaveArtBatch} [batchRenderer] an initialized batch renderer with the preamble already output; if omitted, the entire art block will be output inline
+ * @returns {HTMLDivElement|DocumentFragment}
+ */
+App.UI.DOM.drawOneSlaveRight = function(node, slave, batchRenderer) {
+	if (!V.seeImages || !slave) {
+		return new DocumentFragment();
+	}
+	const artElement = batchRenderer ? batchRenderer.render(slave) : App.Art.SlaveArtElement(slave, 2, 0);
+	return App.UI.DOM.appendNewElement("div", node, artElement, ["imageRef", "medImg"]);
+};
diff --git a/src/js/utilsSC.js b/src/js/utilsSC.js
index 260b3d96a22f1e56f3e5daa55a543535c1d6dba4..61f27b0f2881d2224bb5405821835c4bab179ed8 100644
--- a/src/js/utilsSC.js
+++ b/src/js/utilsSC.js
@@ -180,7 +180,7 @@ App.UI.tabBar = function() {
 		function selectTab() {
 			let tabBtn = document.getElementById(`tab ${selectedTab}`);
 			if (!tabBtn) {
-				tabBtn = /** @type {HTMLElement}*/(document.getElementsByClassName('tab-links').item(0));
+				tabBtn = /** @type {HTMLElement} */(document.getElementsByClassName('tab-links').item(0));
 			}
 			if (tabBtn) {
 				tabBtn.click();
@@ -227,8 +227,8 @@ App.UI.tabBar = function() {
 /** handler function for slaveDescriptionDialog. do not call directly. */
 App.UI._showDescriptionDialog = function(slave, options) {
 	Dialog.setup(SlaveFullName(slave));
-	const image = V.seeImages ? App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) : '';
-	Dialog.append(image).append(App.Desc.longSlave(slave, options));
+	App.UI.DOM.drawOneSlaveRight(Dialog.body(), slave);
+	Dialog.append(App.Desc.longSlave(slave, options));
 	Dialog.open();
 };
 
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 08e0f560bc8c0003c1eea87e83d7909dc72d27a8..8740161a1e0e2436bb0572d2553d8af9fa36f233 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -2055,6 +2055,11 @@ globalThis.newSlave = function(slave) {
 		V.REReductionCheckinIDs.push(slave.ID);
 	}
 
+	/* special case for MB slave genetic intellignece in slave acquisition */
+	if (slave.savedIntelligence !== undefined) {
+		slave.intelligence = slave.savedIntelligence;
+	}
+
 	generatePronouns(slave);
 	SetBellySize(slave);
 	V.slaveIndices[slave.ID] = V.slaves.push(slave) - 1;
@@ -2072,6 +2077,10 @@ globalThis.newSlave = function(slave) {
 		slave.intelligence = -100;
 		delete slave.dullIntelligence;
 	}
+	if (slave.savedIntelligence !== undefined) { // MB sets int to -75
+		slave.intelligence = -75;
+		delete slave.savedIntelligence;
+	}
 
 	if (slave.assignment) {
 		assignJob(slave, slave.assignment);
@@ -2135,20 +2144,20 @@ globalThis.SlaveFullBirthName = function(slave) {
  */
 globalThis.PoliteRudeTitle = function(slave) {
 	const PC = V.PC;
-	const {s, ss, title} = getEnunciation(slave);
+	const {title} = getEnunciation(slave);
 
 	let r = "";
 	if (slave.nationality === "Japanese") {
 		if (slave.trust > 0) {
 			r += `${PC.slaveName}${PC.title > 0 ? "kun" : "chan"}`;
 		} else {
-			r += (PC.slaveSurname ? PC.slaveSurname : `${PC.slaveName}${s}an`);
+			r += Spoken(slave, PC.slaveSurname ? PC.slaveSurname : `${PC.slaveName}san`);
 		}
 	} else {
 		if (slave.intelligence + slave.intelligenceImplant < -95) {
 			r += title;
 		} else if (slave.intelligence + slave.intelligenceImplant > 50) {
-			r += (PC.title > 0 ? `Ma${s}ter` : `Mi${s}tre${ss}`);
+			r += Spoken(slave, PC.title > 0 ? `Master` : `Mistress`);
 		} else if (slave.trust > 0) {
 			r += PC.slaveName;
 		} else {
@@ -3000,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;
 };
 
 /**
@@ -3015,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;
@@ -3650,29 +3663,29 @@ globalThis.restoreTraitor = function() {
 		}
 	}
 	if (V.incubator.capacity > 0) {
-		for (const _pca of V.incubator.tanks) {
-			if (V.traitorStats.traitorMotherTank.includes(_pca.ID)) {
-				_pca.mother = V.traitor.ID;
+		for (const pca of V.incubator.tanks) {
+			if (V.traitorStats.traitorMotherTank.includes(pca.ID)) {
+				pca.mother = V.traitor.ID;
 			}
-			if (V.traitorStats.traitorFatherTank.includes(_pca.ID)) {
-				_pca.father = V.traitor.ID;
+			if (V.traitorStats.traitorFatherTank.includes(pca.ID)) {
+				pca.father = V.traitor.ID;
 			}
 		}
 	}
 	if (V.nursery > 0) {
-		for (const _pca of V.cribs) {
-			if (V.traitorStats.traitorMotherTank.includes(_pca.ID)) {
-				_pca.mother = V.traitor.ID;
+		for (const pca of V.cribs) {
+			if (V.traitorStats.traitorMotherTank.includes(pca.ID)) {
+				pca.mother = V.traitor.ID;
 			}
-			if (V.traitorStats.traitorFatherTank.includes(_pca.ID)) {
-				_pca.father = V.traitor.ID;
+			if (V.traitorStats.traitorFatherTank.includes(pca.ID)) {
+				pca.father = V.traitor.ID;
 			}
 		}
 	}
 	if (V.traitorStats.boomerangBody > 0) {
-		const _pca = getSlave(V.traitorStats.traitorBody);
-		if (_pca) {
-			_pca.origBodyOwnerID = V.traitor.ID;
+		const pca = getSlave(V.traitorStats.traitorBody);
+		if (pca) {
+			pca.origBodyOwnerID = V.traitor.ID;
 		}
 	}
 	for (const slave of V.slaves) {
@@ -3689,8 +3702,9 @@ globalThis.restoreTraitor = function() {
  * Sets a slave to default values for mindbroken.
  *
  * @param {App.Entity.SlaveState} slave
+ * @param {number} oldIntelligence Genetic intelligence for slavegen. Seriously, do not use outside of slavegen!
  */
-globalThis.applyMindbroken = function(slave) {
+globalThis.applyMindbroken = function(slave, oldIntelligence = -200) {
 	slave.fetish = "mindbroken";
 	slave.fetishStrength = 10;
 	slave.attrXY = 50;
@@ -3704,6 +3718,9 @@ globalThis.applyMindbroken = function(slave) {
 	slave.skill.combat = 0;
 	slave.skill.whoring = 0;
 	slave.skill.entertainment = 0;
+	if (oldIntelligence >= -100) {
+		slave.savedIntelligence = oldIntelligence;
+	}
 	slave.intelligence = -75;
 	slave.intelligenceImplant = 0;
 	slave.sexualFlaw = "none";
diff --git a/src/js/utilsUnits.js b/src/js/utilsUnits.js
index 5e5932b1d5d8545b063ff7fa39ccb74178c26822..3c952e3e581ee0c726f85340c14d781aaf3da94d 100644
--- a/src/js/utilsUnits.js
+++ b/src/js/utilsUnits.js
@@ -334,24 +334,21 @@ globalThis.cashFormat = function(s = 0) {
 /**
  * Formats the given number as currency.
  *
- * Positive values returns in green, negative values return in red.
+ * Positive values returns in green, negative values return in red, unless the invert parameter is set.
  * @param {number} s The number to format.
- * @param {boolean} invert Whether or not to invert the numbers.
- * @returns {string} Returns a string of the number formatted as a currency with different colors depending on the amount.
+ * @param {boolean} invert Whether or not to invert the numbers (i.e. display positive numbers in red, and negative numbers in green).
+ * @returns {string}
  */
 globalThis.cashFormatColor = function(s = 0, invert = false) {
-	if (invert) {
-		s = -1 * s;
-	}
-	// Display red if the value is negative, unless invert is true
-	if (s < 0) {
-		return `<span class='red'>${cashFormat(s)}</span>`;
-		// White for exactly zero
+	if ((invert && s > 0) || s < 0) {
+		// Display in red (WITHOUT a negative sign) if the value is negative, unless invert is true
+		return `<span class='cash dec'>${cashFormat(s)}</span>`;
 	} else if (s === 0) {
+		// White for exactly zero
 		return `<span>${cashFormat(s)}</span>`;
-		// Yellow for positive
 	} else {
-		return `<span class='cash'>${cashFormat(s)}</span>`;
+		// Yellow for positive
+		return `<span class='cash inc'>${cashFormat(s)}</span>`;
 	}
 };
 
diff --git a/src/js/wombJS.js b/src/js/wombJS.js
index 7a1cf00585da20ad7c359ae3ce51b912dfc29985..4a0a91d514a76f79783e825479208b891d0576ee 100644
--- a/src/js/wombJS.js
+++ b/src/js/wombJS.js
@@ -926,13 +926,6 @@ globalThis.WombCleanAllReserve = function(actor) {
  * - data.litters[x] = age (.realAge) of litter "x".
  * - data.litterData[x].length = count of fetuses in "x" litter.
  * - data.litterData[x] = array with actual fetuses that belong to a litter "x". Can be used to check anything related to fetus. (This is not a copy, but a reference to actual fetuses, so be careful with changes).
- *
- * Sample of usage in SugarScript:
- * ---
- * <<set _wd = WombGetLittersData(_slave)>>
- * $He is _wd.litters[0] weeks pregnant with $his first set of _wd.litterData[0].length children<<if _wd.litters > 1>>, _wd.litters[1] weeks along with $his second set<</if>><<if _wd.litters > 2>>, _wd.litters[2] and _wd.litters[2] weeks along with $his third<</if>>.
- * In summary $he carry _wd.litters.length separate sets of children. $His most progressed fetus of second pregnancy is already reached _wd.litterData[1][0].age biological week of gestation.
- * ---
  */
 globalThis.WombGetLittersData = function(actor) {
 	let unicLiters = []; // array with realAges of separate litters.
diff --git a/src/markets/bulkSlave/bulkSlaveIntro.js b/src/markets/bulkSlave/bulkSlaveIntro.js
index 3409530dfdeff8b80272c0931922adae0beb2d14..51763c1254b7b3061721adfbbb4a73f0aab2cbe9 100644
--- a/src/markets/bulkSlave/bulkSlaveIntro.js
+++ b/src/markets/bulkSlave/bulkSlaveIntro.js
@@ -83,12 +83,12 @@ App.Markets.bulkSlaveIntro = function() {
 		}
 
 		/* Set slave to the desired newSlave so that existing code can be used */
-		const _slave = V.market.newSlaves[V.market.newSlaveIndex];
+		const slave = V.market.newSlaves[V.market.newSlaveIndex];
 
-		el.append(App.Desc.longSlave(_slave, {market: V.market.slaveMarket}));
+		el.append(App.Desc.longSlave(slave, {market: V.market.slaveMarket}));
 
 		/* Use existing New Slave Intro */
-		el.append(App.UI.newSlaveIntro(_slave));
+		el.append(App.UI.newSlaveIntro(slave));
 
 		/* Override nextButton setting from New Slave Intro */
 		V.nextButton = "Continue";
@@ -128,38 +128,38 @@ App.Markets.bulkSlaveIntro = function() {
 		V.market.newSlavesDone = 0;
 		V.market.newSlaveIndex = 0;
 		V.market.introType = "bulk";
-		let _slaveCost;
+		let cost;
 		if (!V.market.numSlaves) {
 			V.market.numSlaves = 5;
 		}
 
-		for (let _i = 0; _i < V.market.numSlaves; _i++) {
+		for (let i = 0; i < V.market.numSlaves; i++) {
 			let slave = (generateMarketSlave(V.market.slaveMarket, V.market.numArcology)).slave;
 			V.slavesSeen++;
 			if (!App.Data.misc.lawlessMarkets.includes(V.market.slaveMarket)) {
 				App.Desc.lawCompliance(slave, V.market.slaveMarket); /* slave stats may change, affecting price */
 			}
-			_slaveCost = slaveCost(slave);
+			cost = slaveCost(slave);
 
-			/* Adjust _slaveCost according to V.slavesSeen */
+			/* Adjust cost according to V.slavesSeen */
 			if (V.slavesSeen > V.slaveMarketLimit) {
-				_slaveCost += _slaveCost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1);
+				cost += cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1);
 				if (V.market.introType === "inStock") {
 					break;
 				}
 			}
 
 			/* Apply discount modifier */
-			_slaveCost = discount * Math.trunc(_slaveCost / 500);
+			cost = discount * Math.trunc(cost / 500);
 
 			/* Charge the Player for the slave, or break out if cannot afford */
-			if (V.cash < _slaveCost) {
-				_i = V.market.numSlaves;
+			if (V.cash < cost) {
+				i = V.market.numSlaves;
 				break;
 			} else {
-				cashX(forceNeg(_slaveCost), "slaveTransfer", slave);
+				cashX(forceNeg(cost), "slaveTransfer", slave);
 				V.market.newSlaves.push(slave);
-				V.market.totalCost += _slaveCost;
+				V.market.totalCost += cost;
 			}
 		}
 
diff --git a/src/markets/marketUI.js b/src/markets/marketUI.js
index 62a8a55c97112dfde15aa925e6f3256337e37522..981baec4b2e0a85ca42e932cb084708eb4eff5ad 100644
--- a/src/markets/marketUI.js
+++ b/src/markets/marketUI.js
@@ -9,7 +9,8 @@
 App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave", sTitlePlural = "slaves", costMod = 1} = {}) {
 	const el = new DocumentFragment();
 	const {slave, text} = generateMarketSlave(slaveMarket, (V.market.numArcology || 1));
-	const cost = getCost();
+	const costObj = getCost();
+	const cost = costObj.cost;
 	let prisonCrime = "";
 	if (slaveMarket === V.prisonCircuit[V.prisonCircuitIndex]) {
 		prisonCrime = pronounsForSlaveProp(slave, text);
@@ -17,16 +18,18 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave",
 		$(el).append(` ${text}`);
 	}
 
-	App.UI.DOM.appendNewElement("p",
-		el,
-		`The offered price is ${cashFormat(cost)}. ${(V.slavesSeen > V.slaveMarketLimit) ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : ``}`
-	);
+	App.Events.addParagraph(el, [
+		`The offered price is`,
+		App.UI.DOM.combineNodes(costObj.report, "."),
+		V.slavesSeen > V.slaveMarketLimit ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : ``
+	]);
 
 	el.append(choices());
 	return el;
 
 	function getCost() {
-		let cost = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket));
+		const costObj = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket), false, true);
+		let cost = costObj.cost;
 		if (V.slavesSeen > V.slaveMarketLimit) {
 			cost += cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1);
 		}
@@ -37,7 +40,7 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave",
 		}
 		console.log("CostMod: ", costMod);
 		cost = 500 * Math.trunc(cost / 500);
-		return cost;
+		return {cost, report: costObj.report};
 	}
 
 	function choices() {
diff --git a/src/markets/specificMarkets/customSlaveMarket.js b/src/markets/specificMarkets/customSlaveMarket.js
index 5865b9287deef7920a72ec372f550cf341ef68d7..e982318348594b9f2cf5e79d8ce8bbaa32cef8f5 100644
--- a/src/markets/specificMarkets/customSlaveMarket.js
+++ b/src/markets/specificMarkets/customSlaveMarket.js
@@ -222,7 +222,7 @@ App.Markets["Custom Slave"] = function() {
 		const choices = new Map([
 			["greatly below average", "Petite"],
 			["below average", "Short"],
-			["normal", "Average height"],
+			["normal", "Average"],
 			["above average", "Tall"],
 			["greatly above average", "Very tall"],
 		]);
diff --git a/src/markets/specificMarkets/householdLiquidator.js b/src/markets/specificMarkets/householdLiquidator.js
index d7f1262a2e54e559cbb3218d177e4e17a0338c32..bf14e7b98d81ea120f1606d2dda2356729e77458 100644
--- a/src/markets/specificMarkets/householdLiquidator.js
+++ b/src/markets/specificMarkets/householdLiquidator.js
@@ -5,8 +5,8 @@ App.Markets["Household Liquidator"] = function() {
 	const el = new DocumentFragment();
 	let slave;
 	let r = [];
-	const _newSlaves = [];
-	let _totalCost;
+	const newSlaves = [];
+	let totalCost;
 	if (jsRandom(1, 100) > 50) {
 		// Old enough to have a younger sibling who can be a slave.
 		slave = GenerateNewSlave(null, {
@@ -16,18 +16,18 @@ App.Markets["Household Liquidator"] = function() {
 		setMissingParents(slave);
 
 		// Create opposite sex chance of relative
-		const _oppositeSex = (slave.genes !== GenerateChromosome());
+		const oppositeSex = (slave.genes !== GenerateChromosome());
 		App.UI.DOM.appendNewElement("p", el, `The household liquidator is offering a set of siblings for sale. You are permitted to inspect both slaves.`);
 
-		const _relativeSlave = generateRelatedSlave(slave, "younger sibling", _oppositeSex);
-		_newSlaves.push(slave);
-		_newSlaves.push(_relativeSlave);
+		const relativeSlave = generateRelatedSlave(slave, "younger sibling", oppositeSex);
+		newSlaves.push(slave);
+		newSlaves.push(relativeSlave);
 
-		let _slaveCost = slaveCost(slave, false, true);
+		let cost = slaveCost(slave, false, true);
 		if (V.slavesSeen > V.slaveMarketLimit) {
-			_slaveCost += Math.trunc(_slaveCost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
+			cost += Math.trunc(cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
 		}
-		_totalCost = _slaveCost * 3;
+		totalCost = cost * 3;
 	} else if (jsRandom(1, 100) > 20) {
 		// Old enough to have a child who can be a slave.
 		slave = GenerateNewSlave(null, {
@@ -45,56 +45,56 @@ App.Markets["Household Liquidator"] = function() {
 		}
 		finishSlave();
 		// Create opposite sex chance of relative
-		const _oppositeSex = (slave.genes !== GenerateChromosome());
+		const oppositeSex = (slave.genes !== GenerateChromosome());
 		const {his, mother} = getPronouns(slave);
 
-		const _relativeSlave = generateRelatedSlave(slave, "child", _oppositeSex);
-		const {daughter} = getPronouns(_relativeSlave);
+		const relativeSlave = generateRelatedSlave(slave, "child", oppositeSex);
+		const {daughter} = getPronouns(relativeSlave);
 
 		r.push(`The household liquidator is offering a ${mother} and ${his} ${daughter} for sale. You are permitted to inspect both slaves.`);
 		App.UI.DOM.appendNewElement("p", el, r.join(" "));
 
-		_newSlaves.push(slave);
-		_newSlaves.push(_relativeSlave);
+		newSlaves.push(slave);
+		newSlaves.push(relativeSlave);
 
-		let _slaveCost = slaveCost(slave, false, true);
+		let cost = slaveCost(slave, false, true);
 		if (V.slavesSeen > V.slaveMarketLimit) {
-			_slaveCost += Math.trunc(_slaveCost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
+			cost += Math.trunc(cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
 		}
-		_totalCost = _slaveCost * 3;
+		totalCost = cost * 3;
 	} else {
 		slave = GenerateNewSlave(null, {disableDisability: 1});
 		finishSlave();
 		setMissingParents(slave);
 		App.UI.DOM.appendNewElement("p", el, `The household liquidator is offering something special: identical twins. The markup is huge, but the merchandise isn't something you see every day.`);
 
-		const _relativeSlave = generateRelatedSlave(slave, "twin");
-		_newSlaves.push(slave);
-		_newSlaves.push(_relativeSlave);
+		const relativeSlave = generateRelatedSlave(slave, "twin");
+		newSlaves.push(slave);
+		newSlaves.push(relativeSlave);
 
-		let _slaveCost = slaveCost(slave, false, true);
+		let cost = slaveCost(slave, false, true);
 		if (V.slavesSeen > V.slaveMarketLimit) {
-			_slaveCost += Math.trunc(_slaveCost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
+			cost += Math.trunc(cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1));
 		}
-		_totalCost = _slaveCost * 4;
+		totalCost = cost * 4;
 	}
 
 	el.append(`The price is `);
-	el.append(App.UI.DOM.cashFormat(_totalCost));
+	el.append(App.UI.DOM.cashFormat(totalCost));
 	el.append(`.`);
 	if (V.slavesSeen > V.slaveMarketLimit) {
 		el.append(` You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.`);
 	}
 
-	if (V.cash >= _totalCost) {
+	if (V.cash >= totalCost) {
 		App.UI.DOM.appendNewElement(
 			"div",
 			el,
 			App.UI.DOM.link(
 				`Buy their slave contract`,
 				() => {
-					V.market.newSlaves = _newSlaves;
-					V.market.newSlaves.forEach((s) => cashX(forceNeg(_totalCost / V.market.newSlaves.length), "slaveTransfer", s));
+					V.market.newSlaves = newSlaves;
+					V.market.newSlaves.forEach((s) => cashX(forceNeg(totalCost / V.market.newSlaves.length), "slaveTransfer", s));
 				},
 				[],
 				"Bulk Slave Intro"
@@ -115,7 +115,7 @@ App.Markets["Household Liquidator"] = function() {
 			"Market"
 		)
 	);
-	App.UI.DOM.appendNewElement("p", el, App.UI.MultipleInspect(_newSlaves, true, "Household Liquidators"));
+	App.UI.DOM.appendNewElement("p", el, App.UI.MultipleInspect(newSlaves, true, "Household Liquidators"));
 
 	return el;
 
diff --git a/src/markets/specificMarkets/huskSlave.js b/src/markets/specificMarkets/huskSlave.js
index 287184beaab483e600b53c78928add9a9c521f27..940188ef402c869db6b65e4dd47eb4706540b537 100644
--- a/src/markets/specificMarkets/huskSlave.js
+++ b/src/markets/specificMarkets/huskSlave.js
@@ -15,7 +15,7 @@ App.Markets["Husk Slave"] = function() {
 	el.append(age());
 	el.append(sex());
 	el.append(nationality());
-	el.append(race());
+	el.append(raceSelect());
 	el.append(virginity());
 	App.UI.DOM.appendNewElement("h2", el, "Reservations");
 	el.append(reserve());
@@ -81,7 +81,7 @@ App.Markets["Husk Slave"] = function() {
 		return p;
 	}
 
-	function race() {
+	function raceSelect() {
 		const p = document.createElement("p");
 		App.UI.DOM.appendNewElement("div", p, "Race: ");
 		App.UI.DOM.appendNewElement(
@@ -97,9 +97,9 @@ App.Markets["Husk Slave"] = function() {
 		);
 
 		const linkArray = [];
-		const race = new Map(App.Data.misc.filterRaces);
-		race.set("not important", "Not Important");
-		for (const [race, capRace] of App.Data.misc.filterRaces) {
+		const races = new Map(App.Data.misc.filterRaces);
+		races.set("not important", "Not Important");
+		for (const [race, capRace] of races) {
 			if (V.huskSlave.race === race) {
 				linkArray.push(
 					App.UI.DOM.disabledLink(
diff --git a/src/markets/specificMarkets/slaveMarkets.js b/src/markets/specificMarkets/slaveMarkets.js
index 02115bdf164d18256d62be6a01e53cba3a526079..ba482e1abdfc258077e0c3f6347cf5206f17b56c 100644
--- a/src/markets/specificMarkets/slaveMarkets.js
+++ b/src/markets/specificMarkets/slaveMarkets.js
@@ -4,12 +4,12 @@ App.Markets.heap = function() {
 	r.push(`You visit the slave markets off the arcology plaza. It's always preferable to examine merchandise in person.`);
 	r.push(`You're in the corner of the slave market occupied by "The Flesh Heap", a dumping ground, of sorts, for broken slaves. Be it brain death, drug overdose, coma, or anything else, this market is willing to buy and sell them. Most of the worthwhile slaves have already been picked clean by pharmaceutical companies for drug testing, and the rest are practically nothing more than vegetables, but a handful remain just conscious enough to be profitable with effort as slaves. One should go in expecting only the worst quality possible, though if anything catches your eye, it will be rather cheap to purchase.`);
 
-	let _heap = jsRandom(1, 4);
-	if (_heap === 1) {
+	let heap = jsRandom(1, 4);
+	if (heap === 1) {
 		r.push(`"Looking for a warm body to use as furniture? Perhaps as a decorative, living sculpture? We got what you want!"`);
-	} else if (_heap === 2) {
+	} else if (heap === 2) {
 		r.push(`"I guarantee they are all alive, maybe not healthy, but alive. Well, except that one; just ignore that one."`);
-	} else if (_heap === 3) {
+	} else if (heap === 3) {
 		r.push(`"We ask that you don't use this merchandise for organ harvesting; we have plenty of nonfunctional ones for that."`);
 	} else {
 		r.push(`"If you are looking for a body to do unmentionable things to, you came to the right place! Though these in particular just barely fall under slave laws."`);
@@ -25,16 +25,16 @@ App.Markets.wetware = function() {
 	const {heU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
 	r.push(`You're in the corner of the slave market occupied by scientists and programmers, pioneers in perfecting the skills of slaves by removing all external stimuli and subjecting them to an inhumane regimen of simulated sexual and career training. Although their bodies are ruined, these slaves are guaranteed to be intelligent, skilled and trained in a variety of jobs. If you're willing to perform extensive repairs${(V.bodyswapAnnounced) ? `, or have a spare body ready` : ``}, these slaves have high potential in almost any role in your arcology.`);
 
-	let _wetware = jsRandom(1, 4);
-	if (_wetware === 1) {
+	let wetware = jsRandom(1, 4);
+	if (wetware === 1) {
 		r.push(`Just past a scientist, you can see a`);
 		if (V.seeExtreme === 1) {
 			r.push(`limbless`);
 		}
 		r.push(`slave being extracted from a tank filled with fluid wearing a bizarre helmet. As the device is removed by a technician, the slave begins to panic as ${heU} is dragged from ${hisU} virtual life and realizes exactly what has happened to ${hisU} body.`);
-	} else if (_wetware === 2) {
+	} else if (wetware === 2) {
 		r.push(`A scientist turns to you and remarks "I almost envy the hardware. They believe they're having a fulfilling career with a loving family and meaningful relationships for a lifetime. Honestly, if the mental imprinting process wasn't so destructive to the human body, I'd probably hop in myself!"`);
-	} else if (_wetware === 3) {
+	} else if (wetware === 3) {
 		r.push(`Racks of ravaged bodies are laid across tables with plaques stating slave IQ, career, and sexual skill exam results.`);
 	} else {
 		r.push(`Curious, you ask a technician why it's necessary for the merchandise to be so badly treated. He replies "Forcing stimulus on the hardware takes an enormous toll on their nervous and circulatory system. The nonfunctional components are disabled and removed as necessary to ensure optimal response to the imprinting process."`);
@@ -52,13 +52,13 @@ App.Markets.kidnappers = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`Fortunately for them, such behavior is not permitted here. Though they remain frightened and angry, they are safe from rape, for now.`);
 	} else {
-		let _kidnappers = jsRandom(1, 4);
+		let kidnappers = jsRandom(1, 4);
 		r.push(`There's more merchandise out of sight in the holding areas. To go by what you can hear,`);
-		if (_kidnappers === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (kidnappers === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`muffled insistence that the speaker is not a girl followed by struggling and then shrieks as a resistant dickgirl takes anal rape,`);
-		} else if ((_kidnappers === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
+		} else if ((kidnappers === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
 			r.push(`muffled begging followed by struggling and then crying as a new slave learns how it feels to have a slave's cunt,`);
-		} else if (_kidnappers === 3) {
+		} else if (kidnappers === 3) {
 			r.push(`muffled gagging followed gasping and sobbing as a new slave tries to get ${hisU} breath back after oral rape,`);
 		} else {
 			r.push(`the unmistakable slap of flesh on flesh,`);
@@ -83,13 +83,13 @@ App.Markets.indentures = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`The generous protections for slaves in your arcology lend this last group extra confidence.`);
 	} else {
-		let _indentures = jsRandom(1, 4);
+		let indentures = jsRandom(1, 4);
 		r.push(`The area is crowded, and more indentured servants are packed together in the holding areas. To go by what you can hear,`);
-		if (_indentures === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (indentures === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`the unmistakable mixed shrieks, sobs, and slaps of anal rape,`);
-		} else if ((_indentures === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
+		} else if ((indentures === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
 			r.push(`the characteristic crying and gasping of an unwilling ${girlU} giving up ${hisU} cunt,`);
-		} else if (_indentures === 3) {
+		} else if (indentures === 3) {
 			r.push(`the gagging and expectoration of someone who has just gotten a mouthful of unwelcome cum,`);
 		} else {
 			r.push(`disconsolate sobbing interrupted by a gasp as something is stuffed inside someone's mouth, and followed by muffled screams,`);
@@ -110,13 +110,13 @@ App.Markets.hunters = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`Their methods are somewhat limited, as the rules in your arcology preclude the more effective methods of punishment.`);
 	} else {
-		let _hunters = jsRandom(1, 4);
+		let hunters = jsRandom(1, 4);
 		r.push(`The slave catchers consider their catches fair game, though they usually confine their amusements to the holding areas out of sight. Not out of earshot, though; to go by what you can hear,`);
-		if (_hunters === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (hunters === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`vehement insistence that the speaker is not a girl followed by a beating and then shrieks as a rebellious dickgirl takes anal rape,`);
-		} else if (_hunters === 2 && jsRandom(0, 99) >= V.seeDicks) {
+		} else if (hunters === 2 && jsRandom(0, 99) >= V.seeDicks) {
 			r.push(`vehement protestations followed by a beating and then crying as a slave's cunt takes ${hisU} punishment for ${himU},`);
-		} else if (_hunters === 3) {
+		} else if (hunters === 3) {
 			r.push(`struggling and gagging followed gasping and angry swearing as a rebellious slave tries to get ${hisU} breath back after oral rape,`);
 		} else {
 			r.push(`struggling followed by the slap of flesh on flesh,`);
@@ -140,13 +140,13 @@ App.Markets["underage raiders"] = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`though they do obey the rules of your arcology that restrain them from abusing the slaves.`);
 	} else {
-		let _ur = jsRandom(1, 4);
+		let ur = jsRandom(1, 4);
 		r.push(`though they restrain themselves from reducing the value of their captures by taking virginities. They do have their fun, though; to go by what you can hear from the holding area where they keep underage slaves who can be sold,`);
-		if (_ur === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (ur === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`a muffled but obviously sadistic description of feminization, and the desperate sobbing in response,`);
-		} else if ((_ur === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
+		} else if ((ur === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
 			r.push(`a muffled but obviously sadistic description of breeding, and the desperate sobbing in response,`);
-		} else if (_ur === 3) {
+		} else if (ur === 3) {
 			r.push(`faint struggling and crying that suggests that someone is being thoroughly groped and pinched,`);
 		} else {
 			r.push(`the lewd, lubricated noise of someone giving a reluctant handjob,`);
@@ -169,13 +169,13 @@ App.Markets.raiders = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`though they do obey the rules of your arcology that restrain them from abusing the slaves.`);
 	} else {
-		let _raiders = jsRandom(1, 4);
+		let raiders = jsRandom(1, 4);
 		r.push(`though they restrain themselves from reducing the value of their captures by taking virginities. They do have their fun, though; to go by what you can hear from the holding area where they keep slaves of age who can be sold,`);
-		if (_raiders === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (raiders === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`a muffled but obviously sadistic description of feminization, and the desperate sobbing in response,`);
-		} else if (_raiders === 2 && jsRandom(0, 99) >= V.seeDicks) {
+		} else if (raiders === 2 && jsRandom(0, 99) >= V.seeDicks) {
 			r.push(`a muffled but obviously sadistic description of breeding, and the desperate sobbing in response,`);
-		} else if (_raiders === 3) {
+		} else if (raiders === 3) {
 			r.push(`faint struggling and crying that suggests that someone is being thoroughly groped and pinched,`);
 		} else {
 			r.push(`the lewd, lubricated noise of someone giving a reluctant handjob,`);
@@ -221,13 +221,13 @@ App.Markets.trainers = function() {
 	if (V.arcologies[0].FSPaternalistSMR === 1) {
 		r.push(`Though the rules of your arcology protected them from the worst excesses of the training profession, many of the slaves on sale have the haunted look of people still coming to terms with the idea that they no longer have any bodily autonomy.`);
 	} else {
-		let _trainers = jsRandom(1, 4);
+		let trainers = jsRandom(1, 4);
 		r.push(`The trainers are a competitive bunch, and to go by what you can hear,`);
-		if (_trainers === 1 && jsRandom(1, 100) <= V.seeDicks) {
+		if (trainers === 1 && jsRandom(1, 100) <= V.seeDicks) {
 			r.push(`moaning interspersed with lewd, well-lubricated noises coming from both anal sex and vigorous masturbation,`);
-		} else if (_trainers === 2 && jsRandom(0, 99) >= V.seeDicks) {
+		} else if (trainers === 2 && jsRandom(0, 99) >= V.seeDicks) {
 			r.push(`moaning and the distinctive slap of feminine buttocks on thighs beneath them as a ${girlU} rides a dick,`);
-		} else if (_trainers === 3) {
+		} else if (trainers === 3) {
 			r.push(`the lush, lewd sounds of diligent oral sex,`);
 		} else {
 			r.push(`the call-and-response of a trainer and a slave running through a memorized obedience exercise,`);
diff --git a/src/markets/specificMarkets/slaveShelter.js b/src/markets/specificMarkets/slaveShelter.js
index 4b8bd813215b59cfdb6a047af35d79451d47a088..a577b8e6f6147ff8a9f7345676ac7dce85af86c9 100644
--- a/src/markets/specificMarkets/slaveShelter.js
+++ b/src/markets/specificMarkets/slaveShelter.js
@@ -52,7 +52,7 @@ App.Markets["Slave Shelter"] = function() {
 					V.shelterSlave.career = "a slave";
 					setHealth(V.shelterSlave, jsRandom(-30, -10));
 					V.shelterSlave.anus = 3;
-					applyMindbroken(V.shelterSlave);
+					applyMindbroken(V.shelterSlave, V.shelterSlave.intelligence);
 					break;
 				case "amputee":
 					V.shelterSlave = GenerateNewSlave(null, {disableDisability: 1});
@@ -78,7 +78,7 @@ App.Markets["Slave Shelter"] = function() {
 					V.shelterSlave.behavioralFlaw = "hates men";
 					V.shelterSlave.sexualFlaw = "hates oral";
 					V.shelterSlave.canRecruit = 0;
-					V.shelterSlave.override_Eye_Color = 1;
+					V.shelterSlave.override_Eye_Color = 1; // TODO: Identifier 'override_Eye_Color' is not in camel case
 					break;
 				case "deaf":
 					V.shelterSlave = GenerateNewSlave(null, {minAge: V.minimumSlaveAge, maxAge: 22, disableDisability: 1});
@@ -100,7 +100,7 @@ App.Markets["Slave Shelter"] = function() {
 					V.shelterSlave.weight = -50;
 					V.shelterSlave.vagina = 9;
 					V.shelterSlave.bellySag = 20;
-					applyMindbroken(V.shelterSlave);
+					applyMindbroken(V.shelterSlave, V.shelterSlave.intelligence);
 					break;
 				case "cannibal victim male":
 					if (V.pedo_mode === 1) {
diff --git a/src/markets/theMarket/buySlaves.js b/src/markets/theMarket/buySlaves.js
index 5d83a8f14328b4c5649dbf5ab6552028ca718536..4672eec2eadfc1d33dde889a83496192e1b59bce 100644
--- a/src/markets/theMarket/buySlaves.js
+++ b/src/markets/theMarket/buySlaves.js
@@ -59,8 +59,8 @@ App.UI.buySlaves = function() {
 
 	function neighborsBlock() {
 		const el = new DocumentFragment();
-		for (let _i = 0; _i < V.arcologies.length; _i++) {
-			if (V.arcologies[_i].direction !== 0) {
+		for (let i = 0; i < V.arcologies.length; i++) {
+			if (V.arcologies[i].direction !== 0) {
 				linkArray = [];
 				const linkUnit = document.createElement("span");
 				linkUnit.append(
@@ -70,14 +70,14 @@ App.UI.buySlaves = function() {
 							V.market = new App.Markets.GlobalVariable();
 							V.market.slaveMarket = "neighbor";
 							V.market.newSlaves = [];
-							V.market.numArcology = _i;
+							V.market.numArcology = i;
 							updateNav();
 						},
 						[],
 						"Market"
 					)
 				);
-				App.UI.DOM.appendNewElement("span", linkUnit, ` ${V.arcologies[_i].name}`, "bold");
+				App.UI.DOM.appendNewElement("span", linkUnit, ` ${V.arcologies[i].name}`, "bold");
 				linkArray.push(linkUnit);
 				if (V.cash > (minCost * 5)) {
 					linkArray.push(
@@ -88,7 +88,7 @@ App.UI.buySlaves = function() {
 								V.market.slaveMarket = "neighbor";
 								V.market.introType = "bulk";
 								V.market.numSlaves = 5;
-								V.market.numArcology = _i;
+								V.market.numArcology = i;
 							},
 							[],
 							"Bulk Slave Intro"
@@ -104,7 +104,7 @@ App.UI.buySlaves = function() {
 								V.market.slaveMarket = "neighbor";
 								V.market.introType = "bulk";
 								V.market.numSlaves = 10;
-								V.market.numArcology = _i;
+								V.market.numArcology = i;
 							},
 							[],
 							"Bulk Slave Intro"
diff --git a/src/markets/theMarket/tradeMenials.js b/src/markets/theMarket/tradeMenials.js
index 90c3a30c6d3138e72af342435223fae09a49b25a..dce3d4dba5ecd9cff08fb3290b53eb4c1fc5d138 100644
--- a/src/markets/theMarket/tradeMenials.js
+++ b/src/markets/theMarket/tradeMenials.js
@@ -194,13 +194,13 @@ App.UI.tradeMenials = function(menialWorkersOnly) {
 				makeLink(100, buySomeMenials);
 			}
 			if (V.cash > (menialPrice + 1) * 2) {
-				let _menialBulkPremium = Math.trunc(1 + Math.clamp(V.cash / menialPrice, 0, bulkMax) / 400);
+				let menialBulkPremium = Math.trunc(1 + Math.clamp(V.cash / menialPrice, 0, bulkMax) / 400);
 				linkArray.push(
 					App.UI.DOM.link(
 						"max",
 						() => {
 							buySomeMenials(
-								Math.trunc(Math.clamp(V.cash / (menialPrice + _menialBulkPremium), 0, bulkMax))
+								Math.trunc(Math.clamp(V.cash / (menialPrice + menialBulkPremium), 0, bulkMax))
 							);
 							jQuery("#menial-span").empty().append(App.UI.tradeMenials(menialWorkersOnly));
 						},
@@ -387,13 +387,13 @@ App.UI.tradeMenials = function(menialWorkersOnly) {
 						makeLink(100, buySomeFuckdolls);
 					}
 					if (V.cash > (menialPrice + 1) * 2) {
-						let _menialBulkPremium = Math.trunc(1 + Math.clamp(V.cash / menialPrice, 0, bulkMax) / 400);
+						let menialBulkPremium = Math.trunc(1 + Math.clamp(V.cash / menialPrice, 0, bulkMax) / 400);
 						linkArray.push(
 							App.UI.DOM.link(
 								"max",
 								() => {
 									buySomeFuckdolls(
-										Math.trunc(Math.clamp(V.cash / (menialPrice + _menialBulkPremium), 0, bulkMax))
+										Math.trunc(Math.clamp(V.cash / (menialPrice + menialBulkPremium), 0, bulkMax))
 									);
 									jQuery("#menial-span").empty().append(App.UI.tradeMenials(menialWorkersOnly));
 								},
@@ -487,13 +487,13 @@ App.UI.tradeMenials = function(menialWorkersOnly) {
 						makeLink(100, buySomeBioreactors);
 					}
 					if (V.cash > (menialPrice - 99) * 2) {
-						let _bioreactorBulkPremium = Math.trunc(1 + Math.clamp(V.cash / (menialPrice - 99), 0, bulkMax) / 400);
+						let bioreactorBulkPremium = Math.trunc(1 + Math.clamp(V.cash / (menialPrice - 99), 0, bulkMax) / 400);
 						linkArray.push(
 							App.UI.DOM.link(
 								"max",
 								() => {
 									buySomeBioreactors(
-										Math.trunc(Math.clamp(V.cash / (menialPrice - 99 + _bioreactorBulkPremium), 0, bulkMax))
+										Math.trunc(Math.clamp(V.cash / (menialPrice - 99 + bioreactorBulkPremium), 0, bulkMax))
 									);
 									jQuery("#menial-span").empty().append(App.UI.tradeMenials(menialWorkersOnly));
 								},
diff --git a/src/neighbor/neighborDescription.js b/src/neighbor/neighborDescription.js
index 81200f8de7a69dcdd6ec6cc3c89b7f2a293e0497..b5340e3297981dd8f39c9be99cd9cc8420abbd75 100644
--- a/src/neighbor/neighborDescription.js
+++ b/src/neighbor/neighborDescription.js
@@ -33,16 +33,16 @@ App.UI.neighborDescription = function(i) {
 	} else {
 		r.push(`is your arcology.`);
 	}
-	let _economicUncertainty = App.Utils.economicUncertainty(i);
+	let economicUncertainty = App.Utils.economicUncertainty(i);
 	if (V.arcologies[i].direction === 0) {
 		r.push(`You control <span class="lime">${V.arcologies[i].ownership}%</span> of the arcology, and the largest minority holder controls <span class="orange">${V.arcologies[i].minority}%.</span>`);
 	} else if ((V.arcologies[i].government !== "your trustees") && (V.arcologies[i].government !== "your agent")) {
-		r.push(`Its leadership has control of approximately <span class="orange">${Math.trunc(V.arcologies[i].ownership*_economicUncertainty)}%</span> of the arcology${(V.arcologies[i].minority > V.arcologies[i].ownership-10) ? `, a dangerously narrow margin over competition with a <span class="tan">${Math.trunc(V.arcologies[i].minority*_economicUncertainty)}%</span> share` : ``}.`);
+		r.push(`Its leadership has control of approximately <span class="orange">${Math.trunc(V.arcologies[i].ownership*economicUncertainty)}%</span> of the arcology${(V.arcologies[i].minority > V.arcologies[i].ownership-10) ? `, a dangerously narrow margin over competition with a <span class="tan">${Math.trunc(V.arcologies[i].minority*economicUncertainty)}%</span> share` : ``}.`);
 	}
 	if (V.arcologies[i].PCminority > 0) {
-		r.push(`You own <span class="lime">${V.arcologies[i].PCminority}%</span> of this arcology${(((V.arcologies[i].government === "your trustees") || (V.arcologies[i].government === "your agent")) && V.arcologies[i].minority > V.arcologies[i].PCminority-10) ? `, a dangerously narrow margin over competition with a <span class="red">${Math.trunc(V.arcologies[i].minority*_economicUncertainty)}%</span> share` : ``}.`);
+		r.push(`You own <span class="lime">${V.arcologies[i].PCminority}%</span> of this arcology${(((V.arcologies[i].government === "your trustees") || (V.arcologies[i].government === "your agent")) && V.arcologies[i].minority > V.arcologies[i].PCminority-10) ? `, a dangerously narrow margin over competition with a <span class="red">${Math.trunc(V.arcologies[i].minority*economicUncertainty)}%</span> share` : ``}.`);
 	}
-	r.push(`The arcology has an estimated GSP of <span class="yellowgreen">${cashFormat(Math.trunc(0.1*V.arcologies[i].prosperity*_economicUncertainty))}m,</span>`);
+	r.push(`The arcology has an estimated GSP of <span class="yellowgreen">${cashFormat(Math.trunc(0.1*V.arcologies[i].prosperity*economicUncertainty))}m,</span>`);
 	if (Math.abs(V.arcologies[i].prosperity - averageProsperity) < 5) {
 		r.push(`average among`);
 	} else if (V.arcologies[i].prosperity > averageProsperity) {
@@ -53,7 +53,7 @@ App.UI.neighborDescription = function(i) {
 	r.push(`its neighbors.`);
 
 	let desc = "";
-	const _neighborDescription = [];
+	const neighborDescription = [];
 	if (V.arcologies[i].FSSubjugationist !== "unset") {
 		if (V.arcologies[i].FSSubjugationist > 80) {
 			desc = "committed to ";
@@ -70,7 +70,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `an excellent dumping ground for low quality ${V.arcologies[i].FSSubjugationistRace} slaves.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSSupremacist !== "unset") {
 		if (V.arcologies[i].FSSubjugationist > 80) {
@@ -88,7 +88,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `the site of a furious debate over existing ${V.arcologies[i].FSSupremacistRace} slaves.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSRepopulationFocus !== "unset") {
 		if (V.arcologies[i].FSRepopulationFocus > 80) {
@@ -106,7 +106,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `actively importing fertile slave girls.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSRestart !== "unset") {
 		if (V.arcologies[i].FSRestart > 80) {
@@ -124,7 +124,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `actively importing sterilization supplies.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSGenderRadicalist !== "unset") {
 		if (V.arcologies[i].FSGenderRadicalist > 80) {
@@ -142,7 +142,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `actively importing a wider variety of slave girls.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSGenderFundamentalist !== "unset") {
 		if (V.arcologies[i].FSGenderFundamentalist > 80) {
@@ -160,7 +160,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `importing increasing numbers of fertile slaves.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSPaternalist !== "unset") {
 		if (V.arcologies[i].FSPaternalist > 80) {
@@ -178,7 +178,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `starting to demand abused slaves whose lives can be turned around.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSDegradationist !== "unset") {
 		if (V.arcologies[i].FSDegradationist > 80) {
@@ -196,7 +196,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `importing a rapidly increasing number of slaves, for some reason.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSIntellectualDependency !== "unset") {
 		if (V.arcologies[i].FSIntellectualDependency > 80) {
@@ -214,7 +214,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `importing large quantities of aphrodisiacs and psychosuppressants.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSSlaveProfessionalism !== "unset") {
 		if (V.arcologies[i].FSSlaveProfessionalism > 80) {
@@ -232,7 +232,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `seeking out high-class slave trainers.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSBodyPurist !== "unset") {
 		if (V.arcologies[i].FSBodyPurist > 80) {
@@ -250,7 +250,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `setting up research programs to develop better slave drugs.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSTransformationFetishist !== "unset") {
 		if (V.arcologies[i].FSTransformationFetishist > 80) {
@@ -268,7 +268,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `receiving daily shipments of silicone and surgical necessities.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSYouthPreferentialist !== "unset") {
 		if (V.arcologies[i].FSYouthPreferentialist > 80) {
@@ -286,7 +286,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `starting to get a reputation as an excellent place to get a good price for a virgin.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSMaturityPreferentialist !== "unset") {
 		if (V.arcologies[i].FSMaturityPreferentialist > 80) {
@@ -304,7 +304,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `displaying an increasing demand for enslaved housewives and professional women.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSPetiteAdmiration !== "unset") {
 		if (V.arcologies[i].FSPetiteAdmiration > 80) {
@@ -322,7 +322,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `starting to accumulate an unusually large number of short slaves.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSStatuesqueGlorification !== "unset") {
 		if (V.arcologies[i].FSStatuesqueGlorification > 80) {
@@ -340,7 +340,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `starting to drive out its shorter citizenry.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSSlimnessEnthusiast !== "unset") {
 		if (V.arcologies[i].FSSlimnessEnthusiast > 80) {
@@ -358,7 +358,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `starting to display unusual fashions regarding breasts and butts.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSAssetExpansionist !== "unset") {
 		if (V.arcologies[i].FSAssetExpansionist > 80) {
@@ -376,7 +376,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `demanding fatter slaves, since its citizens are learning they absorb growth hormones better.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSPastoralist !== "unset") {
 		if (V.arcologies[i].FSPastoralist > 80) {
@@ -394,7 +394,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `displaying an increasing public appetite for dairy, and yet imports almost no true cow's milk.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSCummunism !== "unset") {
 		if (V.arcologies[i].FSCummunism > 80) {
@@ -412,7 +412,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `displaying an increasing public appetite for cum, and has begun importing more and more specialized milkers.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSPhysicalIdealist !== "unset") {
 		if (V.arcologies[i].FSPhysicalIdealist > 80) {
@@ -430,7 +430,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `the site of a musclegirl fetish community.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSHedonisticDecadence !== "unset") {
 		if (V.arcologies[i].FSHedonisticDecadence > 80) {
@@ -448,7 +448,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `the site of a large number of lazy individuals.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSIncestFetishist !== "unset") {
 		if (V.arcologies[i].FSIncestFetishist > 80) {
@@ -466,7 +466,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `devoting more and more of its resources into genealogy.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSChattelReligionist !== "unset") {
 		if (V.arcologies[i].FSChattelReligionist > 80) {
@@ -484,7 +484,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `in the throes of public dissension over its religious laws.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSRomanRevivalist !== "unset") {
 		if (V.arcologies[i].FSRomanRevivalist > 80) {
@@ -502,7 +502,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `working its way through sword and sandals fashion towards proper historicity.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSNeoImperialist !== "unset") {
 		if (V.arcologies[i].FSNeoImperialist > 80) {
@@ -520,7 +520,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `creating an extremely strict hierarchical system, with an elite caste of techno-nobility cementing itself through a series of complicated, emergent feudal dynamics.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSAztecRevivalist !== "unset") {
 		if (V.arcologies[i].FSAztecRevivalist > 80) {
@@ -538,7 +538,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `struggling to embrace the amount of blood sacrifice and prayer involved.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSEgyptianRevivalist !== "unset") {
 		if (V.arcologies[i].FSEgyptianRevivalist > 80) {
@@ -556,7 +556,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `struggling with the fashion implications of so much white linen everywhere.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSEdoRevivalist !== "unset") {
 		if (V.arcologies[i].FSEdoRevivalist > 80) {
@@ -574,7 +574,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `the object of considerable debate among socially awkward teenagers worldwide.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSArabianRevivalist !== "unset") {
 		if (V.arcologies[i].FSArabianRevivalist > 80) {
@@ -592,7 +592,7 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `eagerly reveling in the most romantic parts of superficial Arabian romanticism.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 	if (V.arcologies[i].FSChineseRevivalist !== "unset") {
 		if (V.arcologies[i].FSChineseRevivalist > 80) {
@@ -610,24 +610,24 @@ App.UI.neighborDescription = function(i) {
 		} else {
 			desc += `moving towards a stage of refinement that will allow it to present itself properly.`;
 		}
-		_neighborDescription.push(desc);
+		neighborDescription.push(desc);
 	}
 
-	if (_neighborDescription.length > 0) {
-		if (_neighborDescription.length > 2) {
-			r.push(`Its culture is complex. First, it is ${_neighborDescription[0]}`);
-			for (let j = 1; j < _neighborDescription.length; j++) {
-				if (j < _neighborDescription.length-1) {
+	if (neighborDescription.length > 0) {
+		if (neighborDescription.length > 2) {
+			r.push(`Its culture is complex. First, it is ${neighborDescription[0]}`);
+			for (let j = 1; j < neighborDescription.length; j++) {
+				if (j < neighborDescription.length-1) {
 					r.push(`It is`);
 				} else {
 					r.push(`Finally, the arcology is`);
 				}
-				r.push(`${_neighborDescription[j]}`);
+				r.push(`${neighborDescription[j]}`);
 			}
-		} else if (_neighborDescription.length === 2) {
-			r.push(`Its culture is developing along two lines. First, it is ${_neighborDescription[0]} Second, it is ${_neighborDescription[1]}`);
+		} else if (neighborDescription.length === 2) {
+			r.push(`Its culture is developing along two lines. First, it is ${neighborDescription[0]} Second, it is ${neighborDescription[1]}`);
 		} else {
-			r.push(`Its culture is diverging from the old world: it is ${_neighborDescription[0]}`);
+			r.push(`Its culture is diverging from the old world: it is ${neighborDescription[0]}`);
 		}
 	}
 	App.Events.addNode(el, r, "div");
diff --git a/src/neighbor/neighborInteract.js b/src/neighbor/neighborInteract.js
index 3c964d4f6aeb5522fc1d9c83819181d3fc178f1d..f11fc2810b3ad87fb1781569e3dfc668fc7d1dcb 100644
--- a/src/neighbor/neighborInteract.js
+++ b/src/neighbor/neighborInteract.js
@@ -7,14 +7,14 @@ App.Neighbor.Interact = function() {
 	let r = [];
 	App.UI.DOM.appendNewElement("p", node, `You have ${V.arcologies.length - 1} neighbors.`);
 
-	let _nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].embargoTarget; });
-	if (!_nei) {
+	let nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].embargoTarget; });
+	if (!nei) {
 		App.UI.DOM.appendNewElement("div", node, `You are not engaged in economic warfare against a neighboring arcology.`);
 	} else {
 		let linkArray = [];
 		App.Events.addNode(node, [
 			`You have targeted`,
-			App.UI.DOM.makeElement("span", _nei.name, "bold"),
+			App.UI.DOM.makeElement("span", nei.name, "bold"),
 			`for economic warfare.`
 		], "div");
 		r.push(`Its planned impacts will be`);
@@ -56,13 +56,13 @@ App.Neighbor.Interact = function() {
 		App.Events.addNode(node, r, "div", "indent");
 	}
 
-	_nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].influenceTarget; });
-	if (!_nei) {
+	nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].influenceTarget; });
+	if (!nei) {
 		App.UI.DOM.appendNewElement("div", node, `You are not using your arcology's culture to attempt to influence neighboring arcologies' development.`);
 	} else {
 		App.Events.addNode(node, [
 			`You have targeted`,
-			App.UI.DOM.makeElement("span", _nei.name, "bold"),
+			App.UI.DOM.makeElement("span", nei.name, "bold"),
 			`for cultural influence.`,
 			App.UI.DOM.link("Stop",
 				() => {
@@ -74,14 +74,14 @@ App.Neighbor.Interact = function() {
 	}
 
 	if (V.PC.skill.hacking > 0) {
-		_nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberEconomicTarget; });
-		if (!_nei) {
+		nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberEconomicTarget; });
+		if (!nei) {
 			App.UI.DOM.appendNewElement("div", node, `You are not engaged in cyber warfare against a neighboring arcology.`);
 		} else {
 			let linkArray = [];
 			App.Events.addNode(node, [
 				`You have targeted`,
-				App.UI.DOM.makeElement("span", _nei.name, "bold"),
+				App.UI.DOM.makeElement("span", nei.name, "bold"),
 				`for cyber economic warfare.`
 			], "div");
 			r.push(`Its planned impacts will be`);
@@ -123,14 +123,14 @@ App.Neighbor.Interact = function() {
 			App.Events.addNode(node, r, "div", "indent");
 		}
 
-		_nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberReputationTarget; });
-		if (!_nei) {
+		nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberReputationTarget; });
+		if (!nei) {
 			App.UI.DOM.appendNewElement("div", node, `You are not engaged in character assassination against a neighboring arcology.`);
 		} else {
 			let linkArray = [];
 			App.Events.addNode(node, [
 				`You have targeted the leadership of`,
-				App.UI.DOM.makeElement("span", _nei.name, "bold"),
+				App.UI.DOM.makeElement("span", nei.name, "bold"),
 				`for character assassination.`
 			], "div");
 			r.push(`Its planned impacts will be`);
diff --git a/src/npc/bodyguard/bgDescription.js b/src/npc/bodyguard/bgDescription.js
index c308fc6421dca887451208047582ba71dfb4b519..5bd634470ccd346eb9f92bb07585ae05e45bb098 100644
--- a/src/npc/bodyguard/bgDescription.js
+++ b/src/npc/bodyguard/bgDescription.js
@@ -14,7 +14,7 @@ App.Desc.bodyguard = function(slave) {
 	r.push(bgWeapon());
 
 	if (slave.skill.combat > 0) {
-		r.push(`${He} is <span class="aquamarine">skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edged weapons, and ${his} hands`);
+		r.push(`${He} is <span class="skill">skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edged weapons, and ${his} hands`);
 		if (!hasBothArms(slave)) {
 			r.push(`would be deadly weapons if ${he} had`);
 			if (!hasAnyArms(slave)) {
diff --git a/src/npc/children/childInteract.tw b/src/npc/children/childInteract.tw
index f5ef0a39ce1adc32ae7d02b02c244c5a36c26d85..133b9b3031e7a6c2bd58256dd77839f8926cccd1 100644
--- a/src/npc/children/childInteract.tw
+++ b/src/npc/children/childInteract.tw
@@ -419,7 +419,7 @@ FIXME:
 	<</if>>
 	<<if $activeChild.devotion >= 100 && $activeChild.relationship < 0 && $activeChild.relationship > -3>>
 		|	<<link "Talk to $him about relationships" "Matchmaking">>
-				<<set $subSlave = 0, $eventSlave = $activeChild>>
+				<<set $AS = $activeChild.ID>>
 			<</link>>
 	<</if>>
 <</if>>
diff --git a/src/npc/children/childSummary.js b/src/npc/children/childSummary.js
index c91ea74877b4b9d727eb0df66e226e3ba35fd58f..6b7bc261c514e29d10d5b096296cf7245c0c4508 100644
--- a/src/npc/children/childSummary.js
+++ b/src/npc/children/childSummary.js
@@ -2673,7 +2673,7 @@ App.Facilities.Nursery.ChildSummary = function(child) {
 	 */
 	function shortSexSkills(child) {
 		let SSkills = child.skill.anal + child.skill.oral;
-		r += `<span class="aquamarine">`;
+		r += `<span class="skill">`;
 		if (((SSkills + child.skill.whoring + child.skill.entertainment) >= 400) && ((child.vagina < 0) || (child.skill.vaginal >= 100))) {
 			r += `MSS`;
 		} else {
@@ -2828,7 +2828,7 @@ App.Facilities.Nursery.ChildSummary = function(child) {
 	 */
 	function longSexSkills(child) {
 		let SSkills = (child.skill.anal + child.skill.oral);
-		r += `<span class="aquamarine">`;
+		r += `<span class="skill">`;
 		if (((SSkills + child.skill.whoring + child.skill.entertainment) >= 400) && ((child.vagina < 0) || (child.skill.vaginal >= 100))) {
 			r += `Masterful Whore. `;
 		} else {
diff --git a/src/npc/children/longChildDescription.js b/src/npc/children/longChildDescription.js
index 01f89e40c1102aeb496a1293c8ad141743f3e672..3526d31e235a13b57b875a7605b3622e4c4a4018 100644
--- a/src/npc/children/longChildDescription.js
+++ b/src/npc/children/longChildDescription.js
@@ -441,13 +441,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 		}
 
 		if (child.skill.anal >= 100) {
-			r += `${He} is a <span class="aquamarine">masterful anal slut.</span> `;
+			r += `${He} is a <span class="skill">masterful anal slut.</span> `;
 		} else if (child.skill.anal > 60) {
-			r += `${He} is an <span class="aquamarine">expert anal slut.</span> `;
+			r += `${He} is an <span class="skill">expert anal slut.</span> `;
 		} else if (child.skill.anal > 30) {
-			r += `${He} is a <span class="aquamarine">skilled anal slut.</span> `;
+			r += `${He} is a <span class="skill">skilled anal slut.</span> `;
 		} else if (child.skill.anal > 10) {
-			r += `${He} has <span class="aquamarine">basic knowledge about anal.</span> `;
+			r += `${He} has <span class="skill">basic knowledge about anal.</span> `;
 		} else {
 			r += `${He} is unskilled at taking anal. `;
 		}
@@ -3951,13 +3951,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 
 		r += `${He} is `;
 		if (child.skill.oral >= 100) {
-			r += `an <span class="aquamarine">oral sex master.</span> `;
+			r += `an <span class="skill">oral sex master.</span> `;
 		} else if (child.skill.oral > 60) {
-			r += `an <span class="aquamarine">expert at oral.</span> `;
+			r += `an <span class="skill">expert at oral.</span> `;
 		} else if (child.skill.oral > 30) {
-			r += `<span class="aquamarine">orally skilled.</span> `;
+			r += `<span class="skill">orally skilled.</span> `;
 		} else if (child.skill.oral > 10) {
-			r += `<span class="aquamarine">capable of basic oral sex.</span> `;
+			r += `<span class="skill">capable of basic oral sex.</span> `;
 		} else {
 			r += `unskilled at oral sex. `;
 		}
@@ -5533,14 +5533,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 						r += `${He} has a small patch of ${child.pubicHColor} fur above ${his} ${child.dick > 0 ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `;
 					}
 				}
-
 			} else {
 				switch (child.pubicHStyle) {
 					case "hairless":
 						r += `${He}'s naturally smooth and hairless. `;
 						break;
 					case "bald":
-						r += `${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth. `;
+						r += `${He} is no longer able to grow pubic hair, leaving ${him} hairless and smooth. `;
 						break;
 					case "waxed":
 						r += `${He}'s waxed and smooth. `;
@@ -5589,7 +5588,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `Lack of hood combined with its size means ${he} can't wear any clothes without being constantly stimulated. `;
+							r += `${His} lack of hood, combined with its size, means ${he} can't wear any clothes without being constantly stimulated. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
@@ -5598,13 +5597,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							}
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
@@ -5623,21 +5622,21 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `${His} small hood is no longer able to cover it completely and large part of ${his} clitoris is always exposed. `;
+							r += `${His} small hood is no longer able to cover it completely, and a large part of ${his} clitoris is always exposed. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
 							} else {
 								r += `${His} clit is enormous, almost a pseudophallus. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else if (child.foreskin === 2) {
 						if (child.clit === 1) {
@@ -5663,18 +5662,18 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							r += `It's large enough that the hood can cover only half of it. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else if (child.foreskin === 3) {
 						if (child.clit === 1) {
@@ -5683,7 +5682,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is quite large. `;
 							}
-							r += `The hood covering it is quite large making stimulation difficult. `;
+							r += `However, the hood covering it is also quite large, making stimulation difficult. `;
 						} else if (child.clit === 2) {
 							if (child.devotion > 50) {
 								r += `${His} clit is huge and visibly erect. `;
@@ -5697,21 +5696,21 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is enormous, almost a pseudophallus. `;
 							}
-							r += `${His} large hood covers all but the tip of ${his} clit even when aroused. `;
+							r += `${His} large hood covers all but the tip of ${his} clit, even when aroused. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 							r += `Even ${his} large hood can't cover it, leaving over half of the clit exposed. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else {
 						if (child.clit === 1) {
@@ -5720,14 +5719,14 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is quite large. `;
 							}
-							r += `${His} large thick hood covering it makes any stimulation difficult. `;
+							r += `However, the large, thick hood covering it makes any stimulation difficult. `;
 						} else if (child.clit === 2) {
 							if (child.devotion > 50) {
 								r += `${His} clit is huge and visibly erect. `;
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `${His} large thick hood covering it makes any stimulation difficult. `;
+							r += `However, the large, thick hood covering it makes any stimulation difficult. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
@@ -5737,14 +5736,14 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							r += `Matching its size is the thick hood covering it. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 							r += `${His} large hood covering over half of it adds to its penis-like appearance. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect, since lack of erectile tissues means it can never reach full erection. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never reach full erection. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
@@ -5797,13 +5796,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 			if (child.vagina === -1) {
 				r += `${V.seeDicks < 100 && child.anus > 0 ? `Since ${he} lacks a vagina, ${he} takes it up ${V.seeRace ? `${his} ${child.race}` : `the`} ass instead.` : ``}`;
 			} else if (child.skill.vaginal >= 100) {
-				r += `${He} is a <span class="aquamarine">vanilla sex master.</span> `;
+				r += `${He} is a <span class="skill">vanilla sex master.</span> `;
 			} else if (child.skill.vaginal > 60) {
-				r += `${He} is a <span class="aquamarine">vanilla sex expert.</span> `;
+				r += `${He} is a <span class="skill">vanilla sex expert.</span> `;
 			} else if (child.skill.vaginal > 30) {
-				r += `${He} is <span class="aquamarine">skilled at vanilla sex.</span> `;
+				r += `${He} is <span class="skill">skilled at vanilla sex.</span> `;
 			} else if (child.skill.vaginal > 10) {
-				r += `${He} has <span class="aquamarine">basic knowledge about vanilla sex.</span> `;
+				r += `${He} has <span class="skill">basic knowledge about vanilla sex.</span> `;
 			} else {
 				r += `${He} is unskilled at vaginal sex. `;
 			}
@@ -6167,12 +6166,12 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 
 			r += `${He} was born in ${arcology.name} ${weeksOwned} week${weeksOwned !== 1 ? `s` : ``} ago`;
 
-			let oral = child.counter.oral,
-				vaginal = child.counter.vaginal,
-				anal = child.counter.oral,
-				mammary = child.counter.mammary,
-				penetrative = child.counter.penetrative,
-				total = oral + vaginal + anal + mammary + penetrative;
+			let oral = child.counter.oral;
+			let vaginal = child.counter.vaginal;
+			let anal = child.counter.oral;
+			let mammary = child.counter.mammary;
+			let penetrative = child.counter.penetrative;
+			let total = oral + vaginal + anal + mammary + penetrative;
 
 			if (total > 0) {
 				r += ` and has been fucked about ${total} times, including `;
@@ -7313,13 +7312,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 				r += `${He} is somewhat entertaining. `;
 			}
 		} else if (child.skill.entertainment <= 30) {
-			r += `${He} is <span class="aquamarine">reasonably entertaining.</span> `;
+			r += `${He} is <span class="skill">reasonably entertaining.</span> `;
 		} else if (child.skill.entertainment <= 60) {
-			r += `${He} is a <span class="aquamarine">skilled entertainer.</span> `;
+			r += `${He} is a <span class="skill">skilled entertainer.</span> `;
 		} else if (child.skill.entertainment < 100) {
-			r += `${He} is an <span class="aquamarine">expert entertainer.</span> `;
+			r += `${He} is an <span class="skill">expert entertainer.</span> `;
 		} else {
-			r += `${He} is a <span class="aquamarine">master of entertainment.</span> `;
+			r += `${He} is a <span class="skill">master of entertainment.</span> `;
 		}
 	} else {
 		if (child.skill.entertainment <= 10) {
@@ -7329,13 +7328,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 				r += `${He} is somewhat entertaining and `;
 			}
 		} else if (child.skill.entertainment <= 30) {
-			r += `${He} is <span class="aquamarine">reasonably entertaining</span> and `;
+			r += `${He} is <span class="skill">reasonably entertaining</span> and `;
 		} else if (child.skill.entertainment <= 60) {
-			r += `${He} is a <span class="aquamarine">skilled entertainer</span> and `;
+			r += `${He} is a <span class="skill">skilled entertainer</span> and `;
 		} else if (child.skill.entertainment < 100) {
-			r += `${He} is an <span class="aquamarine">expert entertainer</span> and `;
+			r += `${He} is an <span class="skill">expert entertainer</span> and `;
 		} else {
-			r += `${He} is a <span class="aquamarine">master of entertainment</span> and `;
+			r += `${He} is a <span class="skill">master of entertainment</span> and `;
 		}
 	}
 	if (child.skill.whoring <= 10) {
@@ -7348,22 +7347,22 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 		if (child.skill.entertainment <= 10) {
 			r += `${He} `;
 		}
-		r += `has <span class="aquamarine">basic experience as a prostitute.</span> `;
+		r += `has <span class="skill">basic experience as a prostitute.</span> `;
 	} else if (child.skill.whoring <= 60) {
 		if (child.skill.entertainment <= 10) {
 			r += `${He} is `;
 		}
-		r += `a <span class="aquamarine">skilled streetwalker.</span> `;
+		r += `a <span class="skill">skilled streetwalker.</span> `;
 	} else if (child.skill.whoring < 100) {
 		if (child.skill.entertainment <= 10) {
 			r += `${He} is `;
 		}
-		r += `an <span class="aquamarine">expert working ${boy}.</span> `;
+		r += `an <span class="skill">expert working ${boy}.</span> `;
 	} else {
 		if (child.skill.entertainment <= 10) {
 			r += `${He} is `;
 		}
-		r += `a <span class="aquamarine">masterful whore.</span> `;
+		r += `a <span class="skill">masterful whore.</span> `;
 	}
 
 	if (child.custom.desc !== "" && jsDef(child.custom.desc)) {
@@ -7705,7 +7704,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 	}
 
 	if (child.skill.combat > 0) {
-		r += `${He} is <span class="aquamarine"skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edges weapons, and ${his} limbs `;
+		r += `${He} is <span class="skill"skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edges weapons, and ${his} limbs `;
 		if (getLimbCount(child, 105) > 1) {
 			r += `would be deadly weapons even if they weren't full of deadly weapons already`;
 		} else if (!isAmputee(child)) {
diff --git a/src/npc/databases/dSlavesDatabase.js b/src/npc/databases/dSlavesDatabase.js
index 3babb1d13d5be621e53226035c6aa486d96b4c78..ad54ecb0f19c29801efaaf794927a85c11b04848 100644
--- a/src/npc/databases/dSlavesDatabase.js
+++ b/src/npc/databases/dSlavesDatabase.js
@@ -4716,5 +4716,5 @@ App.Data.HeroSlaves.Dextreme = [
 {
 	 App.Entity.SlaveState.makeSkeleton()},
 {
-	slaveName: "STANDARD", birthName: "STANDARD", ID: _i++, actualAge: 21, physicalAge: 21, visualAge: 21, ovaryAge: 21, health: {condition: 20}, devotion: 60, origHColor: "blonde", pubicHColor: "blonde", origSkin: "white", hStyle: "long", boobs: 500, butt: 3, vagina: 1, vaginaLube: 1, anus: 1, anusTat: "bleached", skill: {vaginal: 0, skill: {oral: 0, skill: {anal: 0, attrXY: 40, fetishKnown: 1},
+	slaveName: "STANDARD", birthName: "STANDARD", ID: i++, actualAge: 21, physicalAge: 21, visualAge: 21, ovaryAge: 21, health: {condition: 20}, devotion: 60, origHColor: "blonde", pubicHColor: "blonde", origSkin: "white", hStyle: "long", boobs: 500, butt: 3, vagina: 1, vaginaLube: 1, anus: 1, anusTat: "bleached", skill: {vaginal: 0, skill: {oral: 0, skill: {anal: 0, attrXY: 40, fetishKnown: 1},
 */
diff --git a/src/npc/databases/ddSlavesDatabase.js b/src/npc/databases/ddSlavesDatabase.js
index 0bc4e7c5aafba1bd0d6907bd7e846ad96f40c32f..b0a33c8f6d308f783baab53a22b0bf788cec976c 100644
--- a/src/npc/databases/ddSlavesDatabase.js
+++ b/src/npc/databases/ddSlavesDatabase.js
@@ -1,5 +1,4 @@
 /* eslint-disable camelcase */
-// _i = 800000},
 
 /**
  * @typedef {object} missingProperties
@@ -1727,5 +1726,5 @@ App.Data.HeroSlaves.DDextreme = [
 ];
 
 /*
-{slaveName = "STANDARD", birthName = "STANDARD", ID = _i++, actualAge = 21, physicalAge = 21, visualAge = 21, ovaryAge = 21, health: {condition: 20}, devotion = 60, origSkin = "white", origHColor = "blonde", pubicHColor = "blonde", hLength = 20, boobs = 300, butt = 1, vagina = -1, preg = -2, dick = 2, anus = 1, balls = 1, scrotum = 1, anusTat = "bleached", skill.oral = 15, skill.anal = 15, attrXX = 40, attrXY = 40, fetishKnown = 1},
+{slaveName = "STANDARD", birthName = "STANDARD", ID = i++, actualAge = 21, physicalAge = 21, visualAge = 21, ovaryAge = 21, health: {condition: 20}, devotion = 60, origSkin = "white", origHColor = "blonde", pubicHColor = "blonde", hLength = 20, boobs = 300, butt = 1, vagina = -1, preg = -2, dick = 2, anus = 1, balls = 1, scrotum = 1, anusTat = "bleached", skill.oral = 15, skill.anal = 15, attrXX = 40, attrXY = 40, fetishKnown = 1},
 */
diff --git a/src/npc/databases/dfSlavesDatabase.js b/src/npc/databases/dfSlavesDatabase.js
index f630aafa1e1f0ab543b8596a19cd49521e6eba78..8f7bda7f28c0cfecd1960a16f04547236ad43b8f 100644
--- a/src/npc/databases/dfSlavesDatabase.js
+++ b/src/npc/databases/dfSlavesDatabase.js
@@ -1,5 +1,4 @@
 /* eslint-disable camelcase */
-// _i: 700000},
 
 /**
  * @type {Partial<partialSlaveState>[]}
diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index f2955f0358d7c4fd21d1d4117b7a84b376198859..3c2b157096380ef2eb40d3a78ec44c98a621c0cf 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -8,7 +8,7 @@
 App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 	const r = [];
 	const {
-		he, him, his, hers, himself, girl, He, His, loli
+		he, him, his, himself, girl, He, His, loli
 	} = getPronouns(slave);
 	const isBellyHeavy =
 		(slave.belly >= 100000 + (slave.muscles * 500) && slave.physicalAge <= 3) ||
@@ -174,6 +174,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 		const r = [];
 		if (slave.belly >= 1000000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is swollen beyond any reasonable description,`);
 				if (slave.physicalAge <= 3) {
@@ -272,6 +273,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 750000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He}`);
 				if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -470,6 +472,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 600000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is dangerously pregnant,`);
 				if (slave.physicalAge <= 3) {
@@ -697,6 +700,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 450000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is immensely pregnant,`);
 				if (slave.physicalAge <= 3) {
@@ -889,7 +893,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 300000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is massively pregnant, dwarfing any normal pregnancy,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${he} is nearly spherical. ${His} toddlerish form is utterly dwarfed by ${his} pregnancy, all ${he} can do is lean against it.`);
@@ -938,7 +943,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
-					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
+					r.push(`and ${he} is more belly than ${girl}. While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
 					if (canWalk(slave)) {
 						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
 					} else if (canStand(slave)) {
@@ -1017,7 +1022,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
-					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
+					r.push(`and ${he} is more belly than ${girl}. While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
 					if (canWalk(slave)) {
 						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
 					} else if (canStand(slave)) {
@@ -1047,6 +1052,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 150000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is massively pregnant, beyond any typical pregnancy,`);
 				if (slave.physicalAge <= 3) {
@@ -1224,6 +1230,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 120000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is massively pregnant,`);
 				if (slave.physicalAge <= 3) {
@@ -1358,7 +1365,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 105000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1494,6 +1502,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 90000) {
 			if (isBellyFluidLargest) {
+				// TODO: write me
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
@@ -1620,7 +1629,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 75000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1752,7 +1762,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 60000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1884,7 +1895,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 45000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1982,7 +1994,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 30000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -2078,7 +2091,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			}
 		} else if (slave.belly >= 15000) {
 			if (isBellyFluidLargest) {
-			} else if (slave.bellyPreg > 0) {
+				// TODO: write me
+			}  else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -10983,6 +10997,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly takes advantage ${his} exposed midriff and unfastened jeans to massively jut out from ${his} body.`);
 						} else {
@@ -10990,6 +11005,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly takes advantage ${his} exposed midriff and unfastened jeans to massively jut out from ${his} body.`);
 						} else {
@@ -10997,6 +11013,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly takes advantage ${his} exposed midriff and unfastened jeans to hang heavily from ${his} body.`);
 						} else {
@@ -11004,6 +11021,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly dominates ${his} exposed midriff and thwarts any efforts to zip up ${his} fly.`);
 						} else {
@@ -11015,6 +11033,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s exposed midriff and unfastened jeans fully display ${his} huge pregnancy.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s exposed midriff and unfastened jeans prominently display ${his} huge implant-filled belly.`);
 						} else {
@@ -11069,6 +11088,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					// WIP//
 					} else if (slave.belly >= 750000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s monolithic implant-filled belly adds tremendously to ${his} slutty appearance.`);
 						} else {
@@ -11076,6 +11096,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly really adds to ${his} slutty appearance.`);
 						} else {
@@ -11083,6 +11104,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly really adds to ${his} slutty appearance.`);
 						} else {
@@ -11090,6 +11112,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly really adds to ${his} slutty appearance.`);
 						} else {
@@ -11097,6 +11120,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly adds to ${his} slutty appearance.`);
 						} else {
@@ -11108,6 +11132,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a large empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant belly adds to ${his} slutty appearance.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly adds to ${his} slutty appearance.`);
 						} else {
@@ -11162,6 +11187,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					// WIP//
 					} else if (slave.belly >= 750000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s monolithic implant-filled belly eclipses ${his} miniskirt and leaves little to hold up ${his} thong.`);
 						} else {
@@ -11169,6 +11195,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly eclipses ${his} miniskirt and leaves little to hold up ${his} thong.`);
 						} else {
@@ -11176,6 +11203,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly eclipses ${his} miniskirt and leaves little to hold up ${his} thong.`);
 						} else {
@@ -11183,6 +11211,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly eclipses ${his} miniskirt and leaves little to hold up ${his} thong.`);
 						} else {
@@ -11190,6 +11219,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly forces ${his} thong strings to tightly hug its curvature as it hangs low enough to obscure ${his} miniskirt completely.`);
 						} else {
@@ -11201,6 +11231,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s miniskirt is trapped beneath ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s miniskirt is trapped beneath ${his} huge implant-filled belly and ${his} thong strings forced to caress its curves.`);
 						} else {
@@ -11255,6 +11286,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					// WIP//
 					} else if (slave.belly >= 750000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset attempts to cradle, rather than bind, ${his} monolithic implant-filled belly, but the sheer size of ${his} artificial bump forces the ribs wide, exposing the thinning cloth beneath.`);
 						} else {
@@ -11262,6 +11294,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset attempts to cradle, rather than bind, ${his} titanic implant-filled belly, but the sheer size of ${his} artificial bump forces the ribs wide, exposing the thin cloth beneath.`);
 						} else {
@@ -11269,6 +11302,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset cradles, rather than binds, ${his} gigantic implant-filled belly, but the sheer size of ${his} artificial bump forces the ribs wide, exposing the thin cloth beneath.`);
 						} else {
@@ -11276,6 +11310,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset cradles, rather than binds, ${his} massive implant-filled belly, but the sheer size of ${his} artificial bump forces the ribs wide, exposing the thin cloth beneath.`);
 						} else {
@@ -11283,6 +11318,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset cradles, rather than binds, ${his} giant implant-filled belly.`);
 						} else {
@@ -11292,6 +11328,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						r.push(`${slave.slaveName}'s corset cradles, rather than binds, ${his} massively fat belly, though the ribs still create deep ravines of succulent flesh.`);
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s corset cradles, rather than binds, ${his} huge implant-filled belly.`);
 						} else {
@@ -11301,6 +11338,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant belly strains the ribs of ${his} corset.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly strains the ribs of ${his} corset.`);
 						} else {
@@ -11369,6 +11407,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled stomach hangs out the front of ${his} suit jacket and blouse as there is no way ${he} could ever come close to closing them. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11376,6 +11415,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled stomach hangs out the front of ${his} suit jacket and blouse as there is no way ${he} could ever come close to closing them. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11383,6 +11423,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled stomach hangs out the front of ${his} suit jacket and blouse as there is no way ${he} could ever come close to closing them. ${His} skirt is shoved so low by the ponderous mass it barely hides ${his} crotch, though ${his} inflated middle more than covers for it.`);
 						} else {
@@ -11390,6 +11431,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled stomach hangs out the front of ${his} suit jacket and blouse as there is no way ${he} could ever come close to closing them. ${He}'s so bulbous, ${his} skirt is forced scandalously low beneath ${his} inflated middle.`);
 						} else {
@@ -11401,6 +11443,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant stomach hangs out the front of ${his} suit jacket and blouse, as there is no way ${he} could close them.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly hangs out the front of ${his} suit jacket and blouse, as there is no way ${he} could close them.`);
 						} else {
@@ -11469,6 +11512,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled stomach hangs out the front of ${his} specially tailored blouse and jacket as there is no way ${he} could ever come close to closing them. ${His} skirt is loosely held together by strained straps, as ${his} immensity guarantees ${he}'ll burst any seams on a proper garment.`);
 						} else {
@@ -11476,6 +11520,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled stomach hangs out the front of ${his} specially tailored blouse and jacket as there is no way ${he} could ever come close to closing them. ${His} skirt is loosely held together by straps, as ${his} immensity guarantees ${he}'ll burst any seams on a proper garment.`);
 						} else {
@@ -11483,6 +11528,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled stomach hangs out the front of ${his} specially tailored blouse and jacket as there is no way ${he} could ever come close to closing them. ${His} skirt is loosely held together by straps, as ${his} immensity guarantees ${he}'ll burst any seams on a proper garment.`);
 						} else {
@@ -11490,6 +11536,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled stomach hangs out the front of ${his} specially tailored blouse and jacket as there is no way for ${him} to close them. ${He}'s so bulbous, ${his} maternity skirt has stretched to its limit.`);
 						} else {
@@ -11501,6 +11548,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant stomach hangs out the front of ${his} specially tailored blouse and jacket as there is no way for ${him} to close them. ${His} maternity skirt fits ${him} quite well, though.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly hangs out the front of ${his} specially tailored blouse and jacket as there is no way for ${him} to close them. ${His} maternity skirt fits ${him} quite well, though.`);
 						} else {
@@ -11569,6 +11617,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit has been specially tailored to drape over ${his} titanic, implant-filled belly and sensually accentuate its size and shape.`);
 						} else {
@@ -11576,6 +11625,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit has been specially tailored to drape over ${his} gigantic implant-filled belly and sensually accentuate its size and shape.`);
 						} else {
@@ -11583,6 +11633,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} massive implant-filled belly and the unique motions it takes to move it.`);
 						} else {
@@ -11590,6 +11641,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} giant implant-filled belly and the wide movements ${he} makes with it.`);
 						} else {
@@ -11597,6 +11649,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} huge implant-filled belly and the wide movements ${he} makes with it.`);
 						} else {
@@ -11608,6 +11661,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} huge implant-filled belly.`);
 						} else {
@@ -11672,6 +11726,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit stretches across ${his} titanic implant-filled belly and draws the eye right to the small bump on its smooth surface, ${his} flattening navel.`);
 						} else {
@@ -11679,6 +11734,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit stretches across ${his} gigantic implant-filled belly and draws the eye right to the deminishing bump on its smooth surface, ${his} navel.`);
 						} else {
@@ -11686,6 +11742,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit stretches over ${his} massive implant-filled belly and draws the eye right to the sole bump on its smooth surface, ${his} navel.`);
 						} else {
@@ -11693,6 +11750,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit stretches over ${his} giant implant-filled belly and draws the eye right to ${his} protruding navel.`);
 						} else {
@@ -11700,6 +11758,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 60000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit stretches over ${his} huge implant-filled belly and draws the eye right to ${his} protruding navel.`);
 						} else {
@@ -11711,6 +11770,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} huge implant-filled belly, displaying ${his} popped navel.`);
 						} else {
@@ -11779,6 +11839,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} titanic implant-filled belly, requiring ${him} to hold ${his} nurse's jacket together under ${his} breasts with a length of red silk ribbon. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11786,6 +11847,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} gigantic implant-filled belly, requiring ${him} to hold ${his} nurse's jacket together under ${his} breasts with a length of red silk ribbon. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11793,6 +11855,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} massive implant-filled belly, requiring ${him} to hold ${his} nurse's jacket together under ${his} breasts with a length of red silk ribbon. ${His} skirt is shoved so low by the ponderous mass it barely hides ${his} crotch, though ${his} inflated middle more than covers for it.`);
 						} else {
@@ -11800,6 +11863,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} gaint implant-filled belly, leaving ${him} with only a single straining button to keep ${his} attire together. ${He}'s so bulbous, ${his} skirt is forced scandalously low beneath ${his} inflated middle.`);
 						} else {
@@ -11811,6 +11875,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} huge pregnant belly, leaving ${him} with only the button below ${his} breasts done.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s jacket fails to even come close to closing over ${his} huge implant-filled belly, leaving ${him} with only the button below ${his} breasts done.`);
 						} else {
@@ -11879,6 +11944,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s blouse rests atop ${his} titanic implant-filled belly, showing off the result of ${his} promiscuity. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11886,6 +11952,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled stomach hangs out the front of ${his} suit jacket and blouse as there is no way ${he} could ever come close to closing them. ${His} skirt is shoved down by the heavy mass, but ${his} overfilled middle draws attention away from ${his} exposed nethers.`);
 						} else {
@@ -11893,6 +11960,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s blouse meekly rests atop ${his} massive implant-filled belly. ${His} skirt is shoved so low by the ponderous mass it barely hides ${his} crotch, though ${his} inflated middle more than covers for it.`);
 						} else {
@@ -11900,6 +11968,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s blouse meekly rests atop ${his} giant implant-filled belly, while it itself forces ${his} skirt scandalously low.`);
 						} else {
@@ -11907,6 +11976,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s blouse can no longer stretch over ${his} huge implant-filled belly, while it itself forces ${his} skirt dangerously low, leaving ${him} looking the part of a school slut.`);
 						} else {
@@ -11918,6 +11988,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s blouse barely covers the top of ${his} huge pregnant belly, while it itself forces ${his} skirt dangerously low, leaving ${him} looking the part of a school slut.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s blouse barely covers the top of ${his} huge implant-filled belly, while it itself forces ${his} skirt dangerously low, leaving ${him} looking the part of a school slut.`);
 						} else {
@@ -11986,6 +12057,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly parts ${his} kimono, since it is impossible to fold over such a bulging swell, leaving it gracefully covering ${his} sides.`);
 						} else {
@@ -11993,6 +12065,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly parts ${his} kimono, since it is impossible to fold over such a bulging swell, leaving it gracefully covering ${his} sides.`);
 						} else {
@@ -12000,6 +12073,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly parts ${his} kimono, leaving it gracefully covering its sides.`);
 						} else {
@@ -12007,6 +12081,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 150000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly has triumphed over ${his} kimono; ${he} has become so gravid it is simply no longer possible to properly fold the garment around ${himself}.`);
 						} else {
@@ -12014,6 +12089,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly tests the limits of ${his} kimono; any larger and ${he} simply won't be capable of folding it over ${his} enormity.`);
 						} else {
@@ -12025,6 +12101,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant belly fills out ${his} kimono; ${his} obi is tied above its swell ${his} for convenience.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly fills out ${his} kimono; ${his} obi tied above its swell ${his} for convenience.`);
 						} else {
@@ -12093,6 +12170,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tank top rests atop the titanic implant-filled belly bulging from ${his} fatigues, which are left unfastened to give ${his} overfilled implant the space it needs to hang heavily. ${He} clearly found it more productive to battle ${his} enemies in the bedroom than in the field.`);
 						} else {
@@ -12100,6 +12178,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tank top rests atop the gigantic implant-filled belly bulging from ${his} fatigues, which are left unfastened to give ${his} overfilled implant more room. ${He} clearly spent more time in bed than out in the field.`);
 						} else {
@@ -12107,6 +12186,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tank top rests atop the massive implant-filled belly bulging from ${his} unfastened fatigues, leaving ${him} looking like someone who fucked all the locals.`);
 						} else {
@@ -12114,6 +12194,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tank top rests atop the giant implant-filled belly bulging from ${his} unfastened fatigues, leaving it clear who the favorite recruit of the platoon was.`);
 						} else {
@@ -12125,6 +12206,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s tank top rests atop the huge pregnant belly bulging from ${his} unfastened fatigues, leaving ${him} looking like someone who had too much fun on shore leave.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tank top rests atop the huge implant-filled belly bulging from ${his} unfastened fatigues, leaving ${him} looking like someone who had too much fun on shore leave.`);
 						} else {
@@ -12179,6 +12261,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					// WIP//
 					} else if (slave.belly >= 750000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the massively gravid, even if they are just pretending. Its material tightly clings to ${his} monolithic implant-filled belly while offering a diamond window to display ${his} popped navel and a massive expanse of skin around it.`);
 						} else {
@@ -12186,6 +12269,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the massively gravid, even if they are just pretending. Its material tightly clings to ${his} titanic implant-filled belly while offering a diamond window to display ${his} popped navel and an expanse of skin around it.`);
 						} else {
@@ -12193,6 +12277,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the massively gravid, even if they are just pretending. Its material tightly clings to ${his} gigantic implant-filled belly while offering a diamond window to display ${his} popped navel and an expanse of skin around it.`);
 						} else {
@@ -12200,6 +12285,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the hugely gravid, even if they are just pretending. Its material tightly clings to ${his} massive implant-filled belly while offering a diamond window to display ${his} popped navel and an expanse of skin around it.`);
 						} else {
@@ -12207,6 +12293,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the hugely gravid, even if they are just pretending. Its material tightly hugs ${his} giant implant-filled belly while offering a diamond window to display ${his} popped navel and surrounding skin.`);
 						} else {
@@ -12214,6 +12301,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is specially designed to flatter the hugely gravid, even if they are just pretending. Its material tightly hugs ${his} huge implant-filled belly while offering a diamond window to display ${his} popped navel.`);
 						} else {
@@ -12225,6 +12313,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is strained by ${his} huge pregnant belly. ${His} popped navel prominently pokes through its front.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s beautiful halter top dress is strained by ${his} huge implant-filled belly. ${His} popped navel prominently pokes through its front.`);
 						} else {
@@ -12287,6 +12376,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown has been retailored to expose ${his} titanic implant-filled belly while giving it the attention it demands.`);
 						} else {
@@ -12294,6 +12384,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown has been retailored to expose ${his} gigantic implant-filled belly while still maintaining its beauty.`);
 						} else {
@@ -12301,6 +12392,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown is tailored to embrace a bulging middle, but ${his} massive implant-filled belly pushes it to its limit. It strains as it tightly hugs the sizeable mass extending from ${his} front.`);
 						} else {
@@ -12308,6 +12400,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown is tailored to not only embrace ${his} giant implant-filled belly, but draw attention to its sheer size.`);
 						} else {
@@ -12315,6 +12408,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown is tailored to not only embrace ${his} huge implant-filled belly, but draw attention to its size and shape.`);
 						} else {
@@ -12326,6 +12420,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown is tailored to not only fit ${his} huge pregnant belly, but draw attention to it.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s fabulous silken ball gown is tailored to not only fit ${his} huge implant-filled belly, but draw attention to it.`);
 						} else {
@@ -12388,6 +12483,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bangles are linked by a dozen long golden chains to a ring around ${his} popped out belly button. The chains tinkle metallically as they shift with ${his} movements.`);
 						} else {
@@ -12395,6 +12491,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bangles are linked by several long golden chains to a ring around ${his} popped out belly button. The chains tinkle metallically as they shift with ${his} movements.`);
 						} else {
@@ -12402,6 +12499,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bangles are linked by a long golden chain to a ring around ${his} popped out belly button. The chain tinkles metallically as it shifts with ${his} movements.`);
 						} else {
@@ -12409,6 +12507,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bangles include several long thin chains that drape across ${his} giant implant-filled belly.`);
 						} else {
@@ -12420,6 +12519,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s bangles include several long thin chains that drape across ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s bangles include several long thin chains that drape across ${his} huge implant-filled belly.`);
 						} else {
@@ -12482,6 +12582,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s specially tailored leotard can barely contain the curve of ${his} titanic implant-filled belly, clearly displaying ${his} popped navel. The material tightly clings to the center of ${his} gravidity, leaving ${his} sides completely exposed.`);
 						} else {
@@ -12489,6 +12590,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s specially tailored leotard highlights the curvature of ${his} gigantic implant-filled belly. The material tightly clings to ${his} popped navel and shows a lot of skin through the sides.`);
 						} else {
@@ -12496,6 +12598,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s specially tailored leotard highlights the curvature of ${his} massive implant-filled belly. The material tightly clings to ${his} popped navel and shows a lot of skin through the sides.`);
 						} else {
@@ -12503,6 +12606,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 150000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s specially tailored leotard highlights the curvature of ${his} giant implant-filled belly. The material tightly clings to ${his} popped navel and now only shows a little skin through the sides.`);
 						} else {
@@ -12510,6 +12614,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s leotard is stretched to its absolute limit trying to contain the swell of ${his} giant implant-filled belly, tightly clinging to what it can cover and prominently displaying ${his} popped navel. The sides of ${his} gravidity are completely exposed by the overwhelmed garment, and the sheer size of ${his} bulging middle threatens to pull the thin spandex away from ${his} crotch.`);
 						} else {
@@ -12517,6 +12622,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight leotard can barely contain the curve of ${his} huge implant-filled belly, clearly displaying ${his} popped navel. The material tightly clings to the center of ${his} gravidity, leaving ${his} sides completely exposed.`);
 						} else {
@@ -12528,6 +12634,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s tight leotard highlights the curvature of ${his} huge pregnant belly. The material tightly clings to ${his} popped navel and shows a lot of skin through the sides.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight leotard highlights the curvature of ${his} huge implant-filled belly. The material tightly clings to ${his} popped navel and shows a lot of skin through the sides.`);
 						} else {
@@ -12590,6 +12697,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit stretches across ${his} titanic implant-filled belly and draws the eye right to the small bump on its smooth surface, ${his} flattening navel.`);
 						} else {
@@ -12597,6 +12705,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit stretches across ${his} gigantic implant-filled belly and draws the eye right to the deminishing bump on its smooth surface, ${his} navel.`);
 						} else {
@@ -12604,6 +12713,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit stretches over ${his} massive implant-filled belly and draws the eye right to the sole bump on its smooth surface, ${his} navel.`);
 						} else {
@@ -12611,6 +12721,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit stretches over ${his} giant implant-filled belly and draws the eye right to ${his} protruding navel.`);
 						} else {
@@ -12618,6 +12729,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 60000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit stretches over ${his} huge implant-filled belly and draws the eye right to ${his} protruding navel.`);
 						} else {
@@ -12629,6 +12741,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s tight bodysuit shows off the curvature of ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s tight bodysuit clings to ${his} huge implant-filled belly, prominently displaying ${his} popped navel.`);
 						} else {
@@ -12796,6 +12909,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					// WIP//
 					} else if (slave.belly >= 750000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through in the hopes of keeping material from slipping to the side of ${his} monolithic implant-filled belly. Since ${his} navel has begun to pull flat, however, the tension does that job instead.`);
 						} else {
@@ -12803,6 +12917,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} titanic implant-filled belly, though the tension does a good enough job on its own.`);
 						} else {
@@ -12810,6 +12925,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} gigantic implant-filled belly, though the tension does a good enough job on its own.`);
 						} else {
@@ -12817,6 +12933,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} massive implant-filled belly, though the tension does a good enough job on its own.`);
 						} else {
@@ -12824,6 +12941,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} giant implant-filled belly.`);
 						} else {
@@ -12831,6 +12949,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} huge implant-filled belly.`);
 						} else {
@@ -12842,6 +12961,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} huge pregnant belly.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`The strip of cloth running down ${his} front has a diamond-shaped hole for ${his} navel to poke through, keeping the material from slipping to the side of ${his} huge implant-filled belly.`);
 						} else {
@@ -12905,6 +13025,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is specially designed to accommodate such a absurdly swollen ${girl} and comes with a gap in the front for ${his} titanic implant-filled belly to bulge through.`);
 						} else {
@@ -12912,6 +13033,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is specially designed to accommodate such a massively swollen ${girl} and comes with a gap in the front for ${his} gigantic implant-filled belly to bulge through.`);
 						} else {
@@ -12919,6 +13041,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is specially designed to accommodate such a hugely swollen ${girl} and comes with a gap in the front for ${his} massive implant-filled belly to bulge through.`);
 						} else {
@@ -12926,6 +13049,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is specially designed with a gap in the front for ${his} giant implant-filled belly to bulge through.`);
 						} else {
@@ -12933,6 +13057,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 30000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is carefully fitted to contain ${his} huge implant-filled belly, but only emphasizes just how large ${he} has gotten.`);
 						} else {
@@ -12944,6 +13069,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s teddy is filled to its limit by ${his} huge pregnant belly. ${His} popped navel prominently pokes through the taut material.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s teddy is filled to its limit by ${his} huge implant-filled belly. ${His} popped navel prominently pokes through the taut material.`);
 						} else {
@@ -13012,6 +13138,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly completely hides ${his} silken panties and takes full advantage of its lack of restriction to bulge massively. ${His} silken vest sensually frames what little it can of ${his} immense middle.`);
 						} else {
@@ -13019,6 +13146,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly completely hides ${his} silken panties and takes full advantage of its freedom to hang heavily. ${His} silken vest sensually frames what little it can of ${his} immense middle.`);
 						} else {
@@ -13026,6 +13154,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly completely hides ${his} silken panties and takes full advantage of its freedom to hang heavily. ${His} silken vest sensually frames what it can of ${his} immense middle.`);
 						} else {
@@ -13033,6 +13162,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly completely hides ${his} silken panties and bulges heavily from ${his} body. ${His} silken vest sensually frames ${his} ponderous middle.`);
 						} else {
@@ -13042,6 +13172,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						r.push(`${slave.slaveName}'s massively fat belly completely hides ${his} silken panties. ${His} silken vest struggles to sensually frame ${his} immense, jiggly gut while dwarfed by it.`);
 					} else if (slave.belly >= 15000 || (slave.bellyAccessory === "a huge empathy belly")) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly completely hides ${his} silken panties. ${His} silken vest sensually frames ${his} ponderous stomach.`);
 						} else {
@@ -13110,6 +13241,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly stretches ${his} once loose dress into a more form fitting attire. It is specially tailored to be modest yet draw attention to ${his} abnormaly large middle.`);
 						} else {
@@ -13117,6 +13249,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly completely fills ${his} once loose dress. It is specially tailored to be modest yet draw attention to ${his} abnormaly large middle.`);
 						} else {
@@ -13124,6 +13257,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly fills ${his} once loose dress. It is specially tailored to be modest yet draw attention to ${his} spectacular middle.`);
 						} else {
@@ -13131,6 +13265,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly fills out ${his} loose dress. It is specially tailored to be modest yet draw attention to ${his} expanded middle.`);
 						} else {
@@ -13142,6 +13277,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant belly fills out ${his} loose dress. It is specially tailored to be modest yet draw attention to ${his} pregnancy.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly fills out ${his} loose dress. It is specially tailored to be modest yet draw attention to ${his} expanded middle.`);
 						} else {
@@ -13204,6 +13340,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 600000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s titanic implant-filled belly takes full advantage of ${his} exposed midriff to hang heavily from ${his} body.`);
 						} else {
@@ -13211,6 +13348,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 450000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s gigantic implant-filled belly takes full advantage of ${his} exposed midriff to hang heavily from ${his} body.`);
 						} else {
@@ -13218,6 +13356,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyPreg >= 300000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s massive implant-filled belly takes full advantage of ${his} exposed midriff to hang heavily from ${his} body.`);
 						} else {
@@ -13225,6 +13364,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.belly >= 120000) {
 						if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s giant implant-filled belly takes full advantage of ${his} exposed midriff to bulge heavily out from ${his} body while pushing ${his} stretch pants low.`);
 						} else {
@@ -13236,6 +13376,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						if (slave.bellyAccessory === "a huge empathy belly") {
 							r.push(`${slave.slaveName}'s huge pregnant belly takes full advantage of ${his} exposed midriff to hang freely and obscure ${his} stretch pants.`);
 						} else if (isBellyFluidLargest) {
+							// TODO: write me
 						} else if (slave.bellyImplant > 0) {
 							r.push(`${slave.slaveName}'s huge implant-filled belly takes full advantage of ${his} exposed midriff to hang freely and obscure ${his} stretch pants.`);
 						} else {
@@ -13306,6 +13447,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.bellyPreg >= 600000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`titanic implant-filled belly`);
 							} else {
@@ -13313,6 +13455,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.bellyPreg >= 450000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`gigantic implant-filled belly`);
 							} else {
@@ -13320,6 +13463,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.bellyPreg >= 300000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`massive implant-filled belly`);
 							} else {
@@ -13327,6 +13471,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.belly >= 120000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`giant implant-filled belly`);
 							} else {
@@ -13334,6 +13479,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.belly >= 30000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`huge implant-filled belly`);
 							} else {
@@ -13345,6 +13491,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							if (slave.bellyAccessory === "a huge empathy belly") {
 								r.push(`huge pregnancy`);
 							} else if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`huge implant-filled belly`);
 							} else {
@@ -13408,6 +13555,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						// wip
 						} else if (slave.belly >= 750000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top cannot even attempt to cover ${his} monolithic belly, only rest atop it, while ${his} spats struggle to stay up beneath the boundless mass.`);
 							} else {
@@ -13415,6 +13563,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.belly >= 600000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top cannot even attempt to cover ${his} titanic belly, only rest atop it, while ${his} spats are left to fend for themselves beneath the oppressive mass.`);
 							} else {
@@ -13422,6 +13571,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.belly >= 450000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top cannot even attempt to cover ${his} gigantic belly, only rest atop it, while ${his} spats are left to fend for themselves beneath the oppressive mass.`);
 							} else {
@@ -13429,6 +13579,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.bellyPreg >= 300000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top cannot even attempt to cover ${his} massive belly, only rest atop it, while ${his} spats are left to fend for themselves beneath the oppressive mass.`);
 							} else {
@@ -13436,6 +13587,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							}
 						} else if (slave.belly >= 120000) {
 							if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top is currently making a laughable attempt at covering ${his} lewd, bulging belly. ${His} spats struggle to manage any of ${his} impressive bulk.`);
 							} else {
@@ -13447,6 +13599,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 							if (slave.bellyAccessory === "a huge empathy belly") {
 								r.push(`${slave.slaveName}'s top is currently making a laughable attempt at covering ${his} lewd, bulging pregnancy, barely covering a fourth of its bulk while ${his} spats are stuck only coming up to its base.`);
 							} else if (isBellyFluidLargest) {
+								// TODO: write me
 							} else if (slave.bellyImplant > 0) {
 								r.push(`${slave.slaveName}'s top is currently making a laughable attempt at covering ${his} lewd, bulging belly, barely covering a fourth of its bulk while ${his} spats are stuck only coming up to its base.`);
 							} else {
diff --git a/src/npc/descriptions/boobs/boobs.js b/src/npc/descriptions/boobs/boobs.js
index 55292879524c6a6d39c3ca9d36250b41fcf81578..895add8e5f5917e346fdcfa3234a431b2201ee34 100644
--- a/src/npc/descriptions/boobs/boobs.js
+++ b/src/npc/descriptions/boobs/boobs.js
@@ -784,7 +784,7 @@ App.Desc.boobs = function() {
 					} else if (slave.boobs > 4000) {
 						r += `${adjNoun} stretch ${his} custom tailored dress to its absolute limit.`;
 					} else if (slave.boobs > 800) {
-						r += `${adjNoun} stretch taut against ${his} dress, leaving nothing to the imagination.`;
+						r += `${adjNoun} stretch ${his} dress taut, leaving nothing to the imagination.`;
 					} else if (slave.boobs < 300) {
 						r += `dress tightly hugs ${his} flat chest, prominently displaying ${his} ${slave.nipples} nipples though the fabric.`;
 					} else {
diff --git a/src/npc/descriptions/butt/anus.js b/src/npc/descriptions/butt/anus.js
index 71af7449aa31c224465a36df9ad46e306da72bae..07ea87021e728df3ff02a5d5f7324cd3eef30a7b 100644
--- a/src/npc/descriptions/butt/anus.js
+++ b/src/npc/descriptions/butt/anus.js
@@ -125,13 +125,13 @@ App.Desc.anus = function(slave, {market, eventDescription} = {}) {
 		}
 	} else {
 		if (slave.skill.anal >= 100) {
-			r.push(`${He} is a <span class="aquamarine">masterful anal slut.</span>`);
+			r.push(`${He} is a <span class="skill">masterful anal slut.</span>`);
 		} else if (slave.skill.anal > 60) {
-			r.push(`${He} is an <span class="aquamarine">expert anal slut.</span>`);
+			r.push(`${He} is an <span class="skill">expert anal slut.</span>`);
 		} else if (slave.skill.anal > 30) {
-			r.push(`${He} is a <span class="aquamarine">skilled anal slut.</span>`);
+			r.push(`${He} is a <span class="skill">skilled anal slut.</span>`);
 		} else if (slave.skill.anal > 10) {
-			r.push(`${He} has <span class="aquamarine">basic knowledge about anal.</span>`);
+			r.push(`${He} has <span class="skill">basic knowledge about anal.</span>`);
 		} else {
 			r.push(`${He} is unskilled at taking anal.`);
 		}
diff --git a/src/npc/descriptions/career.js b/src/npc/descriptions/career.js
index 427f43796960d1635c88fda2b65898b1d3a1d4ef..c0878c988bdbb89086ee8d1252d9aa09700e0085 100644
--- a/src/npc/descriptions/career.js
+++ b/src/npc/descriptions/career.js
@@ -116,7 +116,7 @@ App.Desc.career = function(slave) {
 					}
 				} else if (App.Data.Careers.General.menial.includes(slave.career)) {
 					r.push(`${career}, giving ${him} experience following orders.`);
-				} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+				} else if (App.Data.Careers.General.servant.includes(slave.career)) {
 					r.push(`${career}, giving ${him} a slight edge in housekeeping.`);
 				} else {
 					r.push(`${career}.`);
diff --git a/src/npc/descriptions/crotch/dick.js b/src/npc/descriptions/crotch/dick.js
index 71640d6b11cce2c43ba5d5329659638de96d00a6..a2690b9032d2646420bb13e79b9499644ee4ea68 100644
--- a/src/npc/descriptions/crotch/dick.js
+++ b/src/npc/descriptions/crotch/dick.js
@@ -1207,7 +1207,9 @@ App.Desc.dick = function(slave, {market, eventDescription} = {}) {
 				}
 				r.push(`the hole.`);
 			} else if (slave.fetishKnown === 0) {
+				// TODO: write me
 			} else if (slave.fetishStrength <= 60) {
+				// TODO: write me
 			} else if (slave.fetish === "buttslut") {
 				r.push(`Judging by the`);
 				if (slave.prostate > 1) {
@@ -1389,7 +1391,9 @@ App.Desc.dick = function(slave, {market, eventDescription} = {}) {
 				}
 				r.push(`the hole.`);
 			} else if (slave.fetishKnown === 0) {
+				// TODO: write me
 			} else if (slave.fetishStrength <= 60) {
+				// TODO: write me
 			} else if (slave.fetish === "buttslut") {
 				r.push(`Judging by the`);
 				if (slave.prostate > 1) {
diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js
index 27166ef7533fe81de04e45a1986be128b62da4cd..fe1dbc42cb42291f33bcdb460c1d8b6702b989a8 100644
--- a/src/npc/descriptions/crotch/vagina.js
+++ b/src/npc/descriptions/crotch/vagina.js
@@ -293,7 +293,7 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`Lack of hood combined with its size means ${he} can't wear any clothes without being constantly stimulated.`);
+					r.push(`${His} lack of hood, combined with its size, means ${he} can't wear any clothes without being constantly stimulated.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
@@ -302,13 +302,13 @@ App.Desc.vagina = function(slave) {
 					}
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
@@ -327,28 +327,28 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`${His} small hood is no longer able to cover it completely and large part of ${his} clitoris is always exposed.`);
+					r.push(`${His} small hood is no longer able to cover it completely, and a large part of ${his} clitoris is always exposed.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
 					} else {
 						r.push(`${His} clit is enormous, almost a pseudophallus.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else if (slave.foreskin === 2) {
 				if (slave.clit === 1) {
@@ -374,18 +374,18 @@ App.Desc.vagina = function(slave) {
 					r.push(`It's large enough that the hood can cover only half of it.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else if (slave.foreskin === 3) {
 				if (slave.clit === 1) {
@@ -394,7 +394,7 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is quite large.`);
 					}
-					r.push(`The hood covering it is quite large making stimulation difficult.`);
+					r.push(`However, the hood covering it is also quite large, making stimulation difficult.`);
 				} else if (slave.clit === 2) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is huge and visibly erect.`);
@@ -408,21 +408,21 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is enormous, almost a pseudophallus.`);
 					}
-					r.push(`${His} large hood covers all but the tip of ${his} clit even when aroused.`);
+					r.push(`${His} large hood covers all but the tip of ${his} clit, even when aroused.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 					r.push(`Even ${his} large hood can't cover it, leaving over half of the clit exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else {
 				if (slave.clit === 1) {
@@ -431,14 +431,14 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is quite large.`);
 					}
-					r.push(`${His} large thick hood covering it makes any stimulation difficult.`);
+					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
 				} else if (slave.clit === 2) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is huge and visibly erect.`);
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`${His} large thick hood covering it makes any stimulation difficult.`);
+					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
@@ -448,14 +448,14 @@ App.Desc.vagina = function(slave) {
 					r.push(`Matching its size is the thick hood covering it.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 					r.push(`${His} large hood covering over half of it adds to its penis-like appearance.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect, since lack of erectile tissues means it can never reach full erection.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never reach full erection.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
@@ -621,13 +621,13 @@ App.Desc.vagina = function(slave) {
 				r.push(`ass instead.`);
 			}
 		} else if (slave.skill.vaginal >= 100) {
-			r.push(`${He} is a <span class="aquamarine">vanilla sex master.</span>`);
+			r.push(`${He} is a <span class="skill">vanilla sex master.</span>`);
 		} else if (slave.skill.vaginal > 60) {
-			r.push(`${He} is a <span class="aquamarine">vanilla sex expert.</span>`);
+			r.push(`${He} is a <span class="skill">vanilla sex expert.</span>`);
 		} else if (slave.skill.vaginal > 30) {
-			r.push(`${He} is <span class="aquamarine">skilled at vanilla sex.</span>`);
+			r.push(`${He} is <span class="skill">skilled at vanilla sex.</span>`);
 		} else if (slave.skill.vaginal > 10) {
-			r.push(`${He} has <span class="aquamarine">basic knowledge about vanilla sex.</span>`);
+			r.push(`${He} has <span class="skill">basic knowledge about vanilla sex.</span>`);
 		} else {
 			r.push(`${He} is unskilled at vaginal sex.`);
 		}
@@ -635,7 +635,7 @@ App.Desc.vagina = function(slave) {
 
 	r.push(App.Desc.mods(slave, "pubic mound"));
 
-	const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+	const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
 
 	if (slave.race === "catgirl") {
 		if (slave.pubicHStyle === "hairless" || slave.pubicHStyle === "bald" || slave.pubicHStyle === "waxed" || slave.pubicHStyle === "shaved") {
@@ -649,12 +649,12 @@ App.Desc.vagina = function(slave) {
 		} else if (slave.pubicHStyle === "very bushy") {
 			r.push(`${He} has a veritable bush of ${slave.pubicHColor} fur around ${his} crotch that flares out to ${his} thighs.`);
 		}
-	} else if (slave.physicalAge < _pubertyAge - 2) {
+	} else if (slave.physicalAge < pubertyAge - 2) {
 		r.push(`${He} is too sexually immature to have pubic hair.`);
 	} else if (slave.pubicHStyle === "hairless") {
 		r.push(`${He}'s naturally smooth and hairless.`);
 	} else if (slave.pubicHStyle === "bald") {
-		r.push(`${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth.`);
+		r.push(`${He} is no longer able to grow pubic hair, leaving ${him} hairless and smooth.`);
 	} else if (slave.pubicHStyle === "waxed") {
 		if (slave.fuckdoll > 0) {
 			r.push(`${His} pubic hair has been removed to prevent chafing.`);
@@ -663,9 +663,9 @@ App.Desc.vagina = function(slave) {
 		} else {
 			r.push(`${He}'s waxed and smooth.`);
 		}
-	} else if (slave.physicalAge < _pubertyAge - 1) {
+	} else if (slave.physicalAge < pubertyAge - 1) {
 		r.push(`${He} has a few wisps of pubic hair.`);
-	} else if (slave.physicalAge < _pubertyAge) {
+	} else if (slave.physicalAge < pubertyAge) {
 		r.push(`${He} is on the verge of puberty and has a small patch of ${slave.pubicHColor} pubic hair above ${his}`);
 		if (slave.dick > 0) {
 			r.push(`cock.`);
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index 14fb5798d230b3bfc2c06ad45529cc240009f70d..2dd0a09739e246ea985f92b7c1f36917ca1c297e 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -97,7 +97,9 @@ App.Desc.eyes = function(slave, {market, eventDescription} = {}) {
 			}
 		}
 		r += `, `;
-		if (slave.intelligence > 95) {
+		if (slave.fetish === "mindbroken") {
+			r += `fitting for vacant expression constantly adorning ${his} face; ${his} broken mind lacks the ability to form higher thought and is completely reliant on others to think for ${him}.`;
+		} else if (slave.intelligence > 95) {
 			r += `but ${his} facial expressions reveal ${he} is incisive, quick, cunning; `;
 			if (slave.intelligence + slave.intelligenceImplant >= 130) {
 				r += `with ${his} education, ${he} is so far <span class="deepskyblue">beyond brilliant</span> that ${he} is nearly peerless. `;
@@ -223,7 +225,9 @@ App.Desc.eyes = function(slave, {market, eventDescription} = {}) {
 			}
 		}
 	} else {
-		if (slave.intelligence > 95) {
+		if (slave.fetish === "mindbroken") {
+			r += `${His} ${App.Desc.eyesColor(slave, "", "eye", "eyes", false)} ${hasBothEyes(slave) ? "are" : "is"} dull and vacant; ${his} broken mind lacks the capacity for higher thought.`;
+		} else if (slave.intelligence > 95) {
 			r += `${His} ${App.Desc.eyeColor(slave)}-eyed gaze is incisive, quick, cunning; `;
 			if (slave.intelligence + slave.intelligenceImplant >= 130) {
 				r += `with ${his} education, ${he} is so far <span class="deepskyblue">beyond brilliant</span> that ${he} is nearly peerless. `;
diff --git a/src/npc/descriptions/mind.js b/src/npc/descriptions/mind.js
index a78e387981b2714a90a1538cd37826c113a4aea6..0fbef348f6cf3f902aeb43293573b9510b015ab3 100644
--- a/src/npc/descriptions/mind.js
+++ b/src/npc/descriptions/mind.js
@@ -15,13 +15,13 @@ App.Desc.mind = function(slave, {market, eventDescription} = {}) {
 
 		if (slave.fetish === "mindbroken") {
 			r.push(`However, <span class="coral">${his} mind is fundamentally broken;</span> everything ${he} experiences will quickly be forgotten.`);
+		} else {
+			r.push(behavioralFlaws());
+			r.push(behavioralQuirks());
+			r.push(sexualFlaws());
+			r.push(sexualQuirk());
+			r.push(fetish());
 		}
-
-		r.push(behavioralFlaws());
-		r.push(behavioralQuirks());
-		r.push(sexualFlaws());
-		r.push(sexualQuirk());
-		r.push(fetish());
 		r.push(attraction());
 	} else {
 		r.push(`It's impossible to tell what intelligence or inclinations a Fuckdoll might have by looking at it, but the most recent records indicate that this one is`);
diff --git a/src/npc/descriptions/mouth.js b/src/npc/descriptions/mouth.js
index 8641125e1a5a6bbad84379b5d77700e38dced229..606e946e08b9de5625ecb50a793902ab9d78cd5f 100644
--- a/src/npc/descriptions/mouth.js
+++ b/src/npc/descriptions/mouth.js
@@ -165,13 +165,13 @@ App.Desc.mouth = function(slave) {
 	} else {
 		r.push(`${He} is`);
 		if (slave.skill.oral >= 100) {
-			r.push(`an <span class="aquamarine">oral sex master.</span>`);
+			r.push(`an <span class="skill">oral sex master.</span>`);
 		} else if (slave.skill.oral > 60) {
-			r.push(`an <span class="aquamarine">expert at oral.</span>`);
+			r.push(`an <span class="skill">expert at oral.</span>`);
 		} else if (slave.skill.oral > 30) {
-			r.push(`<span class="aquamarine">orally skilled.</span>`);
+			r.push(`<span class="skill">orally skilled.</span>`);
 		} else if (slave.skill.oral > 10) {
-			r.push(`<span class="aquamarine">capable of basic oral sex.</span>`);
+			r.push(`<span class="skill">capable of basic oral sex.</span>`);
 		} else {
 			r.push(`unskilled at oral sex.`);
 		}
diff --git a/src/npc/descriptions/skills.js b/src/npc/descriptions/skills.js
index edc6065f1dffed4f47e507064d3d6476c355b3d7..bd41b2a34419168802512a6964c677354cca585f 100644
--- a/src/npc/descriptions/skills.js
+++ b/src/npc/descriptions/skills.js
@@ -13,13 +13,13 @@ App.Desc.skills = function(slave) {
 		if (slave.fuckdoll <= 10) {
 			r.push(`poorly adapted to life as a living sex toy.`);
 		} else if (slave.fuckdoll <= 30) {
-			r.push(`<span class="aquamarine">moderately adapted to life as a living sex toy.</span>`);
+			r.push(`<span class="skill">moderately adapted to life as a living sex toy.</span>`);
 		} else if (slave.fuckdoll <= 60) {
-			r.push(`<span class="aquamarine">well adapted to life as a living sex toy.</span>`);
+			r.push(`<span class="skill">well adapted to life as a living sex toy.</span>`);
 		} else if (slave.fuckdoll < 100) {
-			r.push(`<span class="aquamarine">almost perfectly adapted to life as a living sex toy.</span>`);
+			r.push(`<span class="skill">almost perfectly adapted to life as a living sex toy.</span>`);
 		} else {
-			r.push(`<span class="aquamarine">perfectly adapted to life as a living sex toy.</span>`);
+			r.push(`<span class="skill">perfectly adapted to life as a living sex toy.</span>`);
 		}
 		r.push(`Entertainment and prostitution skills are irrelevant for a Fuckdoll.`);
 	} else {
@@ -27,25 +27,25 @@ App.Desc.skills = function(slave) {
 			if (slave.skill.entertainment <= 10) {
 				// no text
 			} else if (slave.skill.entertainment <= 30) {
-				r.push(`${He} is <span class="aquamarine">reasonably entertaining.</span>`);
+				r.push(`${He} is <span class="skill">reasonably entertaining.</span>`);
 			} else if (slave.skill.entertainment <= 60) {
-				r.push(`${He} is a <span class="aquamarine">skilled entertainer.</span>`);
+				r.push(`${He} is a <span class="skill">skilled entertainer.</span>`);
 			} else if (slave.skill.entertainment < 100) {
-				r.push(`${He} is an <span class="aquamarine">expert entertainer.</span>`);
+				r.push(`${He} is an <span class="skill">expert entertainer.</span>`);
 			} else {
-				r.push(`${He} is a <span class="aquamarine">master of entertainment.</span>`);
+				r.push(`${He} is a <span class="skill">master of entertainment.</span>`);
 			}
 		} else {
 			if (slave.skill.entertainment <= 10) {
 				// no text
 			} else if (slave.skill.entertainment <= 30) {
-				r.push(`${He} is <span class="aquamarine">reasonably entertaining</span> and`);
+				r.push(`${He} is <span class="skill">reasonably entertaining</span> and`);
 			} else if (slave.skill.entertainment <= 60) {
-				r.push(`${He} is a <span class="aquamarine">skilled entertainer</span> and`);
+				r.push(`${He} is a <span class="skill">skilled entertainer</span> and`);
 			} else if (slave.skill.entertainment < 100) {
-				r.push(`${He} is an <span class="aquamarine">expert entertainer</span> and`);
+				r.push(`${He} is an <span class="skill">expert entertainer</span> and`);
 			} else {
-				r.push(`${He} is a <span class="aquamarine">master of entertainment</span> and`);
+				r.push(`${He} is a <span class="skill">master of entertainment</span> and`);
 			}
 		}
 		if (slave.skill.whoring <= 10) {
@@ -54,22 +54,22 @@ App.Desc.skills = function(slave) {
 			if (slave.skill.entertainment <= 10) {
 				r.push(`${He}`);
 			}
-			r.push(`has <span class="aquamarine">basic experience as a prostitute.</span>`);
+			r.push(`has <span class="skill">basic experience as a prostitute.</span>`);
 		} else if (slave.skill.whoring <= 60) {
 			if (slave.skill.entertainment <= 10) {
 				r.push(`${He} is`);
 			}
-			r.push(`a <span class="aquamarine">skilled streetwalker.</span>`);
+			r.push(`a <span class="skill">skilled streetwalker.</span>`);
 		} else if (slave.skill.whoring < 100) {
 			if (slave.skill.entertainment <= 10) {
 				r.push(`${He} is`);
 			}
-			r.push(`an <span class="aquamarine">expert working ${girl}.</span>`);
+			r.push(`an <span class="skill">expert working ${girl}.</span>`);
 		} else {
 			if (slave.skill.entertainment <= 10) {
 				r.push(`${He} is`);
 			}
-			r.push(`a <span class="aquamarine">masterful whore.</span>`);
+			r.push(`a <span class="skill">masterful whore.</span>`);
 		}
 	}
 	return r.join(" ");
diff --git a/src/npc/descriptions/womb/pregnancy.js b/src/npc/descriptions/womb/pregnancy.js
index 82bda99e020dc76323da8629d359c352c31c44aa..fc3eaba0389b26f64a86bbae08ebc65b4253a094 100644
--- a/src/npc/descriptions/womb/pregnancy.js
+++ b/src/npc/descriptions/womb/pregnancy.js
@@ -23,6 +23,7 @@ App.Desc.pregnancy = function(slave, {market, eventDescription} = {}) {
 	}
 
 	if (slave.preg === -2 && slave.vagina < 0 && slave.mpreg === 0) {
+		// TODO: write me
 	} else if ((slave.preg <= -3) && (slave.ovaries === 1 || slave.mpreg === 1)) {
 		r.push(`${He} is sterilized.`);
 	} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js
index fd1fa8d5e0be8cad7fccf1b29be192932014f110..d423845424a4876d301ca205626e0f98ff984023 100644
--- a/src/npc/generate/generateGenetics.js
+++ b/src/npc/generate/generateGenetics.js
@@ -1273,7 +1273,7 @@ globalThis.generateChild = function(mother, ovum, incubator = false) {
 			child.tankBaby = 1;
 		} else {
 			child.origin = "$His brain is blank outside of the most basic of functions.";
-			applyMindbroken(child);
+			applyMindbroken(child, child.intelligence);
 			child.tankBaby = 3;
 		}
 		child.intelligenceImplant = 0;
diff --git a/src/npc/generate/generateLeadershipSlave.js b/src/npc/generate/generateLeadershipSlave.js
index 8d580370ec71dbe18a56e2c747e272bd3e7ec758..2a2b7cbb7d3b62ce7ad3933693aabe8cf404ccb6 100644
--- a/src/npc/generate/generateLeadershipSlave.js
+++ b/src/npc/generate/generateLeadershipSlave.js
@@ -9,7 +9,8 @@ globalThis.generateLeadershipSlave = function(input, location) {
 
 	const agePenaltyCheck = V.AgePenalty === 1 ? 36 : 20;
 	const isMotherly = V.JFC.role === 'Motherly Attendant';
-	let ageMin, ageMax;
+	let ageMin;
+	let ageMax;
 	switch (input) {
 		case "Teacher":
 		case "Attendant":
diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js
index d963c4ef384d8fb2cfd2d7c4df56b123c38af11c..f97424d4254c388c4910804d557fc56249588c10 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1150,7 +1150,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			}
 			slave.addict = jsEither([0, 0, 0, 10, 10, 20, 30]);
 			slave.chem = jsRandom(0, 1000);
-			applyMindbroken(slave);
+			applyMindbroken(slave, Intelligence.random({limitIntelligence: [-100, 0]}));
 			break;
 		}
 		case "wetware": {
@@ -1875,7 +1875,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				slave.underArmHStyle = "waxed";
 				slave.heels = 1;
 				slave.energy = 100;
-				applyMindbroken(slave);
+				applyMindbroken(slave, -100);
 				slave.hStyle = "neat";
 				slave.brand["right thigh"] = "the logo of the Cattle Ranch";
 			} else {
@@ -1913,7 +1913,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				slave.pubicHStyle = "waxed";
 				slave.underArmHStyle = "waxed";
 				slave.heels = 1;
-				applyMindbroken(slave);
+				applyMindbroken(slave, jsEither([-100, -100, -100, -100, -60, -60, -30]));
 				slave.hStyle = "neat";
 				slave.collar = "leather with cowbell";
 				slave.brand["right thigh"] = "the logo of the Cattle Ranch";
@@ -2894,7 +2894,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					if (jsRandom(1, 100) > 70) {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for murder. $His actions weigh heavily on $his conscience.";
 						setHealth(slave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 100));
-						applyMindbroken(slave);
+						applyMindbroken(slave, jsRandom(-80, 70));
 					} else {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for murder.";
 						slave.devotion = jsRandom(-50, -20);
@@ -2911,7 +2911,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					if (jsRandom(1, 100) > 50) {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for arson. $His actions, and those $he inadvertently killed, weigh heavily on $his conscience.";
 						setHealth(slave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 100));
-						applyMindbroken(slave);
+						applyMindbroken(slave, jsRandom(-80, 70));
 					} else {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for arson.";
 						slave.devotion = jsRandom(-70, -50);
@@ -2990,7 +2990,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					if (jsRandom(1, 100) > 60) {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter. $His actions weigh heavily on $his conscience.";
 						setHealth(slave, jsRandom(-50, -20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 100));
-						applyMindbroken(slave);
+						applyMindbroken(slave, jsRandom(-80, 70));
 					} else {
 						slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter.";
 						slave.devotion = jsRandom(-70, -50);
diff --git a/src/npc/generate/newChildIntro.js b/src/npc/generate/newChildIntro.js
index d501e8c3e9976862eac1d7113739b7639c6b5b0a..763ce2783be107b570fb188e4be0232a8b94408f 100644
--- a/src/npc/generate/newChildIntro.js
+++ b/src/npc/generate/newChildIntro.js
@@ -23,7 +23,7 @@ App.UI.newChildIntro = function(slave) {
 		} else if (slave.geneticQuirks.neoteny && slave.actualAge > 12 && V.geneticMappingUpgrade < 2) {
 		}
 	} else if (slave.geneticQuirks.progeria && V.geneticMappingUpgrade < 2) {
-		r.push(`you barely manage to pull yourself together to catch ${him} in time. There must have been some mistake with the settings; ${he} should not be //this// old. You help ${him} to ${his} unstable feet and slowly walk ${him} to your penthouse.`);
+		r.push(`you barely manage to pull yourself together to catch ${him} in time. There must have been some mistake with the settings; ${he} should not be <i>this</i> old. You help ${him} to ${his} unstable feet and slowly walk ${him} to your penthouse.`);
 	} else if (slave.geneticQuirks.neoteny && slave.actualAge > 12 && V.geneticMappingUpgrade === 0) {
 		r.push(`you have to make sure the right ${girl} was released. ${He} was supposed to be ${slave.actualAge}, not this child sitting before you. You double check the machine's logs to be certain and it turns out ${he} really is ${slave.actualAge}, just abnormally young looking for ${his} age.`);
 	} else {
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 659f8ca29cd4d3a41c7e60dde091be6c69a414f1..23b0fdf4223504d4bcfda118858fae19a7339c30 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -2212,7 +2212,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 						} else {
 							r.push(`womb`);
 						}
-						r.push(`and ovaries are extracted${canSee(slave) ? `before ${his} eyes` : ``}.`);
+						r.push(`and ovaries are extracted${canSee(slave) ? ` before ${his} eyes` : ``}.`);
 
 						if (slave.fetish === "pregnancy" && slave.pregKnown === 1) {
 							if ((slave.preg > slave.pregData.normalBirth / 1.6) && (canSee(slave))) {
@@ -4292,7 +4292,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 					linkName: `Fill ${him} with cum`,
 					result(slave) {
 						const r = [];
-						r.push(`You securely restrain your new slave${(V.dairyRestraintsSetting > 1) ? `in a milking stall` : ``}. A quick finger check of ${his} holes allows you to choose wisely from a selection of hollow phalluses, which push into your helpless new slave's mouth,`);
+						r.push(`You securely restrain your new slave${(V.dairyRestraintsSetting > 1) ? ` in a milking stall` : ``}. A quick finger check of ${his} holes allows you to choose wisely from a selection of hollow phalluses, which push into your helpless new slave's mouth,`);
 						actX(slave, "oral");
 						if (slave.vagina > 0) {
 							r.push(`vagina,`);
diff --git a/src/npc/infants/infantSummary.js b/src/npc/infants/infantSummary.js
index 780bbe47d6fad954550ba41da8eccfa5f21e4b48..f7a51076d0d739abf38926d2b6f1cbaafc6b190f 100644
--- a/src/npc/infants/infantSummary.js
+++ b/src/npc/infants/infantSummary.js
@@ -1563,12 +1563,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		let r = ``;
 
 		if (child.mother > 0) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.mother;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s ${daughter}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s ${daughter}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTermShort(child);
 					r += ` & ${friendShipShort}`;
 					handled = 1;
@@ -1587,12 +1587,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.father > 0 && child.father !== child.mother) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.father;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s ${daughter}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s ${daughter}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID && handled !== 1) {
 					const friendShipShort = relationshipTermShort(child);
 					r += ` & ${friendShipShort}`;
 					handled = 1;
@@ -1611,24 +1611,24 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.daughters === 1) {
-			let _ssj = V.slaves.findIndex(function(s) {
+			let ssj = V.slaves.findIndex(function(s) {
 				return s.mother === child.ID;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s mother`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTermShort(child);
 					r += ` & ${friendShipShort}`;
 					handled = 1;
 				}
 			}
 			r += " ";
-			_ssj = V.slaves.findIndex(function(s) {
+			ssj = V.slaves.findIndex(function(s) {
 				return s.father === child.ID;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s father`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s father`;
+				if (child.relationshipTarget === V.slaves[ssj].ID && handled !== 1) {
 					const friendShipShort = relationshipTermShort(child);
 					r += ` & ${friendShipShort}`;
 					handled = 1;
@@ -1640,12 +1640,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.sisters === 1) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return areSisters(s, child) > 0;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s ${sister}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s ${sister}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTermShort(child);
 					r += `& ${friendShipShort}`;
 					handled = 1;
@@ -1657,11 +1657,11 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.relationshipTarget;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s`;
 				const friendShipShort = relationshipTermShort(child);
 				r += ` ${friendShipShort}`;
 			}
@@ -1683,12 +1683,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		let r = ``;
 
 		if (child.mother > 0) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.mother;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">${daughter}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightgreen">${daughter}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTerm(child);
 					r += ` and ${friendShipShort}`;
 					handled = 1;
@@ -1709,12 +1709,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.father > 0 && child.father !== child.mother) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.father;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">${daughter}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightgreen">${daughter}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTerm(child);
 					r += ` and ${friendShipShort}`;
 					handled = 1;
@@ -1734,24 +1734,24 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.daughters === 1) {
-			let _ssj = V.slaves.findIndex(function(s) {
+			let ssj = V.slaves.findIndex(function(s) {
 				return s.mother === child.ID;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">mother`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightgreen">mother`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTerm(child);
 					r += ` and ${friendShipShort}`;
 					handled = 1;
 				}
 				r += `.</span> `;
 			}
-			_ssj = V.slaves.findIndex(function(s) {
+			ssj = V.slaves.findIndex(function(s) {
 				return s.father === child.ID;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">father`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightgreen">father`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTerm(child);
 					r += ` and ${friendShipShort}`;
 					handled = 1;
@@ -1769,12 +1769,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.sisters === 1) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return areSisters(s, child) > 0;
 			});
-			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">${sister}`;
-				if (child.relationshipTarget === V.slaves[_ssj].ID) {
+			if (ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightgreen">${sister}`;
+				if (child.relationshipTarget === V.slaves[ssj].ID) {
 					const friendShipShort = relationshipTerm(child);
 					r += ` and ${friendShipShort}`;
 					handled = 1;
@@ -1792,12 +1792,12 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 		}
 
 		if (child.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.relationshipTarget;
 			});
-			if (_ssj !== -1) {
+			if (ssj !== -1) {
 				const friendship = relationshipTerm(child);
-				r += `${SlaveFullName(V.slaves[_ssj])}'s `;
+				r += `${SlaveFullName(V.slaves[ssj])}'s `;
 				r += `<span class="lightgreen">${friendship}.</span> `;
 			}
 		} else if (child.relationship === -3 && child.mother !== -1 && child.father !== -1) {
@@ -1816,17 +1816,17 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 
 		if (child.rivalry !== 0) {
 			r += `&nbsp;&nbsp;&nbsp;&nbsp;`;
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.rivalryTarget;
 			});
-			if (_ssj !== -1) {
+			if (ssj !== -1) {
 				r += `<span class="lightsalmon">`;
 				if (child.rivalry <= 1) {
-					r += `Disl ${SlaveFullName(V.slaves[_ssj])}`;
+					r += `Disl ${SlaveFullName(V.slaves[ssj])}`;
 				} else if (child.rivalry <= 2) {
-					r += `${SlaveFullName(V.slaves[_ssj])}'s rival`;
+					r += `${SlaveFullName(V.slaves[ssj])}'s rival`;
 				} else {
-					r += `Hates ${SlaveFullName(V.slaves[_ssj])}`;
+					r += `Hates ${SlaveFullName(V.slaves[ssj])}`;
 				}
 				r += `</span> `;
 			}
@@ -1840,17 +1840,17 @@ App.Facilities.Nursery.InfantSummary = function(child) {
 
 		if (child.rivalry !== 0) {
 			r += `&nbsp;&nbsp;&nbsp;&nbsp;`;
-			const _ssj = V.slaves.findIndex(function(s) {
+			const ssj = V.slaves.findIndex(function(s) {
 				return s.ID === child.rivalryTarget;
 			});
 
-			if (_ssj !== -1) {
+			if (ssj !== -1) {
 				if (child.rivalry <= 1) {
-					r += `<span class="lightsalmon">Dislikes</span> ${SlaveFullName(V.slaves[_ssj])}. `;
+					r += `<span class="lightsalmon">Dislikes</span> ${SlaveFullName(V.slaves[ssj])}. `;
 				} else if (child.rivalry <= 2) {
-					r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightsalmon">rival.</span> `;
+					r += `${SlaveFullName(V.slaves[ssj])}'s <span class="lightsalmon">rival.</span> `;
 				} else {
-					r += `<span class="lightsalmon">Hates</span> ${SlaveFullName(V.slaves[_ssj])}. `;
+					r += `<span class="lightsalmon">Hates</span> ${SlaveFullName(V.slaves[ssj])}. `;
 				}
 			}
 			r += " ";
diff --git a/src/npc/interaction/FFuckdollImpreg.js b/src/npc/interaction/FFuckdollImpreg.js
index 035f2250ffa0a39bcfb79c2cc939ada3ad622785..7ae1839ac119d210da994225ab9de9466a305637 100644
--- a/src/npc/interaction/FFuckdollImpreg.js
+++ b/src/npc/interaction/FFuckdollImpreg.js
@@ -13,14 +13,14 @@ App.Interact.fFuckdollImpreg = function(slave) {
 	} = getPronouns(slave);
 
 	addPartner(slave, -1);
-	const _bonus = random(6, 20);
+	const bonus = random(6, 20);
 
 	if (slave.mpreg === 1) {
-		slave.counter.anal += _bonus + 1;
-		V.analTotal += _bonus + 1;
+		slave.counter.anal += bonus + 1;
+		V.analTotal += bonus + 1;
 	} else {
-		slave.counter.vaginal += _bonus + 1;
-		V.vaginalTotal += _bonus + 1;
+		slave.counter.vaginal += bonus + 1;
+		V.vaginalTotal += bonus + 1;
 	}
 
 	r.push(`You decide to use the Fuckdoll's fertile womb to grow a child.`);
diff --git a/src/npc/interaction/FSuckle.js b/src/npc/interaction/FSuckle.js
index 956baac3067d3b354e3b444f1e491dcf1bc863c2..a59ba0ff2e02ef3b8caf1a620d0468142c9d76ea 100644
--- a/src/npc/interaction/FSuckle.js
+++ b/src/npc/interaction/FSuckle.js
@@ -15,19 +15,19 @@ App.Interact.fSuckle = function(slave) {
 	addPartner(slave, -1);
 
 	seX(slave, "mammary", V.PC, "oral");
-	let _mood;
+	let mood;
 	if (V.PC.pregMood === 0 || V.PC.preg < 28) {
-		_mood = 0;
+		mood = 0;
 	} else if (V.PC.pregMood === 1) {
-		_mood = 1;
+		mood = 1;
 	} else if (V.PC.pregMood === 2) {
-		_mood = 2;
+		mood = 2;
 	}
 
 	// still needed: breast implant support, nipple piercing support
 
 	r.push(`You`);
-	if (_mood === 2) {
+	if (mood === 2) {
 		r.push(`demand`);
 	} else {
 		r.push(`beckon`);
@@ -56,26 +56,26 @@ App.Interact.fSuckle = function(slave) {
 			r.push(`${He} complies without a thought.`);
 		} else if (slave.devotion > 20 && slave.trust > 20) {
 			r.push(`${He} complies,`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`knowing full well what you want.`);
 			} else {
 				r.push(`giddy with anticipation of your plans for ${him}.`);
 			}
 		} else if (slave.trust < -20) {
 			r.push(`${He} hurriedly complies,`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`fearful of the sudden shift in your demeanor.`);
 			} else {
 				r.push(`aware of the consequences of disobedience.`);
 			}
 		} else if (slave.devotion < -20) {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`${He} is shaken by your tone, knowing that disobedience may lead to even worse matters for ${him}; ${he} complies without any further hassle.`);
 			} else {
 				r.push(`${He} begrudgingly complies, not understanding your intentions, but knowing worse things await at ${his} disobedience.`);
 			}
 		} else {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`${He} is a little afraid of your sudden demanding tone, but steels ${himself} for whatever punishment you wish to mete out to ${him}.`);
 			} else {
 				r.push(`Though hesitant, ${he} complies without question.`);
@@ -86,26 +86,26 @@ App.Interact.fSuckle = function(slave) {
 			r.push(`${He} pays no attention as ${he} is carefully positioned for your use.`);
 		} else if (slave.devotion > 20 && slave.trust > 20) {
 			r.push(`Though ${he} has no agency over this,`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`${he} is somewhat confused by your sudden aggressive posture.`);
 			} else {
 				r.push(`${he} is visibly giddy with anticipation for your next course of action as ${he} is helped into position.`);
 			}
 		} else if (slave.trust < -20) {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`${He} knows better than to struggle as ${he} is helped into position, though ${he} dreads what ${his} pregnant ${getWrittenTitle(slave)} has planned.`);
 			} else {
 				r.push(`${He} knows better than to struggle as ${he} is helped into position, well aware of the consequences it would bring.`);
 			}
 		} else if (slave.devotion < -20) {
 			r.push(`Though ${he} is rebellious,`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`seeing such a gravid person take such a predatory stance shakes ${him} and ${he} becomes more compliant.`);
 			} else {
 				r.push(`${his} inability to move and distaste for falling to the ground kept ${him} from giving ${his} help much trouble.`);
 			}
 		} else {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`Though ${he} is frightened by your sudden aggressiveness, ${he} complies with ${his} helper as ${he} is positioned.`);
 			} else {
 				r.push(`Though hesitant, ${he} complies with ${his} helper as ${he} is positioned.`);
@@ -115,13 +115,13 @@ App.Interact.fSuckle = function(slave) {
 
 	if (slave.boobs >= 20000) {
 		r.push(`You`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`caress`);
 		} else {
 			r.push(`take note of`);
 		}
 		r.push(`${his} massive udders,`);
-		if (_mood === 2) {
+		if (mood === 2) {
 			if (slave.nipples === "puffy") {
 				r.push(`grabbing a puffy nipple, lifting it up and letting it drop back down with a loud plop and a spurt of milk. They are dripping with excess milk and the flurry of kicks in your middle tells you what you need to do.`);
 			} else if (slave.nipples === "inverted") {
@@ -186,7 +186,7 @@ App.Interact.fSuckle = function(slave) {
 				r.push(`overly exertive nipple already prodding at your mouth, as if begging to be suckled on.`);
 			}
 			r.push(`Though muffled, you`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`order ${him} to deal with`);
 				if (V.PC.dick !== 0) {
 					r.push(`the erect monster pressing uncomfortably against the underside of your belly.`);
@@ -290,7 +290,7 @@ App.Interact.fSuckle = function(slave) {
 			}
 		} else {
 			r.push(`exotic nipple brushing across your lips, as if wanting to have your tongue inside it, while ${his} other nipple`);
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`brushes across your`);
 				if (V.PC.dick !== 0) {
 					r.push(`penis, just begging to be penetrated. You struggle to shift yourself in such a way to penetrate ${his} nipple, before finally managing to slip the tip into ${him}`);
@@ -370,40 +370,40 @@ App.Interact.fSuckle = function(slave) {
 		}
 	} else if (slave.boobs >= 2000) {
 		r.push(`You`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`caress`);
-		} else if (_mood === 2) {
+		} else if (mood === 2) {
 			r.push(`hungrily eye`);
 		} else {
 			r.push(`eye`);
 		}
 		r.push(`${his} ${slave.nipples} nipples,`);
 		if (slave.nipples === "puffy") {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`gripping the nipple with your hand and squeezing hard enough to force out a spurt of milk. A flurry of kicks tells you that you are to take one of those swollen, dripping beauties and have a drink.`);
 			} else {
 				r.push(`swollen and dripping with excess milk and calling on your instincts to suckle on them.`);
 			}
 		} else if (slave.nipples === "inverted") {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`poking it with your finger as deep as you can. The inviting hole keeps all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself. The kicking in your middle settles it, you're taking a drink whether or not ${his} nipples agree.`);
 			} else {
 				r.push(`the inviting hole keeping all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself.`);
 			}
 		} else if (slave.nipples === "flat") {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`pinching the nipple with your fingertips and squeezing hard enough to force out some drops of milk. A flurry of kicks demands you wrap you lips around it and take what little milk hides within.`);
 			} else {
 				r.push(`swollen and dripping with excess milk and calling on your instincts to suck on them.`);
 			}
 		} else if (slave.nipples === "fuckable") {
-			if (_mood === 2) {
-				r.push(`using two fingers to penetrate and spread apart to appreciate the insides. They are dripping with excess milk and resemble a tiny pussy; a series of kicks insist that you have a taste${(V.PC.dick !== 0) ? `and a little stress relief` : ``}.`);
+			if (mood === 2) {
+				r.push(`using two fingers to penetrate and spread apart to appreciate the insides. They are dripping with excess milk and resemble a tiny pussy; a series of kicks insist that you have a taste${(V.PC.dick !== 0) ? ` and a little stress relief` : ``}.`);
 			} else {
 				r.push(`dripping with excess milk and resembling a tiny pussy, your instincts doubly insisting that you have a taste.`);
 			}
 		} else {
-			if (_mood === 2) {
+			if (mood === 2) {
 				r.push(`pinching one between your thumb and forefinger with enough force to hurt. Excess milk drips from it as a rather forceful kick from your womb insists that you take your fill; you wouldn't mind a taste yourself.`);
 			} else {
 				r.push(`dripping with excess milk and calling on your instincts to suckle on them.`);
@@ -448,7 +448,7 @@ App.Interact.fSuckle = function(slave) {
 			r.push(`getting familiar with ${his} fat belly as`);
 		}
 		r.push(`${his} over-productive bosoms dripping sweet cream on your face${(slave.nipples === "inverted") ? `, the milk waiting to be sucked from the tight inverted holes above you` : ``}${(V.PC.belly >= 10000) ? ` and your belly brushing the undersides of ${his} tits` : ``}. You`);
-		if (_mood === 2) {
+		if (mood === 2) {
 			r.push(`order ${him} to deal with`);
 			if (V.PC.dick !== 0) {
 				r.push(`the erect monster pressing uncomfortably against the underside of your belly.`);
@@ -484,7 +484,7 @@ App.Interact.fSuckle = function(slave) {
 
 	if (slave.fetish === "mindbroken") {
 		r.push(`You`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`struggle to lean forward and wrap your lips gently around a nipple,`);
 		} else {
 			r.push(`lurch forward and engulf a nipple with your lips,`);
@@ -492,7 +492,7 @@ App.Interact.fSuckle = function(slave) {
 		r.push(`causing ${him} to shudder with arousal as the suction causes milk to gush into your mouth to sate your needs.`);
 	} else if (slave.devotion <= 20 || slave.trust < -20) {
 		r.push(`${He} braces ${himself} as you`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`struggle to lean forward and wrap your lips gently around a nipple,`);
 		} else {
 			r.push(`lurch forward and engulf a nipple with your lips,`);
@@ -500,18 +500,18 @@ App.Interact.fSuckle = function(slave) {
 		r.push(`cringing as the suction causes milk to gush into your mouth to sate your needs.`);
 	} else {
 		r.push(`You`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`struggle to lean forward and wrap your lips gently around a nipple,`);
 		} else {
 			r.push(`lurch forward and engulf a nipple with your lips,`);
 		}
 		r.push(`causing ${him} to coo with delight`);
-		if (_mood === 1) {
+		if (mood === 1) {
 			r.push(`and support your head`);
 		}
 		r.push(`as the suction causes milk to gush into your mouth to sate your needs.`);
 	}
-	if (_mood === 2) {
+	if (mood === 2) {
 		r.push(`Your`);
 		if (V.PC.pregType > 1) {
 			r.push(`babies calm`);
@@ -519,7 +519,7 @@ App.Interact.fSuckle = function(slave) {
 			r.push(`baby calms`);
 		}
 		r.push(`down as ${his} cream reaches your system.`);
-	} else if (_mood === 1) {
+	} else if (mood === 1) {
 		r.push(`Your`);
 		if (V.PC.pregType > 1) {
 			r.push(`babies kick`);
@@ -573,7 +573,7 @@ App.Interact.fSuckle = function(slave) {
 		} else {
 			r.push(`roll and prod`);
 		}
-		r.push(`with your tongue, trying to get the most out of ${his} mammaries, you hasten ${his} breath and bring ${him} further pleasure${(slave.nipples === "inverted") ? `as it slowly hardens and leaves its inverted state` : ``}.`);
+		r.push(`with your tongue, trying to get the most out of ${his} mammaries, you hasten ${his} breath and bring ${him} further pleasure${(slave.nipples === "inverted") ? ` as it slowly hardens and leaves its inverted state` : ``}.`);
 		if (slave.nipples === "puffy") {
 			r.push(`You note the texture of ${his} nipple: soft, more so even than the rest of ${his} boob. Your constant efforts of sucking and tongueplay are rewarded`);
 		} else if (slave.nipples === "flat") {
@@ -601,9 +601,9 @@ App.Interact.fSuckle = function(slave) {
 		r.push(`hardness,`);
 	}
 	r.push(`relishing the delicious treat one could have only received from a mother's bosom; at least, so was the case before modern medicine decided to say something about it. Though it may as well be artificial, the act of breastfeeding continues to appease a fundamental emotional need that is arguably unique to the action.`);
-	if (_mood === 2) {
+	if (mood === 2) {
 		r.push(`It gives you undeniable emotional respite despite the mood caused by your pregnancy, even if it will only last as long as you stay with ${him}.`);
-	} else if (_mood === 1) {
+	} else if (mood === 1) {
 		r.push(`You can only hope ${he}'ll return the favor when you yourself become too heavy with milk.`);
 	} else if (V.PC.preg > 30) {
 		r.push(`You know that you'll soon have your own child`);
@@ -668,7 +668,7 @@ App.Interact.fSuckle = function(slave) {
 	} else {
 		r.push(`onto`);
 	}
-	r.push(`${his} other breast${(V.PC.dick !== 0 && V.PC.balls >= 10) ? `and backflowing hard from your sheer volume` : ``}. You release ${his} nipple with a loud pop and lick your lips in delight.`);
+	r.push(`${his} other breast${(V.PC.dick !== 0 && V.PC.balls >= 10) ? ` and backflowing hard from your sheer volume` : ``}. You release ${his} nipple with a loud pop and lick your lips in delight.`);
 	if (slave.boobs >= 20000 && slave.nipples === "fuckable") {
 		r.push(`Your`);
 		if (V.PC.dick !== 0) {
@@ -689,9 +689,9 @@ App.Interact.fSuckle = function(slave) {
 			r.push(`nippleslit.`);
 		}
 	}
-	if (_mood === 2) {
+	if (mood === 2) {
 		r.push(`For a moment, ${he} thought you were finished, but with your hormone fueled libido, ${he}'ll be feeling a lot more than sore nipples but the time you tire of ${his} touch.`);
-	} else if (_mood === 1) {
+	} else if (mood === 1) {
 		r.push(`You cuddle up against ${him}, holding close to ${him} as you snooze off your milky meal.`);
 		if (slave.fetish === "mindbroken") {
 			r.push(`${He} struggles in discomfort at your pregnant weight pinning ${him} down until ${he} manages to rouse your child`);
@@ -722,7 +722,7 @@ App.Interact.fSuckle = function(slave) {
 	}
 
 	r.push(`Once you`);
-	if (_mood === 1) {
+	if (mood === 1) {
 		r.push(`wake and slowly rise to your feet, you help ${him} clean up`);
 	} else {
 		r.push(`are done, you allow ${him} to clean up`);
diff --git a/src/npc/interaction/fAbuse.js b/src/npc/interaction/fAbuse.js
index b93824aef30a6b81ceec074a5ab6a81eaf8f74f2..1d419218b90c67e469c976f3afe4241aeab02aef 100644
--- a/src/npc/interaction/fAbuse.js
+++ b/src/npc/interaction/fAbuse.js
@@ -28,7 +28,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 	}
 
-	let _assPain = 0;
+	let assPain = 0;
 
 	if (!hasAnyLegs(slave)) {
 		r.push(`You set ${his} helpless form down for abuse. Brutalizing ${him} is almost childishly easy; ${his}`);
@@ -553,7 +553,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 		r.push(`up ${his} butt. What surprises ${him} is when you slide a finger or two in alongside your dick to stretch ${him} to the point of pain.`);
 		r.push(VCheck.Anal(slave, 1));
-		_assPain = 1;
+		assPain = 1;
 	} else if (slave.vagina === 0) {
 		r.push(`The bitch's still a virgin and you don't mean to take that now, but you torture ${him} with the threat of raping ${his} virgin pussy for a while before settling for ${his} gagging throat.`);
 		seX(slave, "oral", V.PC, "penetrative");
@@ -611,7 +611,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 		r.push(`${His} asshole spasms with the pain of the rape. You cum explosively.`);
 		r.push(VCheck.Anal(slave, 1));
-		_assPain = 1;
+		assPain = 1;
 	} else if (slave.dick > 0 && slave.scrotum > 0) {
 		r.push(`You ram`);
 		if (V.PC.dick === 0) {
@@ -631,7 +631,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 		r.push(`You orgasm explosively.`);
 		r.push(VCheck.Anal(slave, 1));
-		_assPain = 1;
+		assPain = 1;
 	} else if (slave.dick > 0) {
 		r.push(`You ram`);
 		if (V.PC.dick === 0) {
@@ -645,7 +645,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 		r.push(`${He}'s such a slut that ${he} shows signs of enjoyment, but you put a stop to that whenever it happens by slapping and flicking ${his} cock. You cum explosively.`);
 		r.push(VCheck.Anal(slave, 1));
-		_assPain = 1;
+		assPain = 1;
 	} else {
 		r.push(`${He}'s got no special physical targets for abuse, so you just rape ${him} hard and fast, raining stinging slaps down on ${him} as you do. ${He} cries and whimpers; you finish.`);
 		r.push(VCheck.Both(slave, 1));
@@ -665,7 +665,7 @@ App.Interact.fAbuse = function(slave) {
 
 	if (slave.assignment !== Job.BODYGUARD) {
 		if (slave.minorInjury === 0) {
-			if (_assPain === 1) {
+			if (assPain === 1) {
 				r.push(`The anal rape leaves ${him} with a sore butthole.`);
 			} else if (random(1, 100) > 50) {
 				slave.minorInjury = either("black eye", "bruise", "split lip");
@@ -721,27 +721,27 @@ App.Interact.fAbuse = function(slave) {
 
 	if (random(1, 100) > (20+slave.devotion+slave.trust)) {
 		if (slave.fetish !== "submissive" && slave.fetish !== "masochist" && slave.assignment !== Job.BODYGUARD) {
-			const _seed = random(1, 8);
+			const seed = random(1, 8);
 			r.push(`Brutal abuse has left ${him}`);
-			if (_seed === 1 && slave.behavioralFlaw !== "odd") {
+			if (seed === 1 && slave.behavioralFlaw !== "odd") {
 				r.push(`<span class="red">acting strangely.</span>`);
 				slave.behavioralFlaw = "odd";
-			} else if (_seed === 2 && slave.behavioralFlaw !== "anorexic") {
+			} else if (seed === 2 && slave.behavioralFlaw !== "anorexic") {
 				r.push(`<span class="red">starving ${himself}</span> in a crippling attempt to be pretty.`);
 				slave.behavioralFlaw = "anorexic";
-			} else if (_seed === 3 && slave.behavioralFlaw !== "gluttonous") {
+			} else if (seed === 3 && slave.behavioralFlaw !== "gluttonous") {
 				r.push(`<span class="red">stress eating</span> whenever ${he} can.`);
 				slave.behavioralFlaw = "gluttonous";
-			} else if (_seed === 4 && slave.behavioralFlaw !== "devout") {
+			} else if (seed === 4 && slave.behavioralFlaw !== "devout") {
 				r.push(`<span class="red">praying in private</span> whenever ${he} can.`);
 				slave.behavioralFlaw = "devout";
-			} else if (_seed === 5 && slave.sexualFlaw !== "apathetic") {
+			} else if (seed === 5 && slave.sexualFlaw !== "apathetic") {
 				r.push(`<span class="red">sexually apathetic,</span> since ${he} feels it cannot go well for ${him}.`);
 				slave.sexualFlaw = "apathetic";
-			} else if (_seed === 6 && slave.sexualFlaw !== "crude") {
+			} else if (seed === 6 && slave.sexualFlaw !== "crude") {
 				r.push(`<span class="red">sexually crude,</span> out of an unconscious belief that sex is ugly and unworthy of effort.`);
 				slave.sexualFlaw = "crude";
-			} else if (_seed === 7 && slave.sexualFlaw !== "judgemental") {
+			} else if (seed === 7 && slave.sexualFlaw !== "judgemental") {
 				r.push(`<span class="red">sexually judgemental,</span> out of an unconscious desire to disqualify people from being good enough to have sex with ${him}.`);
 				slave.sexualFlaw = "judgemental";
 			} else if (V.PC.dick !== -1) {
diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 1ae97178c48d3501eb789bcd0eeadf3ae20f2df4..79b563ca34086592dd2dcbf392b55528d74e0fb8 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",
@@ -28,8 +26,9 @@ App.Interact.fAnimal = function(slave, type) {
 	/** @type {App.Entity.Animal} */
 	const animal = V.active[type];
 
-	let fetishDesc;
+	/** @type {0|1|2} */
 	let hole;
+	let fetishDesc;
 	let orifice;
 
 	const anAnimal = `${animal.articleAn} ${animal.name}`;
@@ -100,9 +99,7 @@ App.Interact.fAnimal = function(slave, type) {
 		fetishDesc = `committing such a sinful act`;
 	}
 
-	const div = App.UI.DOM.appendNewElement("div", frag);
-
-	let text = [];
+	const text = new SpacedTextAccumulator(frag);
 
 	if (canWalk(slave)) {
 		text.push(`You call ${him} over and`);
@@ -114,7 +111,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,34 +121,32 @@ 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 (
-					(act === Acts.VAGINAL && slave.vagina > 0) ||
-						(act === Acts.ANAL && slave.anus > 0)
-				) {
+				if ((act === Acts.VAGINAL && slave.vagina > 0)
+					|| (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,50 +154,48 @@ 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`}.`);
 		}
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
-
+	text.toParagraph();
 
 	if (slave.devotion > 50) {
 		if (act === Acts.ORAL) {
@@ -237,7 +230,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, then gives a groan as the beast thrusts, stretching ${his} poor throat to the limit.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -255,7 +248,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -293,7 +286,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -311,7 +304,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -349,7 +342,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -367,7 +360,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -390,7 +383,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,12 +407,12 @@ 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.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -432,7 +425,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 .`);
 					}
@@ -449,8 +442,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
+	text.toParagraph();
 
 	switch (animal) {
 		case V.active.canine:
@@ -460,7 +452,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:
@@ -483,9 +475,9 @@ App.Interact.fAnimal = function(slave, type) {
 			throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 	}
 
-	if (act === Acts.ANAL) {
+	if (act === Acts.VAGINAL) {
 		slave.vagina = slave.vagina < animal.dick.size ? animal.dick.size : slave.vagina;
-	} else if (act === Acts.VAGINAL) {
+	} else if (act === Acts.ANAL) {
 		slave.anus = slave.anus < animal.dick.size ? animal.dick.size : slave.anus;
 	}
 
@@ -493,8 +485,7 @@ App.Interact.fAnimal = function(slave, type) {
 		knockMeUp(slave, 5, hole, -8);
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
+	text.toParagraph();
 
 	if (random(1, 100) > 100 + slave.devotion) {
 		switch (act) {
@@ -606,8 +597,7 @@ App.Interact.fAnimal = function(slave, type) {
 			}
 		}
 
-		App.Events.addParagraph(div, text);
-		text = [];
+		text.toParagraph();
 	}
 
 	return frag;
@@ -633,19 +623,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 +662,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/interaction/fAnus.js b/src/npc/interaction/fAnus.js
index 4f6a40fafcc9f9dff96886d2a5a51ce545c0ba9f..b86b5b128fe7556d5d3643f3e49946f0e1e0e162 100644
--- a/src/npc/interaction/fAnus.js
+++ b/src/npc/interaction/fAnus.js
@@ -86,7 +86,7 @@ App.Interact.fAnus = function(slave) {
 			r.push(`fuck ${his} ass. You gently ease into ${his} butthole and slowly accelerate your thrusting into ${his} ass. However ${he} still squeals in pain as you continue pounding. <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} <span class="trust dec">fears further anal pain.</span>`);
 			slave.trust -= 5;
 		} else {
-			r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? `and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`);
+			r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? ` and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`);
 			if (hasAnyArms(slave)) {
 				r.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`} behind ${him}`);
 			}
@@ -138,7 +138,7 @@ App.Interact.fAnus = function(slave) {
 		}
 	} else if (slave.devotion < -20) {
 		if (!isAmputee(slave)) {
-			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. Horrified, ${he} tries to back away, but you catch ${him} and throw ${him} on the couch next to your desk. ${He} tries to`);
+			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. Horrified, ${he} tries to back away, but you catch ${him} and throw ${him} on the couch next to your desk. ${He} tries to`);
 			if (hasAnyArms(slave)) {
 				r.push(`shield ${his} asshole,`);
 			} else {
@@ -191,7 +191,7 @@ App.Interact.fAnus = function(slave) {
 		}
 	} else if (slave.devotion <= 20 && slave.vagina < 0) {
 		if (!isAmputee(slave)) {
-			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. ${He} knows a sissy slave takes it up the butt, and lies on the couch next to your desk with ${his}`);
+			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. ${He} knows a sissy slave takes it up the butt, and lies on the couch next to your desk with ${his}`);
 			if (!hasAnyLegs(slave)) {
 				r.push(`hips`);
 			} else {
@@ -226,7 +226,7 @@ App.Interact.fAnus = function(slave) {
 			if (V.seeRace === 1) {
 				r.push(slave.race);
 			}
-			r.push(`anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. ${He} hesitates but eventually lies on the couch next to your desk with ${his}`);
+			r.push(`anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. ${He} hesitates but eventually lies on the couch next to your desk with ${his}`);
 			if (!hasAnyLegs(slave)) {
 				r.push(`hips`);
 			} else {
diff --git a/src/npc/interaction/fBoobs.js b/src/npc/interaction/fBoobs.js
index a8e7ae399b814415f46fbf7de616a944f84e782c..019482829b1a63a702a6d587e631bd20b363a589 100644
--- a/src/npc/interaction/fBoobs.js
+++ b/src/npc/interaction/fBoobs.js
@@ -87,7 +87,7 @@ App.Interact.fBoobs = function(slave) {
 			} else if (slave.boobs >= 300) {
 				r.push(`You have to feel around under your pregnancy to hold your cock against ${his} tiny breasts. You thrust against them and your hand, while the other teases your middle, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across ${his} front.`);
 			} else {
-				r.push(`You have to lean forward and pin your cock against ${his} flat chest with the underside of your own pregnancy to make any real channel to thrust into. You fondle your belly${(V.PC.boobs >= 300) ? `and breasts` : ``}, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across your underbelly and ${his} front. You turn around and have ${his} lick you clean before pulling your gravid bulk off of ${him}.`);
+				r.push(`You have to lean forward and pin your cock against ${his} flat chest with the underside of your own pregnancy to make any real channel to thrust into. You fondle your belly${(V.PC.boobs >= 300) ? ` and breasts` : ``}, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across your underbelly and ${his} front. You turn around and have ${his} lick you clean before pulling your gravid bulk off of ${him}.`);
 			}
 		} else {
 			r.push(`You lay ${him} down on the couch on ${his} back, lather oil onto ${his} breasts and gingerly straddle ${his} face; your needy cunt over ${his} mouth.`);
diff --git a/src/npc/interaction/fButt.js b/src/npc/interaction/fButt.js
index 26c7747368783adcf2212a94dc05b852e8187796..fd4c97964d93d3f08eda9e9ea059cee716d063c6 100644
--- a/src/npc/interaction/fButt.js
+++ b/src/npc/interaction/fButt.js
@@ -126,7 +126,7 @@ App.Interact.fButt = function(slave) {
 			r.push(`fuck ${his} ass. <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} <span class="trust dec">fears further anal pain.</span>`);
 			slave.trust -= 5;
 		} else {
-			r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? `and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`);
+			r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? ` and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`);
 			if (hasAnyArms(slave)) {
 				r.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`} behind ${him}`);
 			}
diff --git a/src/npc/interaction/fDance.js b/src/npc/interaction/fDance.js
index 9fa5693990ef457de39bd39c5e1109e88ab81c67..0ebe24ee3d4d81241c2de39f59d60234aaf391d9 100644
--- a/src/npc/interaction/fDance.js
+++ b/src/npc/interaction/fDance.js
@@ -1335,7 +1335,7 @@ App.Interact.fDance = function(slave) {
 			} else if (slave.boobs > 4000) {
 				r.push(`massive breasts stretch ${his} custom tailored dress to its absolute limit.`);
 			} else if (slave.boobs > 800) {
-				r.push(`big breasts stretch taut against ${his} dress, leaving nothing to the imagination.`);
+				r.push(`big breasts stretch ${his} dress taut, leaving nothing to the imagination.`);
 			} else if (slave.boobs < 300) {
 				r.push(`dress tightly hugs ${his} flat chest, prominently displaying ${his} ${slave.nipples} nipples though the fabric.`);
 			} else {
diff --git a/src/npc/interaction/fDick.js b/src/npc/interaction/fDick.js
index ef9814f9054c52823a38a97fc79236da3187c755..aabba388b571b1c8cdb0fd00a512a20160f5c68a 100644
--- a/src/npc/interaction/fDick.js
+++ b/src/npc/interaction/fDick.js
@@ -17,50 +17,50 @@ App.Interact.fDick = function(slave) {
 	addPartner(slave, -1);
 
 	const cunt = V.PC.vagina !== -1 ? "cunt" : "rectal";
-	const _belly = bellyAdjective(slave);
-	const _amount = cumAmount(slave);
-	let _load;
-	if (_amount <= 30) {
-		_load = "a few timid spurts";
-	} else if (_amount <= 60) {
-		_load = "an average load";
-	} else if (_amount <= 80) {
-		_load = "a large load";
-	} else if (_amount <= 100) {
-		_load = "a massive spurt of seed";
-	} else if (_amount <= 140) {
-		_load = "a huge spurt of seed";
-	} else if (_amount <= 160) {
-		_load = "a giant and drawn out gush";
-	} else if (_amount <= 180) {
-		_load = "an enormous and belly swelling load";
-	} else if (_amount <= 200) {
-		_load = "a monstrous, drawn out and belly swelling load";
+	const belly = bellyAdjective(slave);
+	const amount = cumAmount(slave);
+	let load;
+	if (amount <= 30) {
+		load = "a few timid spurts";
+	} else if (amount <= 60) {
+		load = "an average load";
+	} else if (amount <= 80) {
+		load = "a large load";
+	} else if (amount <= 100) {
+		load = "a massive spurt of seed";
+	} else if (amount <= 140) {
+		load = "a huge spurt of seed";
+	} else if (amount <= 160) {
+		load = "a giant and drawn out gush";
+	} else if (amount <= 180) {
+		load = "an enormous and belly swelling load";
+	} else if (amount <= 200) {
+		load = "a monstrous, drawn out and belly swelling load";
 	} else {
-		_load = "an overly massive and unending gush of seed";
+		load = "an overly massive and unending gush of seed";
 	}
 
-	let _nutte;
+	let nutte;
 	if (slave.balls === 1) {
-		_nutte = "vestigial";
+		nutte = "vestigial";
 	} else if (slave.balls === 2) {
-		_nutte = "small";
+		nutte = "small";
 	} else if (slave.balls === 3) {
-		_nutte = "average";
+		nutte = "average";
 	} else if (slave.balls === 4) {
-		_nutte = "large";
+		nutte = "large";
 	} else if (slave.balls === 5) {
-		_nutte = "massive";
+		nutte = "massive";
 	} else if (slave.balls === 6) {
-		_nutte = "huge";
+		nutte = "huge";
 	} else if (slave.balls === 7) {
-		_nutte = "giant";
+		nutte = "giant";
 	} else if (slave.balls === 8) {
-		_nutte = "enormous";
+		nutte = "enormous";
 	} else if (slave.balls === 9) {
-		_nutte = "monstrous";
+		nutte = "monstrous";
 	} else {
-		_nutte = "overly massive";
+		nutte = "overly massive";
 	}
 
 	let dickAdj;
@@ -140,7 +140,7 @@ App.Interact.fDick = function(slave) {
 			r.push(`down`);
 		}
 		if (slave.scrotum > 0) {
-			r.push(`and stroke ${his} ${_nutte} balls,`);
+			r.push(`and stroke ${his} ${nutte} balls,`);
 		} else if (slave.vagina > -1) {
 			r.push(`and tease ${his} neglected pussy,`);
 		} else {
@@ -172,19 +172,19 @@ App.Interact.fDick = function(slave) {
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} obedient cock. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} squeaks lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${_load} inside of you before apologizing submissively.`);
+				r.push(`on ${his} obedient cock. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} squeaks lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${load} inside of you before apologizing submissively.`);
 			} else if (slave.trust <= 20) {
 				r.push(`Having followed your instructions quickly and obediently, ${he} tries ${his} best to please you while you bounce`);
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} eager cock. ${He} grabs your hips and warns you ${he} is about to cum; in response you speed up your pace, encouraging ${him} to impale you on ${his} throbbing shaft. ${He} squeals lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${_load} into you before helping you up.`);
+				r.push(`on ${his} eager cock. ${He} grabs your hips and warns you ${he} is about to cum; in response you speed up your pace, encouraging ${him} to impale you on ${his} throbbing shaft. ${He} squeals lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${load} into you before helping you up.`);
 			} else {
 				r.push(`Having followed your instructions with gusto, ${he} energetically pounds you while you bounce`);
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} eager cock. ${He} grabs your hips and desperately warns you ${he} can't hold out any longer; in response you speed up your pace, tipping ${him} over the edge and forcing ${him} to impale you on ${his} twitching shaft. ${He} moans loudly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${_load} into you before pulling you into a post coitus embrace.`);
+				r.push(`on ${his} eager cock. ${He} grabs your hips and desperately warns you ${he} can't hold out any longer; in response you speed up your pace, tipping ${him} over the edge and forcing ${him} to impale you on ${his} twitching shaft. ${He} moans loudly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${load} into you before pulling you into a post coitus embrace.`);
 			}
 		} else if (slave.devotion >= -20) {
 			if (slave.trust < -20) {
@@ -192,13 +192,13 @@ App.Interact.fDick = function(slave) {
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} terrified cock. While ${he} is too afraid to enjoy pleasuring you, ${he} obediently thrusts into you. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic ${cunt} spasms, and blows ${_load} in you like a good little slave.`);
+				r.push(`on ${his} terrified cock. While ${he} is too afraid to enjoy pleasuring you, ${he} obediently thrusts into you. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic ${cunt} spasms, and blows ${load} in you like a good little slave.`);
 			} else if (slave.trust <= 20) {
 				r.push(`Having obediently followed your instructions, ${he} lies as still as ${he} can beneath you while you bounce`);
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} willing cock. While ${he} is too uncertain of ${his} position in the hierarchy to really enjoy ${himself}, ${he} hesitatingly thrusts into you. When ${he} feels ${he} is nearing ${his} limit, ${he} gives you proper warning that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic ${cunt} spasms and boldness, and blows ${_load} in you during the confusion.`);
+				r.push(`on ${his} willing cock. While ${he} is too uncertain of ${his} position in the hierarchy to really enjoy ${himself}, ${he} hesitatingly thrusts into you. When ${he} feels ${he} is nearing ${his} limit, ${he} gives you proper warning that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic ${cunt} spasms and boldness, and blows ${load} in you during the confusion.`);
 			} else {
 				r.push(`Having obediently followed your instructions, ${he} energetically pounds you while you bounce`);
 				if (V.PC.belly >= 5000) {
@@ -212,18 +212,18 @@ App.Interact.fDick = function(slave) {
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} reluctant cock. While ${he} is too afraid to be an active participant in pleasuring you, you make do with what ${he}'s giving. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${_load} inside of you despite ${his} fear.`);
+				r.push(`on ${his} reluctant cock. While ${he} is too afraid to be an active participant in pleasuring you, you make do with what ${he}'s giving. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${load} inside of you despite ${his} fear.`);
 			} else if (slave.trust <= 20) {
 				r.push(`Having followed your instructions as quickly as ${he} could, ${he} lies as still as ${he} can beneath you while you bounce`);
 				if (V.PC.belly >= 5000) {
 					r.push(`your gravid bulk`);
 				}
-				r.push(`on ${his} reluctant cock. While ${he} is too hateful to be an active participant in pleasuring you, you make do with what ${he}'s got. ${He} cries out lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${_load} deep inside you without warning. ${He} <span class="orangered">smirks a little</span> as you glare daggers at ${him}.`);
+				r.push(`on ${his} reluctant cock. While ${he} is too hateful to be an active participant in pleasuring you, you make do with what ${he}'s got. ${He} cries out lewdly, overwhelmed by your orgasmic ${cunt} spasms, and unloads ${load} deep inside you without warning. ${He} <span class="orangered">smirks a little</span> as you glare daggers at ${him}.`);
 				slave.trust++;
 			} else if (overpowerCheck(slave, V.PC) < random(1, 100)) {
 				r.push(`Without warning, ${he} flips you onto your side and, still hilted,`);
 				if (slave.belly >= 300000) {
-					r.push(`repositions you onto your hands and knees while using ${his} ${_belly} belly to pin you under ${him}.`);
+					r.push(`repositions you onto your hands and knees while using ${his} ${belly} belly to pin you under ${him}.`);
 				} else if (V.PC.belly >= 5000) {
 					r.push(`rolls you into missionary while pinning your arms and legs.`);
 				} else if (V.PC.boobs >= 1000) {
@@ -235,7 +235,7 @@ App.Interact.fDick = function(slave) {
 				} else {
 					r.push(`rolls you into missionary while pinning your arms and forcing you into a mating press.`);
 				}
-				r.push(`Such audacity takes you entirely by surprise and gives ${him} the edge ${he} needs to pull it off. ${He} vigorously pistons in and out of you with little regard for you${(V.PC.pregKnown === 1) ? `or your pregnancy` : ``}, fucking you senseless until ${he} has had enough and cums deep inside your`);
+				r.push(`Such audacity takes you entirely by surprise and gives ${him} the edge ${he} needs to pull it off. ${He} vigorously pistons in and out of you with little regard for you${(V.PC.pregKnown === 1) ? ` or your pregnancy` : ``}, fucking you senseless until ${he} has had enough and cums deep inside your`);
 				if (V.PC.vagina !== -1) {
 					r.push(`pussy.`);
 				} else {
@@ -295,7 +295,7 @@ App.Interact.fDick = function(slave) {
 
 		r.push(`You reach back`);
 		if (slave.scrotum > 0) {
-			r.push(`and stroke ${his} ${_nutte} balls.`);
+			r.push(`and stroke ${his} ${nutte} balls.`);
 		} else if (slave.vagina > -1) {
 			r.push(`and tease ${his} neglected pussy.`);
 		} else {
@@ -366,11 +366,11 @@ App.Interact.fDick = function(slave) {
 
 	if (canImpreg(V.PC, slave)) {
 		if (slave.diet === "cum production") {
-			const _pregChance = (slave.balls * 5 * 1.2);
-			r.push(knockMeUp(V.PC, _pregChance, 0, slave.ID));
+			const pregChance = (slave.balls * 5 * 1.2);
+			r.push(knockMeUp(V.PC, pregChance, 0, slave.ID));
 		} else {
-			const _pregChance = (slave.balls * 5);
-			r.push(knockMeUp(V.PC, _pregChance, 0, slave.ID));
+			const pregChance = (slave.balls * 5);
+			r.push(knockMeUp(V.PC, pregChance, 0, slave.ID));
 		}
 	}
 	if (V.policies.sexualOpenness === 0) {
diff --git a/src/npc/interaction/fFeelings.js b/src/npc/interaction/fFeelings.js
index d873503662c49db765906999914cbb90f6d8ae0d..883ac05791e39681ca01fbaf4628b1d5f15210f7 100644
--- a/src/npc/interaction/fFeelings.js
+++ b/src/npc/interaction/fFeelings.js
@@ -1184,31 +1184,31 @@ App.Interact.feelings = function(slave) {
 		}
 
 		if (slave.inflation > 0) {
-			let _fluid;
+			let fluid;
 			if (SlaveStatsChecker.checkForLisp(slave)) {
-				_fluid = lispReplace(slave.inflationType);
+				fluid = lispReplace(slave.inflationType);
 			} else {
-				_fluid = slave.inflationType;
+				fluid = slave.inflationType;
 			}
-			if (slave.behavioralFlaw === "gluttonous" && ["food", "milk"].includes(_fluid) && [1, 3].includes(slave.inflationMethod) && slave.fetish === "humiliation" && slave.fetishStrength > 60) {
+			if (slave.behavioralFlaw === "gluttonous" && ["food", "milk"].includes(fluid) && [1, 3].includes(slave.inflationMethod) && slave.fetish === "humiliation" && slave.fetishStrength > 60) {
 				if (slave.bellyFluid >= 10000) {
 					r.push(Spoken(slave, `My belly hurts a bit, but it's worth it to let everybody know what a disgraceful, gluttonous <span class="note">pig</span> I am.`));
 				} else if (slave.bellyFluid >= 5000) {
-					r.push(Spoken(slave, `I can't believe I get to gorge myself silly on ${_fluid} and show it off! Thank you, ${Master}.`));
+					r.push(Spoken(slave, `I can't believe I get to gorge myself silly on ${fluid} and show it off! Thank you, ${Master}.`));
 				} else if (slave.bellyFluid >= 2000) {
-					r.push(Spoken(slave, `This ${_fluid} is delicious, but wouldn't it be hot if your little piggy had an even <span class="note">bigger</span> belly for people to stare at?`));
+					r.push(Spoken(slave, `This ${fluid} is delicious, but wouldn't it be hot if your little piggy had an even <span class="note">bigger</span> belly for people to stare at?`));
 				}
-			} else if (slave.behavioralFlaw === "gluttonous" && ["food", "milk"].includes(_fluid) && [1, 3].includes(slave.inflationMethod)) {
+			} else if (slave.behavioralFlaw === "gluttonous" && ["food", "milk"].includes(fluid) && [1, 3].includes(slave.inflationMethod)) {
 				if (slave.bellyFluid >= 10000 && slave.fetish === "masochist" && slave.fetishStrength > 60) {
-					r.push(Spoken(slave, `This ${_fluid} is so tasty, and my belly hurts so <span class="note">good</span>... I wish I really could stuff myself to bursting.`));
+					r.push(Spoken(slave, `This ${fluid} is so tasty, and my belly hurts so <span class="note">good</span>... I wish I really could stuff myself to bursting.`));
 				} else if (slave.bellyFluid >= 10000) {
 					r.push(Spoken(slave, `My belly hurts a little, but it feels so good to gorge myself...`));
 				} else if (slave.bellyFluid >= 5000) {
 					r.push(Spoken(slave, `I can't believe I get to stuff myself like this! Thank you, ${Master}.`));
 				} else if (slave.bellyFluid >= 2000) {
-					r.push(Spoken(slave, `Thank you for letting me have so much delicious ${_fluid}, ${Master}.`));
+					r.push(Spoken(slave, `Thank you for letting me have so much delicious ${fluid}, ${Master}.`));
 				}
-			} else if (slave.sexualFlaw === "cum addict" && _fluid === "cum" && [1, 3].includes(slave.inflationMethod)) {
+			} else if (slave.sexualFlaw === "cum addict" && fluid === "cum" && [1, 3].includes(slave.inflationMethod)) {
 				if (slave.bellyFluid >= 10000 && slave.fetish === "masochist" && slave.fetishStrength > 60) {
 					r.push(Spoken(slave, `I'm so full of tasty cum it <span class="note">hurts,</span> ${Master}. I think this is what heaven feels like...`));
 				} else if (slave.bellyFluid >= 10000) {
@@ -1218,7 +1218,7 @@ App.Interact.feelings = function(slave) {
 				} else if (slave.bellyFluid >= 2000) {
 					r.push(Spoken(slave, `Thank you for letting me have so much delicious cum, ${Master}.`));
 				}
-			} else if (slave.sexualFlaw === "cum addict" && _fluid === "cum" && slave.inflationMethod === 2) {
+			} else if (slave.sexualFlaw === "cum addict" && fluid === "cum" && slave.inflationMethod === 2) {
 				if (slave.bellyFluid >= 10000 && slave.fetish === "masochist" && slave.fetishStrength > 60) {
 					r.push(Spoken(slave, `It feels like I'm <span class="note">bursting</span> with cum, ${Master}. It's wonderful, even if I can't taste it.`));
 				} else if (slave.bellyFluid >= 10000) {
@@ -1240,11 +1240,11 @@ App.Interact.feelings = function(slave) {
 				if (slave.bellyFluid >= 10000 && slave.fetish === "masochist" && slave.fetishStrength > 60) {
 					r.push(Spoken(slave, `My guts are so full, ${Master}, it hurts so <span class="note">good</span>...`));
 				} else if (slave.bellyFluid >= 10000) {
-					r.push(Spoken(slave, `I feel really full, can I let the ${_fluid} out now?`));
+					r.push(Spoken(slave, `I feel really full, can I let the ${fluid} out now?`));
 				} else if (slave.bellyFluid >= 5000) {
-					r.push(Spoken(slave, `I feel so full, can I let the ${_fluid} out now?`));
+					r.push(Spoken(slave, `I feel so full, can I let the ${fluid} out now?`));
 				} else if (slave.bellyFluid >= 2000) {
-					r.push(Spoken(slave, `I feel so uncomfortable, can I let the ${_fluid} out now?`));
+					r.push(Spoken(slave, `I feel so uncomfortable, can I let the ${fluid} out now?`));
 				}
 			}
 		}
@@ -1602,6 +1602,7 @@ App.Interact.feelings = function(slave) {
 				break;
 			case "work as a farmhand":
 				// TODO: add a description for this
+				break;
 			case "please you":
 			case "serve in the master suite":
 			case "be your Concubine":
@@ -1693,17 +1694,17 @@ App.Interact.feelings = function(slave) {
 		}
 
 		if (slave.relationship > 0) {
-			const _partner = getSlave(slave.relationshipTarget);
+			const partner = getSlave(slave.relationshipTarget);
 			const {
 				He2, His2,
 				he2, his2, him2, daughter2, sister2,
-			} = getPronouns(_partner).appendSuffix("2");
-			let _partnerName;
-			if (_partner) {
+			} = getPronouns(partner).appendSuffix("2");
+			let partnerName;
+			if (partner) {
 				if (willLisp) {
-					_partnerName = lispReplace(_partner.slaveName);
+					partnerName = lispReplace(partner.slaveName);
 				} else {
-					_partnerName = _partner.slaveName;
+					partnerName = partner.slaveName;
 				}
 			} else {
 				r.push(Spoken(slave, `<span class="red">Error, relationshipTarget not found.</span>`));
@@ -1715,7 +1716,7 @@ App.Interact.feelings = function(slave) {
 				} else {
 					r.push(Spoken(slave, `hanging out with`));
 				}
-				r.push(Spoken(slave, `${_partnerName} every day, ${he2}'s a good friend." ${He} blushes. "${He2}'s kind of hot, too.`));
+				r.push(Spoken(slave, `${partnerName} every day, ${he2}'s a good friend." ${He} blushes. "${He2}'s kind of hot, too.`));
 			} else if (slave.relationship <= 3) {
 				r.push(Spoken(slave, `I really like`));
 				if (canSee(slave)) {
@@ -1723,85 +1724,85 @@ App.Interact.feelings = function(slave) {
 				} else {
 					r.push(Spoken(slave, `hanging out with`));
 				}
-				r.push(Spoken(slave, `${_partnerName} every day, ${he2}'s a good friend —" ${He} blushes. "— even when we're not fucking.`));
+				r.push(Spoken(slave, `${partnerName} every day, ${he2}'s a good friend —" ${He} blushes. "— even when we're not fucking.`));
 			} else if (slave.relationship <= 4) {
-				r.push(Spoken(slave, `I really love ${_partnerName}." ${He} blushes. "Thank you for letting us be together, ${Master}.`));
+				r.push(Spoken(slave, `I really love ${partnerName}." ${He} blushes. "Thank you for letting us be together, ${Master}.`));
 			} else {
-				r.push(Spoken(slave, `I'm so happy with ${_partnerName}." ${He} blushes. "Thank you for ${him2}, ${Master}.`));
+				r.push(Spoken(slave, `I'm so happy with ${partnerName}." ${He} blushes. "Thank you for ${him2}, ${Master}.`));
 			}
 			if (slave.relationship >= 3) {
-				if (slave.mother === _partner.ID) {
+				if (slave.mother === partner.ID) {
 					r.push(Spoken(slave, `"I — I'm fucking my mother,"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2}'s such a hot MILF, I can't stop.`));
-				} else if (slave.father === _partner.ID) {
+				} else if (slave.father === partner.ID) {
 					r.push(Spoken(slave, `I — I'm fucking my father,"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} knows so much about penetration, I can't stop.`));
-				} else if (_partner.mother === slave.ID) {
+				} else if (partner.mother === slave.ID) {
 					r.push(Spoken(slave, `I — I'm fucking my ${daughter2},"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body, I can't stop.`));
-				} else if (_partner.father === slave.ID) {
+				} else if (partner.father === slave.ID) {
 					r.push(Spoken(slave, `I — I'm fucking my ${daughter2},"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body. ${He2} looks so much like ${his2} mother, I can't stop.`));
-				} else if (areSisters(slave, _partner) === 1) {
+				} else if (areSisters(slave, partner) === 1) {
 					r.push(Spoken(slave, `I — I'm fucking my twin ${sister2},"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`));
-				} else if (areSisters(slave, _partner) === 2) {
+				} else if (areSisters(slave, partner) === 2) {
 					r.push(Spoken(slave, `I — I'm fucking my ${sister2},"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`));
-				} else if (areSisters(slave, _partner) === 3) {
+				} else if (areSisters(slave, partner) === 3) {
 					r.push(Spoken(slave, `I — I'm fucking my half-${sister2},"`));
 					r.push(`${he} bursts out, blushing even harder.`);
 					r.push(Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`));
-				} else if ((slave.actualAge + 14) < _partner.actualAge) {
+				} else if ((slave.actualAge + 14) < partner.actualAge) {
 					r.push(Spoken(slave, `${He2}'s old enough to be my mother."`));
 					r.push(`${He} looks down, blushing a little harder.`);
 					r.push(Spoken(slave, `"But I'm lucky, ${he2}'s such a hot MILF.`));
-				} else if ((slave.actualAge - 14) > _partner.actualAge) {
+				} else if ((slave.actualAge - 14) > partner.actualAge) {
 					r.push(Spoken(slave, `${He2}'s young enough to be my ${daughter2}."`));
 					r.push(`${He} looks down, blushing a little harder.`);
 					r.push(Spoken(slave, `"But I love ${his2} hot young body.`));
 				}
-				if ((slave.actualAge - 5) > _partner.actualAge && _partner.actualAge < 20) {
+				if ((slave.actualAge - 5) > partner.actualAge && partner.actualAge < 20) {
 					r.push(Spoken(slave, `${He2}'s a little immature at times, but having sex with a teenager is so awesome, it's worth it.`));
 				}
-				if (hasAnyProstheticLimbs(_partner)) {
-					const _sex = getLimbCount(_partner, 103);
-					const _beauty = getLimbCount(_partner, 104);
-					const _combat = getLimbCount(_partner, 105);
-					if (_sex > 0 && _beauty > 0 && _combat > 0) {
+				if (hasAnyProstheticLimbs(partner)) {
+					const sex = getLimbCount(partner, 103);
+					const beauty = getLimbCount(partner, 104);
+					const combat = getLimbCount(partner, 105);
+					if (sex > 0 && beauty > 0 && combat > 0) {
 						r.push(Spoken(slave, `${His2} P-Limbs do look cool and I like how strong they can make ${him2} but they scare me a little, sometimes. Though of course ${he2} disables the weapons when we're together."`));
 						r.push(`${He} giggles.`);
 						r.push(Spoken(slave, `"${He2} has vibe fingers, so that's awesome.`));
-					} else if (_sex > 0 && _beauty > 0) {
+					} else if (sex > 0 && beauty > 0) {
 						r.push(Spoken(slave, `I really like ${his2} P-Limbs. They're very pretty, but kind of cold. That's just how ${he2} is."`));
 						r.push(`${He} giggles.`);
 						r.push(Spoken(slave, `" ${He2} has vibe fingers. so that's awesome.`));
-					} else if (_beauty > 0 && _combat > 0) {
+					} else if (beauty > 0 && combat > 0) {
 						r.push(Spoken(slave, `${His2} P-Limbs do look cool and I like how strong they can make ${him2} but they scare me a little, sometimes. Though of course ${he2} disables the weapons when we're together.`));
-					} else if (_sex > 0 && _combat > 0) {
+					} else if (sex > 0 && combat > 0) {
 						r.push(Spoken(slave, `${His2} P-Limbs do scare me a little, sometimes. Though of course ${he2} disables the weapons when we're together."`));
 						r.push(`${He} giggles.`);
 						r.push(Spoken(slave, `"${He2} has vibe fingers. so that's awesome.`));
-					} else if (_sex > 0) {
+					} else if (sex > 0) {
 						r.push(Spoken(slave, `And, um."`));
 						r.push(`${He} giggles.`);
 						r.push(Spoken(slave, `"${He2} has vibe fingers. so that's awesome.`));
-					} else if (_beauty > 0) {
+					} else if (beauty > 0) {
 						r.push(Spoken(slave, `I really like ${his2} P-Limbs. They're very pretty, but kind of cold. That's just how ${he2} is.`));
-					} else if (_combat > 0) {
+					} else if (combat > 0) {
 						r.push(Spoken(slave, `${His2} P-Limbs do scare me a little, sometimes. Though of course ${he2} disables the weapons when we're together."`));
 						r.push(`${He} giggles.`);
 						r.push(Spoken(slave, `"Though I did get ${him2} to extend ${his2} blades once, so I could kiss them for luck.`));
 					} else {
 						r.push(Spoken(slave, `I really do like ${his2} P-Limbs. They're a little awkward, and kind of cold, but that's just how ${he2} is.`));
 					}
-				} else if (getLimbCount(_partner, 0) > 0) {
+				} else if (getLimbCount(partner, 0) > 0) {
 					r.push(Spoken(slave, `${He2}'s an amputee, of course, so that's a little sad.`));
 				}
 			}
diff --git a/src/npc/interaction/fFeet.js b/src/npc/interaction/fFeet.js
index e229b09030626692a04dc5cc0c5d8f8156e4ef7a..f0e7eae423bbb5dbc614a4684c1b8ee498a2e76d 100644
--- a/src/npc/interaction/fFeet.js
+++ b/src/npc/interaction/fFeet.js
@@ -15,12 +15,12 @@ App.Interact.fFeet = function(slave) {
 
 	addPartner(slave, -1);
 
-	const _footSeed = random(1, 100);
+	const footSeed = random(1, 100);
 	let thighsAdj;
-	let _belly;
+	let belly;
 	let legsAdj;
 	let boobsDesc;
-	let _boobs;
+	let boobs;
 	let ballsDesc;
 	let dickAdj;
 	let buttAdj;
@@ -76,9 +76,9 @@ App.Interact.fFeet = function(slave) {
 	}
 
 	if (slave.belly < 1500) {
-		_belly = thighsAdj;
+		belly = thighsAdj;
 	} else {
-		_belly = bellyAdjective(slave);
+		belly = bellyAdjective(slave);
 	}
 
 	if (slave.height >= 185) {
@@ -95,7 +95,7 @@ App.Interact.fFeet = function(slave) {
 
 	if (slave.boobs >= 30000) {
 		boobsDesc = "skip";
-		_boobs = "room filling";
+		boobs = "room filling";
 	} else if (slave.boobs >= 20000) {
 		boobsDesc = "beanbag sized";
 	} else if (slave.boobs >= 8500) {
@@ -150,10 +150,10 @@ App.Interact.fFeet = function(slave) {
 		boobsDesc = "B-cup";
 	} else {
 		boobsDesc = "skip";
-		_boobs = "flat";
+		boobs = "flat";
 	}
 	if (boobsDesc !== "skip") {
-		_boobs = boobsDesc + " " + slave.boobShape;
+		boobs = boobsDesc + " " + slave.boobShape;
 	}
 
 	if (slave.balls === 1) {
@@ -286,13 +286,13 @@ App.Interact.fFeet = function(slave) {
 	// Part 2: lube and reaction
 	if (!canWalk(slave)) {
 		if (tooBigBreasts(slave)) {
-			r.push(`Since ${he} is immobilized by ${his} ${_boobs} boobs, you have ${him} lay on ${his} side on the floor,`);
+			r.push(`Since ${he} is immobilized by ${his} ${boobs} boobs, you have ${him} lay on ${his} side on the floor,`);
 		} else if (tooBigBelly(slave)) {
 			r.push(`Since ${he} is immobilized by ${his}`);
 			if (slave.bellyPreg >= 3000) {
 				r.push(`hugely gravid`);
 			} else if (slave.bellyImplant >= 3000) {
-				r.push(`${_belly} protruding`);
+				r.push(`${belly} protruding`);
 			} else {
 				r.push(`heavy ${slave.inflationType}-filled`);
 			}
@@ -374,9 +374,9 @@ App.Interact.fFeet = function(slave) {
 		}
 		if (!canWalk(slave)) {
 			if (slave.boobs > slave.belly ) {
-				r.push(`${His} ${_boobs} breasts wobble as ${his} ${feet} service you.`);
+				r.push(`${His} ${boobs} breasts wobble as ${his} ${feet} service you.`);
 			} else {
-				r.push(`${His} ${_belly} belly wobbles as ${his} ${feet} service you.`);
+				r.push(`${His} ${belly} belly wobbles as ${his} ${feet} service you.`);
 			}
 		}
 	} else if (slave.devotion < -50) {
@@ -469,9 +469,9 @@ App.Interact.fFeet = function(slave) {
 			} else if (slave.boobs < 500) {
 				r.push(`small chest.`);
 			} else if (slave.boobs >= 18000) {
-				r.push(`${_boobs} breasts, though ${he} can't reach ${his} nipples.`);
+				r.push(`${boobs} breasts, though ${he} can't reach ${his} nipples.`);
 			} else {
-				r.push(`${_boobs} breasts and erect nipples.`);
+				r.push(`${boobs} breasts and erect nipples.`);
 			}
 			r.push(`${He} is certainly giving you plenty of sexy options for you to watch.`);
 		} else if (slave.fetish === "sadist" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
@@ -501,7 +501,7 @@ App.Interact.fFeet = function(slave) {
 				if (hasBothArms(slave)) {
 					r.push(`one of`);
 				}
-				r.push(`${his} ${hands} roaming across ${his} ${_belly} belly as ${he} happily services you.`);
+				r.push(`${his} ${hands} roaming across ${his} ${belly} belly as ${he} happily services you.`);
 			} else {
 				r.push(`${feet}.`);
 			}
@@ -540,16 +540,16 @@ App.Interact.fFeet = function(slave) {
 			r.push(`Feeling`);
 		}
 		r.push(`you near your orgasm, ${he}`);
-		if (_footSeed < 40 && hasAnyArms(slave)) {
+		if (footSeed < 40 && hasAnyArms(slave)) {
 			if (slave.boobs < 300) {
 				r.push(`presses ${his} ${hands} on ${his} flat chest,`);
 			} else if (slave.boobs < 500) {
 				r.push(`puts ${his} ${hands} under ${his} small chest,`);
 			} else {
-				r.push(`cups ${his} ${_boobs} breasts with ${his} ${hands},`);
+				r.push(`cups ${his} ${boobs} breasts with ${his} ${hands},`);
 			}
 			r.push(`then sticks out ${his} tongue, posing like a Free Cities whore who wants a cumshot.`);
-		} else if (_footSeed < 70 && !(slave.chastityPenis) && !(slave.chastityVagina) && (slave.dick > 0 || slave.vagina >= 0 )) {
+		} else if (footSeed < 70 && !(slave.chastityPenis) && !(slave.chastityVagina) && (slave.dick > 0 || slave.vagina >= 0 )) {
 			r.push(`spreads ${his} ${legsAdj} ${legs}`);
 			if (slave.dick > 0) {
 				if (slave.vagina >= 0) {
@@ -608,7 +608,7 @@ App.Interact.fFeet = function(slave) {
 	if (slave.fetish === "mindbroken") {
 		r.push(`You eventually cum all over ${his} ${skin}`);
 		if (V.PC.balls >= 9) {
-			r.push(`${feet} ${legsAdj} ${legs}, and even ${_belly} belly with your massive load.`);
+			r.push(`${feet} ${legsAdj} ${legs}, and even ${belly} belly with your massive load.`);
 		} else if (V.PC.balls >= 5) {
 			r.push(`${feet} and ${legsAdj} ${legs} with your large load.`);
 		} else {
@@ -665,7 +665,7 @@ App.Interact.fFeet = function(slave) {
 	} else if (slave.devotion < -50) {
 		r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 		if (V.PC.balls >= 9) {
-			r.push(`${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+			r.push(`${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 		} else if (V.PC.balls >= 5) {
 			r.push(`and ${legsAdj} ${legs} with your large load`);
 		}
@@ -673,7 +673,7 @@ App.Interact.fFeet = function(slave) {
 	} else if (slave.devotion < -20) {
 		r.push(`You eventually cum all over ${his} ${skin}`);
 		if (V.PC.balls >= 9) {
-			r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load,`);
+			r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load,`);
 		} else if (V.PC.balls >= 5) {
 			r.push(`${feet} and ${legsAdj} ${legs} with your large load,`);
 		} else {
@@ -683,7 +683,7 @@ App.Interact.fFeet = function(slave) {
 	} else if (slave.devotion <= 20) {
 		r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 		if (V.PC.balls >= 9) {
-			r.push(`${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+			r.push(`${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 		} else if (V.PC.balls >= 5) {
 			r.push(`and ${legsAdj} ${legs} with your large load`);
 		}
@@ -691,7 +691,7 @@ App.Interact.fFeet = function(slave) {
 	} else if (slave.devotion < 60 || slave.attrXY < 16 || (slave.sexualQuirk === "unflinching" && slave.devotion <= 20)) {
 		r.push(`You eventually cum all over ${his} ${skin}`);
 		if (V.PC.balls >= 9) {
-			r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load,`);
+			r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load,`);
 		} else if (V.PC.balls >= 5) {
 			r.push(`${feet} and ${legsAdj} ${legs} with your large load,`);
 		} else {
@@ -710,9 +710,9 @@ App.Interact.fFeet = function(slave) {
 					} else if (slave.boobs < 500) {
 						r.push(`small chest`);
 					} else {
-						r.push(`${_boobs} breasts`);
+						r.push(`${boobs} breasts`);
 					}
-					r.push(`and ${_belly} belly onto ${his} thighs.`);
+					r.push(`and ${belly} belly onto ${his} thighs.`);
 				} else {
 					r.push(`Your large load coats ${his} face in sticky semen, some dripping onto ${his}`);
 					if (slave.boobs < 300) {
@@ -720,7 +720,7 @@ App.Interact.fFeet = function(slave) {
 					} else if (slave.boobs < 500) {
 						r.push(`small chest.`);
 					} else {
-						r.push(`${_boobs} breasts.`);
+						r.push(`${boobs} breasts.`);
 					}
 				}
 			} else {
@@ -729,7 +729,7 @@ App.Interact.fFeet = function(slave) {
 		} else if (slave.fetish === "humiliation" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
 			r.push(`You eventually cum all over ${his} ${skin}`);
 			if (V.PC.balls >= 9) {
-				r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`${feet} and ${legsAdj} ${legs} with your large load`);
 			} else {
@@ -739,7 +739,7 @@ App.Interact.fFeet = function(slave) {
 		} else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
 			r.push(`You eventually cum all over ${his} ${skin}`);
 			if (V.PC.balls >= 9) {
-				r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`${feet} and ${legsAdj} ${legs} with your large load`);
 			} else {
@@ -761,7 +761,7 @@ App.Interact.fFeet = function(slave) {
 		} else if (slave.fetish === "boobs" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
 			r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 			if (V.PC.balls >= 9) {
-				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`and ${legsAdj} ${legs} with your large load`);
 			}
@@ -771,13 +771,13 @@ App.Interact.fFeet = function(slave) {
 			} else if (slave.boobs < 500) {
 				r.push(`rubs ${his} ${hands} across ${his} small chest`);
 			} else {
-				r.push(`squeezes ${his} ${_boobs} breasts tightly`);
+				r.push(`squeezes ${his} ${boobs} breasts tightly`);
 			}
 			r.push(`while moaning in pleasure.`);
 		} else if (slave.fetish === "sadist" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
 			r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 			if (V.PC.balls >= 9) {
-				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`and ${legsAdj} ${legs} with your large load`);
 			}
@@ -785,7 +785,7 @@ App.Interact.fFeet = function(slave) {
 		} else if (slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) {
 			r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 			if (V.PC.balls >= 9) {
-				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`and ${legsAdj} ${legs} with your large load`);
 			}
@@ -823,7 +823,7 @@ App.Interact.fFeet = function(slave) {
 			}
 			r.push(`Your orgasm shoots across ${his} ${skin}`);
 			if (V.PC.balls >= 9) {
-				r.push(`${feet}, ${legsAdj} ${legs}, and even ${his} ${_belly} belly is marked with your massive load. ${He} runs ${his} ${hands} through the cum on ${his} belly, massaging the semen into ${his} skin.`);
+				r.push(`${feet}, ${legsAdj} ${legs}, and even ${his} ${belly} belly is marked with your massive load. ${He} runs ${his} ${hands} through the cum on ${his} belly, massaging the semen into ${his} skin.`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`${feet} and ${legsAdj} ${legs}.`);
 			} else {
@@ -832,7 +832,7 @@ App.Interact.fFeet = function(slave) {
 		} else {
 			r.push(`You eventually cum all over ${his} ${skin} ${feet}`);
 			if (V.PC.balls >= 9) {
-				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`);
+				r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${belly} belly with your massive load`);
 			} else if (V.PC.balls >= 5) {
 				r.push(`and ${legsAdj} ${legs} with your large load`);
 			}
@@ -892,7 +892,7 @@ App.Interact.fFeet = function(slave) {
 				if (cumAmount(slave) > 20) { // huge load
 					r.push(`${His} ${dickAdj} dick unloads a massive amount of cum, adding ${his} own semen to ${his} body, resulting in a slave covered nearly head to toe in spunk.`);
 				} else {
-					r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${_boobs} chest, and ${he} giggles and gasps as it rains down.`);
+					r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${boobs} chest, and ${he} giggles and gasps as it rains down.`);
 				}
 			} else if (slave.vagina >= 0) {
 				r.push(`${He} leans back and moans in pleasure, showing ${his}`);
@@ -927,7 +927,7 @@ App.Interact.fFeet = function(slave) {
 					}
 					r.push(`${he} couldn't be happier.`);
 				} else {
-					r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${_boobs} chest, and ${he} giggles and gasps as it rains down with audible splats. ${He} is splattered in semen, face coated in your cum, and judging by`);
+					r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${boobs} chest, and ${he} giggles and gasps as it rains down with audible splats. ${He} is splattered in semen, face coated in your cum, and judging by`);
 					if (canSmell(slave)) {
 						r.push(`${his} nostrils desperately taking in the heady smell and`);
 					}
diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index c6ebb02242839929928b3fb0c65b229d7d86d14a..451396c50676ab22aef5a4739ff815b8f358de7a 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -15,6 +15,7 @@ App.Interact.fKiss = function(slave) {
 	const {title: Master, say: say} = getEnunciation(slave);
 
 	const {womanP} = getPronouns(V.PC).appendSuffix("P");
+	/** @type {FC.MouthAccessory|""} */
 	let assignedGag = "";
 	r.push(`You tell ${slave.slaveName} to`);
 	switch (slave.mouthAccessory) {
diff --git a/src/npc/interaction/fLickPussy.js b/src/npc/interaction/fLickPussy.js
index a6a7b52c5b7e72d627f9f681c46a07f1d1832e93..d147dd9b9bb559cfdc4cc5c738d5691a44525e45 100644
--- a/src/npc/interaction/fLickPussy.js
+++ b/src/npc/interaction/fLickPussy.js
@@ -16,17 +16,17 @@ App.Interact.fLickPussy = function(slave) {
 
 	addPartner(slave, -1);
 
-	const _devotion = slave.devotion; /* for brevity*/
+	const devotion = slave.devotion; /* for brevity*/
 
 	if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) {
 		r.push(`You summon ${slave.slaveName} to your office and order ${him} to lie down on the couch. ${He} does so`);
-		if (_devotion > 95) {
+		if (devotion > 95) {
 			r.push(`with a smile, skipping over to give you a quick kiss before ${he} complies with your request.`);
-		} else if (_devotion > 50) {
+		} else if (devotion > 50) {
 			r.push(`without hesitation, ready to serve and obey.`);
-		} else if (_devotion > -50) {
+		} else if (devotion > -50) {
 			r.push(`with a look of trepidation, as though afraid you're going to hurt ${him}.`);
-		} else if (_devotion <= -50) {
+		} else if (devotion <= -50) {
 			r.push(`with a look of hatred, though only after you threaten to punish ${him}.`);
 		}
 	} else {
@@ -36,7 +36,7 @@ App.Interact.fLickPussy = function(slave) {
 	r.push(`After ${he} is situated, you go over to`);
 	if (slave.clothes !== "no clothing") {
 		r.push(`${him} and take off ${his} clothing, causing ${him} to`);
-		if (_devotion > 50) {
+		if (devotion > 50) {
 			r.push(`give you a soft smile.`);
 		} else {
 			r.push(`give you an angry glare.`);
@@ -96,11 +96,11 @@ App.Interact.fLickPussy = function(slave) {
 		r.push(`${his} ${relativeTerm(slave, V.PC)}`);
 	} else {
 		r.push(`the ${womanP}`);
-		if (_devotion > 95) {
+		if (devotion > 95) {
 			r.push(`${he} loves`);
-		} else if (_devotion > 50) {
+		} else if (devotion > 50) {
 			r.push(`${he}'s accepted as ${his} ${getWrittenTitle(slave)}`);
-		} else if (_devotion < -50) {
+		} else if (devotion < -50) {
 			r.push(`${he} hates`);
 		} else if (slave.trust < -50) {
 			r.push(`${he} fears`);
@@ -121,7 +121,7 @@ App.Interact.fLickPussy = function(slave) {
 	r.push(`Before ${he} cums, though, you pull back, causing ${him} to whine in frustration. You begin again, then pull back again just before ${he} orgasms. You repeat this several more times, each time causing ${him} to become more and more frustrated. Finally, one last stroke of your tongue causes ${him} to go over the edge, making ${him}`);
 	if (canTalk(slave)) {
 		r.push(`scream out`);
-		if (_devotion > 50) {
+		if (devotion > 50) {
 			r.push(`your name`);
 		}
 	} else {
diff --git a/src/npc/interaction/fNippleFuck.js b/src/npc/interaction/fNippleFuck.js
index 6dea0848d81846be5807a1c8fa7cc33fdfd8b530..496ec559d49b0057efd881c7eaba92b3d5a6f10c 100644
--- a/src/npc/interaction/fNippleFuck.js
+++ b/src/npc/interaction/fNippleFuck.js
@@ -65,9 +65,22 @@ App.Interact.fNippleFuck = function(slave) {
 	} else if (slave.devotion > 20 || slave.trust > 20) {
 		r.push(`${He} has a glassy-eyed expression as ${he}`);
 		if (hasBothArms(slave)) {
-			r.push(`gropes ${his} breasts with one hand and furiously abuses ${his} clit with the other.`);
+			r.push(`gropes ${his} breasts with`);
+			if (slave.dick > 0 && slave.chastityPenis === 0) {
+				r.push(`one hand and furiously beats ${himself} off with the other.`);
+			} else if (canDoVaginal(slave)) {
+				r.push(`one hand and furiously abuses ${his} clit with the other.`);
+			} else {
+				r.push(`both hands.`);
+			}
 		} else if (hasAnyArms(slave)) {
-			r.push(`fingers ${his} pussy while rubbing ${his} arm alongside ${his} breasts.`);
+			if (slave.dick > 0 && slave.chastityPenis === 0) {
+				r.push(`jacks off while rubbing ${his} arm alongside ${his} breasts.`);
+			} else if (canDoVaginal(slave)) {
+				r.push(`fingers ${his} pussy while rubbing ${his} arm alongside ${his} breasts.`);
+			} else {
+				r.push(`while ${he} gropes ${his} neglected breast.`);
+			}
 		} else {
 			r.push(`tries ${his} hardest to pleasure ${himself} with no hands.`);
 		}
diff --git a/src/npc/interaction/fPCImpreg.js b/src/npc/interaction/fPCImpreg.js
index c6bd63ed6fe5c0a089bed5880d25c3467b3e6801..a707bbfe1531fa0f04b2ef86c8f6532cf240122c 100644
--- a/src/npc/interaction/fPCImpreg.js
+++ b/src/npc/interaction/fPCImpreg.js
@@ -126,7 +126,7 @@ App.Interact.fPCImpreg = function(slave) {
 				text.push(`pussy, ready for fertilization.`);
 			}
 
-			text.push(`You waste no time with foreplay as you mount ${him} and get to work. As you claim ${his} pearl, ${his} breath hitches in ${his} throat, but pleasure quickly overcomes the pain. ${He} groans as your pelvis repeatedly slaps against ${him} over and over, anticipating what's to come. Just before you reach your peak, you hilt yourself within ${him}, signaling that it's time. ${He} sobs with happiness when ${he} finally feels your hot seed${fillHim}${firstTime}. ${He} spends the rest of the day cherishing ${his} ${bellyAdjective(slave)} stomach. This new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} ${hole} has been broken in, and there's a good chance 's ${superfetation ? `got another bun in the oven` : `pregnant`}.</span>
+			text.push(`You waste no time with foreplay as you mount ${him} and get to work. As you claim ${his} pearl, ${his} breath hitches in ${his} throat, but pleasure quickly overcomes the pain. ${He} groans as your pelvis repeatedly slaps against ${him} over and over, anticipating what's to come. Just before you reach your peak, you hilt yourself within ${him}, signaling that it's time. ${He} sobs with happiness when ${he} finally feels your hot seed${fillHim}${firstTime}. ${He} spends the rest of the day cherishing ${his} ${bellyAdjective(slave)} stomach. This new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} ${hole} has been broken in, and there's a good chance ${he}'s ${superfetation ? `got another bun in the oven` : `pregnant`}.</span>
 			`);
 
 			slave.devotion += 15;
diff --git a/src/npc/interaction/fPat.js b/src/npc/interaction/fPat.js
index 567d9de68f27606fcce7e66a9b31048b39b402c3..c43ed70a8190f298d12eac9e1b57d4d25ffb5186 100644
--- a/src/npc/interaction/fPat.js
+++ b/src/npc/interaction/fPat.js
@@ -162,7 +162,7 @@ App.Interact.fPat = function(slave) {
 	} else if ((slave.relationship === -3) && slave.devotion+slave.trust >= 175) {
 		r.push(`Tenderly and lovingly you brush your fingers along ${his} head, enjoying the feeling of your slave's utterly willing submission. ${He} slowly leans ${his} body closer and closer to you${!hasAnyLegs(slave) ? ` and finally onto your lap` : ``}, relaxing as ${he} feels your caress. As ${he} shifts ${his} weight to your chest, ${he} feels all of the daily stresses of the day melt away, and a deep, happy sigh escapes ${his} lips. You smile fondly, allowing all of the troubles of being an arcology owner dissipate, in a similar fashion to your slave. For now, just for now, you are just a ${womanP} and ${hisP} devoted and content ${wife}.`);
 	} else if (slave.relationship === -2) {
-		r.push(`Tenderly and lovingly you brush your fingers along ${his} head, for a moment, appreciating how easily your slave submits to your desire to pat ${his} head. ${He} slowly leans ${his} body closer and closer to you${!hasAnyLegs(slave) ? `allowing you to move ${him} onto your lap` : ``}, relaxing as ${he} feels your caresses. As ${his} weight falls onto you, all of the stress from ${his} body melts away, and a small, respectful sigh escapes ${his} pursed lips. You smile fondly, allowing all of the troubles of being an arcology owner drift away, in a similar fashion to your slave. For now, just for now, you are just a ${womanP} and ${hisP} devoted and content servant.`);
+		r.push(`Tenderly and lovingly you brush your fingers along ${his} head, for a moment, appreciating how easily your slave submits to your desire to pat ${his} head. ${He} slowly leans ${his} body closer and closer to you${!hasAnyLegs(slave) ? ` allowing you to move ${him} onto your lap` : ``}, relaxing as ${he} feels your caresses. As ${his} weight falls onto you, all of the stress from ${his} body melts away, and a small, respectful sigh escapes ${his} pursed lips. You smile fondly, allowing all of the troubles of being an arcology owner drift away, in a similar fashion to your slave. For now, just for now, you are just a ${womanP} and ${hisP} devoted and content servant.`);
 	} else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60 && hasAnyArms(slave)) {
 		r.push(`As you start to touch ${him} ${he} smiles at you and takes your hand, following its movements. You tenderly and lovingly kiss it and let it rest on the side of ${his} head, before continuing with your ministrations. As opposed to your more submissive slaves, ${slave.slaveName} takes an active role in your petting, gently guiding where your hand goes along ${his} head. You enjoy the feel of ${his} hand on yours, as well as ${his}`);
 		if (isBald) {
diff --git a/src/npc/interaction/fPoolSex.js b/src/npc/interaction/fPoolSex.js
index c4c7cbf8983b158b259e2395cd1c085d985a881c..78d888f6c313f2a76859c38fb825e387d3f99cc6 100644
--- a/src/npc/interaction/fPoolSex.js
+++ b/src/npc/interaction/fPoolSex.js
@@ -124,7 +124,7 @@ App.Interact.fPoolSex = function(slave) {
 				r.push(`waits patiently as`);
 			}
 		}
-		r.push(`you strip down and change into your swimming outfit. When it's clear that you're ready to join ${him}, ${he} motions at the pool's holographic console and its mobility assistance devices kick in, rolling ${him} into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles${(V.PC.preg > 30) ? `and soothes your stretched skin` : ``}, then wade toward your waiting slave.`);
+		r.push(`you strip down and change into your swimming outfit. When it's clear that you're ready to join ${him}, ${he} motions at the pool's holographic console and its mobility assistance devices kick in, rolling ${him} into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles${(V.PC.preg > 30) ? ` and soothes your stretched skin` : ``}, then wade toward your waiting slave.`);
 		App.Events.addParagraph(node, r);
 		r = [];
 		r.push(`${He} smiles politely, rubbing circles in the exploded sides of ${his} colossal belly, then gasps as you take a handful of the ooze and shove it right in ${his} face. ${He} sputters indignantly and then`);
diff --git a/src/npc/interaction/fRelation.js b/src/npc/interaction/fRelation.js
index fd8353b707bad6cc44a41f488c10ef3af00ca0f3..181c042eed4b50fb793c76ca1633e7a28541ef09 100644
--- a/src/npc/interaction/fRelation.js
+++ b/src/npc/interaction/fRelation.js
@@ -1,11 +1,10 @@
 /**
  * @param {App.Entity.SlaveState} slave - slave to fuck with partner.
  * @param {App.Entity.SlaveState} partner - partner to fuck slave with.  must be a close relative or relationship target of slave.
- * @returns {DocumentFragment}
+ * @returns {DocumentFragment|HTMLElement}
  */
 App.Interact.fRelation = function(slave, partner) {
-	const node = new DocumentFragment();
-	let r = [];
+	const r = new SpacedTextAccumulator();
 
 	const {
 		He, His,
@@ -102,7 +101,7 @@ App.Interact.fRelation = function(slave, partner) {
 			}
 			r.push(`your strap-on`);
 		}
-		r.push(r.pop() + `.`);
+		r.addToLast(`.`);
 		r.push(`On your direction, ${slave.slaveName} sits on the couch. When ${partner.slaveName} enters, ${his2} ${activeSlaveRel} spreads ${his} arms and tells ${him2} to sit on ${his} lap. ${partner.slaveName} gets the idea and straddles ${him} so they're face to face. You take ${partner.slaveName} from behind; ${he2} gasps as ${he2} feels ${his2} ${activeSlaveRel}'s ${hasBothArms(partner) ? `hands` : `hand`} stimulate ${him2} from the front. They make out shamelessly while you take your pleasure. When you finish, ${slave.slaveName} lies down on the couch so ${partner.slaveName} can ride ${his}`);
 		if (V.seeRace === 1) {
 			r.push(slave.race);
@@ -168,7 +167,7 @@ App.Interact.fRelation = function(slave, partner) {
 		} else {
 			r.push(`pussies`);
 		}
-		r.push(`against one another${(V.PC.dick === 0) ? `while you don a strap-on` : ``}, spreading their legs to offer you everything. You switch back and forth, with the twin you're not in rubbing and grinding against the one you are, until both of ${partner.slaveName} and ${slave.slaveName} are lying on the desk${(V.PC.dick !== 0) ? ` with cum dripping out of them` : ``}, making out tiredly.`);
+		r.push(`against one another${(V.PC.dick === 0) ? ` while you don a strap-on` : ``}, spreading their legs to offer you everything. You switch back and forth, with the twin you're not in rubbing and grinding against the one you are, until both of ${partner.slaveName} and ${slave.slaveName} are lying on the desk${(V.PC.dick !== 0) ? ` with cum dripping out of them` : ``}, making out tiredly.`);
 		seX(slave, "oral", partner, "oral");
 		r.push(VCheck.Both(slave, 1));
 		r.push(VCheck.Partner(partner, 1));
@@ -191,7 +190,7 @@ App.Interact.fRelation = function(slave, partner) {
 			if (V.PC.dick === 0) {
 				r.push(`with a strap-on`);
 			}
-			r.push(r.pop() + `. You pull out`);
+			r.addToLast(`. You pull out`);
 		} else {
 			r.push(`floor with`);
 			if (V.PC.dick === 0) {
@@ -236,7 +235,7 @@ App.Interact.fRelation = function(slave, partner) {
 		if (V.PC.dick === 0) {
 			r.push(`while you don a strap-on,`);
 		}
-		r.push(`and offer you their holes. They're just friends, but they're sex slaves and they see nothing wrong with enjoying sex with you, together. They keep up a constant stream of giggling, gasping, and smiling as each of them in turn feels a cock, warm and wet from their friend's body, transferred into them. Each of them does their best to help the other do well, even manually stimulating their friend when necessary${(V.PC.boobs >= 300 || V.PC.title === 0) ? `and spinning around to lavish attention on your nipples` : ``}.`);
+		r.push(`and offer you their holes. They're just friends, but they're sex slaves and they see nothing wrong with enjoying sex with you, together. They keep up a constant stream of giggling, gasping, and smiling as each of them in turn feels a cock, warm and wet from their friend's body, transferred into them. Each of them does their best to help the other do well, even manually stimulating their friend when necessary${(V.PC.boobs >= 300 || V.PC.title === 0) ? ` and spinning around to lavish attention on your nipples` : ``}.`);
 		r.push(VCheck.Both(slave, 1));
 		r.push(VCheck.Partner(partner, 1));
 	} else if (["friend with benefits", "lover", "slave wife"].includes(activeSlaveRel) && slave.devotion > 20 && partner.devotion > 20) {
@@ -278,6 +277,6 @@ App.Interact.fRelation = function(slave, partner) {
 		r.push(VCheck.Partner(partner, 1));
 	}
 
-	App.Events.addParagraph(node, r);
-	return node;
+	r.toParagraph();
+	return r.container();
 };
diff --git a/src/npc/interaction/fRival.js b/src/npc/interaction/fRival.js
index 4961caa21242009820ada84abfb222f2775b39b4..af4ea07ef32fe87c1fbff92e2b6cb45e89f80dc4 100644
--- a/src/npc/interaction/fRival.js
+++ b/src/npc/interaction/fRival.js
@@ -151,7 +151,7 @@ App.Interact.fRival = function(slave) {
 		} else {
 			r.push(`tell ${him2} to ride your dick`);
 		}
-		r.push(`anally, facing you. ${He2} lowers ${his2} butthole down onto your cock, not without trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard, not certain what you mean. To make it clear, you hook a single finger up into poor ${rival.slaveName}'s rectum alongside`);;
+		r.push(`anally, facing you. ${He2} lowers ${his2} butthole down onto your cock, not without trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard, not certain what you mean. To make it clear, you hook a single finger up into poor ${rival.slaveName}'s rectum alongside`);
 
 		if (V.PC.dick === 0) {
 			r.push(`the fake phallus.`);
diff --git a/src/npc/interaction/fSlaveSelfImpreg.js b/src/npc/interaction/fSlaveSelfImpreg.js
index 8055f6a5d60ddcfccfe5bf0169440d54b00ad107..743e369922693eff6933c583ba46e103c4897dde 100644
--- a/src/npc/interaction/fSlaveSelfImpreg.js
+++ b/src/npc/interaction/fSlaveSelfImpreg.js
@@ -14,11 +14,11 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 
 	addPartner(slave, -1);
 
-	const _pfh = (slave.fetish === "pregnancy" && slave.fetishStrength > 50);
-	const _pfk = (_pfh && slave.fetishKnown === 1) || slave.sexualFlaw === "breeder";
-	let _coop = true;
-	let _enjoy = true;
-	const _superfetation = (slave.geneticQuirks.superfetation === 2 && slave.pregKnown === 1) ? 1 : 0;
+	const pfh = (slave.fetish === "pregnancy" && slave.fetishStrength > 50);
+	const pfk = (pfh && slave.fetishKnown === 1) || slave.sexualFlaw === "breeder";
+	let coop = true;
+	let enjoy = true;
+	const superfetation = (slave.geneticQuirks.superfetation === 2 && slave.pregKnown === 1) ? 1 : 0;
 
 	if (slave.fetish === "mindbroken") {
 	} else {
@@ -30,17 +30,17 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 				r.push(`${slave.slaveName}`);
 				r.push(`dislikes you,`);
 			}
-			if (slave.sexualFlaw === "breeder" || (_pfh && slave.fetishStrength > 90)) {
+			if (slave.sexualFlaw === "breeder" || (pfh && slave.fetishStrength > 90)) {
 				r.push(`but the idea of simultaneously impregnating and being impregnated is <span class="hotpink">so tempting</span> that ${he}'s <span class="mediumaquamarine">grateful</span> to you despite ${himself}.`);
 				slave.devotion += 2;
 				slave.trust += 1;
-			} else if (_pfk) {
+			} else if (pfk) {
 				r.push(`but ${his} obvious predilection for being pregnant significantly lessens the <span class="mediumorchid">indignity</span> of the situation.`);
-				_coop = false;
+				coop = false;
 				slave.devotion -= 2;
-			} else if (_pfh) {
+			} else if (pfh) {
 				r.push(`but, despite the <span class="mediumorchid">indignity</span> of the situation, ${his} resistance seems strangely muted. It's fairly obvious that something about the idea of being impregnated is <span class="hotpink">strangely appealing</span> to ${him}.`);
-				_coop = false;
+				coop = false;
 				slave.devotion -= 4;
 			} else {
 				if (isAmputee(slave)) {
@@ -50,12 +50,12 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 				} else {
 					r.push(`and this <span class="gold">uniquely degrading</span> violation of ${his} person only reinforces ${his} <span class="mediumorchid">hatred</span> towards you. ${He} resists so violently that you must <span class="health.dec">physically coerce ${him}</span> into cooperating with the procedure.`);
 				}
-				_coop = false;
-				_enjoy = false;
+				coop = false;
+				enjoy = false;
 				slave.devotion -= 5;
 				slave.trust -= 6;
 			}
-		} else if (_pfk) {
+		} else if (pfk) {
 			r.push(`${slave.slaveName}`);
 			r.push(`<span class="hotpink">genuinely enjoys</span> impregnation and pregnancy, so ${he} is <span class="mediumaquamarine">grateful</span> that you're giving ${him} a chance to become so intimately acquainted with both aspects of ${his} fetish at the same time.`);
 			slave.devotion += 4;
@@ -66,7 +66,7 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 				slave.trust += 1;
 			}
 		} else {
-			if (_pfh) {
+			if (pfh) {
 				r.push(`Even though you aren't aware of any special fondness for pregnancy, ${slave.slaveName} seems <span class="hotpink">oddly eager</span> to cooperate with you. It quickly becomes obvious that ${he} is <span class="lightcoral">fascinated with pregnancy</span> and you've <span class="mediumaquamarine">helped ${him} discover this</span> about ${himself}.`);
 				slave.devotion += 1;
 				slave.trust += 1;
@@ -84,11 +84,11 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 					slave.devotion += 1;
 					slave.trust += 1;
 				}
-				_enjoy = false;
+				enjoy = false;
 			} else {
 				r.push(`${slave.slaveName}`);
 				r.push(`cooperates without any protest. ${He} may not particularly enjoy pregnancy or impregnation, but ${he}'s too well-broken to resist or speak against you.`);
-				_enjoy = false;
+				enjoy = false;
 			}
 		}
 	}
@@ -101,9 +101,9 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 			r.push(`vagina.`);
 		}
 	} else if (isAmputee(slave)) {
-		if (_coop && _enjoy) {
+		if (coop && enjoy) {
 			r.push(`Although ${slave.slaveName} is unable to do much to help, ${his} expression is visibly excited as you place ${him} on a bench, and produce a sample container and syringe.`);
-		} else if (_enjoy) {
+		} else if (enjoy) {
 			r.push(`A maelstrom of emotions fill ${slave.slaveName}'s face as you carry ${him} to a bench, and produce a sample cup and syringe.`);
 
 			if (slave.dick > 6) {
@@ -122,7 +122,7 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 				r.push(`vagina,`);
 			}
 			r.push(`and shoot the contents home, deep against ${his} waiting cervix.`);
-		} else if (_coop) {
+		} else if (coop) {
 			r.push(`${slave.slaveName} is calm and docile as you place ${him} on a bench, and produce a sample container and syringe. With no other option, ${he} throws back ${his} head and enjoys the stimulation as your personal assistant, at your instruction, begins stimulating ${him} to orgasm. When ${he} ejaculates, you carefully catch every drop in the sample cup, load the syringe, and inject the contents directly against ${his} cervix.`);
 		} else {
 			r.push(`Although ${slave.slaveName} frantically squirms in a futile attempt to resist as you place ${him} on a bench, and produce a sample cup and syringe. Without limbs to aid ${his} escape, ${he} can only`);
@@ -139,8 +139,8 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 			}
 			r.push(`and shoot the contents directly against the opening to ${his} womb.`);
 		}
-	} else if (_coop) {
-		if (_enjoy) {
+	} else if (coop) {
+		if (enjoy) {
 			if (slave.dick > 6 && slave.balls <= 4) {
 				r.push(`Although ${he} is aroused by the idea of impregnating ${himself}, ${slave.slaveName}'s cock is simply too large to easily become erect. A quick injection of vasodilators later, and ${he}'s ready to go. Because ${he}'s so eager, you simply stand back and let the magic happen.`);
 				if (
@@ -312,7 +312,7 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 			}
 		}
 	} else {
-		if (_enjoy) {
+		if (enjoy) {
 			r.push(`Although ${slave.slaveName} is anything but eager to cooperate, you don't have to drag ${him}. It's obvious that ${his} resistance is conflicting with the raw desire to fill ${himself} with ${his} own seed.`);
 			if (slave.dick > 6 && slave.balls <= 4) {
 				r.push(`While the size of ${his} cock makes it necessary for you to inject ${him} with vasodilators for ${him} to become properly erect, ${his} resistance is minimal.`);
@@ -370,20 +370,20 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 		}
 	}
 
-	const _actCount = random(2, 8)+1;
-	slave.counter.penetrative += _actCount;
-	V.penetrativeTotal += _actCount;
+	const actCount = random(2, 8)+1;
+	slave.counter.penetrative += actCount;
+	V.penetrativeTotal += actCount;
 	if (slave.mpreg === 1) {
-		slave.counter.anal += _actCount;
-		V.analTotal += _actCount;
+		slave.counter.anal += actCount;
+		V.analTotal += actCount;
 	} else {
-		slave.counter.vaginal += _actCount;
-		V.vaginalTotal += _actCount;
+		slave.counter.vaginal += actCount;
+		V.vaginalTotal += actCount;
 	}
 
 	r.push(`You repeat this ritual throughout the week, ensuring that ${slave.slaveName}`);
 
-	if (_superfetation === 1) {
+	if (superfetation === 1) {
 		r.push(`has <span class="lime">added another child</span> to ${his} pregnancy.`);
 	} else {
 		r.push(`is <span class="lime">carrying ${his} own child.</span>`);
@@ -400,11 +400,11 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 
 	if (V.arcologies[0].FSRepopulationFocus !== "unset" && (V.arcologies[0].FSGenderFundamentalist === "unset" || V.arcologies[0].FSRepopulationFocus >= V.arcologies[0].FSGenderFundamentalist)) {
 		// seems logical that repop would trump anything else if it's equal-or-more advanced than fundamentalism.
-		const _delt = (V.arcologies[0].FSGenderFundamentalist !== "unset") ?
+		const delt = (V.arcologies[0].FSGenderFundamentalist !== "unset") ?
 			V.arcologies[0].FSRepopulationFocus - V.arcologies[0].FSGenderFundamentalist :
 			V.arcologies[0].FSRepopulationFocus;
 
-		if (_delt > 0) {
+		if (delt > 0) {
 			r.push(`Society is <span class="green">pleased</span> by the addition of a new slave, no matter the means by which it was produced.`);
 			repX(V.FSSingleSlaveRep*(V.arcologies[0].FSRepopulationFocus/V.FSLockinLevel), "futureSocieties", slave);
 		} else {
diff --git a/src/npc/interaction/fillUpButt.js b/src/npc/interaction/fillUpButt.js
index 89c4f5087fc3b276af88a0d4b787bf61ac95d325..34f18ada1928a13d0ce257ac34e9569b06be6f8a 100644
--- a/src/npc/interaction/fillUpButt.js
+++ b/src/npc/interaction/fillUpButt.js
@@ -13,7 +13,7 @@ App.Interact.fillUpButt = function(slave) {
 	} = getPronouns(slave);
 
 	slave.bellyAccessory = "none";
-	let _pregDiscovery = 0;
+	let pregDiscovery = 0;
 	r.push(`You`);
 	switch (slave.inflationType) {
 		case "water":
@@ -71,7 +71,7 @@ App.Interact.fillUpButt = function(slave) {
 
 	if (slave.inflation > 1 && slave.preg > 1) {
 		r.push(`${He} looks uneasy at the prospect of that much fluid entering ${his} rear, far more than could be considered normal.`);
-		_pregDiscovery = 1;
+		pregDiscovery = 1;
 	} else {
 		if (slave.fetish === "buttslut" && slave.devotion >= -20) {
 			r.push(`${He}'s pleased at the prospect of you touching ${his} favorite body part.`);
@@ -87,8 +87,8 @@ App.Interact.fillUpButt = function(slave) {
 		}
 	}
 
-	if (_pregDiscovery === 1) {
-		r.push(`Not wanting to risk such a mess, you send ${him} for a medical examination. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? `and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of ${slave.inflationType} up ${his} ass, however.`);
+	if (pregDiscovery === 1) {
+		r.push(`Not wanting to risk such a mess, you send ${him} for a medical examination. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? ` and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of ${slave.inflationType} up ${his} ass, however.`);
 		deflate(slave);
 		slave.pregKnown = 1;
 	} else if (slave.fetish === "mindbroken") {
@@ -726,7 +726,7 @@ App.Interact.fillUpButt = function(slave) {
 			r.push(`and admire ${his} distended, ${slave.skin} stomach. ${He} sighs contently, before eagerly begging for more. You pat ${his} belly and tell ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`);
 		}
 	}
-	if (_pregDiscovery === 0) {
+	if (pregDiscovery === 0) {
 		slave.inflation += 1;
 		if (slave.inflation === 3) {
 			if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) {
diff --git a/src/npc/interaction/fondleBoobs.js b/src/npc/interaction/fondleBoobs.js
index 2fd0b948bdcc6a1253a103940e862c6f5d5e0282..c2678308d9222c89adfbe82dce47b8286c985632 100644
--- a/src/npc/interaction/fondleBoobs.js
+++ b/src/npc/interaction/fondleBoobs.js
@@ -624,7 +624,7 @@ App.Interact.fondleBoobs = function(slave) {
 			if (slave.lactation > 0) {
 				r.push(`milky`);
 			}
-			r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? `alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`);
+			r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? ` alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`);
 		}
 		r.push(`When you finally stop, ${he} shakes uncontrollably but says nothing, apprehensive at what you are going to do next.`);
 	} else {
@@ -664,7 +664,7 @@ App.Interact.fondleBoobs = function(slave) {
 			if (slave.lactation > 0) {
 				r.push(`milky`);
 			}
-			r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? `alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`);
+			r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? ` alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`);
 		}
 		r.push(`When you finally stop, ${he} shakes uncontrollably, apprehensive at what you are going to do next.`);
 	}
diff --git a/src/npc/interaction/forceFeeding.js b/src/npc/interaction/forceFeeding.js
index 873b563b9c7f2810d59d1944e7833c2fbc7568e3..cd1e4a798c102b05f7b664620ee3b4c31b18b77e 100644
--- a/src/npc/interaction/forceFeeding.js
+++ b/src/npc/interaction/forceFeeding.js
@@ -13,12 +13,12 @@ App.Interact.forceFeeding = function(slave) {
 	} = getPronouns(slave);
 
 	addPartner(slave, -1);
-	let _doMe;
+	let doMe;
 
-	const _belly = bellyAdjective(slave);
+	const belly = bellyAdjective(slave);
 	slave.bellyAccessory = "none";
-	let _isDone = slave.inflation-1;
-	let _pregDiscovery = 0;
+	let isDone = slave.inflation-1;
+	let pregDiscovery = 0;
 	r.push(`You call ${him} over and ask ${him} to wait patiently for a moment.`);
 	if (slave.fetish === "mindbroken") {
 		r.push(`${He} shows no response as`);
@@ -141,13 +141,13 @@ App.Interact.forceFeeding = function(slave) {
 	if (slave.weight > 190) {
 		r.push(`immensely soft`);
 	} else if (slave.belly >= 150000) {
-		r.push(_belly);
+		r.push(belly);
 	} else if (slave.weight > 160) {
 		r.push(`massive soft`);
 	} else if (slave.weight > 130) {
 		r.push(`giant soft`);
 	} else if (slave.belly >= 1500) {
-		r.push(_belly);
+		r.push(belly);
 	} else if (slave.weight > 95) {
 		r.push(`huge soft`);
 	} else if (slave.weight > 30) {
@@ -217,7 +217,7 @@ App.Interact.forceFeeding = function(slave) {
 	App.Events.addParagraph(node, r);
 	r = [];
 
-	if (slave.pregKnown === 0 && slave.preg > slave.pregData.normalBirth/13.33 && _isDone > 0) {
+	if (slave.pregKnown === 0 && slave.preg > slave.pregData.normalBirth/13.33 && isDone > 0) {
 		r.push(`As soon as the next helping enters ${him} you feel something is wrong. ${He} begins to heave,`);
 		if (slave.fetish !== "mindbroken" && slave.devotion > 50) {
 			r.push(`struggling to keep down the slave food, however ${he} shortly expels the entirety of ${his} stomach across the floor.`);
@@ -253,10 +253,10 @@ App.Interact.forceFeeding = function(slave) {
 		} else {
 			r.push(`given how disappointed ${he} is in failing you, but is worrying. Such a good slave shouldn't do such bad things.`);
 		}
-		_pregDiscovery = 1;
+		pregDiscovery = 1;
 	} else {
-		if (_isDone > 0) {
-			_isDone--;
+		if (isDone > 0) {
+			isDone--;
 			r.push(`But ${he} isn't done`);
 			if (slave.fetish === "mindbroken") {
 				r.push(`yet.`);
@@ -308,7 +308,7 @@ App.Interact.forceFeeding = function(slave) {
 			App.Events.addParagraph(node, r);
 			r = [];
 		}
-		if (_isDone > 0) {
+		if (isDone > 0) {
 			if (slave.fetish === "mindbroken") {
 				r.push(`${He} squirms a little in discomfort, but ${he} still has another gallon to go, so you continue feeding food into ${his} mouth.`);
 			} else if (slave.devotion < -20) {
@@ -367,7 +367,7 @@ App.Interact.forceFeeding = function(slave) {
 				r.push(`pat it several more times`);
 			}
 			r.push(`as you appreciate its size.`);
-			_doMe = 1;
+			doMe = 1;
 			App.Events.addParagraph(node, r);
 			r = [];
 		}
@@ -440,7 +440,7 @@ App.Interact.forceFeeding = function(slave) {
 			r.push(`lavishing attention on ${his} gurgling belly, much to ${his} delight, until you tire of ${him} and send ${him} on ${his} way.`);
 		} else {
 			r.push(`playing with ${his} belly. ${He} joins you in the endeavor, happy that you are pleased with the`);
-			if (_doMe !== 1) {
+			if (doMe !== 1) {
 				r.push(`outcome.`);
 			} else {
 				r.push(`outcome, but ${his}`);
@@ -452,26 +452,26 @@ App.Interact.forceFeeding = function(slave) {
 				r.push(`you ${he} wants more.`);
 			}
 			// Fuckings for devoted slaves.
-			_doMe = 1;
-			let _sexType;
+			doMe = 1;
+			let sexType;
 			if (canDoVaginal(slave) && slave.vagina > 0) {
-				_sexType = "vaginal";
+				sexType = "vaginal";
 			} else if (canDoAnal(slave) && slave.anus > 0) {
-				_sexType = "anal";
+				sexType = "anal";
 			} else {
-				_sexType = "none";
+				sexType = "none";
 			}
-			if (_sexType !== "none") {
+			if (sexType !== "none") {
 				if (V.PC.belly >= 10000) {
-					_doMe = 0;
+					doMe = 0;
 					r.push(`${His}`);
-					if (_sexType === "vaginal") {
+					if (sexType === "vaginal") {
 						r.push(`pussy`);
 					} else {
 						r.push(`ass`);
 					}
 					r.push(`is under a lot of pressure from ${his} swollen middle and surely would feel amazing; it's even`);
-					if (_sexType === "vaginal") {
+					if (sexType === "vaginal") {
 						r.push(`sopping wet for`);
 					} else {
 						r.push(`eagerly winking at`);
@@ -481,14 +481,14 @@ App.Interact.forceFeeding = function(slave) {
 					if (V.PC.dick !== 0) {
 						r.push(`You're already rock hard so you`);
 					} else {
-						if (_sexType === "vaginal") {
+						if (sexType === "vaginal") {
 							r.push(`You don a strap-on and`);
 						} else {
 							r.push(`You don a strap-on, lube up,`);
 						}
 					}
 					r.push(`pull ${his} legs apart,`);
-					if (_sexType === "vaginal") {
+					if (sexType === "vaginal") {
 						r.push(`revealing ${his}`);
 						if (slave.vaginaLube > 1) {
 							r.push(`sopping wet,`);
@@ -522,24 +522,24 @@ App.Interact.forceFeeding = function(slave) {
 						}
 					}
 					r.push(`${His} belly is putting so much pressure on it that`);
-					const _looseness = (_sexType === "vaginal") ? slave.vagina : slave.anus;
-					if (_sexType === "vaginal" && _looseness >= 10) {
+					const looseness = (sexType === "vaginal") ? slave.vagina : slave.anus;
+					if (sexType === "vaginal" && looseness >= 10) {
 						r.push(`you might be able to get some decent friction now.`);
 						if (V.PC.dick !== 0) {
 							r.push(`You can actually feel the sides of ${his} cunt as you slide in.`);
 						} else {
 							r.push(`You slide in like it's still nothing.`);
 						}
-					} else if (_looseness > 3) {
+					} else if (looseness > 3) {
 						r.push(`you should be able to get a decent fuck out of it.`);
 						if (V.PC.dick !== 0) {
 							r.push(`You can't help but be amazed that you're getting some resistance as you slide in.`);
 						} else {
 							r.push(`You slide in like it's nothing.`);
 						}
-					} else if (_looseness > 2) {
+					} else if (looseness > 2) {
 						r.push(`it won't feel so`);
-						if (_sexType === "vaginal") {
+						if (sexType === "vaginal") {
 							r.push(`worn out.`);
 						} else {
 							r.push(`stretched.`);
@@ -549,11 +549,11 @@ App.Interact.forceFeeding = function(slave) {
 						} else {
 							r.push(`You squeeze in without problem.`);
 						}
-					} else if (_looseness > 1) {
+					} else if (looseness > 1) {
 						r.push(`it'll feel positively tight.`);
 						if (V.PC.dick !== 0) {
 							r.push(`${His}`);
-							if (_sexType === "vaginal") {
+							if (sexType === "vaginal") {
 								r.push(`pussy`);
 							} else {
 								r.push(`anus`);
@@ -566,25 +566,25 @@ App.Interact.forceFeeding = function(slave) {
 						r.push(`you'll barely be able to fit it in.`);
 						if (V.PC.dick !== 0) {
 							r.push(`${His}`);
-							if (_sexType === "vaginal") {
+							if (sexType === "vaginal") {
 								r.push(`vagina`);
 							} else {
 								r.push(`rear`);
 							}
 							r.push(`is so tight you can barely get it in, but with a little work, you manage to squeeze into its tight confines. ${He}'s tighter than any`);
-							if (_sexType === "anal") {
+							if (sexType === "anal") {
 								r.push(`anal`);
 							}
 							r.push(`virgin you've ever fucked.`);
 						} else {
 							r.push(`You have to`);
-							if (_sexType === "vaginal") {
+							if (sexType === "vaginal") {
 								r.push(`lube up some,`);
 							} else {
 								r.push(`get a little rough,`);
 							}
 							r.push(`but eventually you manage to slide into ${his} extremely tight`);
-							if (_sexType === "vaginal") {
+							if (sexType === "vaginal") {
 								r.push(`vagina.`);
 							} else {
 								r.push(`anus.`);
@@ -604,16 +604,16 @@ App.Interact.forceFeeding = function(slave) {
 						r.push(`and ${he}'s forced out all your cum,`);
 					}
 					r.push(`you settle down beside ${him} and rest your head against ${his} belly; it almost feels like a water-filled pillow, albeit a little noisy. You and ${slave.slaveName} doze off together for a much needed nap. You don't get much rest; ${his} stomach's constant groaning and burbling keeps you up, so you send ${him} on ${his} way. ${He} blows you one last kiss and eagerly looks forward to next time.`);
-					if (_sexType === "vaginal") {
+					if (sexType === "vaginal") {
 						r.push(VCheck.Vaginal(slave, 2));
 					} else {
 						r.push(VCheck.Anal(slave, 2));
 					}
 				}
 			} else {
-				_doMe = 0;
+				doMe = 0;
 			}
-			if (_doMe === 0) {
+			if (doMe === 0) {
 				if (V.PC.dick !== 0) {
 					r.push(`You crawl onto the couch above ${his} head and lower your erect cock straight into ${his} waiting mouth. ${He} eagerly sucks you off, ${his} belly wobbling with every thrust into ${his} throat. You cum fast and hard into ${him}, a product of being on the edge during ${his} feeding;`);
 					if (slave.behavioralFlaw === "gluttonous") {
@@ -636,8 +636,8 @@ App.Interact.forceFeeding = function(slave) {
 		}
 	}
 
-	if (_pregDiscovery === 1) {
-		r.push(`Once you've managed to stop ${his} heaving and clean up, you decide to get to the root of this mess. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? `and surprisingly far along` : ``}.</span>`);
+	if (pregDiscovery === 1) {
+		r.push(`Once you've managed to stop ${his} heaving and clean up, you decide to get to the root of this mess. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? ` and surprisingly far along` : ``}.</span>`);
 		deflate(slave);
 		slave.pregKnown = 1;
 	} else {
diff --git a/src/npc/interaction/passage/abort.js b/src/npc/interaction/passage/abort.js
index f709a53b2288a549510361b3042a21143dd755d0..9e47f9de3650530fa297ce3d4973e1bd1668c961 100644
--- a/src/npc/interaction/passage/abort.js
+++ b/src/npc/interaction/passage/abort.js
@@ -33,9 +33,9 @@ App.Interact.abort = function(slave) {
 			slave.devotion -= 10;
 		} else if (slave.fetish === "pregnancy") {
 			r.push(`<span class="devotion dec">filled with a deep sorrow.</span> To a pregnancy fetishist, having a pregnancy end like this hurts far worse than birth ever would. ${He} is <span class="trust dec">terrified of a repeat performance.</span>`);
-			const _fetishModifier = slave.fetishStrength/2;
-			slave.devotion -= 1*_fetishModifier;
-			slave.trust -= 1*_fetishModifier;
+			const fetishModifier = slave.fetishStrength / 2;
+			slave.devotion -= 1 * fetishModifier;
+			slave.trust -= 1 * fetishModifier;
 		} else if (slave.devotion <= 20) {
 			r.push(`<span class="devotion dec">consumed by muted weeping and enduring sorrow.</span> Even though ${he} knew ${his} baby was destined for a slave orphanage, it seems ${he} cared for it. ${He} is <span class="trust dec">terrified of your power</span> over ${his} body.`);
 			slave.trust -= 10;
diff --git a/src/npc/interaction/passage/fMarry.js b/src/npc/interaction/passage/fMarry.js
index 57e332bc1bce8462699feb2642f0beb3b67b232d..444ae7c4b54f178128476a37a3644ab60dc084a0 100644
--- a/src/npc/interaction/passage/fMarry.js
+++ b/src/npc/interaction/passage/fMarry.js
@@ -752,7 +752,7 @@ App.Interact.fMarry = function(slave) {
 			} else if (V.assistant.appearance === "fairy") {
 				r.push(`"To seal the deal," ${V.assistant.name} concludes, "${slave.slaveName}, you gotta drink the ${groom}'s`);
 				if (V.PC.dick !== 0) {
-					r.push(`semen${(V.PC.vagina !== -1) ? `and pussy juices` : ``}."`);
+					r.push(`semen${(V.PC.vagina !== -1) ? ` and pussy juices` : ``}."`);
 				} else {
 					r.push(`pussy juices."`);
 				}
@@ -792,7 +792,7 @@ App.Interact.fMarry = function(slave) {
 			} else if (V.assistant.appearance === "loli") {
 				r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`);
 				if (V.PC.dick !== 0) {
-					r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} cunny` : ``}."`);
+					r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? ` and lick ${hisP} cunny` : ``}."`);
 				} else {
 					r.push(`lick the ${groom}'s cunny."`);
 				}
@@ -801,7 +801,7 @@ App.Interact.fMarry = function(slave) {
 			} else if (V.assistant.appearance === "preggololi") {
 				r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`);
 				if (V.PC.dick !== 0) {
-					r.push(`suck the ${groom}'s lovely cock${(V.PC.vagina !== -1) ? `and eat out ${hisP} cunt` : ``}."`);
+					r.push(`suck the ${groom}'s lovely cock${(V.PC.vagina !== -1) ? ` and eat out ${hisP} cunt` : ``}."`);
 				} else {
 					r.push(`lick the ${groom}'s cunt."`);
 				}
@@ -823,7 +823,7 @@ App.Interact.fMarry = function(slave) {
 			} else if (V.assistant.appearance === "cherub") {
 				r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should`);
 				if (V.PC.dick !== 0) {
-					r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} pussy` : ``},`);
+					r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? ` and lick ${hisP} pussy` : ``},`);
 				} else {
 					r.push(`lick the ${groom}'s pussy,`);
 				}
diff --git a/src/npc/interaction/passage/fSlaveImpreg.js b/src/npc/interaction/passage/fSlaveImpreg.js
index b97a0cb57bb025b023677cf4ec5bdfae2b10e29f..6131562b403424ef97cc5d716bbe62b1e9f8ee1a 100644
--- a/src/npc/interaction/passage/fSlaveImpreg.js
+++ b/src/npc/interaction/passage/fSlaveImpreg.js
@@ -1,5 +1,5 @@
 /**
- *
+ * @param {App.Entity.SlaveState} slave
  * @returns {HTMLElement}
  */
 App.Interact.fSlaveImpreg = function(slave) {
@@ -53,13 +53,11 @@ App.Interact.fSlaveImpreg = function(slave) {
 	return node;
 
 	/**
-	 *
 	 * @param {App.Entity.SlaveState} impregnatrix
-	 * @returns {DocumentFragment}
+	 * @returns {HTMLElement|DocumentFragment}
 	 */
 	function consummate(impregnatrix) {
-		const node = new DocumentFragment();
-		let r = [];
+		const r = new SpacedTextAccumulator();
 		V.nextLink = "Slave Interact";
 		V.nextButton = "Back";
 
@@ -141,8 +139,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			r.push(`Since ${impregnatrix.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${impregnatrix.slaveName} writhes with the pain of the injection, which is compounded as ${he2} springs agonizingly erect.`);
 		}
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		r.push(`Next, you see to ${slave.slaveName}.`);
 
@@ -230,8 +227,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 
 		knockMeUp(slave, 100, 2, impregnatrix.ID);
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		if (slave.devotion < -20 && impregnatrix.devotion < -20) {
 			r.push(`Since you have two restrained slaves, it's up to you to do all the work. You put ${slave.slaveName} on the couch with ${his} ${assPussy} available, and then maneuver ${impregnatrix.slaveName}'s dick into place. The two slaves make no further moves until you deal ${impregnatrix.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. After watching them mechanically go at it for a while, you stop ${impregnatrix.slaveName}, insert an electrostimulator up ${his2} rectum, and administer a shock to ${his2} ${prostate} that forces ${him2} to empty ${his2} nuts into ${slave.slaveName}. Both slaves <span class="mediumorchid">resent</span> what you made them do and <span class="gold">fear you</span> as a result.`);
@@ -457,8 +453,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			}
 		}
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		r.push(`You prepare the necessary file on their possible offspring. Upon birth, it will be remanded to a slave orphanage to be raised to the age of ${V.minimumSlaveAge} and then sold, but its likely appearance and traits are already worth noting. ${slave.slaveName} and ${impregnatrix.slaveName} are likely to produce`);
 
@@ -544,7 +539,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			r.push(`slave with a decent ass.`);
 		}
 
-		App.Events.addParagraph(node, r);
-		return node;
+		r.toParagraph();
+		return r.container();
 	}
 };
diff --git a/src/npc/interaction/passage/fSlaveSlaveAss.js b/src/npc/interaction/passage/fSlaveSlaveAss.js
index d36be6f52d0b95ba2c3651788feac499299ceefa..637d3adbcd4557afb6a16e76592f84b887539cdd 100644
--- a/src/npc/interaction/passage/fSlaveSlaveAss.js
+++ b/src/npc/interaction/passage/fSlaveSlaveAss.js
@@ -8,8 +8,8 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 	App.UI.DOM.appendNewElement("div", node, `Select a slave that will fuck ${slave.slaveName}.`);
 	App.UI.DOM.appendNewElement("h2", node, `Select an eligible slave`);
 
-	const _eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4));
-	for (const eligible of _eligibles) {
+	const eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4));
+	for (const eligible of eligibles) {
 		const div = App.UI.DOM.appendNewElement("div", node);
 		div.append(App.UI.DOM.link(
 			SlaveFullName(eligible),
@@ -21,13 +21,13 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 			App.UI.DOM.appendNewElement("span", div, ` ${eligible.custom.label}`, ["yellow", "bold"]);
 		}
 		if (totalRelatives(slave) > 0) {
-			const _relTerm = relativeTerm(slave, eligible);
-			if (_relTerm !== null) {
-				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(_relTerm)}`, "lightgreen");
+			const relTerm = relativeTerm(slave, eligible);
+			if (relTerm !== null) {
+				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(relTerm)}`, "lightgreen");
 			}
 		}
 	}
-	if (_eligibles.length === 0) {
+	if (eligibles.length === 0) {
 		App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of this act.`, "note");
 	}
 	return node;
@@ -48,7 +48,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 			He2, His2,
 			he2, his2, him2, himself2, hers2, wife2
 		} = getPronouns(rapist).appendSuffix("2");
-		let _incestMood;
+		let incestMood;
 
 		addPartner(slave, -1);
 
@@ -57,43 +57,43 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		rapist.counter.penetrative++;
 		V.penetrativeTotal++;
 
-		let _dickSize;
+		let dickSize;
 		if (rapist.dick === 1) {
-			_dickSize = "pathetic";
+			dickSize = "pathetic";
 		} else if (rapist.dick === 2) {
-			_dickSize = "tiny";
+			dickSize = "tiny";
 		} else if (rapist.dick === 3) {
-			_dickSize = "average";
+			dickSize = "average";
 		} else if (rapist.dick === 4) {
-			_dickSize = "big";
+			dickSize = "big";
 		} else if (rapist.dick === 5) {
-			_dickSize = "huge";
+			dickSize = "huge";
 		} else if (rapist.dick === 6) {
-			_dickSize = "gigantic";
+			dickSize = "gigantic";
 		} else if (rapist.dick === 7) {
-			_dickSize = "titanic";
+			dickSize = "titanic";
 		} else if (rapist.dick === 8) {
-			_dickSize = "absurd";
+			dickSize = "absurd";
 		} else if (rapist.dick === 9) {
-			_dickSize = "inhuman";
+			dickSize = "inhuman";
 		} else {
-			_dickSize = "obscene";
+			dickSize = "obscene";
 		}
 
-		const _isIncest = areRelated(slave, rapist);
+		const isIncest = areRelated(slave, rapist);
 
 		r.push(`You take a look at the slave you selected.`);
 
 		if (rapist.fetish === "dom" && rapist.fetishStrength > 20 && rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} loves to dominate others it's not hard to get ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`massive clit`);
 			}
 			r.push(`ready. ${His2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} cock`);
+				r.push(`${dickSize} cock`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -101,16 +101,16 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		} else if (rapist.fetish === "sadist" && rapist.fetishStrength > 20 && rapist.devotion >= -20) {
 			r.push(`With the prospect of torturing another slave`);
 			if (rapist.dick > 0) {
-				r.push(`${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`);
+				r.push(`${his2} ${dickSize} cock swells to a throbbing erection in seconds.`);
 			} else {
 				r.push(`${his2} huge clit becomes fully engorged in seconds.`);
 			}
 		} else if ((rapist.fetish === "pregnancy" && rapist.fetishStrength > 20 && rapist.devotion >= -20) && rapist.dick > 0) {
-			r.push(`With the prospect of raping another slave bareback, ${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`);
+			r.push(`With the prospect of raping another slave bareback, ${his2} ${dickSize} cock swells to a throbbing erection in seconds.`);
 		} else if (rapist.attrXX > 65 && rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} likes sticking ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -122,7 +122,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		} else if (rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} does not resist your will, ${he2} should comply reasonably well. ${He2} has to work to get ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -130,14 +130,14 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		} else {
 			r.push(`Since ${rapist.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${rapist.slaveName} writhes with the pain of the injection, which is compounded as ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
 			r.push(`quickly reaches an agonizingly full erection.`);
 		}
 
-		if (_isIncest) {
+		if (isIncest) {
 			r.push(`${rapist.slaveName} is well aware that ${he2} is about to rape`);
 			if (rapist.father === slave.ID && rapist.mother === slave.ID) {
 				r.push(`the slave that is both ${his2} mother and ${his2} father,`);
@@ -165,14 +165,14 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 				} else {
 					r.push(`but despite ${his2} conflicted feelings ${his2} arousal is clear.`);
 				}
-				_incestMood = "Top";
+				incestMood = "Top";
 			} else if (rapist.relationshipTarget === slave.ID && rapist.relationship > 2) {
 				r.push(`but since ${he2}'s already in a sexual relationship with ${him}, it's only special because ${his2} ${getWrittenTitle(rapist)} is watching.`);
-				_incestMood = "Top";
+				incestMood = "Top";
 			} else {
 				if (rapist.devotion > 95) {
 					r.push(`but ${his2} deep acceptance of slavery means ${he2} can't help but be eager to please everyone involved with ${his2} performance.`);
-					_incestMood = "Top";
+					incestMood = "Top";
 				} else if (rapist.devotion > 60) {
 					r.push(`but ${his2} experience as a slave means ${he2} can mostly ignore it and focus on sex.`);
 				} else {
@@ -186,7 +186,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 
 		r.push(`Next, you see to ${slave.slaveName}.`);
 
-		if (_isIncest) {
+		if (isIncest) {
 			r.push(`${slave.slaveName} is fully naked and`);
 			if (canSee(slave)) {
 				r.push(`looking up at`);
@@ -208,7 +208,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 				if (slave.energy > 60) {
 					r.push(`whose`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
@@ -222,16 +222,16 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					}
 					r.push(`the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
 					r.push(`that's soon going inside ${him}.`);
 				}
-				if (_incestMood === "Top") {
-					_incestMood = "Both";
+				if (incestMood === "Top") {
+					incestMood = "Both";
 				} else {
-					_incestMood = "Bottom";
+					incestMood = "Bottom";
 				}
 			} else if (slave.relationshipTarget === rapist.ID && slave.relationship > 2) {
 				r.push(`and seems calm and inviting to ${his}`);
@@ -243,15 +243,15 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					r.push(`slave ${wife2}'s`);
 				}
 				if (rapist.dick > 0) {
-					r.push(`${_dickSize} penis`);
+					r.push(`${dickSize} penis`);
 				} else {
 					r.push(`massive clit`);
 				}
 				r.push(`that will be penetrating ${him}.`);
-				if (_incestMood === "Top") {
-					_incestMood = "Both";
+				if (incestMood === "Top") {
+					incestMood = "Both";
 				} else {
-					_incestMood = "Bottom";
+					incestMood = "Bottom";
 				}
 			} else {
 				if (slave.devotion > 95) {
@@ -263,20 +263,20 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					}
 					r.push(`the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
 					r.push(`above ${him} with a lusty smile.`);
-					if (_incestMood === "Top") {
-						_incestMood = "Both";
+					if (incestMood === "Top") {
+						incestMood = "Both";
 					} else {
-						_incestMood = "Bottom";
+						incestMood = "Bottom";
 					}
 				} else if (slave.devotion > 60) {
 					r.push(`and if ${he} focuses, ${he} can forget the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
@@ -286,7 +286,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					if (canSee(slave)) {
 						r.push(`eyes glued to the`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -294,7 +294,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					} else if (canHear(slave)) {
 						r.push(`listening to the heavy breathing of ${his} relative whose`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -302,7 +302,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 					} else {
 						r.push(`imagining how the`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -322,7 +322,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		} else if ((slave.devotion > 20 && slave.anus === 0) ) {
 			r.push(`${He} accepts your orders without comment and presents ${his} virgin asshole to ${rapist.slaveName}. ${He} gasps in shock when ${he} feels the`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -366,7 +366,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		if (slave.devotion < -20 && rapist.devotion < -20) {
 			r.push(`Since you have two restrained slaves, it's up to you to do all the work. ${slave.slaveName} is tied up on the bed with ${his} asshole available, so you maneuver ${rapist.slaveName}'s`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`strap-on`);
 			}
@@ -374,7 +374,7 @@ App.Interact.fSlaveSlaveAss = function(slave) {
 		} else if (rapist.devotion < -20) {
 			r.push(`Since your dick slave is restrained, you order ${slave.slaveName} to present ${himself} on the bed, and then maneuver ${rapist.slaveName}'s`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`strap-on`);
 			}
diff --git a/src/npc/interaction/passage/fSlaveSlaveDick.js b/src/npc/interaction/passage/fSlaveSlaveDick.js
index f14405bc32c9879dd98602b2e5f472874887dd9e..982f157d321247daa0bcb29f015e3df35141f585 100644
--- a/src/npc/interaction/passage/fSlaveSlaveDick.js
+++ b/src/npc/interaction/passage/fSlaveSlaveDick.js
@@ -9,8 +9,8 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 	App.UI.DOM.appendNewElement("div", node, `Select a slave that will ride ${slave.slaveName}.`);
 	App.UI.DOM.appendNewElement("h2", node, `Select an eligible slave`);
 
-	const _eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && canDoVaginal(s) && canStand(s) /* amp-amp scene is not written */);
-	for (const eligible of _eligibles) {
+	const eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && canDoVaginal(s) && canStand(s) /* amp-amp scene is not written */);
+	for (const eligible of eligibles) {
 		const div = App.UI.DOM.appendNewElement("div", node);
 		div.append(App.UI.DOM.link(
 			SlaveFullName(eligible),
@@ -25,13 +25,13 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			App.UI.DOM.appendNewElement("span", div, ` Fertile`, "green");
 		}
 		if (totalRelatives(slave) > 0) {
-			const _relTerm = relativeTerm(slave, eligible);
-			if (_relTerm !== null) {
-				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(_relTerm)}`, "lightgreen");
+			const relTerm = relativeTerm(slave, eligible);
+			if (relTerm !== null) {
+				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(relTerm)}`, "lightgreen");
 			}
 		}
 	}
-	if (_eligibles.length === 0) {
+	if (eligibles.length === 0) {
 		App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of this act.`, "note");
 	}
 	return node;
@@ -48,33 +48,33 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			He2,
 			he2, his2, him2, himself2, hers2
 		} = getPronouns(rapist).appendSuffix("2");
-		let _bottomDrugged;
-		let _incestMood;
+		let bottomDrugged;
+		let incestMood;
 
-		let _dickSize;
+		let dickSize;
 		if (slave.dick) {
 			if (slave.dick === 1) {
-				_dickSize = "tiny";
+				dickSize = "tiny";
 			} else if (slave.dick === 2) {
-				_dickSize = "tiny";
+				dickSize = "tiny";
 			} else if (slave.dick === 3) {
-				_dickSize = "average";
+				dickSize = "average";
 			} else if (slave.dick === 4) {
-				_dickSize = "big";
+				dickSize = "big";
 			} else if (slave.dick === 5) {
-				_dickSize = "huge";
+				dickSize = "huge";
 			} else if (slave.dick === 6) {
-				_dickSize = "gigantic";
+				dickSize = "gigantic";
 			} else if (slave.dick === 7) {
-				_dickSize = "titanic";
+				dickSize = "titanic";
 			} else if (slave.dick === 8) {
-				_dickSize = "absurd";
+				dickSize = "absurd";
 			} else if (slave.dick >= 9) {
-				_dickSize = "inhuman";
+				dickSize = "inhuman";
 			}
 		}
 
-		const _isIncest = areRelated(slave, rapist);
+		const isIncest = areRelated(slave, rapist);
 
 		r.push(`You take a look at the bound cock toy.`);
 
@@ -110,7 +110,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit.`);
 			} else {
-				r.push(`${_dickSize} cock.`);
+				r.push(`${dickSize} cock.`);
 			}
 		}
 
@@ -124,7 +124,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				if (slave.clit >= 4) {
 					r.push(`massive clit`);
 				} else {
-					r.push(`${_dickSize} penis`);
+					r.push(`${dickSize} penis`);
 				}
 				r.push(`from becoming erect. A massive dose of vasodilators fixes this, and you think you see ${his} face twitch with the pain, but there is no further reaction.`);
 			}
@@ -134,7 +134,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				if (slave.clit >= 4) {
 					r.push(`massive clit`);
 				} else {
-					r.push(`${_dickSize} penis`);
+					r.push(`${dickSize} penis`);
 				}
 				r.push(`becomes erect. When you let go, ${he} gives a needy moo with a sad expression to ask you to keep going.`);
 			} else {
@@ -142,10 +142,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				if (slave.clit >= 4) {
 					r.push(`massive clit`);
 				} else {
-					r.push(`${_dickSize} cock`);
+					r.push(`${dickSize} cock`);
 				}
 				r.push(`becomes erect, and ${he} moos in discomfort and struggles against ${his} restraints.`);
-				_bottomDrugged = 1;
+				bottomDrugged = 1;
 			}
 		} else if (slave.fetish === "mindbroken" && slave.career === "a breeding bull") {
 			r.push(`${slave.slaveName}, as a good bull, was already erect while being tied down. It seems ${he} knows what's going to happen to ${him} soon. Maybe someone at the Cattle Ranch has been sampling their bulls?`);
@@ -159,7 +159,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} cock`);
+								r.push(`${dickSize} cock`);
 							}
 							r.push(`is erect. ${He} knows ${he}'s going to get used, and can't hide ${his} excitement.`);
 						} else if (slave.fetish === "dom") {
@@ -167,7 +167,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} cock`);
+								r.push(`${dickSize} cock`);
 							}
 							r.push(`becomes hard. Despite knowing ${he}'s going to be used, ${he} can't hide ${his} curiosity to experience what the other side feels.`);
 						} else if (slave.fetish === "masochist") {
@@ -175,7 +175,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} erection`);
+								r.push(`${dickSize} erection`);
 							}
 							r.push(`once you have finished. ${His} nipples are firm as well, and ${he} struggles against ${his} restraints to feel them dig into ${him} tighter.`);
 						} else if (slave.fetish === "sadist") {
@@ -183,27 +183,27 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} cock`);
+								r.push(`${dickSize} cock`);
 							}
 							r.push(`becomes erect and hope ${he} at least learns something from being on the receiving end for once.`);
-							_bottomDrugged = 1;
+							bottomDrugged = 1;
 						} else if (slave.fetish === "humiliation") {
 							r.push(`${slave.slaveName} gets off on humiliation, and after being ordered to lay naked on a bed to be tied down, becomes flushed with arousal with ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} cock`);
+								r.push(`${dickSize} cock`);
 							}
 							r.push(`throbbing in anticipation at being used like a toy.`);
 						} else if (slave.fetish === "pregnancy" && V.arcologies[0].FSRepopulationFocus !== "unset" && canPenetrate(slave)) {
-							r.push(`${slave.slaveName} gets off thinking about pregnancy, and in your arcology most women are pregnant or fertile. ${He} knows someone's pussy will be around ${his} ${_dickSize} cock soon, and is clearly lost in ${his} fantasies as ${his} cock swells to a throbbing erection.`);
+							r.push(`${slave.slaveName} gets off thinking about pregnancy, and in your arcology most women are pregnant or fertile. ${He} knows someone's pussy will be around ${his} ${dickSize} cock soon, and is clearly lost in ${his} fantasies as ${his} cock swells to a throbbing erection.`);
 						}
 					} else if (slave.attrXX > 65) {
 						r.push(`${slave.slaveName} has a good sex drive and likes pussy, even before ${he}'s fully bound ${his}`);
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`is throbbing in anticipation.`);
 					} else {
@@ -211,7 +211,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`stands erect.`);
 					}
@@ -221,7 +221,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`erect and ready.`);
 					} else {
@@ -229,10 +229,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`causes ${him} to quickly reach painful readiness, and the unnatural pain makes ${him} strain at ${his} bonds.`);
-						_bottomDrugged = 1;
+						bottomDrugged = 1;
 					}
 				}
 			} else {
@@ -242,7 +242,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} erection`);
+							r.push(`${dickSize} erection`);
 						}
 						r.push(`ready for sex despite ${his} negative feelings.`);
 					} else {
@@ -250,7 +250,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`to be ready for sex.`);
 					}
@@ -259,10 +259,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit`);
 					} else {
-						r.push(`${_dickSize} cock`);
+						r.push(`${dickSize} cock`);
 					}
 					r.push(`becomes painfully hard.`);
-					_bottomDrugged = 1;
+					bottomDrugged = 1;
 				}
 			}
 		}
@@ -277,7 +277,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 
 		if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") {
 			r.push(`${slave.slaveName} doesn't even notice`);
-			if (_isIncest) {
+			if (isIncest) {
 				if (slave.father === rapist.ID && slave.mother === rapist.ID) {
 					r.push(`the slave that is both ${his} mother and ${his} father,`);
 				} else if (rapist.mother === slave.ID || rapist.father === slave.ID) {
@@ -294,7 +294,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			}
 			r.push(`and simply lays still.`);
 		} else if (slave.fetish === "mindbroken" && (slave.career === "a dairy cow" || slave.career === "a breeding bull")) {
-			if (_isIncest) {
+			if (isIncest) {
 				r.push(`${slave.slaveName}'s simple mind does not even acknowledge that ${rapist.slaveName} is`);
 				if (slave.father === rapist.ID && slave.mother === rapist.ID) {
 					r.push(`the slave that is both ${his} mother and ${his} father,`);
@@ -322,10 +322,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`swollen clit`);
 			} else {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			}
 			r.push(`is erect. Naturally, ${he} seems quite eager to put them together.`);
-			_incestMood = "Bottom";
+			incestMood = "Bottom";
 		} else {
 			r.push(`${slave.slaveName} is fully naked and`);
 			if (canSee(slave)) {
@@ -333,7 +333,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			} else {
 				r.push(`waiting in front of`);
 			}
-			if (_isIncest) {
+			if (isIncest) {
 				if (slave.father === rapist.ID && slave.mother === rapist.ID) {
 					r.push(`the slave that is both ${his} mother and ${his} father,`);
 				} else if (rapist.mother === slave.ID || rapist.father === slave.ID) {
@@ -346,7 +346,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					r.push(`${his} ${relativeTerm(slave, rapist)},`);
 				}
 				if (slave.sexualQuirk === "perverted" || slave.behavioralQuirk === "sinful") {
-					_incestMood = "Bottom";
+					incestMood = "Bottom";
 					r.push(`unable to hide ${his} intense arousal at the impending`);
 					if (rapist.sexualQuirk === "perverted") {
 						r.push(`perverted`);
@@ -359,16 +359,16 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					}
 					r.push(`${rapist.slaveName} can hear ${him} moan in anticipation${(!canSee(slave)) ? ", which surprises the blind slave" : ""}.`);
 				} else if (slave.relationshipTarget === rapist.ID && slave.relationship > 2) {
-					_incestMood = "Both";
+					incestMood = "Both";
 					r.push(`but since they're already in a sexual relationship, ${he} just shows a relaxed smile as ${he} waits for ${rapist.slaveName} to mount ${him}.`);
 				} else {
 					if (slave.devotion > 95) {
-						_incestMood = "Bottom";
+						incestMood = "Bottom";
 						r.push(`but ${his} deep acceptance of slavery means ${he} is eager to please you,`);
 						if (slave.clit >= 4) {
 							r.push(`leaving ${his} massive clit flushed.`);
 						} else {
-							r.push(`making ${his} ${_dickSize} cock drip precum.`);
+							r.push(`making ${his} ${dickSize} cock drip precum.`);
 						}
 					} else if (slave.devotion > 60) {
 						r.push(`and is clearly struggling between keeping ${himself} hard and acknowledging the incest. A small dose of vasodilators and ${his} impressive desire to please you should keep ${his}`);
@@ -378,23 +378,23 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							r.push(`penis`);
 						}
 						r.push(`up for ${rapist.slaveName}.`);
-						_incestMood = "BottomFragile";
+						incestMood = "BottomFragile";
 					} else {
-						if (!_bottomDrugged) {
+						if (!bottomDrugged) {
 							r.push(`and once it becomes clear to ${him} that ${rapist.slaveName} will be the one mounting ${him}, ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to readiness to ${his} horror.`);
-							_bottomDrugged = 1;
+							bottomDrugged = 1;
 						} else {
 							r.push(`and to ${his} own horror the drugs ${he} was injected with keep ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`ready and waiting.`);
 						}
@@ -425,14 +425,14 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`leaving ${his} massive clit flushed.`);
 						} else {
-							r.push(`making ${his} ${_dickSize} cock drip precum.`);
+							r.push(`making ${his} ${dickSize} cock drip precum.`);
 						}
 					} else if (slave.devotion > 95) {
 						r.push(`${His} deep acceptance of slavery means ${he} is eager to please you,`);
 						if (slave.clit >= 4) {
 							r.push(`leaving ${his} massive clit flushed,`);
 						} else {
-							r.push(`making ${his} ${_dickSize} cock drip precum,`);
+							r.push(`making ${his} ${dickSize} cock drip precum,`);
 						}
 						r.push(`despite how odd it is to fuck one's own body.`);
 					} else if (slave.devotion > 60) {
@@ -444,21 +444,21 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						}
 						r.push(`at attention.`);
 					} else {
-						if (!_bottomDrugged) {
+						if (!bottomDrugged) {
 							r.push(`Once it becomes clear to ${him} that "${he}'ll" be the one mounting ${him}, ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to readiness to ${his} horror.`);
-							_bottomDrugged = 1;
+							bottomDrugged = 1;
 						} else {
 							r.push(`To ${his} own horror the drugs ${he} was injected with keep ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`ready and waiting.`);
 						}
@@ -470,7 +470,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`leaving ${his} massive clit flushed,`);
 						} else {
-							r.push(`making ${his} ${_dickSize} cock drip precum,`);
+							r.push(`making ${his} ${dickSize} cock drip precum,`);
 						}
 						r.push(`eager for ${rapist.slaveName}.`);
 					} else if (slave.devotion > 60) {
@@ -482,21 +482,21 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						}
 						r.push(`is at attention and waiting for ${rapist.slaveName}.`);
 					} else {
-						if (!_bottomDrugged) {
+						if (!bottomDrugged) {
 							r.push(`Once it becomes clear to ${him} that ${rapist.slaveName} be the one mounting ${him}, ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to a proper hardness.`);
-							_bottomDrugged = 1;
+							bottomDrugged = 1;
 						} else {
 							r.push(`To ${his} own horror the drugs ${he} was injected with keep ${his}`);
 							if (slave.clit >= 4) {
 								r.push(`massive clit`);
 							} else {
-								r.push(`${_dickSize} penis`);
+								r.push(`${dickSize} penis`);
 							}
 							r.push(`ready and waiting.`);
 						}
@@ -510,7 +510,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 
 		if (rapist.fetish === "mindbroken" && rapist.career !== "a dairy cow" && rapist.career !== "a breeding bull") {
 			r.push(`${rapist.slaveName} stares blankly, and needs to be deliberately guided to straddle ${slave.slaveName}.`);
-			if (_isIncest) {
+			if (isIncest) {
 				r.push(`Naturally, ${he2} isn't even aware of the impending incest.`);
 			}
 			if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") {
@@ -521,10 +521,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			}
 			r.push(`ready and waiting, and catches on to why ${he2}'s here quickly. ${He2} takes it into ${his2} mouth before you stop ${him2} and tap ${his2} pussy, and after a few seconds of thinking ${he2} straddles ${slave.slaveName}'s hips with a moo.`);
-			if (_isIncest) {
+			if (isIncest) {
 				r.push(`Naturally, since ${he2} thinks ${he2}'s a cow, incest means nothing to ${him2}.`);
 			}
 		} else if (rapist.fetish === "mindbroken" && (rapist.career === "a breeding bull")) {
@@ -532,15 +532,15 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			}
 			r.push(`ready and waiting, but isn't quite sure what to do with it. ${He2}'s been brought up to use ${his2} dick when thinking, after all. It takes a few minutes to get ${him2} to straddle ${slave.slaveName}'s hips with the intent to get ${his2} pussy penetrated.`);
-			if (_isIncest) {
+			if (isIncest) {
 				r.push(`Naturally, since ${he2} thinks ${he2}'s a breeding bull, incest means nothing to ${him2}.`);
 			}
 		} else {
 			r.push(`${rapist.slaveName} sees`);
-			if (_isIncest) {
+			if (isIncest) {
 				if (rapist.father === slave.ID && rapist.mother === slave.ID) {
 					r.push(`the slave that is both ${his2} mother and ${his2} father`);
 				} else if (slave.mother === rapist.ID || slave.father === rapist.ID) {
@@ -554,7 +554,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				}
 				r.push(`tied to the bed,`);
 				if (rapist.sexualQuirk === "perverted" || rapist.sexualQuirk === "sinful") {
-					if (_incestMood === "Bottom") {
+					if (incestMood === "Bottom") {
 						r.push(`and can't hide ${his2}`);
 						if (rapist.sexualQuirk === "perverted") {
 							r.push(`perverted`);
@@ -562,9 +562,9 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							r.push(`sinful`);
 						}
 						r.push(`arousal at the excited glances they share.`);
-						_incestMood = "Both";
+						incestMood = "Both";
 					} else {
-						_incestMood = "Top";
+						incestMood = "Top";
 						r.push(`and becomes indecently aroused at their horrified expressions for the`);
 						if (rapist.sexualQuirk === "perverted") {
 							r.push(`perverted`);
@@ -577,26 +577,26 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					r.push(`and licks ${his2} lips involuntarily.`);
 				} else {
 					if (rapist.devotion > 95) {
-						if (_incestMood === "Bottom") {
+						if (incestMood === "Bottom") {
 							r.push(`as well as ${his2} apparent lust. Since ${he2} is a perfect slave for you, ${his2} vagina becomes flushed with arousal quickly.`);
-							_incestMood = "Both";
+							incestMood = "Both";
 						} else {
-							_incestMood = "Top";
+							incestMood = "Top";
 							r.push(`as well as ${his} worried expression. ${rapist.slaveName} seems aroused and determined to show ${him} how a proper slave should act.`);
 						}
 					} else if (rapist.devotion > 60) {
-						if (_incestMood === "BottomFragile") {
-							_incestMood = "";
+						if (incestMood === "BottomFragile") {
+							incestMood = "";
 						}
 						r.push(`and after figuring out they're just as superficially prepared as ${he2} is, resolves ${himself2} to forget they're related to stay aroused.`);
 					} else {
 						r.push(`and can't hide the look of horror that crosses ${his2} face. You assure ${him2} this is what ${he2} needs to do.`);
-						if (_incestMood === "Bottom") {
+						if (incestMood === "Bottom") {
 							r.push(`To ${his2} growing disgust, ${he2} can tell ${slave.slaveName}'s`);
 							if (slave.clit >= 4) {
 								r.push(`erect clit`);
 							} else {
-								r.push(`${_dickSize} erection`);
+								r.push(`${dickSize} erection`);
 							}
 							r.push(`shows off genuine arousal despite their blood relation.`);
 						} else {
@@ -604,7 +604,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`erect clit`);
 							} else {
-								r.push(`${_dickSize} erection`);
+								r.push(`${dickSize} erection`);
 							}
 							r.push(`on display doesn't seem thrilled as well.`);
 						}
@@ -625,26 +625,26 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					r.push(`and licks ${his2} lips involuntarily.`);
 				} else {
 					if (rapist.devotion > 95) {
-						if (_incestMood === "Bottom") {
+						if (incestMood === "Bottom") {
 							r.push(`as well as ${his2} apparent lust. Since ${he2} is a perfect slave for you, ${his2} vagina becomes flushed with arousal quickly.`);
-							_incestMood = "Both";
+							incestMood = "Both";
 						} else {
-							_incestMood = "Top";
+							incestMood = "Top";
 							r.push(`as well as ${his} worried expressions. ${rapist.slaveName} seems aroused and determined to show ${him} how a proper slave should act.`);
 						}
 					} else if (rapist.devotion > 20) {
-						if (_incestMood === "BottomFragile") {
-							_incestMood = "";
+						if (incestMood === "BottomFragile") {
+							incestMood = "";
 						}
 						r.push(`and after figuring out they're just as superficially prepared as ${he2} is, resolves ${himself2} to try and make it pleasurable.`);
 					} else {
 						r.push(`and can't hide the look of horror that crosses ${his2} face. You assure ${him2} this is what ${he2} needs to do.`);
-						if (_incestMood === "Bottom") {
+						if (incestMood === "Bottom") {
 							r.push(`To ${his2} growing disgust, ${he2} can tell ${slave.slaveName}'s`);
 							if (slave.clit >= 4) {
 								r.push(`erect clit`);
 							} else {
-								r.push(`${_dickSize} erection`);
+								r.push(`${dickSize} erection`);
 							}
 							r.push(`shows off genuine arousal despite ${his2} unwillingness.`);
 						} else {
@@ -652,7 +652,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 							if (slave.clit >= 4) {
 								r.push(`erect clit`);
 							} else {
-								r.push(`${_dickSize} erection`);
+								r.push(`${dickSize} erection`);
 							}
 							r.push(`on display doesn't seem thrilled as well.`);
 						}
@@ -660,14 +660,14 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				}
 			}
 
-			if (_incestMood === "Top" || _incestMood === "Both" || !(_isIncest)) {
+			if (incestMood === "Top" || incestMood === "Both" || !(isIncest)) {
 				if (rapist.fetishKnown === 1) {
 					if (rapist.fetish === "submissive") {
 						r.push(`${rapist.slaveName} usually prefers to be underneath someone with a`);
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`like that, which is obvious in ${his2} expressions. Knowing ${he2}'s riding it due to someone's orders is just about the only detail that plays to ${his2} fetish.`);
 					} else if (rapist.fetish === "dom") {
@@ -675,7 +675,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} cock`);
+							r.push(`${dickSize} cock`);
 						}
 						r.push(`tied up and presented to ${him2}. Being on top and controlling everything is what gets ${him2} off, and you just gave ${him2} a nice human dildo to dominate.`);
 					} else if (rapist.fetish === "masochist") {
@@ -683,7 +683,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} erection`);
+							r.push(`${dickSize} erection`);
 						}
 						r.push(`tied before ${him2}. Maybe ${he2} can delude ${himself2} into thinking this is a denial play for ${himself2} and enjoy the human dildo, or maybe not.`);
 					} else if (rapist.fetish === "sadist") {
@@ -691,7 +691,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit's`);
 						} else {
-							r.push(`${_dickSize} cock's`);
+							r.push(`${dickSize} cock's`);
 						}
 						r.push(`owner feels.`);
 					} else if (rapist.fetish === "humiliation") {
@@ -713,7 +713,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -735,7 +735,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -743,7 +743,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -754,7 +754,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -762,7 +762,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -774,7 +774,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			}
 			r.push(`is all ${hers2}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to hurt and rape another slave for ${his2} pleasure.`);
 			if (rapist.vagina === 0) { /* losing virginity */
@@ -784,7 +784,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -808,7 +808,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -816,7 +816,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -827,7 +827,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -835,7 +835,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -854,13 +854,13 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
 					rapist.devotion += 10;
 				} else if (rapist.devotion >= -20) {
-					r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears _h2e might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`);
+					r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
 					rapist.devotion += 4;
 				} else {
@@ -877,7 +877,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -885,7 +885,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -896,7 +896,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -904,7 +904,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -917,7 +917,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			}
 			r.push(`is all ${hers2}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to rape another slave for ${his2} pleasure.`);
 			if (rapist.vagina === 0) {
@@ -925,7 +925,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				if (slave.clit >= 4) {
 					r.push(`clit-dick,`);
 				} else {
-					r.push(`${_dickSize} dick,`);
+					r.push(`${dickSize} dick,`);
 				}
 				r.push(`impaling ${himself2} slowly and teasing ${his2} bound victim. This act <span class="lime">breaks in ${his2} pussy.</span>`);
 				rapist.vagina = 1;
@@ -945,7 +945,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			}
 			r.push(`is all ${hers}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to rape another slave, just for the perverted novelty of the act.`);
 			if (rapist.vagina === 0) { /* losing virginity */
@@ -954,7 +954,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -977,7 +977,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -985,7 +985,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -996,7 +996,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1004,7 +1004,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -1021,7 +1021,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -1043,7 +1043,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1051,7 +1051,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -1062,7 +1062,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1070,7 +1070,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -1085,7 +1085,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -1107,7 +1107,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1115,7 +1115,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -1126,7 +1126,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1134,7 +1134,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
@@ -1144,7 +1144,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (slave.clit >= 4) {
 				r.push(`massive clit`);
 			} else {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			}
 			r.push(`and dripping away with the contents of ${rapist.slaveName}'s cum-filled pussy. You notice ${rapist.slaveName}'s looking a little more longingly at ${slave.slaveName}.`);
 		} else {
@@ -1155,7 +1155,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
-						r.push(`${_dickSize} dick.`);
+						r.push(`${dickSize} dick.`);
 					}
 					r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`);
 					rapist.vagina = 1;
@@ -1177,7 +1177,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1185,7 +1185,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`);
 					}
@@ -1196,7 +1196,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`for the first time.`);
 					} else {
@@ -1204,7 +1204,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 						if (slave.clit >= 4) {
 							r.push(`massive clit`);
 						} else {
-							r.push(`${_dickSize} dick`);
+							r.push(`${dickSize} dick`);
 						}
 						r.push(`disappears into ${his} mother's vagina.`);
 					}
diff --git a/src/npc/interaction/passage/fSlaveSlaveVag.js b/src/npc/interaction/passage/fSlaveSlaveVag.js
index 681dd553c617751ac08b44ec591df144a4f35d8d..aa12e30bc4685b7a7cf43d4a677ac5670cf0796c 100644
--- a/src/npc/interaction/passage/fSlaveSlaveVag.js
+++ b/src/npc/interaction/passage/fSlaveSlaveVag.js
@@ -8,8 +8,8 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 	App.UI.DOM.appendNewElement("div", node, `Select a slave that will fuck ${slave.slaveName}.`);
 	App.UI.DOM.appendNewElement("h2", node, `Select an eligible slave`);
 
-	const _eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4));
-	for (const eligible of _eligibles) {
+	const eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4));
+	for (const eligible of eligibles) {
 		const div = App.UI.DOM.appendNewElement("div", node);
 		div.append(App.UI.DOM.link(
 			SlaveFullName(eligible),
@@ -24,13 +24,13 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 			App.UI.DOM.appendNewElement("span", div, ` Virile`, "green");
 		}
 		if (totalRelatives(slave) > 0) {
-			const _relTerm = relativeTerm(slave, eligible);
-			if (_relTerm !== null) {
-				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(_relTerm)}`, "lightgreen");
+			const relTerm = relativeTerm(slave, eligible);
+			if (relTerm !== null) {
+				App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(relTerm)}`, "lightgreen");
 			}
 		}
 	}
-	if (_eligibles.length === 0) {
+	if (eligibles.length === 0) {
 		App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of this act.`, "note");
 	}
 	return node;
@@ -51,7 +51,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 			He2, His2,
 			he2, his2, him2, himself2, hers2, wife2
 		} = getPronouns(rapist).appendSuffix("2");
-		let _incestMood;
+		let incestMood;
 
 		addPartner(slave, -1);
 
@@ -60,37 +60,37 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		rapist.counter.penetrative++;
 		V.penetrativeTotal++;
 
-		let _dickSize;
+		let dickSize;
 		if (rapist.dick === 1) {
-			_dickSize = "pathetic";
+			dickSize = "pathetic";
 		} else if (rapist.dick === 2) {
-			_dickSize = "tiny";
+			dickSize = "tiny";
 		} else if (rapist.dick === 3) {
-			_dickSize = "average";
+			dickSize = "average";
 		} else if (rapist.dick === 4) {
-			_dickSize = "big";
+			dickSize = "big";
 		} else if (rapist.dick === 5) {
-			_dickSize = "huge";
+			dickSize = "huge";
 		} else if (rapist.dick === 6) {
-			_dickSize = "gigantic";
+			dickSize = "gigantic";
 		} else if (rapist.dick === 7) {
-			_dickSize = "titanic";
+			dickSize = "titanic";
 		} else if (rapist.dick === 8) {
-			_dickSize = "absurd";
+			dickSize = "absurd";
 		} else if (rapist.dick === 9) {
-			_dickSize = "inhuman";
+			dickSize = "inhuman";
 		} else {
-			_dickSize = "obscene";
+			dickSize = "obscene";
 		}
 
-		const _isIncest = areRelated(slave, rapist);
+		const isIncest = areRelated(slave, rapist);
 
 		r.push(`You take a look at the slave you selected.`);
 
 		if (rapist.fetish === "dom" && rapist.fetishStrength > 20 && rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} loves to dominate others it's not hard to get ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -100,7 +100,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 			} else {
 				r.push(`${His2}`);
 				if (rapist.dick > 0) {
-					r.push(`${_dickSize} cock`);
+					r.push(`${dickSize} cock`);
 				} else {
 					r.push(`massive clit`);
 				}
@@ -109,16 +109,16 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		} else if (rapist.fetish === "sadist" && rapist.fetishStrength > 20 && rapist.devotion >= -20) {
 			r.push(`With the prospect of torturing another slave`);
 			if (rapist.dick > 0) {
-				r.push(`${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`);
+				r.push(`${his2} ${dickSize} cock swells to a throbbing erection in seconds.`);
 			} else {
 				r.push(`${his2} huge clit becomes fully engorged in seconds.`);
 			}
 		} else if ((rapist.fetish === "pregnancy" && rapist.fetishStrength > 20 && rapist.devotion >= -20) && rapist.dick > 0) {
-			r.push(`With the prospect of raping another slave bareback, ${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`);
+			r.push(`With the prospect of raping another slave bareback, ${his2} ${dickSize} cock swells to a throbbing erection in seconds.`);
 		} else if (rapist.attrXX > 65 && rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} likes sticking ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -130,7 +130,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		} else if (rapist.devotion >= -20) {
 			r.push(`Since ${rapist.slaveName} does not resist your will, ${he2} should comply reasonably well. ${He2} has to work to get ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -138,14 +138,14 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		} else {
 			r.push(`Since ${rapist.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${rapist.slaveName} writhes with the pain of the injection, which is compounded as ${his2}`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} penis`);
+				r.push(`${dickSize} penis`);
 			} else {
 				r.push(`massive clit`);
 			}
 			r.push(`quickly reaches an agonizingly full erection.`);
 		}
 
-		if (_isIncest) {
+		if (isIncest) {
 			r.push(`${rapist.slaveName} is well aware that ${he2} is about to rape`);
 			if (rapist.father === slave.ID && rapist.mother === slave.ID) {
 				r.push(`the slave that is both ${his2} mother and ${his2} father,`);
@@ -173,14 +173,14 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 				} else {
 					r.push(`but despite ${his2} conflicted feelings ${his2} arousal is clear.`);
 				}
-				_incestMood = "Top";
+				incestMood = "Top";
 			} else if (rapist.relationshipTarget === slave.ID && rapist.relationship > 2) {
 				r.push(`but since ${he2}'s already in a sexual relationship with ${him}, it's only special because ${his2} ${getWrittenTitle(rapist)} is watching.`);
-				_incestMood = "Top";
+				incestMood = "Top";
 			} else {
 				if (rapist.devotion > 95) {
 					r.push(`but ${his2} deep acceptance of slavery means ${he2} can't help but be eager to please everyone involved with ${his2} performance.`);
-					_incestMood = "Top";
+					incestMood = "Top";
 				} else if (rapist.devotion > 60) {
 					r.push(`but ${his2} experience as a slave means ${he2} can mostly ignore it and focus on sex.`);
 				} else {
@@ -194,7 +194,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 
 		r.push(`Next, you see to ${slave.slaveName}.`);
 
-		if (_isIncest) {
+		if (isIncest) {
 			r.push(`${slave.slaveName} is fully naked and`);
 			if (canSee(slave)) {
 				r.push(`looking up at`);
@@ -216,7 +216,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 				if (slave.energy > 60) {
 					r.push(`whose`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
@@ -230,16 +230,16 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					}
 					r.push(`the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
 					r.push(`that's soon going inside ${him}.`);
 				}
-				if (_incestMood === "Top") {
-					_incestMood = "Both";
+				if (incestMood === "Top") {
+					incestMood = "Both";
 				} else {
-					_incestMood = "Bottom";
+					incestMood = "Bottom";
 				}
 			} else if (slave.relationshipTarget === rapist.ID && slave.relationship > 2) {
 				r.push(`and seems calm and inviting to ${his}`);
@@ -251,15 +251,15 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					r.push(`slave ${wife2}'s`);
 				}
 				if (rapist.dick > 0) {
-					r.push(`${_dickSize} penis`);
+					r.push(`${dickSize} penis`);
 				} else {
 					r.push(`massive clit`);
 				}
 				r.push(`that will be penetrating ${him}.`);
-				if (_incestMood === "Top") {
-					_incestMood = "Both";
+				if (incestMood === "Top") {
+					incestMood = "Both";
 				} else {
-					_incestMood = "Bottom";
+					incestMood = "Bottom";
 				}
 			} else {
 				if (slave.devotion > 95) {
@@ -271,20 +271,20 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					}
 					r.push(`the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
 					r.push(`above ${him} with a lusty smile.`);
-					if (_incestMood === "Top") {
-						_incestMood = "Both";
+					if (incestMood === "Top") {
+						incestMood = "Both";
 					} else {
-						_incestMood = "Bottom";
+						incestMood = "Bottom";
 					}
 				} else if (slave.devotion > 60) {
 					r.push(`and if ${he} focuses, ${he} can forget the`);
 					if (rapist.dick > 0) {
-						r.push(`${_dickSize} penis`);
+						r.push(`${dickSize} penis`);
 					} else {
 						r.push(`massive clit`);
 					}
@@ -294,7 +294,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					if (canSee(slave)) {
 						r.push(`eyes glued to the`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -302,7 +302,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					} else if (canHear(slave)) {
 						r.push(`listening to the heavy breathing of ${his} relative whose`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -310,7 +310,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 					} else {
 						r.push(`imagining how the`);
 						if (rapist.dick > 0) {
-							r.push(`${_dickSize} penis`);
+							r.push(`${dickSize} penis`);
 						} else {
 							r.push(`massive clit`);
 						}
@@ -330,7 +330,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		} else if ((slave.devotion > 20 && slave.vagina === 0) ) {
 			r.push(`${He} accepts your orders without comment and presents ${his} virgin pussy to ${rapist.slaveName}. ${He} gasps in shock when ${he} feels the`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`massive clit`);
 			}
@@ -374,7 +374,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		if (slave.devotion < -20 && rapist.devotion < -20) {
 			r.push(`Since you have two restrained slaves, it's up to you to do all the work. ${slave.slaveName} is tied up on the bed with ${his} pussy available, so you maneuver ${rapist.slaveName}'s`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`strap-on`);
 			}
@@ -382,7 +382,7 @@ App.Interact.fSlaveSlaveVag = function(slave) {
 		} else if (rapist.devotion < -20) {
 			r.push(`Since your dick slave is restrained, you order ${slave.slaveName} to present ${himself} on the bed, and then maneuver ${rapist.slaveName}'s`);
 			if (rapist.dick > 0) {
-				r.push(`${_dickSize} dick`);
+				r.push(`${dickSize} dick`);
 			} else {
 				r.push(`strap-on`);
 			}
diff --git a/src/npc/interaction/passage/matchmaking.js b/src/npc/interaction/passage/matchmaking.js
index c5987fe23718399781cbf7f46da678c8c497035b..1328f2b2d94964fd156479047c3823303308c314 100644
--- a/src/npc/interaction/passage/matchmaking.js
+++ b/src/npc/interaction/passage/matchmaking.js
@@ -14,13 +14,9 @@ App.Interact.matchmaking = function(slave) {
 
 	const desc = SlaveTitle(slave);
 
-	if (V.seeImages) {
-		node.append(
-			App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"])
-		);
-	}
+	App.UI.DOM.drawOneSlaveRight(node, slave);
 
-	r.push(`You order ${slave.slaveName} to come to your office. The`);
+	r.push(`You order`, App.UI.DOM.slaveDescriptionDialog(slave, slave.slaveName, {noArt: true}), `to come to your office. The`);
 	if (slave.relationship === -2) {
 		r.push(`worshipful`);
 	} else {
@@ -89,7 +85,7 @@ App.Interact.matchmaking = function(slave) {
 		App.Events.addParagraph(node, r);
 		r = [];
 		r.push(`Being ordered into a relationship would be difficult for anyone, but they're so obedient that <span class="lightgreen">they do their best and make it work.</span> You ensure that they do, and your determined efforts to do so <span class="mediumorchid">reduce their devotion to you,</span> though it's mostly by redirection towards each other. And in any case, they remain devoted enough, and will likely return to their earlier worshipfulness in a few weeks at most.`);
-		let _matched = 1;
+		let matched = 1;
 		if (slave.fetish === "submissive" && subSlave.fetish === "dom") {
 			r.push(`${subSlave.slaveName} is a dom and ${slave.slaveName} is a sub. It's a match out of bad fiction.`);
 		} else if (subSlave.fetish === "submissive" && slave.fetish === "dom") {
@@ -133,9 +129,9 @@ App.Interact.matchmaking = function(slave) {
 		} else if (subSlave.fetish === "pregnancy" && canAchieveErection(slave)) {
 			r.push(`${subSlave.slaveName} can indulge the fantasy that ${he2}'s getting pregnant each and every time ${slave.slaveName} cums inside ${him2}.`);
 		} else {
-			_matched = 0;
+			matched = 0;
 		}
-		if (_matched === 1) {
+		if (matched === 1) {
 			r.push(`Their sexual compatibility is excellent, and they <span class="mediumaquamarine">trust you more</span> for matching them so perfectly.`);
 			slave.trust += 10;
 			subSlave.trust += 10;
@@ -222,6 +218,7 @@ App.Interact.matchmaking = function(slave) {
 			slave.trust -= 10;
 			subSlave.trust -= 10;
 		}
+		App.Events.addParagraph(frag, r);
 
 		return frag;
 	}
diff --git a/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js b/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js
index 68c5b8cee64c5e051769a12f5274281d65f0bbf4..f79ca53142c4819dd4ce51a7647899ee6f7d0e8a 100644
--- a/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js
+++ b/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js
@@ -1,6 +1,6 @@
 globalThis.FSlaveFeed = function(slave, milkTap) {
 	const el = new DocumentFragment();
-	let _pregDiscovery = 0;
+	let pregDiscovery = 0;
 	const {
 		His, He,
 		his, he, him, himself, wife, girl, hers
@@ -9,8 +9,8 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 		His2, He2,
 		his2, he2, him2, himself2, wife2
 	} = getPronouns(milkTap).appendSuffix("2");
-	let _incestGive;
-	let _incestTake;
+	let incestGive;
+	let incestTake;
 	let r = [];
 	const relative = relativeTerm(slave, milkTap);
 
@@ -19,10 +19,10 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 	if (slave.inflationType === "milk") {
 		slave.milkSource = milkTap.ID;
 		if (milkTap.behavioralQuirk === "sinful" || milkTap.sexualQuirk === "perverted" || milkTap.fetish === "incest") { // incest is a planned fetish, don't touch it!
-			_incestGive = 1;
+			incestGive = 1;
 		}
 		if (slave.behavioralQuirk === "sinful" || slave.sexualQuirk === "perverted" || slave.fetish === "incest") {
-			_incestTake = 1;
+			incestTake = 1;
 		}
 
 		r.push(`The first necessary step is to prepare the milk cow and ${his2} udders.`);
@@ -70,7 +70,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				r.push(`It takes next to no effort to get ${his2} milk flowing.`);
 			}
 		} else if (slave.mother === milkTap.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} fondly remembers nursing ${his2} ${relativeTerm(milkTap, slave)}.`);
 			} else {
 				r.push(`This is fairly easy, as ${milkTap.slaveName}'s body remembers nursing ${his2} ${relativeTerm(milkTap, slave)}, even if ${he} is resistant to the idea.`);
@@ -81,7 +81,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				r.push(`It takes minimal effort to get ${his2} milk flowing.`);
 			}
 		} else if (slave.father === milkTap.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} is aroused at the thought of breast feeding the ${girl} ${he2} sired.`);
 				if (milkTap.lactation > 1) {
 					r.push(`${He2} is practically gushing milk with excitement.`);
@@ -97,7 +97,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				}
 			}
 		} else if (milkTap.mother === slave.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} is aroused at the lewdity of breast feeding ${his2} own mother.`);
 				if (milkTap.lactation > 1) {
 					r.push(`${He2} is practically gushing milk with excitement.`);
@@ -113,7 +113,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				}
 			}
 		} else if (milkTap.father === slave.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as having ${his2} father drink ${his2} milk is a taboo ${milkTap.slaveName} can't wait to break.`);
 				if (milkTap.lactation > 1) {
 					r.push(`${He2} is practically gushing milk with excitement.`);
@@ -129,7 +129,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				}
 			}
 		} else if (areSisters(slave, milkTap) === 1) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as having ${milkTap.slaveName} enjoys sexually experimenting with ${his2} ${relative}.`);
 			} else {
 				r.push(`This is easy enough, as ${milkTap.slaveName} wants ${his2} ${relative} to try ${his2} milk, but only if ${he} can taste ${hers} too.`);
@@ -140,7 +140,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				r.push(`It takes minimal effort to get ${his2} milk flowing.`);
 			}
 		} else if (areSisters(slave, milkTap) === 2) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as having ${milkTap.slaveName} enjoys sexually experimenting with ${his2} ${relative}.`);
 				if (milkTap.lactation > 1) {
 					r.push(`${He2} is practically gushing milk with excitement.`);
@@ -156,7 +156,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				}
 			}
 		} else if (areSisters(slave, milkTap) === 3) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as having ${milkTap.slaveName} enjoys sexually experimenting with ${his2} ${relative}.`);
 				if (milkTap.lactation > 1) {
 					r.push(`${He2} is practically gushing milk with excitement.`);
@@ -222,7 +222,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 		} else if (slave.mother === milkTap.ID) {
 			r.push(`${He} draws close to ${his} mother's nipples, trying to remember if ${he} once had a favorite.`);
 		} else if (slave.father === milkTap.ID) {
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`${He} eagerly wraps ${his} lips around ${his} father's nipple.`);
 				if (canAchieveErection(milkTap)) {
 					r.push(`${He} shudders with budding lust when ${he} feels the dick that sired ${him} poking at ${his} belly.`);
@@ -235,7 +235,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			}
 		} else if (milkTap.mother === slave.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`happily`);
 			} else {
 				r.push(`awkwardly`);
@@ -243,7 +243,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`brings ${his} lips to ${his} relative's nipple.`);
 		} else if (milkTap.father === slave.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly`);
 			} else {
 				r.push(`awkwardly`);
@@ -259,7 +259,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} ${relative}${(slave.lactation > 0) ? `while coaxing ${his} own milk to flow` : ``}.`);
 		} else if (areSisters(slave, milkTap) === 2) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`hesitatingly lowers ${himself} to`);
@@ -267,7 +267,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} relative's nipple.`);
 		} else if (areSisters(slave, milkTap) === 3) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`hesitatingly lowers ${himself} to`);
@@ -300,7 +300,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} milky meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth / 4) ? `, and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of milk, however.`);
 			deflate(slave);
 			slave.pregKnown = 1;
-			_pregDiscovery = 1;
+			pregDiscovery = 1;
 		} else if (milkTap.fuckdoll > 0) {
 			r.push(`Slight moaning emanates from the Fuckdoll as ${slave.slaveName} drinks from ${his2} breasts. You enjoy the show, specifically the sight of ${slave.slaveName}'s belly steadily growing larger until`);
 			if (slave.inflation === 3) {
@@ -485,7 +485,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			}
 			if (canAchieveErection(milkTap)) {
 				r.push(r.pop() + `.`);
-				if (_incestTake) {
+				if (incestTake) {
 					r.push(`The way ${he} is wiggling ${his} hips suggests ${he} isn't finished with ${his} daddy just yet, and ${his} father's moaning confirms ${he} is teasing ${him2} with ${his} rear. ${He} giggles as the horny cow unloads on ${his} backside`);
 				} else {
 					r.push(`${He} doesn't stay put for long, as a strong moan and a blast of cum across ${his} rear from the horny cow startles ${him} from ${his} rest`);
@@ -1066,10 +1066,10 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 	} else { /* cum variant */
 		slave.cumSource = milkTap.ID;
 		if (milkTap.behavioralQuirk === "sinful" || milkTap.sexualQuirk === "perverted" || milkTap.fetish === "incest") { /* incest is a planned fetish, don't touch it! */
-			_incestGive = 1;
+			incestGive = 1;
 		}
 		if (slave.behavioralQuirk === "sinful" || slave.sexualQuirk === "perverted" || slave.fetish === "incest") {
-			_incestTake = 1;
+			incestTake = 1;
 		}
 
 		r.push(`The first necessary step is to prepare the cum slave and ${his} cock and balls.`);
@@ -1100,31 +1100,31 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				r.push(`loves getting ${his2} dick sucked by ${his2} ${wife}, something that commonly happens due to ${his2} overproduction.`);
 			}
 		} else if (slave.mother === milkTap.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} savors the thought of having ${his2} dick sucked by ${his2} ${relative}.`);
 			} else {
 				r.push(`This is tough, as ${milkTap.slaveName} is very uncomfortable having ${his2} dick sucked by ${his2} ${relative}, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
 			}
 		} else if (slave.father === milkTap.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} cherishes the sheer lewdity of having ${his2} dick sucked by ${his2} ${relative}.`);
 			} else {
 				r.push(`This is tough, as ${milkTap.slaveName} is rather uncomfortable having ${his2} dick sucked by ${his2} ${relative}, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
 			}
 		} else if (milkTap.mother === slave.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} savors the thought of having ${his2} dick sucked by ${his2} own mother.`);
 			} else {
 				r.push(`This is moderately tough, as ${milkTap.slaveName} is very uncomfortable having ${his2} dick sucked by ${his2} own mother, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
 			}
 		} else if (milkTap.father === slave.ID) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} cherishes the sheer lewdity of having ${his2} dick sucked by ${his2} own father.`);
 			} else {
 				r.push(`This is tough, as ${milkTap.slaveName} is very uncomfortable having ${his2} dick sucked by ${his2} own father, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
 			}
 		} else if (areSisters(slave, milkTap) === 1) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} enjoys the notion of twincest quite a lot.`);
 			} else {
 				r.push(`This is moderately tough, as ${milkTap.slaveName} is uncomfortable getting so intimate with ${his2}`);
@@ -1135,13 +1135,13 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 				}
 			}
 		} else if (areSisters(slave, milkTap) === 2) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} is quite eager to get intimate with ${his2} ${relative}.`);
 			} else {
 				r.push(`This is moderately tough, as ${milkTap.slaveName} is uncomfortable getting so intimate with ${his2} ${relative}, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
 			}
 		} else if (areSisters(slave, milkTap) === 3) {
-			if (_incestGive) {
+			if (incestGive) {
 				r.push(`This is easy enough, as ${milkTap.slaveName} is quite eager to get intimate with ${his2} ${relative}.`);
 			} else {
 				r.push(`This is moderately tough, as ${milkTap.slaveName} is uncomfortable getting so intimate with ${his2} ${relative}, but ${he2} can't really complain about getting ${his2} overfilled nuts drained.`);
@@ -1222,7 +1222,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			}
 		} else if (slave.mother === milkTap.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`awkwardly brings ${his} lips to`);
@@ -1230,7 +1230,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} mother's cock.`);
 		} else if (slave.father === milkTap.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`awkwardly brings ${his} lips to`);
@@ -1238,7 +1238,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`daddy's cock.`);
 		} else if (milkTap.mother === slave.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`awkwardly brings ${his} lips to`);
@@ -1246,7 +1246,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} ${relative}'s cock.`);
 		} else if (milkTap.father === slave.ID) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`awkwardly brings ${his} lips to`);
@@ -1254,13 +1254,13 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} ${relative}'s cock.`);
 		} else if (areSisters(slave, milkTap) === 1) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`readily`);
 			}
 			r.push(`gets in position to suck ${his} ${relative}'s dick.`);
 		} else if (areSisters(slave, milkTap) === 2) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`hesitatingly lowers ${himself} to`);
@@ -1268,7 +1268,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 			r.push(`${his} ${relative}'s cock.`);
 		} else if (areSisters(slave, milkTap) === 3) {
 			r.push(`${He}`);
-			if (_incestTake) {
+			if (incestTake) {
 				r.push(`eagerly wraps ${his} lips around`);
 			} else {
 				r.push(`hesitatingly lowers ${himself} to`);
@@ -1298,10 +1298,10 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 		r = [];
 
 		if (slave.preg > 3 && slave.pregKnown === 0 && slave.inflation > 1) {
-			r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} thick meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > 10) ? `and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of cum, however.`);
+			r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} thick meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > 10) ? ` and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of cum, however.`);
 			deflate(slave);
 			slave.pregKnown = 1;
-			_pregDiscovery = 1;
+			pregDiscovery = 1;
 		} else if (milkTap.fuckdoll > 0) {
 			r.push(`Slight moaning emanates from the Fuckdoll as ${slave.slaveName} sucks ${his2} dick. You enjoy the show, specifically the sight of ${slave.slaveName}'s belly steadily growing larger until`);
 
@@ -1993,7 +1993,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) {
 	App.Events.addNode(el, r, "p");
 	r = [];
 
-	if (_pregDiscovery === 0) {
+	if (pregDiscovery === 0) {
 		seX(slave, "oral", milkTap, "oral");
 		r.push(`You help the bloated ${slave.slaveName} to the couch to recover and, more importantly, keep ${his} meal down. Only once ${he} has had several minutes to unwind`);
 		if (slave.devotion > 10) {
diff --git a/src/npc/startingGirls/editFamily.js b/src/npc/startingGirls/editFamily.js
index 607ac97d97509ea7ba58cf42f61127a72fb1735e..835b623ef53985335c48449e395a879105bb693e 100644
--- a/src/npc/startingGirls/editFamily.js
+++ b/src/npc/startingGirls/editFamily.js
@@ -570,8 +570,8 @@ App.Intro.editFamily = function(slave, cheat) {
 			App.UI.DOM.link(
 				"Reset ALL PC Relatives",
 				() => {
-					let _sameMother = 0;
-					let _sameFather = 0;
+					let sameMother = 0;
+					let sameFather = 0;
 
 					for (const s of V.slaves) {
 						if (s.newGamePlus === 0) {
@@ -582,28 +582,28 @@ App.Intro.editFamily = function(slave, cheat) {
 								s.father = 0;
 							}
 							if (s.mother === V.PC.mother) {
-								_sameMother++;
+								sameMother++;
 							}
 							if (s.father === V.PC.father) {
-								_sameFather++;
+								sameFather++;
 							}
 						}
 					}
-					if (_sameMother === 0 && slave.mother === V.PC.mother) {
+					if (sameMother === 0 && slave.mother === V.PC.mother) {
 						slave.mother = 0;
 					}
-					if (_sameFather === 0 && slave.father === V.PC.father) {
+					if (sameFather === 0 && slave.father === V.PC.father) {
 						slave.father = 0;
 					}
-					for (let _efw = 0; (_efw < V.slaves.length && (_sameMother === 1 || _sameFather === 1)); _efw++) {
-						if (V.slaves[_efw].newGamePlus === 0) {
-							if (V.slaves[_efw].mother === V.PC.mother && _sameMother === 1) {
-								V.slaves[_efw].mother = 0;
-								_sameMother = 0;
+					for (let efw = 0; (efw < V.slaves.length && (sameMother === 1 || sameFather === 1)); efw++) {
+						if (V.slaves[efw].newGamePlus === 0) {
+							if (V.slaves[efw].mother === V.PC.mother && sameMother === 1) {
+								V.slaves[efw].mother = 0;
+								sameMother = 0;
 							}
-							if (V.slaves[_efw].father === V.PC.father && _sameFather === 1) {
-								V.slaves[_efw].father = 0;
-								_sameFather = 0;
+							if (V.slaves[efw].father === V.PC.father && sameFather === 1) {
+								V.slaves[efw].father = 0;
+								sameFather = 0;
 							}
 						}
 					}
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 6e8e16a867dd96fed22f77814d2662b5e49a56cd..a21d427b61cbb80571288980147a4aad60d365c8 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -118,16 +118,16 @@ App.StartingGirls.cleanup = function(slave) {
  */
 App.StartingGirls.applyCareerBonus = function(slave) {
 	function applySexSkillBonus() {
-		let _seed = 2;
+		let seed = 2;
 		if (slave.skill.oral < 60) {
 			slave.skill.oral += 20;
-			_seed--;
+			seed--;
 		}
 		if ((slave.skill.anal < 60) && ((slave.anus > 0) || (slave.skill.anal <= 10))) {
 			slave.skill.anal += 20;
-			_seed--;
+			seed--;
 		}
-		if ((_seed > 0) && (slave.skill.vaginal < 60) && (slave.vagina > -1) && ((slave.vagina > 0) || (slave.skill.vaginal <= 10))) {
+		if ((seed > 0) && (slave.skill.vaginal < 60) && (slave.vagina > -1) && ((slave.vagina > 0) || (slave.skill.vaginal <= 10))) {
 			slave.skill.vaginal += 20;
 		}
 	}
@@ -882,8 +882,10 @@ App.StartingGirls.upper = function(slave, cheat = false) {
 	}
 
 	option.pulldown();
-	for (/** @type {"left"|"right"}*/ const side of ["left", "right"]) {
-		if (!!slave.eye[side]) { // has eye
+	/** @type {("left"|"right")[]} */
+	const sides = ["left", "right"];
+	for (const side of sides) {
+		if (slave.eye[side]) { // has eye
 			let option = options.addOption(`${capFirstChar(side)} eye vision`, "vision", slave.eye[side]);
 			option.addValueList([["Normal", 2], ["Nearsighted", 1]]);
 			if (V.seeExtreme === 1) {
@@ -1501,6 +1503,52 @@ App.StartingGirls.lower = function(slave, cheat = false) {
 	return el;
 };
 
+/* non-persistent global data */
+App.StartingGirls.careerFilter = "Any";
+
+/** @type {Map<string, function(string): boolean>} */
+App.StartingGirls.careerBonusFilters = (function() {
+	/**
+	 * @param {Object} obj
+	 * @param {string} key
+	 * @returns {[string, function(string): boolean]}
+	 */
+	const categoryToFilterElement = (obj, key) => {
+		return [capFirstChar(key), c => obj[key].includes(c)];
+	};
+
+	const nonBonusCategories = ["veryYoung", "young", "educated", "uneducated"];
+	const generalBonusCats = Object.keys(App.Data.Careers.General).filter(c => !nonBonusCategories.includes(c));
+	const leadershipBonusCats = Object.keys(App.Data.Careers.Leader);
+	const bonusCategories = new Map([
+		["Any", () => true],
+		...generalBonusCats.map(key => categoryToFilterElement(App.Data.Careers.General, key)),
+		...leadershipBonusCats.map(key => categoryToFilterElement(App.Data.Careers.Leader, key)),
+	]);
+
+	return bonusCategories;
+})();
+
+App.StartingGirls.makeCareerFilterPulldown = function() {
+	const frag = new DocumentFragment();
+	frag.append(`Filter by desired bonus: `);
+
+	const select = document.createElement("select");
+	for (const cat of App.StartingGirls.careerBonusFilters.keys()) {
+		const choice = App.UI.DOM.appendNewElement("option", select, cat);
+		if (App.StartingGirls.careerFilter === cat) {
+			choice.selected = true;
+		}
+	}
+
+	select.onchange = () => {
+		App.StartingGirls.careerFilter = select.value;
+		App.UI.reload();
+	};
+	frag.append(select);
+	return frag;
+};
+
 /**
  * @param {App.Entity.SlaveState} slave
  * @param {boolean} cheat
@@ -1518,9 +1566,7 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 	options.addOption("Slave surname", "slaveSurname", slave).showTextBox();
 
 	option = options.addOption("Career", "career", slave).showTextBox();
-	/**
-	 * @type {Array<string>}
-	 */
+	/** @type {Array<string>} */
 	let careers;
 	let text;
 	if (slave.actualAge < 16) {
@@ -1552,6 +1598,8 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 		}
 	}
 
+	careers = careers.filter(App.StartingGirls.careerBonusFilters.get(App.StartingGirls.careerFilter));
+
 	const niceCareers = new Map();
 	for (const career of careers) {
 		const nice = capFirstChar(App.Utils.removeArticles(career));
@@ -1561,7 +1609,8 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 		option.addValue(career, niceCareers.get(career));
 	}
 
-	option.addComment(`Available careers are based on age and education. Currently most influential is ${him} being ${text}.`).pulldown();
+	const optionComment = ` Available careers are based on age and education. Currently most influential is ${him} being ${text}.`;
+	option.addComment(App.UI.DOM.combineNodes(App.StartingGirls.makeCareerFilterPulldown(), optionComment)).pulldown();
 
 	const indenture = {active: slave.indenture > -1};
 
@@ -1739,13 +1788,19 @@ App.StartingGirls.mental = function(slave, cheat = false) {
 		options.addOption("Trust", "trust", slave),
 		App.Data.StartingGirls.trust);
 
+	const rollRandomFetish = () => either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", "submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none");
+
 	options.addOption("Fetish", "fetishKnown", slave)
-		.addValueList([["Unknown", 0], ["Known", 1]]);
+		.addValue("Unknown", 0, () => {
+			if (!cheat && slave.fetish !== "none") {
+				slave.fetish = rollRandomFetish();
+			}
+		})
+		.addValue("Known", 1);
 
 	option = options.addOption("Fetish", "fetish", slave)
 		.addValue("Unknown", "", () => {
-			slave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist",
-				"submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none");
+			slave.fetish = rollRandomFetish();
 			slave.fetishKnown = 0;
 		}).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humiliation", "humiliation"],
 			["Buttslut", "buttslut"], ["Breasts", "boobs"], ["Pregnancy", "pregnancy"], ["Sadism", "sadist"], ["Masochism", "masochist"]]);
diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js
index 05ae02be81e986a9eec073dae97ed000512ff1f9..0872b6e50f28f81a2ef4a7147d980e67c48f5221 100644
--- a/src/npc/startingGirls/startingGirlsPassage.js
+++ b/src/npc/startingGirls/startingGirlsPassage.js
@@ -11,7 +11,7 @@ App.StartingGirls.passage = function() {
 		if (V.PC.dick !== 0 && V.PC.vagina !== -1 && (V.seeDicks !== 0 || V.makeDicks === 1)) {
 			r.push(`Since you have both a penis and a vagina yourself, you've obviously had access to a source of advanced surgery and organ farming. <span class="skill player">Slaves get a smaller cost increase here for having both penises and vaginas, and for having both testicles and ovaries.</span>`);
 		}
-		if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+		if (isPCCareerInCategory("slaver")) {
 			r.push(`Since you`);
 			if (V.PC.career === "slaver") {
 				r.push(`personally saw to the capture, breaking and or training of`);
@@ -86,6 +86,7 @@ App.StartingGirls.passage = function() {
 						V.activeSlave.origSkin = "fair";
 						V.activeSlave.origHColor = "red";
 						V.activeSlave.markings = "heavily freckled";
+						V.activeSlave.face = 55;
 					},
 					[],
 					"Starting Girls"
@@ -95,13 +96,13 @@ App.StartingGirls.passage = function() {
 				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
 					"Cali Girl",
 					() => {
-						V.activeSlave = App.StartingGirls.generate({nationality: "American"});
+						V.activeSlave = App.StartingGirls.generate({nationality: "American", race: "white"});
 						V.activeSlave.eye.origColor = "blue";
 						V.activeSlave.skin = "sun tanned";
 						V.activeSlave.override_Skin = 1;
 						V.activeSlave.origHColor = "blonde";
 						V.activeSlave.markings = "none";
-						V.activeSlave.face = 95;
+						V.activeSlave.face = 55;
 						V.activeSlave.muscles = 20;
 						V.activeSlave.weight = -20;
 						V.activeSlave.height = Height.forAge(190, V.activeSlave);
diff --git a/src/npc/surgery/bodySwap/bodySwapReaction.js b/src/npc/surgery/bodySwap/bodySwapReaction.js
index 6516b001d65ce370aa0c8bc67f24cc37d9c41a82..a9f0e9c0fe9fdcd2aabf4e0dc560a797bba3b5a2 100644
--- a/src/npc/surgery/bodySwap/bodySwapReaction.js
+++ b/src/npc/surgery/bodySwap/bodySwapReaction.js
@@ -390,7 +390,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">${his} bust has shrunk.</span> ${He} is saddened by the loss of the beautiful weight ${he} once bore and struggles to keep ${himself} under control for your sake, and succeeds. <span class="mediumorchid">But only barely.</span>`);
 					} else {
-						r.push(`<span class="orange">that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and lets the tears finish running from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and lets the tears finish running from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -481,7 +481,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">${his} bust has shrunk.</span> ${He} is saddened by the loss of the beautiful weight ${he} once bore and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`<span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -520,7 +520,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds <span class="orange">not only ${his} implants gone, but ${his} breasts entirely.</span> ${He} is saddened by ${his} flat chest and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`and finds that <span class="orange">${his} implants are gone, along with the rest of ${his} breasts.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipe the tears that are running from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds that <span class="orange">${his} implants are gone, along with the rest of ${his} breasts.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipe the tears that are running from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= 300) { /* flat*/
@@ -585,7 +585,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">and finds ${his} bust has shrunk.</span> ${He} is saddened by the loss of ${his} implants and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`<span class="orange">and finds that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} natural breasts begin to quiver${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipes the tears from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">and finds that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} natural breasts begin to quiver${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipes the tears from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -622,7 +622,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds <span class="orange">no tits at all.</span> ${He} is saddened by ${his} flat chest and struggles to keep ${himself} under control for your sake, and succeeds. <span class="mediumorchid">Barely.</span>`);
 					} else {
-						r.push(`and finds <span class="orange">no tits at all.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds <span class="orange">no tits at all.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= 300 && soul.boobs > 300) { /* flat*/
@@ -687,7 +687,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds that <span class="orange">${his} bust has shrunk.</span> ${He} is saddened by ${his} smaller chest and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`and finds that <span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipe the tears from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds that <span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and wipe the tears from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -736,6 +736,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					r.push(`${He} is irritated that you have altered ${his} body to produce milk.`);
 				}
 			} else if (body.fetish === "mindbroken") {
+				// TODO: write me
 			} else if (body.lactation > 1 && soul.lactation === 1) {
 				r.push(`${He} realizes ${his} breasts are <span class="lime">rapidly producing milk.</span> ${He} groans at the unfamiliar pressure.`);
 			} else if (body.lactation === 1 && soul.lactation === 2) {
@@ -2181,7 +2182,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">${his} bust has shrunk.</span> ${He} is saddened by the loss of the beautiful weight ${he} once bore and struggles to keep ${himself} under control for your sake, and succeeds. <span class="mediumorchid">But only barely.</span>`);
 					} else {
-						r.push(`<span class="orange">that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and lets the tears finish running from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and lets the tears finish running from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -2272,7 +2273,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">${his} bust has shrunk.</span> ${He} is saddened by the loss of the beautiful weight ${he} once bore and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`<span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -2305,7 +2306,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds <span class="orange">not only ${his} implants gone, but ${his} breasts entirely.</span> ${He} is saddened by ${his} flat chest and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`and finds that <span class="orange">${his} implants are gone, along with the rest of ${his} breasts.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and stop the tears that are running from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds that <span class="orange">${his} implants are gone, along with the rest of ${his} breasts.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and stop the tears that are running from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= 300) { /* flat*/
@@ -2364,7 +2365,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`<span class="orange">and finds ${his} bust has shrunk.</span> ${He} is saddened by the loss of ${his} implants and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`<span class="orange">and finds that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} natural breasts begin to quiver${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`<span class="orange">and finds that ${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} natural breasts begin to quiver${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -2400,7 +2401,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds <span class="orange">no tits at all.</span> ${He} is saddened by ${his} flat chest and struggles to keep ${himself} under control for your sake, and succeeds. <span class="mediumorchid">Barely.</span>`);
 					} else {
-						r.push(`and finds <span class="orange">no tits at all.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds <span class="orange">no tits at all.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= 300 && soul.boobs > 300) { /* flat*/
@@ -2459,7 +2460,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					if (body.devotion > 20) {
 						r.push(`and finds that <span class="orange">${his} bust has shrunk.</span> ${He} is saddened by ${his} smaller chest and struggles to keep ${himself} under control for your sake, <span class="mediumorchid">barely.</span>`);
 					} else {
-						r.push(`and finds that <span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? `and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
+						r.push(`and finds that <span class="orange">${his} chest is not as large as it once was.</span> <span class="mediumorchid">Tears leap into ${his} eyes</span> as ${his} shoulders begin to shake${(body.voice !== 0) ? ` and sobs echo about the room` : ``}. ${He} pauses to gather ${himself} together and let the tears run from ${his} eyes before continuing ${his} bodily inspection.`);
 					}
 					body.devotion -= 5;
 				} else if (body.boobs <= soul.boobs - 100 && soul.boobs > 300) { /* (Smaller breasts)*/
@@ -2521,6 +2522,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 					r.push(`${He} is irritated that you have altered ${his} body to produce milk.`);
 				}
 			} else if (body.fetish === "mindbroken") {
+				// TODO: write me
 			} else if (body.lactation > 1 && soul.lactation === 1) {
 				r.push(`${He} realizes ${his} breasts are <span class="lime">rapidly producing milk.</span> ${He} groans at the unfamiliar pressure.`);
 			} else if (body.lactation === 1 && soul.lactation === 2) {
@@ -2604,6 +2606,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 			App.Events.addParagraph(el, r);
 			r = [];
 			if (body.fetish === "mindbroken") {
+				// TODO: write me
 			} else if (soul.voice === 0) {
 				r.push(`After a moment, ${he} turns to you and gestures for a mirror.`);
 				if (body.voice !== 0) {
@@ -3053,7 +3056,7 @@ globalThis.bodySwapReaction = function(body, soul) {
 				if (body.fetish !== "mindbroken") {
 					if (body.bellyPreg >= 100 || body.counter.birthsTotal > 0) {
 						if (body.devotion > 50) {
-							r.push(`Even though ${he} didn't get to experience being made into one, ${he} is delighted to be a mother${(body.counter.birthsTotal > 0) ? `again` : ``}.`);
+							r.push(`Even though ${he} didn't get to experience being made into one, ${he} is delighted to be a mother${(body.counter.birthsTotal > 0) ? ` again` : ``}.`);
 						} else {
 							r.push(`${He} is filled with conflicting emotions, <span class="mediumorchid">hatred</span> for you for forcing`);
 							if (body.pregType > 1) {
diff --git a/src/npc/surgery/bodySwap/huskSlaveSwap.js b/src/npc/surgery/bodySwap/huskSlaveSwap.js
index 49e8fda0c9a7f52b40af8ed180c808b11617ffa5..813997d8182790c87a78e9d98e09963af9acb756 100644
--- a/src/npc/surgery/bodySwap/huskSlaveSwap.js
+++ b/src/npc/surgery/bodySwap/huskSlaveSwap.js
@@ -1,62 +1,62 @@
 App.UI.SlaveInteract.huskSlaveSwap = function() {
 	const node = new DocumentFragment();
 
-	const _oldSlave = clone(V.swappingSlave);
-	const _m = V.slaveIndices[V.swappingSlave.ID];
+	const oldSlave = clone(V.swappingSlave);
+	const m = V.slaveIndices[V.swappingSlave.ID];
 	const {
 		he
 	} = getPronouns(V.swappingSlave);
 
-	App.UI.DOM.appendNewElement("p", node, `You strap ${V.slaves[_m].slaveName}, and the body to which ${he} will be transferred, into the remote surgery and stand back as it goes to work.`);
-	bodySwap(V.slaves[_m], V.activeSlave, false);
-	const _gps = V.genePool.findIndex(function(s) { return s.ID === V.slaves[_m].ID; });
+	App.UI.DOM.appendNewElement("p", node, `You strap ${V.slaves[m].slaveName}, and the body to which ${he} will be transferred, into the remote surgery and stand back as it goes to work.`);
+	bodySwap(V.slaves[m], V.activeSlave, false);
+	const gps = V.genePool.findIndex(function(s) { return s.ID === V.slaves[m].ID; });
 	// special exception to swap genePool since the temporary body lacks an entry. Otherwise we could just call the widget using the genePool entries
-	V.genePool[_gps].race = V.slaves[_m].race;
-	V.genePool[_gps].origRace = V.slaves[_m].origRace;
-	V.genePool[_gps].skin = V.slaves[_m].skin;
-	V.genePool[_gps].markings = V.slaves[_m].markings;
-	V.genePool[_gps].eye.origColor = V.slaves[_m].eye.origColor;
-	V.genePool[_gps].origHColor = V.slaves[_m].origHColor;
-	V.genePool[_gps].origSkin = V.slaves[_m].origSkin;
-	V.genePool[_gps].face = V.slaves[_m].face;
-	V.genePool[_gps].pubicHStyle = V.slaves[_m].pubicHStyle;
-	V.genePool[_gps].underArmHStyle = V.slaves[_m].underArmHStyle;
-	V.genePool[_gps].eyebrowHStyle = V.slaves[_m].eyebrowHStyle;
+	V.genePool[gps].race = V.slaves[m].race;
+	V.genePool[gps].origRace = V.slaves[m].origRace;
+	V.genePool[gps].skin = V.slaves[m].skin;
+	V.genePool[gps].markings = V.slaves[m].markings;
+	V.genePool[gps].eye.origColor = V.slaves[m].eye.origColor;
+	V.genePool[gps].origHColor = V.slaves[m].origHColor;
+	V.genePool[gps].origSkin = V.slaves[m].origSkin;
+	V.genePool[gps].face = V.slaves[m].face;
+	V.genePool[gps].pubicHStyle = V.slaves[m].pubicHStyle;
+	V.genePool[gps].underArmHStyle = V.slaves[m].underArmHStyle;
+	V.genePool[gps].eyebrowHStyle = V.slaves[m].eyebrowHStyle;
 
 	App.Events.addParagraph(node, [
-		`After an honestly impressive procedure, ${V.slaves[_m].slaveName} is recovering nicely.`,
-		bodySwapReaction(V.slaves[_m], _oldSlave)
+		`After an honestly impressive procedure, ${V.slaves[m].slaveName} is recovering nicely.`,
+		bodySwapReaction(V.slaves[m], oldSlave)
 	]);
 
-	const _slaveCost = slaveCost(_oldSlave);
-	const _payout = Math.trunc(_slaveCost/3);
+	const cost = slaveCost(oldSlave);
+	const payout = Math.trunc(cost/3);
 	let r = [];
-	r.push(`${V.slaves[_m].slaveName}'s old body was bought by the Flesh Heap for ${cashFormat(_payout)}.`);
-	if (V.slaves[_m].bodySwap > 0) {
-		const _myBody = V.slaves.findIndex(function(s) { return s.origBodyOwnerID === V.slaves[_m].ID; });
-		if (_myBody !== -1) {
-			V.slaves[_myBody].origBodyOwnerID = 0;
+	r.push(`${V.slaves[m].slaveName}'s old body was bought by the Flesh Heap for ${cashFormat(payout)}.`);
+	if (V.slaves[m].bodySwap > 0) {
+		const myBody = V.slaves.findIndex(function(s) { return s.origBodyOwnerID === V.slaves[m].ID; });
+		if (myBody !== -1) {
+			V.slaves[myBody].origBodyOwnerID = 0;
 			const {
 				he2, him2, his2
-			} = getPronouns(V.slaves[_myBody]).appendSuffix("2");
-			if (V.slaves[_myBody].fetish !== "mindbroken" && V.slaves[_myBody].fuckdoll === 0) {
-				if (V.slaves[_myBody].devotion > 20) {
-					r.push(`${V.slaves[_myBody].slaveName} is somewhat saddened to see ${his2} body leave forever.`);
-				} else if (V.slaves[_myBody].devotion >= -50) {
-					r.push(`${V.slaves[_myBody].slaveName} is <span class="mediumorchid">disturbed</span> to find ${his2} body is gone for good, damaging ${his2} <span class="gold">ability to trust you.</span>`);
-					V.slaves[_myBody].devotion -= 30;
-					V.slaves[_myBody].trust -= 30;
+			} = getPronouns(V.slaves[myBody]).appendSuffix("2");
+			if (V.slaves[myBody].fetish !== "mindbroken" && V.slaves[myBody].fuckdoll === 0) {
+				if (V.slaves[myBody].devotion > 20) {
+					r.push(`${V.slaves[myBody].slaveName} is somewhat saddened to see ${his2} body leave forever.`);
+				} else if (V.slaves[myBody].devotion >= -50) {
+					r.push(`${V.slaves[myBody].slaveName} is <span class="mediumorchid">disturbed</span> to find ${his2} body is gone for good, damaging ${his2} <span class="gold">ability to trust you.</span>`);
+					V.slaves[myBody].devotion -= 30;
+					V.slaves[myBody].trust -= 30;
 				} else {
-					r.push(`${V.slaves[_myBody].slaveName} is <span class="mediumorchid">deeply upset</span> that ${he2}'ll never see ${his2} body again. With so little left, ${he2} finds it easy to take vengeance by <span class="orangered">completely rejecting your ownership of ${him2}.</span>`);
-					V.slaves[_myBody].devotion -= 50;
-					V.slaves[_myBody].trust = 100;
+					r.push(`${V.slaves[myBody].slaveName} is <span class="mediumorchid">deeply upset</span> that ${he2}'ll never see ${his2} body again. With so little left, ${he2} finds it easy to take vengeance by <span class="orangered">completely rejecting your ownership of ${him2}.</span>`);
+					V.slaves[myBody].devotion -= 50;
+					V.slaves[myBody].trust = 100;
 				}
 			}
 		}
 	}
 	App.Events.addParagraph(node, r);
-	V.slaves[_m].bodySwap++;
-	cashX(_payout, "slaveTransfer");
+	V.slaves[m].bodySwap++;
+	cashX(payout, "slaveTransfer");
 	V.activeSlave = 0;
 	V.swappingSlave = 0;
 	return node;
diff --git a/src/npc/surgery/cloningWorkaround.js b/src/npc/surgery/cloningWorkaround.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6f4409fc852bdcd081ce0633ef4b693401381cf
--- /dev/null
+++ b/src/npc/surgery/cloningWorkaround.js
@@ -0,0 +1,114 @@
+App.UI.cloningWorkaround = function() {
+	const node = new DocumentFragment();
+
+	let eligibility = 0;
+	const donatrix = V.donatrix;
+	const receptrix = V.receptrix;
+
+	let impreg;
+	if (donatrix !== "Undecided" && donatrix.ID === -1) {
+		impreg = PlayerName();
+	} else if (donatrix !== "Undecided") {
+		impreg = SlaveFullName(donatrix);
+	} else {
+		impreg = donatrix;
+	}
+
+	let receive;
+	if (receptrix !== "Undecided" && receptrix.ID === -1) {
+		receive = PlayerName();
+	} else if (receptrix !== "Undecided") {
+		receive = SlaveFullName(receptrix);
+	} else {
+		receive = receptrix;
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, `Genetic Source`);
+	App.UI.DOM.appendNewElement("div", node, "Blank ovum prepared, please select genetic source and surrogate.", "note");
+	App.UI.DOM.appendNewElement("div", node, `Chosen source: ${impreg}`);
+
+	App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+		"Yourself",
+		() => {
+			V.donatrix = V.PC;
+			App.UI.reload();
+		}
+	));
+	for (const slave of V.slaves) {
+		if (donatrix !== "Undecided" && donatrix.ID === slave.ID) {
+			App.UI.DOM.appendNewElement("div", node, SlaveFullName(slave), "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				SlaveFullName(slave),
+				() => {
+					V.donatrix = slave;
+					App.UI.reload();
+				}
+			));
+		}
+	}
+	App.UI.DOM.appendNewElement("h2", node, `Surrogate`);
+	App.UI.DOM.appendNewElement("div", node, `Chosen surrogate: ${receive}`);
+
+	for (const slave of V.slaves) {
+		if (canBeReceptrix(slave)) {
+			const name = SlaveFullName(slave);
+			if (receptrix !== "Undecided" && receptrix.ID === slave.ID) {
+				App.UI.DOM.appendNewElement("div", node, name, "note");
+			} else {
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+					name,
+					() => {
+						V.receptrix = slave;
+						App.UI.reload();
+					}, [], "",
+					(slave.pregType >= 4) ? `Using a slave carrying multiples is inadvisable` : ``
+				));
+			}
+			eligibility = 1;
+		}
+	}
+	if (eligibility === 0) {
+		App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of acting as a surrogate.`, "note");
+	}
+
+	if (V.PC.vagina !== -1 && V.PC.preg >= 0 && V.PC.preg < 4 && V.PC.pregType < 8 && V.PC.physicalAge < 70) {
+		if (receptrix !== "Undecided" && receptrix.ID === V.PC.ID) {
+			App.UI.DOM.appendNewElement("div", node, `Yourself`, "note");
+		} else {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				"Use your own womb",
+				() => {
+					V.receptrix = V.PC;
+					App.UI.reload();
+				}
+			));
+		}
+	}
+	App.UI.DOM.appendNewElement("h2", node, `Implantation`);
+
+	if (impreg !== "Undecided" && receive !== "Undecided") {
+		App.UI.DOM.appendNewElement("div", node, `${impreg} will be cloned and ${receive} shall act as the incubator.`);
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Implant clone ovum",
+			() => {
+				cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery");
+				V.surgeryType = "clone";
+			}, [], "Surrogacy",
+		));
+	} else if (impreg !== "Undecided") {
+		App.Events.addNode(node, [
+			`${impreg} will be cloned.`,
+			App.UI.DOM.makeElement("span", "Please select a surrogate", "note")
+		]);
+	} else if (receive !== "Undecided") {
+		App.Events.addNode(node, [
+			`${receive} shall act as the incubator.`,
+			App.UI.DOM.makeElement("span", "Please select a genetic source", "note")
+		]);
+	} else {
+		App.UI.DOM.appendNewElement("div", node, `Please select a genetic source and surrogate`, "note");
+	}
+
+	return node;
+};
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/ovaTransplantWorkaround.js b/src/npc/surgery/ovaTransplantWorkaround.js
new file mode 100644
index 0000000000000000000000000000000000000000..26d1d7f063f621f8585b9b40a8980e98cc1ea1b4
--- /dev/null
+++ b/src/npc/surgery/ovaTransplantWorkaround.js
@@ -0,0 +1,41 @@
+App.UI.ovaTransplantWorkaround = function() {
+	const node = new DocumentFragment();
+	V.receptrix = 0;
+	let eligibility = 0;
+
+	App.UI.DOM.appendNewElement("p", node, "You've decided which fertilized ovum is to be transplanted; now you must select whose womb will be its new home.", "scene-intro");
+
+	App.UI.DOM.appendNewElement("h2", node, "Select a slave to serve as the host");
+
+	for (const slave of V.slaves) {
+		if ((V.donatrix.ID !== slave.ID && slave.ovaries > 0 || slave.mpreg > 0) && isSlaveAvailable(slave) && slave.preg >= 0 && slave.preg < slave.pregData.normalBirth / 10 && slave.pregWeek >= 0 && slave.pubertyXX === 1 && slave.pregType < 12 && slave.bellyImplant === -1 && slave.broodmother === 0 && slave.inflation <= 2 && slave.physicalAge < 70) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				SlaveFullName(slave),
+				() => {
+					V.receptrix = slave;
+					cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery");
+					V.surgeryType = "transplant";
+				}, [], "Surrogacy",
+				(slave.pregType >= 4) ? `Using a slave carrying multiples is inadvisable` : ``
+			));
+			eligibility = 1;
+		}
+	}
+	if (eligibility === 0) {
+		App.UI.DOM.appendNewElement("div", node, "You have no slaves capable of acting as a surrogate.");
+	}
+
+	if (V.PC.vagina !== -1 && V.donatrix.ID !== -1 && V.PC.preg >= 0 && V.PC.preg < 4 && V.PC.pregType < 8 && V.PC.physicalAge < 70) {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			`Use your own womb`,
+			() => {
+				V.receptrix = V.PC;
+				cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery");
+				V.surgeryType = "transplant";
+			},
+			[],
+			"Surrogacy"
+		));
+	}
+	return node;
+};
diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js
index 28a08180ed060d80a7eb9fee2ee64357c74e7be2..d77299a5ee30e04601964602819cea6b1a238271 100644
--- a/src/npc/surgery/surgery.js
+++ b/src/npc/surgery/surgery.js
@@ -84,51 +84,18 @@ App.Medicine.Surgery.commit = function(surgery, slave, cheat = false) {
 	}
 };
 
-/**
- * Returns markup for a link to execute the given procedure
- * @param {string} passage Passage to go after the surgery
- * @param {FC.Medicine.Surgery.Procedure} surgery
- * @param {App.Entity.SlaveState} slave
- * @param {boolean} [cheat]
- * @returns {HTMLElement}
- */
-App.Medicine.Surgery.makeObjectLink = function(passage, surgery, slave, cheat = false) {
-	if (surgery.action === undefined) {
-		return App.UI.DOM.disabledLink(surgery.label, [surgery.description]);
-	}
-
-	function healthCosts() {
-		const hc = (V.PC.skill.medicine >= 100) ? Math.round(surgery.healthCosts / 2) : surgery.healthCosts;
-		if (hc > 30) {
-			return 'substantial';
-		} else if (hc > 20) {
-			return 'significant';
-		} else if (hc > 10) {
-			return 'moderate';
-		} else if (hc > 5) {
-			return 'light';
-		}
-		return 'insignificant';
-	}
-
-	let tooltip = new DocumentFragment();
-	App.UI.DOM.appendNewElement("div", tooltip, `${capFirstChar(surgery.description)}.`);
-	if (!cheat) {
-		App.UI.DOM.appendNewElement("div", tooltip, `Surgery costs: ${cashFormat(surgery.costs)}.`);
-		App.UI.DOM.appendNewElement("div", tooltip, `Projected health damage: ${healthCosts()}.`);
-	}
-
-	return App.UI.DOM.link(surgery.label, App.Medicine.Surgery.commit, [surgery, slave], passage,
-		tooltip);
-};
-
 /**
  * @param {App.Medicine.Surgery.Procedure} procedure
  * @param {function():void} refresh
  * @param {boolean} cheat
+ * @returns {HTMLAnchorElement|HTMLSpanElement}
  */
 App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
-	const slave = procedure.slave;
+	if (procedure.disabledReasons.length > 0) {
+		return App.UI.DOM.disabledLink(procedure.name, procedure.disabledReasons);
+	}
+
+	const slave = procedure.originalSlave;
 	return App.UI.DOM.link(procedure.name, apply, [], "", tooltip());
 
 	function healthCosts() {
@@ -158,29 +125,39 @@ App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
 	}
 
 	function apply() {
-		if (!cheat) {
-			cashX(-procedure.cost, "slaveSurgery", slave);
-			surgeryDamage(slave, procedure.healthCost, cheat);
-			if (procedure.invasive && slave.health.condition < random(-100, -80)) {
-				Engine.play("Surgery Death");
-				return;
-			}
+		const result = App.Medicine.Surgery.apply(procedure, cheat);
+		if (result === null) {
+			Engine.play("Surgery Death");
+			return;
 		}
 
-		const reaction = procedure.apply(cheat);
-		showSlaveReaction(reaction);
+		const [diff, reaction] = result;
+
+		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 +166,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);
@@ -198,137 +175,36 @@ App.Medicine.Surgery.makeLink = function(procedure, refresh, cheat) {
 		slave.devotion += resultOutro.devotion;
 		slave.trust += resultOutro.trust;
 
-		if (reaction.removeJob) {
-			removeJob(slave, Job.LURCHER, true);
-			removeJob(slave, Job.PIT, true);
-			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;
 	}
 };
 
 /**
- * Helpers for composing procedure descriptions
+ * if null is returned the slave died
+ *
+ * @param {App.Medicine.Surgery.Procedure} procedure
+ * @param {boolean} cheat
+ * @returns {[Partial<App.Entity.SlaveState>, App.Medicine.Surgery.SimpleReaction]}
  */
-App.Medicine.Surgery.ListHelpers = class {
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {string} bodyPart
-	 * @param {Object.<string, string>} keys
-	 * @param {App.Utils.Pronouns} pronouns
-	 * @param {boolean} showCCs
-	 */
-	constructor(slave, bodyPart, keys, pronouns, showCCs) {
-		/** @private */
-		this._slave = slave;
-		/** @private */
-		this._bodyPart = bodyPart;
-		/** @private */
-		this._keys = keys;
-		/** @private */
-		this._pronouns = pronouns;
-		/** @private */
-		this._showCCs = showCCs;
-	}
-
-	/**
-	 * @param {string} name
-	 * @param {string} implantType
-	 * @param {number} size
-	 * @returns {FC.Medicine.Surgery.Procedure}
-	 */
-	installImplants(name, implantType, size) {
-		return App.Medicine.Surgery.makeOption(this._keys.installImplant, `${capFirstChar(name)} implants`, size,
-			`place${name}${this._showCCs ? ` ${size}cc` : ''} implants into ${this._pronouns.his} ${this._bodyPart}`,
-			slave => {
-				slave[`${this._bodyPart}Implant`] = size;
-				slave[`${this._bodyPart}ImplantType`] = implantType;
-				slave[this._bodyPart] += size;
-			}, V.surgeryCost, 10, this._bodyPart
-		);
-	}
-
-	removeImplants() {
-		return App.Medicine.Surgery.makeOption(this._keys.removeImplant, "Remove implants",
-			-this._slave[`${this._bodyPart}Implant`],
-			`remove ${this._pronouns.his} ${this._bodyPart} implants`,
-			slave => {
-				slave[`${this._bodyPart}`] -= slave[`${this._bodyPart}Implant`];
-				slave[`${this._bodyPart}Implant`] = 0;
-				slave[`${this._bodyPart}ImplantType`] = "none";
-			}, V.surgeryCost, 5, `${this._bodyPart}Loss`
-		);
+App.Medicine.Surgery.apply = function(procedure, cheat) {
+	const slave = procedure.originalSlave;
+	if (!cheat) {
+		cashX(-procedure.cost, "slaveSurgery", slave);
+		surgeryDamage(slave, procedure.healthCost, cheat);
+		if (procedure.invasive && slave.health.condition < random(-100, -80)) {
+			return null;
+		}
 	}
 
-	/**
-	 * @param {string} name
-	 * @param {string} implantType
-	 * @param {number} size
-	 * @param {number} [implantPrice=0]
-	 * @returns {FC.Medicine.Surgery.Procedure}
-	 */
-	replaceImplants(name, implantType, size, implantPrice = 0) {
-		return App.Medicine.Surgery.makeOption(this._keys.changeImplant, `${capFirstChar(name)} implants`,
-			size - this._slave.boobsImplant,
-			`replace ${this._pronouns.his} ${this._bodyPart} implants with ${name}${this._showCCs ? ` (${size}cc)` : ''} ones`,
-			slave => {
-				slave[this._bodyPart] += size - slave[`${this._bodyPart}Implant`];
-				slave[`${this._bodyPart}Implant`] = size;
-				slave[`${this._bodyPart}ImplantType`] = implantType;
-			}, V.surgeryCost + implantPrice, 10, this._bodyPart
-		);
-	}
+	const [diff, reaction] = procedure.apply(cheat);
 
-	/**
-	 * @param {number} volume
-	 * @returns {FC.Medicine.Surgery.Procedure}
-	 */
-	fillUp(volume) {
-		return App.Medicine.Surgery.makeOption(this._keys.fillUp, "Add inert filler", volume,
-			`add ${this._showCCs ? `${volume}cc of` : 'some'} inert filler to each of ${this._pronouns.his} ${this._bodyPart} implants`,
-			slave => {
-				slave[`${this._bodyPart}Implant`] += volume;
-				slave[this._bodyPart] += volume;
-			},
-			V.surgeryCost, 10, this._bodyPart
-		);
+	if (reaction.removeJob) {
+		removeJob(slave, Job.LURCHER, true);
+		removeJob(slave, Job.PIT, true);
+		removeJob(slave, slave.assignment);
 	}
 
-	/**
-	 * @param {number} volume
-	 * @returns {FC.Medicine.Surgery.Procedure}
-	 */
-	drain(volume) {
-		return App.Medicine.Surgery.makeOption(this._keys.drain, `Drain ${volume}cc`, -volume,
-			`drain ${this._showCCs ? `${volume}cc of` : 'some'} inert filler from ${this._pronouns.his} ${this._bodyPart} implants`,
-			slave => {
-				slave[`${this._bodyPart}Implant`] -= volume;
-				slave[this._bodyPart] -= volume;
-			}, V.surgeryCost, 5, `${this._bodyPart}Loss`
-		);
-	}
-
-	/**
-	 * @param {string} procedureName
-	 * @param {number} sizeChange
-	 * @returns {FC.Medicine.Surgery.Procedure}
-	 */
-	reduce(procedureName, sizeChange) {
-		return App.Medicine.Surgery.makeOption(this._keys.reduction,
-			`${capFirstChar(procedureName)} ${this._bodyPart}`, -200,
-			`${procedureName} ${this._pronouns.his} ${this._bodyPart}`,
-			slave => {
-				slave[this._bodyPart] -= sizeChange;
-			}, V.surgeryCost, 5, `${this._bodyPart}Loss`
-		);
-	}
+	return [diff, reaction];
 };
 
 /**
@@ -345,134 +221,130 @@ App.Medicine.Surgery.allSizingOptions = function() {
 };
 
 App.Medicine.Surgery.sizingProcedures = function() {
+	class ForbiddenDummy extends App.Medicine.Surgery.Procedure {
+		/**
+		 * @param {string} name
+		 * @param {string} forbidden why the surgery can't be used
+		 */
+		constructor(name, forbidden) {
+			super(null);
+			this._name = name;
+			this._forbidden = forbidden;
+		}
+
+		get name() { return this._name; }
+
+		get disabledReasons() { return [this._forbidden]; }
+	}
+
 	return {
 		bodyPart: bodyPart,
 		boobs: boobSizingProcedures,
 		butt: buttSizingProcedures
 	};
 
-	/**
-	 * for implants that we potentially order abroad :)
-	 * @param {FC.Medicine.Surgery.Procedure} op
-	 */
-	function _advFillablePriceModifier(op) {
-		if (V.ImplantProductionUpgrade !== 1) {
-			op.costs += 10000;
-			op.label += " (special order)";
-			op.description += " (special order)";
-		}
-		return op;
-	}
-
 	/**
 	 * Returns list of available surgeries targeted at changing size of the given body part
 	 * @param {string} bodyPart
 	 * @param {App.Entity.SlaveState} slave
 	 * @param {FC.Medicine.Surgery.SizingOptions} [options]
-	 * @returns {FC.Medicine.Surgery.Procedure[]}
+	 * @returns {App.Medicine.Surgery.Procedure[]}
 	 */
 	function bodyPart(bodyPart, slave, options) {
-		switch (bodyPart) {
-			case "boob":
-			case "boobs":
-			case "breast":
-			case "breasts":
-				return boobSizingProcedures(slave, options);
-			case "ass":
-			case "booty":
-			case "butt":
-				return buttSizingProcedures(slave, options);
-			default:
-				throw Error(`No sizing procedures for ${bodyPart}`);
+		if (bodyPart === "boobs") {
+			return boobSizingProcedures(slave, options);
+		}
+		if (bodyPart === "butt") {
+			return buttSizingProcedures(slave, options);
 		}
+		throw Error(`No sizing procedures for ${bodyPart}`);
 	}
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
 	 * @param {FC.Medicine.Surgery.SizingOptions} [options]
-	 * @returns {FC.Medicine.Surgery.Procedure[]}
+	 * @returns {App.Medicine.Surgery.Procedure[]}
 	 */
 	function boobSizingProcedures(slave, options = {}) {
 		const thisArcology = V.arcologies[0];
 		const largeImplantsAvailable = thisArcology.FSTransformationFetishistResearch === 1;
 		const advancedSurgeryAvailable = V.ImplantProductionUpgrade === 1;
-		const pronouns = getPronouns(slave);
-		const {he, His} = pronouns;
-
-		const types = App.Medicine.Keys.Surgery.Target.breast; // shortcuts
-		const helper = new App.Medicine.Surgery.ListHelpers(slave, "boobs", types, pronouns, V.showBoobCCs > 0);
+		const {he, His} = getPronouns(slave);
 
 		const areStringsInstalled = slave.boobsImplantType === "string";
 		const areFillablesInstalled = ["fillable", "advanced fillable", "hyper fillable"].includes(slave.boobsImplantType);
 		const curSize = slave.boobsImplant;
 		const implantType = slave.boobsImplantType;
 
-		let r = [];
+		/**
+		 * @type {Array<App.Medicine.Surgery.Procedure>}
+		 */
+		let procedures = [];
 		if (options.augmentation) {
 			if (slave.indentureRestrictions >= 2) {
-				r.push(App.Medicine.Surgery.makeImpossibleOption(types.installImplant, "Change boob size", `<em>${His} indenture forbids elective surgery</em>`));
+				procedures.push(new ForbiddenDummy("Change boob size", `${His} indenture forbids elective surgery.`));
 			} else if (slave.breastMesh === 1) {
-				r.push(App.Medicine.Surgery.makeImpossibleOption(types.installImplant, "Put implants", `<em>${His} supportive mesh implant blocks implantation</em>`));
+				procedures.push(new ForbiddenDummy("Put implants", `${His} supportive mesh implant blocks implantation.`));
 			} else if (curSize === 0) {
 				if (options.strings) {
-					r.push(helper.installImplants("string", "string", 400));
+					procedures.push(new App.Medicine.Surgery.Procedures.InstallBoobImplants(slave, "string", "string", 400));
 				}
 				if (advancedSurgeryAvailable) {
-					r.push(helper.installImplants("large", "normal", 600));
+					procedures.push(new App.Medicine.Surgery.Procedures.InstallBoobImplants(slave, "large", "normal", 600));
 				}
-				r.push(helper.installImplants("standard", "normal", 400));
-				r.push(helper.installImplants("small", "normal", 200));
+				procedures.push(new App.Medicine.Surgery.Procedures.InstallBoobImplants(slave, "standard", "normal", 400));
+				procedures.push(new App.Medicine.Surgery.Procedures.InstallBoobImplants(slave, "small", "normal", 200));
 			} else if (implantType === "normal") {
 				if (curSize > 400) {
-					r.push(helper.replaceImplants("fillable", "fillable", 800));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "fillable", "fillable", 800));
 				} else if (curSize > 200) {
-					r.push(helper.replaceImplants("large", "normal", 600));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "large", "normal", 600));
 				} else {
-					r.push(helper.replaceImplants("standard", "normal", 400));
-					r.push(helper.replaceImplants("large", "normal", 600));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "standard", "normal", 400));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "large", "normal", 600));
 				}
 			} else if (implantType === "hyper fillable") {
 				if (slave.boobs >= 50000) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase boobs", `<em>${His} breasts are as large as ${he} can physically support</em>`));
+					procedures.push(new ForbiddenDummy("Increase boobs", `${His} breasts are as large as ${he} can physically support.`));
 				} else {
-					r.push(helper.fillUp(1000));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillBoobImplants(slave, 1000));
 				}
 			} else if (implantType === "advanced fillable") {
 				if (curSize >= 10000) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase boobs", `<em>${His} implants are filled to capacity</em>`));
+					procedures.push(new ForbiddenDummy("Increase boobs", `${His} implants are filled to capacity.`));
 					if (largeImplantsAvailable) {
-						r.push(helper.replaceImplants("hyper fillable", "hyper fillable", 11000));
+						procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "hyper fillable", "hyper fillable", 11000));
 					}
 				} else {
-					r.push(helper.fillUp(400));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillBoobImplants(slave, 400));
 				}
 			} else if (implantType === "fillable") {
 				if (curSize >= 1800) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Add inert filler", `<em>${His} implants are filled to capacity</em>`));
-					r.push(_advFillablePriceModifier(helper.replaceImplants("advanced fillable", "advanced fillable", 2200)));
+					procedures.push(new ForbiddenDummy("Add inert filler", `${His} implants are filled to capacity.`));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "advanced fillable", "advanced fillable", 2200, true));
 				} else {
-					r.push(helper.fillUp(200));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillBoobImplants(slave, 200));
 				}
 			}
 		}
 
 		if (options.replace && slave.indentureRestrictions < 2 && curSize > 0) {
 			if (!areStringsInstalled && curSize < 600) {
-				r.push(helper.replaceImplants("string", "string", 400));
+				procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "string", "string", 400));
 			} else if (areStringsInstalled) {
 				// we have engorged string implants, suggest replacing with normal implants of similar size
 				if (curSize > 10000) {
 					if (largeImplantsAvailable) {
 						if (slave.boobs < 50000) {
-							r.push(helper.replaceImplants("hyper fillable", "hyper fillable", Math.round(curSize / 1000) * 1000));
+							procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "hyper fillable", "hyper fillable", Math.round(curSize / 1000) * 1000));
 						}
 					}
 				} else if (curSize > 2200) {
-					r.push(_advFillablePriceModifier(helper.replaceImplants("advanced fillable", "advanced fillable", Math.round(curSize / 400) * 400)));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "advanced fillable", "advanced fillable", Math.round(curSize / 400) * 400, true));
 				} else if (curSize > 400) {
-					r.push(helper.replaceImplants("fillable", "fillable", Math.round(curSize / 200) * 200));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "fillable", "fillable", Math.round(curSize / 200) * 200));
 				} else {
-					r.push(helper.replaceImplants("standard", "normal", 400));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceBoobImplants(slave, "standard", "normal", 400));
 				}
 			}
 		}
@@ -481,155 +353,139 @@ App.Medicine.Surgery.sizingProcedures = function() {
 			if (curSize > 0) {
 				if (areStringsInstalled && curSize > 400) {
 					if (curSize > 8000) {
-						r.push(helper.drain(1000));
+						procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 1000));
 					} else if (curSize > 5000) {
-						r.push(helper.drain(750));
+						procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 750));
 					} else if (curSize > 2000) {
-						r.push(helper.drain(500));
+						procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 500));
 					} else if (curSize > 1000) {
-						r.push(helper.drain(250));
+						procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 250));
 					} else if (curSize > 500) {
-						r.push(helper.drain(100));
+						procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 100));
 					}
 				} else if (areFillablesInstalled) {
 					if (implantType === "hyper fillable") {
 						if (curSize <= 10000) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(1000));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 1000));
 						}
 					} else if (implantType === "advanced fillable") {
 						if (curSize <= 1000) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(500));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 500));
 						}
 					} else if (implantType === "fillable") {
 						if (curSize <= 500) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(100));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainBoobImplants(slave, 100));
 						}
 					}
 				}
 				if (slave.indentureRestrictions < 2) {
-					r.push(helper.removeImplants());
+					procedures.push(new App.Medicine.Surgery.Procedures.RemoveBoobImplants(slave));
 				}
 			}
 			if ((slave.boobs > 300) && (curSize === 0) && slave.indentureRestrictions < 2) {
-				r.push(helper.reduce("reduce", 200));
+				procedures.push(new App.Medicine.Surgery.Procedures.ReduceBoobs(slave, "reduce", 200));
 				if (slave.boobs < 675) {
-					r.push(helper.reduce("slightly reduce", 25));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReduceBoobs(slave, "slightly reduce", 25));
 				}
 			}
 			if ((curSize === 0) && slave.indentureRestrictions < 2 && (slave.breedingMark !== 1 || V.propOutcome !== 1 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
-				if (slave.boobs >= 7000) {
-					r.push(App.Medicine.Surgery.makeOption(types.reduction, "Mastectomy", 300 - slave.boobs,
-						"perform mastectomy",
-						slave => {
-							slave.boobs = 300;
-						},
-						V.surgeryCost, 30, "mastectomy+"
-					));
-				} else if (slave.boobs >= 2000) {
-					r.push(App.Medicine.Surgery.makeOption(types.reduction, "Mastectomy", 300 - slave.boobs,
-						"perform mastectomy",
-						slave => {
-							slave.boobs = 300;
-						},
-						V.surgeryCost, 30, "mastectomy"
-					));
+				if (slave.boobs >= 2000) {
+					procedures.push(new App.Medicine.Surgery.Procedures.Mastectomy(slave));
 				}
 			}
 		}
-		return r;
+		return procedures;
 	}
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
 	 * @param {FC.Medicine.Surgery.SizingOptions} [options]
-	 * @returns {FC.Medicine.Surgery.Procedure[]}
+	 * @returns {App.Medicine.Surgery.Procedure[]}
 	 */
 	function buttSizingProcedures(slave, options = {}) {
 		const thisArcology = V.arcologies[0];
 		const largeImplantsAvailable = thisArcology.FSTransformationFetishistResearch === 1;
 		const advancedSurgeryAvailable = V.ImplantProductionUpgrade === 1;
-		const pronouns = getPronouns(slave);
-		const {His} = pronouns;
-
-		const types = App.Medicine.Keys.Surgery.Target.butt; // shortcuts
-		const helper = new App.Medicine.Surgery.ListHelpers(slave, "butt", types, pronouns, false);
+		const {His} = getPronouns(slave);
 
 		const areStringsInstalled = slave.buttImplantType === "string";
 		const areFillablesInstalled = ["fillable", "advanced fillable", "hyper fillable"].includes(slave.buttImplantType);
 		const curSize = slave.buttImplant;
 		const implantType = slave.buttImplantType;
 
-		let r = [];
-
+		/**
+		 * @type {Array<App.Medicine.Surgery.Procedure>}
+		 */
+		let procedures = [];
 		if (options.augmentation) {
 			if (slave.indentureRestrictions >= 2) {
-				r.push(App.Medicine.Surgery.makeImpossibleOption(types.installImplant, "Change butt size", `<em>${His} indenture forbids elective surgery</em>`));
+				procedures.push(new ForbiddenDummy("Change butt size", `${His} indenture forbids elective surgery.`));
 			} else if (slave.butt > 19 && areFillablesInstalled) {
-				r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase butt", `<em>${His} butt is as large as it can possibly get</em>`));
+				procedures.push(new ForbiddenDummy("Increase butt", `${His} butt is as large as it can possibly get.`));
 			} else if (curSize === 0) {
 				if (options.strings) {
-					r.push(helper.installImplants("string", "string", 1));
+					procedures.push(new App.Medicine.Surgery.Procedures.InstallButtImplants(slave, "string", "string", 1));
 				}
 				if (advancedSurgeryAvailable) {
-					r.push(helper.installImplants("big", "normal", 2));
+					procedures.push(new App.Medicine.Surgery.Procedures.InstallButtImplants(slave, "big", "normal", 2));
 				}
-				r.push(helper.installImplants("standard", "normal", 1));
+				procedures.push(new App.Medicine.Surgery.Procedures.InstallButtImplants(slave, "standard", "normal", 1));
 			} else if (implantType === "normal") {
 				if (curSize >= 5) {
-					r.push(_advFillablePriceModifier(helper.replaceImplants("advanced fillable", "advanced fillable", curSize)));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "advanced fillable", "advanced fillable", curSize, true));
 				} else if (curSize >= 2) {
-					r.push(helper.replaceImplants("fillable", "fillable", 3));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "fillable", "fillable", 3));
 				} else if (curSize === 1) {
-					r.push(helper.replaceImplants("bigger", "normal", 2));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "bigger", "normal", 2));
 				}
 			} else if (implantType === "hyper fillable") {
 				if (curSize > 19) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase butt", `<em>${His} butt implants are filled to capacity</em>`));
+					procedures.push(new ForbiddenDummy("Increase butt", `${His} butt implants are filled to capacity.`));
 				} else {
-					r.push(helper.fillUp(1));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillButtImplants(slave, 1));
 				}
 			} else if (implantType === "advanced fillable") {
 				if (curSize > 7) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase butt", `<em>${His} butt implants are filled to capacity</em>`));
+					procedures.push(new ForbiddenDummy("Increase butt", `${His} butt implants are filled to capacity.`));
 					if (largeImplantsAvailable) {
-						r.push(helper.replaceImplants("hyper fillable", "hyper fillable", 9));
+						procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "hyper fillable", "hyper fillable", 9));
 					}
 				} else {
-					r.push(helper.fillUp(1));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillButtImplants(slave, 1));
 				}
 			} else if (implantType === "fillable") {
 				if (curSize >= 4) {
-					r.push(App.Medicine.Surgery.makeImpossibleOption(types.fillUp, "Increase size", `<em>${His} implants are filled to capacity</em>`));
-					r.push(_advFillablePriceModifier(helper.replaceImplants("advanced fillable", "advanced fillable", 5)));
+					procedures.push(new ForbiddenDummy("Increase size", `${His} implants are filled to capacity.`));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "advanced fillable", "advanced fillable", 5, true));
 				} else {
-					r.push(helper.fillUp(1));
+					procedures.push(new App.Medicine.Surgery.Procedures.FillButtImplants(slave, 1));
 				}
 			}
 		}
 
 		if (options.replace && slave.indentureRestrictions < 2 && curSize > 0) {
 			if (!areStringsInstalled && curSize === 1) {
-				r.push(helper.replaceImplants("string", "string", 1));
+				procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "string", "string", 1));
 			} else if (areStringsInstalled) {
 				// we have engorged string implants, suggest replacing with normal implants of similar size
 				if (curSize >= 9) {
 					if (largeImplantsAvailable) {
-						r.push(helper.replaceImplants("hyper fillable", "hyper fillable", curSize));
+						procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "hyper fillable", "hyper fillable", curSize));
 					}
 				} else if (curSize >= 5) {
-					r.push(_advFillablePriceModifier(helper.replaceImplants("advanced fillable", "advanced fillable", curSize)));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "advanced fillable", "advanced fillable", curSize, true));
 				} else if (curSize >= 3) {
-					r.push(helper.replaceImplants("fillable", "fillable", curSize));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "fillable", "fillable", curSize));
 				} else if (curSize === 2) {
-					r.push(helper.replaceImplants("big", "normal", curSize));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "big", "normal", curSize));
 				} else {
-					r.push(helper.replaceImplants("standard", "normal", curSize));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReplaceButtImplants(slave, "standard", "normal", curSize));
 				}
 			}
 		}
@@ -637,39 +493,39 @@ App.Medicine.Surgery.sizingProcedures = function() {
 		if (options.reduction) {
 			if (curSize > 0) {
 				if (areStringsInstalled && curSize > 1) {
-					r.push(helper.drain(1));
+					procedures.push(new App.Medicine.Surgery.Procedures.DrainButtImplants(slave, 1));
 				} else if (areFillablesInstalled) {
 					if (implantType === "hyper fillable") {
 						if (curSize <= 5) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(1));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainButtImplants(slave, 1));
 						}
 					} else if (implantType === "advanced fillable") {
 						if (curSize <= 3) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(1));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainButtImplants(slave, 1));
 						}
 					} else if (implantType === "fillable") {
 						if (curSize <= 1) {
-							r.push(App.Medicine.Surgery.makeImpossibleOption(types.drain, "Remove filler", `<em>${His} implants are empty</em>`));
+							procedures.push(new ForbiddenDummy("Remove filler", `${His} implants are empty.`));
 						} else {
-							r.push(helper.drain(1));
+							procedures.push(new App.Medicine.Surgery.Procedures.DrainButtImplants(slave, 1));
 						}
 					}
 				}
 				if (slave.indentureRestrictions < 2) {
-					r.push(helper.removeImplants());
+					procedures.push(new App.Medicine.Surgery.Procedures.RemoveButtImplants(slave));
 				}
 			}
 			if ((slave.butt > 1) && (curSize === 0)) {
 				if (slave.indentureRestrictions < 2) {
-					r.push(helper.reduce("reduce", 1));
+					procedures.push(new App.Medicine.Surgery.Procedures.ReduceButt(slave, "reduce", 1));
 				}
 			}
 		}
-		return r;
+		return procedures;
 	}
 }();
 
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/npc/surgery/surrogacyWorkaround.js b/src/npc/surgery/surrogacyWorkaround.js
new file mode 100644
index 0000000000000000000000000000000000000000..4bd5104556c42ce716b09b1c263f945a49980521
--- /dev/null
+++ b/src/npc/surgery/surrogacyWorkaround.js
@@ -0,0 +1,124 @@
+App.UI.surrogacyWorkaround = function() {
+	const node = new DocumentFragment();
+
+	const donatrix = V.donatrix;
+	const impregnatrix = V.impregnatrix;
+	const receptrix = V.receptrix;
+
+	let eligibility = 0;
+	let eligibilityI = 0;
+	let eligibility2 = 0;
+	const donatrixID = (donatrix.ID === V.PC.ID) ? -1 : 0;
+
+	let impreg;
+	if (impregnatrix !== "Undecided" && impregnatrix.ID === -1) {
+		impreg = PlayerName();
+	} else if (impregnatrix !== "Undecided") {
+		impreg = SlaveFullName(impregnatrix);
+	} else {
+		impreg = impregnatrix;
+	}
+
+	let receive;
+	if (receptrix !== "Undecided" && receptrix.ID === -1) {
+		receive = PlayerName();
+	} else if (receptrix !== "Undecided") {
+		receive = SlaveFullName(receptrix);
+	} else {
+		receive = receptrix;
+	}
+
+	App.UI.DOM.appendNewElement("p", node, `${(donatrixID === -1) ? `You've prepared yourself to have an egg taken from your ovaries;` : `${getSlave(V.AS).slaveName} is prepped to have an egg harvested from ${getPronouns(getSlave(V.AS)).possessive} ovaries;`} now you must select a target to fertilize it and who will carry it to term.`, "scene-intro");
+
+	App.UI.DOM.appendNewElement("div", node, `${impreg} will provide the seed and ${receive} shall carry it.`);
+	if (impreg !== "Undecided" && receive !== "Undecided") {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Implant fertilized ovum",
+			() => {
+				cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery");
+				V.surgeryType = "surrogacy";
+				App.UI.reload();
+			}, [], "Surrogacy",
+		));
+	}
+
+
+	App.UI.DOM.appendNewElement("h2", node, `Semen donatrix: ${impreg}`);
+
+	for (const slave of V.slaves) {
+		if (slave.balls > 0 && slave.pubertyXY === 1 && isSlaveAvailable(slave) && canBreed(donatrix, slave)) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				SlaveFullName(slave),
+				() => {
+					V.impregnatrix = slave;
+					App.UI.reload();
+				}
+			));
+			eligibility = 1;
+		}
+	}
+	if (eligibility === 0) {
+		App.UI.DOM.appendNewElement("div", node, "You have no slaves with potent sperm.");
+	}
+
+	if (V.incubator.tanks.length > 0 && V.incubator.setting.reproduction === 2) {
+		App.UI.DOM.appendNewElement("h2", node, `Incubator settings are resulting in large-scale fluid secretion. Select an eligible incubatee to milk for semen:`);
+
+		for (const tank of V.incubator.tanks) {
+			if (tank.balls > 0 && tank.dick > 0 && canBreed(donatrix, tank)) {
+				App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+					tank.slaveName,
+					() => {
+						V.impregnatrix = tank;
+						App.UI.reload();
+					}
+				));
+				eligibilityI = 1;
+			}
+		}
+		if (eligibilityI === 0) {
+			App.UI.DOM.appendNewElement("div", node, "You have no growing slaves producing sperm.");
+		}
+	}
+
+	if (V.PC.balls !== 0) {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Use your own",
+			() => {
+				V.impregnatrix = V.PC;
+				App.UI.reload();
+			}
+		));
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, `Chosen surrogate: ${receive}`);
+
+	for (const slave of V.slaves) {
+		if (canBeReceptrix(slave)) {
+			App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+				SlaveFullName(slave),
+				() => {
+					V.receptrix = slave;
+					App.UI.reload();
+				}, [], "",
+				(slave.pregType >= 4) ? `Using a slave carrying multiples is inadvisable` : ``
+			));
+			eligibility2 = 1;
+		}
+	}
+	if (eligibility2 === 0) {
+		App.UI.DOM.appendNewElement("div", node, "You have no slaves capable of acting as a surrogate.");
+	}
+
+	if (V.PC.vagina !== -1 && V.PC.preg >= 0 && V.PC.preg < 4 && V.PC.pregType < 8 && V.PC.physicalAge < 70) {
+		App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
+			"Use your own womb",
+			() => {
+				V.receptrix = V.PC;
+				App.UI.reload();
+			}
+		));
+	}
+
+	return node;
+};
diff --git a/src/personalAssistant/assistantOptions.js b/src/personalAssistant/assistantOptions.js
index 507314620d1fa786dce26ba47b000bf5b7559461..946a370fd9f653c89c3a9d0867468970501afe49 100644
--- a/src/personalAssistant/assistantOptions.js
+++ b/src/personalAssistant/assistantOptions.js
@@ -44,7 +44,7 @@ App.UI.personalAssistantOptions = function() {
 	tabBar.addTab("Computer Core Upgrades", "upgrades", upgrades());
 	if (V.week >= 11) {
 		tabBar.addTab("Settings", "settings", settings());
-		if (V.assistant.personality !== 0) {
+		if (V.assistant.personality !== 0 && V.assistant.options) {
 			tabBar.addTab("Appearance", "appearance", appearance());
 		}
 	}
@@ -281,11 +281,11 @@ App.UI.personalAssistantOptions = function() {
 				}
 			}
 			App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(linkArray));
-		}
 
-		if (V.seeImages) {
-			App.UI.DOM.appendNewElement("h3", node, "Custom Image");
-			node.append(customAssistantImage());
+			if (V.seeImages && V.seeAvatar) {
+				App.UI.DOM.appendNewElement("h3", node, "Custom Image");
+				node.append(customAssistantImage());
+			}
 		}
 
 		return frag;
diff --git a/src/player/desc/pAnalyzePreg.js b/src/player/desc/pAnalyzePreg.js
index 2117735f6d8f6a334f0c05ea31fff0ef14fc61e7..c47f4877f135c4979c8b5f16769279fb1c14c1bb 100644
--- a/src/player/desc/pAnalyzePreg.js
+++ b/src/player/desc/pAnalyzePreg.js
@@ -28,4 +28,4 @@ App.Desc.Player.analyzePreg = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pNotesBoobs.js b/src/player/desc/pNotesBoobs.js
index 9cc952d4e7e426298f360d35a070f18dafe57964..c83d3b669d1bdfb7a6f83f19f2fd662c5753bb66 100644
--- a/src/player/desc/pNotesBoobs.js
+++ b/src/player/desc/pNotesBoobs.js
@@ -58,4 +58,4 @@ App.Desc.Player.pNotesBoobs = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pNotesButt.js b/src/player/desc/pNotesButt.js
index ba456b880191ef3634f98145c81b0e5050a96eea..b08d7267030e6c53509578e58795c4bfcae51192 100644
--- a/src/player/desc/pNotesButt.js
+++ b/src/player/desc/pNotesButt.js
@@ -140,4 +140,4 @@ App.Desc.Player.pNotesButt = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pNotesCrotch.js b/src/player/desc/pNotesCrotch.js
index 35c72ba85b403c67e2b3f961273466ae66c48c03..d6201f1c6d784d722176cdeeabf78ad875113d03 100644
--- a/src/player/desc/pNotesCrotch.js
+++ b/src/player/desc/pNotesCrotch.js
@@ -13,7 +13,7 @@ App.Desc.Player.pNotesCrotch = function(PC = V.PC) {
 		}
 	} else if (V.PC.career === "escort") {
 		if (V.PC.balls >= 30) {
-			r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peaking out from under the skirt.`);
+			r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peeking out from under the skirt.`);
 		} else if (V.PC.balls >= 14) {
 			r.push(`You've swapped up to a larger pair of slutty pants, specially designed with extra sack room. They draw the eye right to your`);
 			if (V.PC.preg >= 28) {
@@ -50,4 +50,4 @@ App.Desc.Player.pNotesCrotch = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pShortBelly.js b/src/player/desc/pShortBelly.js
index 8e55bafc97a033a2263303148a4a28207212edbe..38ec814225ee04b4f3cfd4056e6b690085a39561 100644
--- a/src/player/desc/pShortBelly.js
+++ b/src/player/desc/pShortBelly.js
@@ -57,4 +57,4 @@ App.Desc.Player.officeBelly = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pShortBoobs.js b/src/player/desc/pShortBoobs.js
index 51794a44e1c903bf3c7deb94d9fe86985fbe0539..dda132ea5ba2fafebaf5e55eeb5eb89ea00db78b 100644
--- a/src/player/desc/pShortBoobs.js
+++ b/src/player/desc/pShortBoobs.js
@@ -162,4 +162,4 @@ App.Desc.Player.officeBoobs = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pShortButt.js b/src/player/desc/pShortButt.js
index 4b972f8eb2873d6d9d55225d7079f16951af6542..837c85cf49a8108623e1276f945764664df68755 100644
--- a/src/player/desc/pShortButt.js
+++ b/src/player/desc/pShortButt.js
@@ -64,4 +64,4 @@ App.Desc.Player.officeButt = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/pShortCrotch.js b/src/player/desc/pShortCrotch.js
index 25e854e94464320aa6a15d0b88bee1bb512de434..0b8173522bb1797f38941f0ee1c5296348812728 100644
--- a/src/player/desc/pShortCrotch.js
+++ b/src/player/desc/pShortCrotch.js
@@ -32,4 +32,4 @@ App.Desc.Player.officeCrotch = function(PC = V.PC) {
 	}
 
 	return r.join(" ");
-};
\ No newline at end of file
+};
diff --git a/src/player/desc/playerCrotch.js b/src/player/desc/playerCrotch.js
index f208a2a2a556be8d7507ad98d6da26ebbf4b2401..0f0e3a0b8dbe9559dc724e58cea20ea7d0058648 100644
--- a/src/player/desc/playerCrotch.js
+++ b/src/player/desc/playerCrotch.js
@@ -126,7 +126,7 @@ App.Desc.Player.crotch = function() {
 			}
 		} else if (V.PC.career === "escort") {
 			if (V.PC.balls >= 30) {
-				r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peaking out from under the skirt.`);
+				r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peeking out from under the skirt.`);
 			} else if (V.PC.balls >= 14) {
 				r.push(`You've swapped up to a larger pair of slutty pants, specially designed with extra sack room. They draw the eye right to your`);
 				if (V.PC.preg >= 28) {
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 2be7faf934b6ae7ccab053138fa54d31eeecfc28..a07810854426b00e5ffc4aa0d5533e4b91614949 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -473,7 +473,7 @@ App.UI.managePersonalAffairs = function() {
 			reputationDiv.append(breeding());
 		}
 
-		if (PC.preg === 0 && PC.pregWeek === 0) {
+		if (PC.preg === 0 && PC.pregWeek === 0 && PC.vagina > -1) {
 			reputationDiv.append(
 				cumTap(),
 				impregnateSelf(),
@@ -669,9 +669,25 @@ App.UI.managePersonalAffairs = function() {
 			const text = [];
 
 			const slaves = [...PC.partners].filter(i => i > 0);
+			const ownedSlaves = slaves
+				.filter(s => getSlave(s))				// make sure it isn't undefined
+				.map(s => SlaveFullName(getSlave(s)));	// get the name
 			const other = [];
 
-			text.push(`You've had sex with ${num(slaves.length)} different slaves so far.`);
+			const link = App.UI.DOM.link(`${num(slaves.length)} ${slaves.length > 1 ? `different slaves` : `slave`}`, () => {
+				Dialog.append(`You have slept with `, toSentence(ownedSlaves), `, as well as ${num(slaves.length - ownedSlaves.length)} slaves you don't currently own.`);
+				Dialog.open();
+			});
+
+			if (slaves.length > 0) {
+				text.push(
+					`You've had sex with`,
+					link,
+					`so far.`,
+				);
+			} else {
+				text.push(`You haven't had sex with any slaves yet.`);
+			}
 
 			if (PC.partners.has(-2)) {
 				other.push(`citizens of ${V.arcologies[0].name}`);
@@ -693,7 +709,7 @@ App.UI.managePersonalAffairs = function() {
 			}
 
 			if (other.length > 0) {
-				text.push(`You have also had sex with ${toSentence(other)}.`);
+				text.push(`You have ${slaves.length > 0 ? `also` : ``} had sex with ${toSentence(other)}${slaves.length > 0 ? `` : `, though`}.`);
 			}
 
 			App.Events.addNode(partnersDiv, text);
diff --git a/src/player/pcSurgeryDegradation.js b/src/player/pcSurgeryDegradation.js
index 7325c8fc705f2ee9ecdc8bb0e433528611932004..68000e8d82b92cf630143aad61937b72b16ef9d9 100644
--- a/src/player/pcSurgeryDegradation.js
+++ b/src/player/pcSurgeryDegradation.js
@@ -293,11 +293,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else {
 				r.push(`find your balls are much bigger than you expected them to be.`);
 			}
@@ -328,11 +328,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls are now closer to the typical size one would expect.`);
 			}
@@ -358,11 +358,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else {
 				r.push(`find your balls are much bigger than you expected them to be.`);
 			}
@@ -395,11 +395,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls are now closer to the typical size one would expect.`);
 			}
@@ -422,11 +422,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 		case "ballBigShrinkage":
 			r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness and tight feeling between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls have had a dramatic size adjustment.`);
 			}
@@ -442,11 +442,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 		case "tightPussy":
 			r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else {
 				r.push(`find your pussy is much tighter than it was. No hymen though, so you can't pass as a virgin.`);
 			}
diff --git a/src/player/personalAttentionSelect.js b/src/player/personalAttentionSelect.js
index 15dcdfc5068c9e49458ef6d990fae6ce201f3513..ae1c53d7eaebc40ad7271ae3b7f4ec9e084c4aec 100644
--- a/src/player/personalAttentionSelect.js
+++ b/src/player/personalAttentionSelect.js
@@ -585,7 +585,7 @@ App.UI.Player.personalAttention = function() {
 
 				if (slave.behavioralFlaw !== "none") {
 					App.Events.addNode(div, [
-						`Current behavioral flaw: <span class="red">${slave.behavioralFlaw}.</span>`,
+						`Current behavioral flaw: <span class="red">${slave.behavioralFlaw}.</span> `,
 					]);
 
 					links.push(attentionLink(i, `Remove ${his} behavioral flaw`, "fix her behavioral flaw"));
@@ -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/pregmod/cloningWorkaround.tw b/src/pregmod/cloningWorkaround.tw
deleted file mode 100644
index b4456a8f0355fe7502364a7b7b808867be953b67..0000000000000000000000000000000000000000
--- a/src/pregmod/cloningWorkaround.tw
+++ /dev/null
@@ -1,68 +0,0 @@
-:: Cloning Workaround [nobr]
-
-<<set $nextButton = "Cancel", $nextLink = "Gene Lab", _eligibility = 0>>
-<<if $donatrix != "Undecided" && $donatrix.ID == -1>><<set _impreg = PlayerName()>><<elseif $donatrix != "Undecided">><<set _impreg = SlaveFullName($donatrix)>><<else>><<set _impreg = $donatrix>><</if>>
-<<if $receptrix != "Undecided" && $receptrix.ID == -1>><<set _receive = PlayerName()>><<elseif $receptrix != "Undecided">><<set _receive = SlaveFullName($receptrix)>><<else>><<set _receive = $receptrix>><</if>>
-
-<h2>Genetic Source</h2>
-<div class="note">Blank ovum prepared, please select genetic source and surrogate.</div>
-<div>Chosen source: _impreg</div>
-
-<p>
-[[Yourself|Cloning Workaround][$donatrix = $PC]]
-<<for _cw = 0; _cw < $slaves.length; _cw++>>
-	<<capture _cw>>
-		<<set _name = SlaveFullName($slaves[_cw])>>
-		<<if $donatrix != "Undecided" && $donatrix.ID == $slaves[_cw].ID>>
-		<div>//_name//</div>
-		<<else>>
-		<div>[[_name|Cloning Workaround][$donatrix = $slaves[_cw]]]</div>
-		<</if>>
-	<</capture>>
-<</for>>
-</p>
-<h2>Surrogate</h2>
-<div>Chosen surrogate: _receive</div>
-<p>
-<<for _cw1 = 0; _cw1 < $slaves.length; _cw1++>>
-	<<capture _cw1>>
-		<<if ($slaves[_cw1].ovaries > 0 || $slaves[_cw1].mpreg > 0) && isSlaveAvailable($slaves[_cw1]) && $slaves[_cw1].preg >= 0 && $slaves[_cw1].preg < 4 && $slaves[_cw1].pregWeek >= 0 && $slaves[_cw1].pubertyXX == 1 && $slaves[_cw1].pregType < 12 && $slaves[_cw1].bellyImplant == -1 && $slaves[_cw1].broodmother == 0 && $slaves[_cw1].inflation <= 2 && $slaves[_cw1].physicalAge < 70>>
-			<<set _name2 = SlaveFullName($slaves[_cw1])>>
-			<div>
-			<<if $receptrix != "Undecided" && $receptrix.ID == $slaves[_cw1].ID>>
-				//_name2//
-			<<else>>
-				[[_name2|Cloning Workaround][$receptrix = $slaves[_cw1]]] <<if $slaves[_cw1].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>>
-			<</if>>
-			</div>
-			<<set _eligibility = 1>>
-		<</if>>
-	<</capture>>
-<</for>>
-<<if (_eligibility == 0)>>
-	<div class="note">You have no slaves capable of acting as a surrogate.</div>
-<</if>>
-
-<<if $PC.vagina != -1 && $PC.preg >= 0 && $PC.preg < 4 && $PC.pregType < 8 && $PC.physicalAge < 70>>
-	<div>
-	<<if $receptrix != "Undecided" && $receptrix.ID == $PC.ID>>
-		//Yourself//
-	<<else>>
-		[[Use your own womb|Cloning Workaround][$receptrix = $PC]]
-	<</if>>
-	</div>
-<</if>>
-</p>
-<h2>Implantation</h2>
-<p>
-<<if _impreg != "Undecided" && _receive != "Undecided">>
-_impreg will be cloned and _receive shall act as the incubator.
-	[[Implant clone ovum|Surrogacy][cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "clone"]]
-<<elseif _impreg != "Undecided">>
-_impreg will be cloned. //Please select a surrogate//
-<<elseif _receive != "Undecided">>
-_receive shall act as the incubator. //Please select a genetic source//
-<<else>>
-//Please select a genetic source and surrogate//
-<</if>>
-</p>
diff --git a/src/pregmod/editGenetics.js b/src/pregmod/editGenetics.js
index 4d9bbef76d24aad26ae0b29045b58a2c6b500a80..130a42a0175912df633300eac8af7327b38d9cb2 100644
--- a/src/pregmod/editGenetics.js
+++ b/src/pregmod/editGenetics.js
@@ -1,6 +1,61 @@
 App.UI.editGenetics = function() {
 	const node = new DocumentFragment();
-
+	const cupCat = new Categorizer(
+		[0, 'flat'],
+		[300, 'A-cup'],
+		[400, 'B-cup'],
+		[500, 'C-cup'],
+		[650, 'D-cup'],
+		[800, 'DD-cup'],
+		[1000, 'F-cup'],
+		[1200, 'G-cup'],
+		[1400, 'H-cup'],
+		[1600, 'I-cup'],
+		[1800, 'J-cup'],
+		[2050, 'K-cup'],
+		[2300, 'L-cup'],
+		[2600, 'M-cup'],
+		[2900, 'N-cup'],
+		[3250, 'O-cup'],
+		[3600, 'P-cup'],
+		[3950, 'Q-cup'],
+		[4300, 'R-cup'],
+		[4700, 'S-cup'],
+		[5100, 'massive']
+	);
+	const faceCat = new Categorizer(
+		[-Infinity, 'very ugly'],
+		[-95, 'ugly'],
+		[-40, 'unattractive'],
+		[-10, 'attractive'],
+		[11, 'very pretty'],
+		[41, 'gorgeous'],
+		[96, 'mind blowing']
+	);
+	const lipsCat = new Categorizer(
+		[0, 'thin'],
+		[11, 'normal'],
+		[21, 'pretty'],
+		[41, 'plush'],
+		[71, 'huge'],
+		[96, 'facepussy']
+	);
+	const hormonalCat = new Categorizer(
+		[-Infinity, 'heavy male'],
+		[-49, 'male'],
+		[-24, 'natural'],
+		[25, 'female'],
+		[50, 'heavy female']
+	);
+	const intelligenceCat = new Categorizer(
+		[-Infinity, 'borderline retarded'],
+		[-95, 'very slow'],
+		[-50, 'slow'],
+		[-15, 'average'],
+		[16, 'smart'],
+		[51, 'very smart'],
+		[96, 'brilliant']
+	);
 	function birthFullName(s) {
 		let r = [];
 		if (V.surnameOrder !== 1) {
@@ -88,7 +143,7 @@ App.UI.editGenetics = function() {
 		makeCell(s.birthSurname || '', 2);
 
 		makeHeader(`Karyotype`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${s.genes} (${tmpl.toSex(s.genes)})`, ["editor", "choice-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${s.genes} (${toSex(s.genes)})`, ["editor", "choice-editor"]);
 		cell.setAttribute("data-param", "genes");
 		cell.setAttribute("data-choices", "XX, XY");
 
@@ -113,13 +168,13 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Father`);
-		makeCell(tmpl.parentFullName(s.father), 2);
+		makeCell(parentFullName(s.father), 2);
 
 		makeHeader(`Mother`);
-		makeCell(tmpl.parentFullName(s.mother), 2);
+		makeCell(parentFullName(s.mother), 2);
 
 		makeHeader(`Age`);
-		makeCell(tmpl.ageDesc(s));
+		makeCell(ageDesc(s));
 
 
 		if (s.birthName !== s.slaveName || s.birthSurname !== s.slaveSurname) {
@@ -155,17 +210,17 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Height`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${s.height} cm (${tmpl.toFeet(s.height)})`, ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${s.height} cm (${toFeet(s.height)})`, ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "height");
 		cell.setAttribute("data-min", "50");
 		cell.setAttribute("data-max", "250");
 
 		makeHeader(`Weight`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.percent(s.weight), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, percent(s.weight), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "weight");
 
 		makeHeader(`Muscles`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.percent(s.muscles), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, percent(s.muscles), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "muscles");
 
 		cell = App.UI.DOM.appendNewElement("td", row);
@@ -175,23 +230,23 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Shoulders`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.shouldersDesc(s.shoulders), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, shouldersDesc(s.shoulders), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "shoulders");
 		cell.setAttribute("data-min", "-2");
 		cell.setAttribute("data-max", "2");
 
 		makeHeader(`Waist`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.percent(s.waist), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, percent(s.waist), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "waist");
 
 		makeHeader(`Hips`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.hipsDesc(s.hips), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, hipsDesc(s.hips), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "hips");
 		cell.setAttribute("data-min", "-2");
 		cell.setAttribute("data-max", "3");
 
 		makeHeader(`Rear`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.buttDesc(s.butt), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, buttDesc(s.butt), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "butt");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "20");
@@ -200,7 +255,7 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Breasts`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${s.boobs} cc (${tmpl.cupCat.cat(s.boobs)})`, ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${s.boobs} cc (${cupCat.cat(s.boobs)})`, ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "boobs");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "100000");
@@ -216,7 +271,7 @@ App.UI.editGenetics = function() {
 		cell.setAttribute("data-choices", "huge, puffy, inverted, tiny, cute, partially inverted");
 
 		makeHeader(`Areolae`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.areolaeDesc(s.areolae), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, areolaeDesc(s.areolae), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "areolae");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "5");
@@ -225,11 +280,11 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Face`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${tmpl.faceCat.cat(s.face)} (${tmpl.percent(s.face)})`, ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${faceCat.cat(s.face)} (${percent(s.face)})`, ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "face");
 
 		makeHeader(`Lips`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${tmpl.lipsCat.cat(s.lips)} (${s.lips})`, ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${lipsCat.cat(s.lips)} (${s.lips})`, ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "lips");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "100");
@@ -240,7 +295,7 @@ App.UI.editGenetics = function() {
 		cell.setAttribute("data-choices", "normal, crooked, straightening braces, cosmetic braces, removable, pointy, baby, mixed");
 
 		makeHeader(`Voice`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.voiceDesc(s.voice), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, voiceDesc(s.voice), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "voice");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "3");
@@ -252,13 +307,13 @@ App.UI.editGenetics = function() {
 			makeRow();
 
 			makeHeader(`Labia`);
-			cell = App.UI.DOM.appendNewElement("td", row, tmpl.labiaDesc(s.labia), ["editor", "number-editor"]);
+			cell = App.UI.DOM.appendNewElement("td", row, labiaDesc(s.labia), ["editor", "number-editor"]);
 			cell.setAttribute("data-param", "labia");
 			cell.setAttribute("data-min", "0");
 			cell.setAttribute("data-max", "3");
 
 			makeHeader(`Clitoris`);
-			cell = App.UI.DOM.appendNewElement("td", row, tmpl.clitDesc(s.clit), ["editor", "number-editor"]);
+			cell = App.UI.DOM.appendNewElement("td", row, clitDesc(s.clit), ["editor", "number-editor"]);
 			cell.setAttribute("data-param", "clit");
 			cell.setAttribute("data-min", "0");
 			cell.setAttribute("data-max", "5");
@@ -280,13 +335,13 @@ App.UI.editGenetics = function() {
 			makeRow();
 
 			makeHeader(`Penis`);
-			cell = App.UI.DOM.appendNewElement("td", row, tmpl.penisDesc(s.dick), ["editor", "number-editor"]);
+			cell = App.UI.DOM.appendNewElement("td", row, penisDesc(s.dick), ["editor", "number-editor"]);
 			cell.setAttribute("data-param", "dick");
 			cell.setAttribute("data-min", "0");
 			cell.setAttribute("data-max", "11");
 
 			makeHeader(`Testes`);
-			cell = App.UI.DOM.appendNewElement("td", row, tmpl.testesDesc(s.balls), ["editor", "number-editor"]);
+			cell = App.UI.DOM.appendNewElement("td", row, testesDesc(s.balls), ["editor", "number-editor"]);
 			cell.setAttribute("data-param", "balls");
 			cell.setAttribute("data-min", "0");
 			cell.setAttribute("data-max", "10");
@@ -306,7 +361,7 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Hormonal`);
-		cell = App.UI.DOM.appendNewElement("td", row, `${tmpl.hormonalCat.cat(s.hormoneBalance)} (${s.hormoneBalance})`, ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, `${hormonalCat.cat(s.hormoneBalance)} (${s.hormoneBalance})`, ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "hormoneBalance");
 
 		makeHeader(`Anal area`);
@@ -324,7 +379,7 @@ App.UI.editGenetics = function() {
 		makeRow();
 
 		makeHeader(`Intelligence`);
-		cell = App.UI.DOM.appendNewElement("td", row, tmpl.intelligenceCat.cat(s.intelligence), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, intelligenceCat.cat(s.intelligence), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "intelligence");
 		cell.setAttribute("data-min", "-100");
 		cell.setAttribute("data-max", "100");
@@ -340,24 +395,22 @@ App.UI.editGenetics = function() {
 
 		if (s.chem > 0 || s.addict > 0) {
 			makeRow();
-			makeCell(tmpl.chemicalsDesc(s), 8);
+			makeCell(chemicalsDesc(s), 8);
 		}
 		return table;
 	}
-
-	var tmpl = tmpl || {};
-	tmpl.percent = function(n) {
+	function percent(n) {
 		if (n > 0) { return '+' + Number(n).toFixed(0) + '%'; }
 		if (n === 0) { return '\u00B10%'; }
 		return Number(n).toFixed(0) + '%';
-	};
-	tmpl.toFeet = function(n) {
+	}
+	function toFeet(n) {
 		let realFeet = Number(n) / 30.48;
 		let feet = Math.floor(realFeet);
 		let inches = Math.round((realFeet - feet) * 12);
 		return feet + "\u2032" + inches + '\u2033';
-	};
-	tmpl.toSex = function(karyotype) {
+	}
+	function toSex(karyotype) {
 		return {
 			XX: 'female',
 			XY: 'male',
@@ -367,14 +420,14 @@ App.UI.editGenetics = function() {
 			XXY: 'Klinefelter syndrome male',
 			XXX: 'triple X syndrome female'
 		}[String(karyotype).toUpperCase()] || 'unknown/not viable';
-	};
-	tmpl.ageDesc = function(slave) {
+	}
+	function ageDesc(slave) {
 		let age = slave.actualAge + (slave.birthWeek + V.week - slave.weekAcquired) / 52.0;
 		let years = Math.floor(age);
 		let months = Math.floor((age - years) * 12);
 		return (years > 0 ? years + 'y ' + months + 'm' : months + 'm');
-	};
-	tmpl.shouldersDesc = function(s) {
+	}
+	function shouldersDesc(s) {
 		return ({
 			'-2': 'very narrow',
 			'-1': 'narrow',
@@ -382,8 +435,8 @@ App.UI.editGenetics = function() {
 			'1': 'broad',
 			'2': 'very broad'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.hipsDesc = function(s) {
+	}
+	function hipsDesc(s) {
 		return ({
 			'-2': 'very narrow',
 			'-1': 'narrow',
@@ -392,8 +445,8 @@ App.UI.editGenetics = function() {
 			'2': 'very wide',
 			'3': 'inhumanly wide'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.buttDesc = function(s) {
+	}
+	function buttDesc(s) {
 		return ({
 			'0': 'flat',
 			'1': 'small',
@@ -417,31 +470,8 @@ App.UI.editGenetics = function() {
 			'19': 'inhuman',
 			'20': 'inhuman'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.cupCat = new Categorizer(
-		[0, 'flat'],
-		[300, 'A-cup'],
-		[400, 'B-cup'],
-		[500, 'C-cup'],
-		[650, 'D-cup'],
-		[800, 'DD-cup'],
-		[1000, 'F-cup'],
-		[1200, 'G-cup'],
-		[1400, 'H-cup'],
-		[1600, 'I-cup'],
-		[1800, 'J-cup'],
-		[2050, 'K-cup'],
-		[2300, 'L-cup'],
-		[2600, 'M-cup'],
-		[2900, 'N-cup'],
-		[3250, 'O-cup'],
-		[3600, 'P-cup'],
-		[3950, 'Q-cup'],
-		[4300, 'R-cup'],
-		[4700, 'S-cup'],
-		[5100, 'massive']
-	);
-	tmpl.areolaeDesc = function(s) {
+	}
+	function areolaeDesc(s) {
 		return ({
 			'0': 'normal',
 			'1': 'large',
@@ -450,41 +480,24 @@ App.UI.editGenetics = function() {
 			'4': 'heart shaped',
 			'5': 'star shaped'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.faceCat = new Categorizer(
-		[-Infinity, 'very ugly'],
-		[-95, 'ugly'],
-		[-40, 'unattractive'],
-		[-10, 'attractive'],
-		[11, 'very pretty'],
-		[41, 'gorgeous'],
-		[96, 'mind blowing']
-	);
-	tmpl.lipsCat = new Categorizer(
-		[0, 'thin'],
-		[11, 'normal'],
-		[21, 'pretty'],
-		[41, 'plush'],
-		[71, 'huge'],
-		[96, 'facepussy']
-	);
-	tmpl.voiceDesc = function(s) {
+	}
+	function voiceDesc(s) {
 		return ({
 			'0': 'mute',
 			'1': 'deep',
 			'2': 'feminine',
 			'3': 'high'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.labiaDesc = function(s) {
+	}
+	function labiaDesc(s) {
 		return ({
 			'0': 'minimal',
 			'1': 'big',
 			'2': 'huge',
 			'3': 'huge dangling'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.clitDesc = function(s) {
+	}
+	function clitDesc(s) {
 		return ({
 			'0': 'normal',
 			'1': 'large',
@@ -493,8 +506,8 @@ App.UI.editGenetics = function() {
 			'4': 'penis-like',
 			'5': 'like a massive penis'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.penisDesc = function(s) {
+	}
+	function penisDesc(s) {
 		return ({
 			'0': 'none',
 			'1': 'tiny',
@@ -509,8 +522,8 @@ App.UI.editGenetics = function() {
 			'10': 'inhuman',
 			'11': 'hypertrophied'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.testesDesc = function(s) {
+	}
+	function testesDesc(s) {
 		return ({
 			'0': 'none',
 			'1': 'vestigial',
@@ -521,15 +534,8 @@ App.UI.editGenetics = function() {
 			'6': 'enormous',
 			'7': 'hypertrophied', '8': 'hypertrophied', '9': 'hypertrophied', '10': 'hypertrophied'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
-	};
-	tmpl.hormonalCat = new Categorizer(
-		[-Infinity, 'heavy male'],
-		[-49, 'male'],
-		[-24, 'natural'],
-		[25, 'female'],
-		[50, 'heavy female']
-	);
-	tmpl.chemicalsDesc = function(slave) {
+	}
+	function chemicalsDesc(slave) {
 		let res = [];
 		if (slave.chem > 0) {
 			res.push('Immune system damaged (' + slave.chem.toFixed(0) + ').');
@@ -538,17 +544,8 @@ App.UI.editGenetics = function() {
 			res.push('Addicted to aphrodisiacs (' + slave.addict.toFixed(0) + ').');
 		}
 		return res.join(' ');
-	};
-	tmpl.intelligenceCat = new Categorizer(
-		[-Infinity, 'borderline retarded'],
-		[-95, 'very slow'],
-		[-50, 'slow'],
-		[-15, 'average'],
-		[16, 'smart'],
-		[51, 'very smart'],
-		[96, 'brilliant']
-	);
-	tmpl.parentFullName = function(id) {
+	}
+	function parentFullName(id) {
 		if (id === 0) {
 			return App.UI.DOM.makeElement("span", "unknown", "note");
 		}
@@ -566,7 +563,7 @@ App.UI.editGenetics = function() {
 					`(${id})`
 				]);
 		}
-	};
+	}
 
 	let outerDiv = App.UI.DOM.appendNewElement("div", node);
 	outerDiv.style.position = "relative";
diff --git a/src/pregmod/implantManufactory.tw b/src/pregmod/implantManufactory.tw
deleted file mode 100644
index 546fac7272b6f3c2ab2c78b4e300e5b6794f5676..0000000000000000000000000000000000000000
--- a/src/pregmod/implantManufactory.tw
+++ /dev/null
@@ -1,155 +0,0 @@
-:: Implant Manufactory [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
-
-<h1>The Implant Manufactory</h1>
-
-<p class="scene-intro">
-	The implant manufactory is running smoothly. It can cheaply produce advanced implants and has freed you from relying on outside sources for specialty implants. It can easily produce more complex implants should you obtain the schematics necessary to build them.
-</p>
-
-<h2>Implant Production</h2>
-
-<p>
-<div>The manufactory is capable of producing customized fillable implants.</div>
-
-<<if ($meshImplants != 1) && ($rep <= 10000*_PCSkillCheck)>>
-	<div class="note">
-		You lack the reputation to access plans for supportive breast implants.
-	</div>
-<<elseif ($meshImplants != 1) && ($rep > 10000*_PCSkillCheck)>>
-	<div>
-		[[Purchase plans for supportive mesh breast implants|Implant Manufactory][cashX(forceNeg(40000*_PCSkillCheck), "capEx"), $meshImplants = 1]]
-		<span class="detail">
-			Costs <<print cashFormat(40000*_PCSkillCheck)>>
-			<div class="indent">
-				Will allow the construction of organic and supportive mesh breast implants.
-			</div>
-		</span>
-	</div>
-<<elseif ($meshImplants > 0)>>
-	<div>The manufactory is capable of producing supportive mesh breast implants.</div>
-<</if>>
-
-<<if $UterineRestraintMesh == 1>>
-	<div>The manufactory is capable of producing supportive mesh uterine implants.</div>
-<</if>>
-
-<<if ($bellyImplants == 0) && ($rep <= 2000*_PCSkillCheck)>>
-	<div class="note">You lack the reputation to access experimental fillable abdominal implants.</div>
-<<elseif ($bellyImplants == 0) && ($rep > 2000*_PCSkillCheck)>>
-	<div>
-		[[Purchase schematics for fillable abdominal implants|Implant Manufactory][cashX(forceNeg(30000*_PCSkillCheck), "capEx"), $bellyImplants = 1]]
-		<span class="detail">
-			Costs <<print cashFormat(30000*_PCSkillCheck)>>
-			<div class="indent">
-				Will allow the construction of fillable abdominal implants for the autosurgery.
-			</div>
-		</span>
-	</div>
-<<elseif ($bellyImplants > 0)>>
-	<div>The manufactory is capable of crafting fillable abdominal implants.</div>
-	<<if ($bellyImplants == 1) && ($cervixImplants == 0) && ($rep <= 6000*_PCSkillCheck)>> /* show only after belly implants already researched */
-		<div class="note">You lack the reputation to access experimental cervix filter micropumps schematics for abdominal implants.</div>
-	<<elseif ($bellyImplants == 1) && ($cervixImplants == 0) && ($rep > 6000 * _PCSkillCheck)>> /* nanotech like technology much more impressive and costly than simple implant */
-		<div>
-			[[Purchase schematics for cervix filter micropumps|Implant Manufactory][cashX(forceNeg(70000*_PCSkillCheck), "capEx"), $cervixImplants = 1]]
-			<span class="detail">
-				Costs <<print cashFormat(70000*_PCSkillCheck)>>
-				<div class="indent">
-					Will allow the construction of cervix filter micropumps for fillable abdominal implants using the autosurgery.
-				</div>
-			</span>
-		</div>
-	<<elseif ($cervixImplants == 1) && ($rep <= 8000*_PCSkillCheck)>>
-		<div>The manufactory is capable of crafting cervix filter micropumps for fillable abdominal implants.</div>
-		<div class="note">
-			You lack the reputation to obtain conversion kits for rectal filter micropumps.
-		</div>
-	<<elseif ($cervixImplants == 1) && ($rep > 8000*_PCSkillCheck)>>
-		<div>The manufactory is capable of crafting cervix filter micropumps for fillable abdominal implants.</div>
-		<div>
-			[[Purchase conversion kits for rectal filter micropumps|Implant Manufactory][cashX(forceNeg(60000*_PCSkillCheck), "capEx"), $cervixImplants = 2]]
-			<span class="detail">
-				Costs <<print cashFormat(60000*_PCSkillCheck)>>
-				<div class="indent">
-					Will allow the construction of the anal equivalent of the cervix micropumps using the autosurgery.
-				</div>
-			</span>
-		</div>
-	<<elseif ($cervixImplants > 1)>>
-		<div>The manufactory is capable of crafting cervix and rectal filter micropumps for fillable abdominal implants.</div>
-	<</if>>
-<</if>>
-</p>
-
-<<if $seePreg != 0>>
-	<h2>Fertility Implants</h2>
-
-	<p>
-	<<if $fertilityImplant == 1>>
-		<div>The manufactory is capable of crafting fertility enhancing implants for ovaries.</div>
-	<<elseif $fertilityImplant == 0 && ($rep <= 3000*_PCSkillCheck)>>
-		<div class="note">
-			You lack the reputation to access fertility boosting ovarian implants.
-		</div>
-	<<else>>
-		<div>
-			[[Purchase schematics for fertility enhancing ovarian implants|Implant Manufactory][cashX(forceNeg(10000*_PCSkillCheck), "capEx"), $fertilityImplant = 1]]
-			<span class="detail">
-				Costs <<print cashFormat(10000*_PCSkillCheck)>>
-				<div class="indent">
-					Will allow the construction of implants that encourage multiple eggs being released during ovulation.
-				</div>
-			</span>
-		</div>
-	<</if>>
-
-	<<if $sympatheticOvaries == 1>>
-		<div>The manufactory is capable of crafting implants that synchronize ovum release.</div>
-	<</if>>
-
-	<<if $seeHyperPreg == 1 && $seeExtreme == 1>>
-		<<if ($permaPregImplant == 0) && ($rep <= 4000*_PCSkillCheck)>>
-			<div class="note">You lack the reputation to access experimental pregnancy generator schematics.</div>
-		<<elseif ($permaPregImplant == 0) && ($rep > 4000*_PCSkillCheck)>>
-			<div>
-				[[Purchase schematics for an experimental implantable pregnancy generator|Implant Manufactory][cashX(forceNeg(40000*_PCSkillCheck), "capEx"), $permaPregImplant = 1]]
-				<span class="detail">
-					Costs <<print cashFormat(40000*_PCSkillCheck)>>
-					<div class="indent">
-						Will allow the construction of implants that force perpetual pregnancy.
-					</div>
-				</span>
-			</div>
-		<<elseif ($permaPregImplant > 0)>>
-			<div>The manufactory is capable of crafting pregnancy generators.</div>
-		<</if>>
-		<<if $PGHack == 1>>
-			<div>
-			The tools required to hack the firmware of basic pregnancy generator implants have been produced by the manufactory for use in the remote surgery.
-			</div>
-		<</if>>
-	<</if>>
-	</p>
-<</if>>
-
-<h2>Fluid Production Implants</h2>
-
-<p>
-<<if ($prostateImplants != 1) && ($rep <= 3000*_PCSkillCheck)>>
-	<div class="note">You lack the reputation to access plans for prostate implants.</div>
-<<elseif ($prostateImplants != 1) && ($rep > 3000*_PCSkillCheck)>>
-	<div>
-		[[Purchase plans for ejaculation enhancing prostate implants|Implant Manufactory][cashX(forceNeg(30000*_PCSkillCheck), "capEx"), $prostateImplants = 1]]
-		<span class="detail">
-			Costs <<print cashFormat(30000*_PCSkillCheck)>>
-			<div class="indent">
-				Will allow the construction of a prostate implant designed to stimulate fluid production for massive ejaculations. Beware of leaking and dehydration.
-			</div>
-		</span>
-	</div>
-<<elseif ($prostateImplants > 0)>>
-	<div>The manufactory is capable of producing ejaculation enhancing prostate implants.</div>
-<</if>>
-</p>
diff --git a/src/pregmod/organFarm.tw b/src/pregmod/organFarm.tw
deleted file mode 100644
index f4ff696b9377d7441b1695dee5a26a7cc4c44e91..0000000000000000000000000000000000000000
--- a/src/pregmod/organFarm.tw
+++ /dev/null
@@ -1,149 +0,0 @@
-:: Organ Farm [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
-
-<h1>The Organ Farm</h1>
-
-<p>
-	<div class="scene-intro">
-		<<if $organFarmUpgrade > 2>>
-			The organ farm is running smoothly. It can rapidly grow tailored organs for implantation in slaves. It can easily produce altered variants should you obtain the data necessary to create them.
-		<<elseif $organFarmUpgrade > 1>>
-			The organ farm is running smoothly. It can quickly grow tailored organs for implantation in slaves, though there will be side-effects. It can easily produce altered variants should you obtain the data necessary to create them.
-		<<elseif ($organFarmUpgrade > 0)>>
-			The organ farm is running smoothly. It can grow tailored organs for implantation in slaves. It can easily produce altered variants should you obtain the data necessary to create them.
-		<</if>>
-	</div>
-
-	<<if ($organFarmUpgrade < 3) && ($rep <= 10000*_PCSkillCheck)>>
-		<div class="note">
-			You lack the reputation to access experimental organ farm parts.
-		</div>
-	<<elseif $dispensary == 0 && $organFarmUpgrade == 2>>
-		<div class="note">
-			An upgraded pharmaceutical fabricator is required by the perfected organ farm.
-		</div>
-	<<elseif $dispensary == 0 && $organFarmUpgrade == 1>>
-		<div class="note">
-			A pharmaceutical fabricator is required to produce the chemicals for the accelerated organ farm.
-		</div>
-	<<elseif $dispensaryUpgrade == 0 && $organFarmUpgrade == 2>>
-		<div class="note">
-			The pharmaceutical fabricator must be upgraded in order to produce the drugs required by the perfected organ farm.
-		</div>
-	<<elseif $organs.length > 0>>
-		<div class="note">
-			The organ farm cannot be upgraded while it is use.
-		</div>
-	<<elseif ($organFarmUpgrade == 2) && ($rep > 10000*_PCSkillCheck)>>
-		<div>
-			[[Upgrade the organ farm to the cutting edge model|Organ Farm][cashX(forceNeg(150000*_PCSkillCheck), "capEx"), $organFarmUpgrade = 3]]
-			<span class="detail">Costs <<print cashFormat(150000*_PCSkillCheck)>></span>
-		</div>
-		<div class="indent detail">
-			Will allow the organ farm to rapidly grow organs without risk to the implantee's health.
-		</div>
-	<<elseif ($organFarmUpgrade == 1) && ($rep > 10000*_PCSkillCheck)>>
-		<div>
-			[[Upgrade the organ farm with an experimental growth accelerator|Organ Farm][cashX(forceNeg(75000*_PCSkillCheck), "capEx"), $organFarmUpgrade = 2]]
-			<span class="detail">Costs <<print cashFormat(75000*_PCSkillCheck)>></span>
-		</div>
-		<div class="indent detail">
-			Will allow the organ farm to quickly grow organs. Implanted organs may cause health issues.
-		</div>
-	<</if>>
-
-	<<if ($youngerOvaries != 1) && ($rep <= 10000*_PCSkillCheck)>>
-		<div class="note">
-			You lack the reputation to access designs for cloning fertile ovaries for menopausal slaves.
-		</div>
-	<<elseif ($youngerOvaries != 1) && ($rep > 10000*_PCSkillCheck)>>
-		<div>
-			[[Purchase designs for cloning fertile ovaries for menopausal slaves|Organ Farm][cashX(forceNeg(30000*_PCSkillCheck), "capEx"), $youngerOvaries = 1]]
-			<span class="detail">Costs <<print cashFormat(30000*_PCSkillCheck)>></span>
-		</div>
-		<div class="indent detail">
-			Will allow the growth of younger, fertile ovaries for menopausal slaves. Restored fertility will only last for a couple years at most.
-		</div>
-	<<elseif ($youngerOvaries > 0)>>
-		<div>
-			The organ farm is capable of growing fertile ovaries for postmenopausal slaves.
-		</div>
-	<</if>>
-
-	<<if $asexualReproduction == 1>>
-		<div>
-			The organ farm is capable of growing modified ovary pairs capable of self-fertilization.
-		</div>
-	<</if>>
-
-	<<if $seePreg != 0 && $seeBestiality == 1 && $experimental.animalOvaries == 1>>
-		<<if $animalOvaries < 1>>
-			<div class="note">
-				You lack the required designs for cloning animal ovaries for slaves.
-			</div>
-		<<else>>
-			<div>
-				The organ farm is capable of growing animal ovaries for slaves.
-			</div>
-		<</if>>
-
-		<<if $animalTesticles < 1>>
-			<div class="note">
-				You lack the required designs for cloning animal testicles for slaves.
-			</div>
-		<<else>>
-			<div>
-				The organ farm is capable of growing animal testicles for slaves.
-			</div>
-		<</if>>
-
-		<<if $arcologies[0].FSGenderRadicalistResearch == 1>>
-			<<if $animalMpreg < 1>>
-				<div class="note">
-					You lack the required designs for cloning animal anal wombs and ovaries for slaves.
-				</div>
-			<<else>>
-				<div>
-					The organ farm is capable of growing animal anal wombs and ovaries for slaves.
-				</div>
-			<</if>>
-		<</if>>
-	<</if>>
-</p>
-
-<h2>Organ Production</h2>
-
-<p>
-	<<includeDOM App.Medicine.OrganFarm.currentlyGrowing()>>
-</p>
-
-<h2>Future Societies Research</h2>
-
-<p>
-	<<if $seePreg != 0>>
-		<div>
-		<<if $arcologies[0].FSGenderRadicalistDecoration == 100>>
-			<<if ($arcologies[0].FSGenderRadicalistResearch == 0)>>
-				<<if ($rep >= 10000*_PCSkillCheck)>>
-					[[Fund research into developing male pregnancy methods|Organ Farm][cashX(forceNeg(50000*_PCSkillCheck), "capEx"),$arcologies[0].FSGenderRadicalistResearch = 1]]
-					<span class="detail">
-						Costs <<print cashFormat(50000*_PCSkillCheck)>>.
-						<div class="indent">Will allow cloning and production of anal uteri and ovaries.</div>
-					</span>
-				<<else>>
-					<span class="note">You lack the reputation to access the research necessary to develop anal uteri and ovaries.</span>
-					<br>
-				<</if>>
-			<<else>>
-				The organ farm has been upgraded with schematics for modified uteri and ovaries.
-				<br>
-			<</if>>
-		<<elseif $arcologies[0].FSGenderRadicalistResearch == 1>>
-			<span class="note">The organ farm has been upgraded with schematics for modified uteri and ovaries.</span>
-		<<else>>
-			<span class="note">Gender Radicalist focused research unavailable.</span>
-		<</if>>
-		</div>
-	<</if>>
-</p>
diff --git a/src/pregmod/ovaTransplantWorkaround.tw b/src/pregmod/ovaTransplantWorkaround.tw
deleted file mode 100644
index ec57a9651686d6f2558bf223a844b0cb53bdea6a..0000000000000000000000000000000000000000
--- a/src/pregmod/ovaTransplantWorkaround.tw
+++ /dev/null
@@ -1,29 +0,0 @@
-:: Ova Transplant Workaround [nobr]
-
-<<set $nextButton = "Cancel", $receptrix = 0, _eligibility = 0>>
-
-//You've decided which fertilized ovum is to be transplanted; now you must select whose womb will be its new home.//
-
-<br><br>
-
-__Select a slave to serve as the host__
-
-<br>
-
-<<for _otw = 0; _otw < $slaves.length; _otw++>>
-	<<capture _otw>>
-		<<if ($donatrix.ID != $slaves[_otw].ID && $slaves[_otw].ovaries > 0 || $slaves[_otw].mpreg > 0) && isSlaveAvailable($slaves[_otw]) && $slaves[_otw].preg >= 0 && $slaves[_otw].preg < $slaves[_otw].pregData.normalBirth/10 && $slaves[_otw].pregWeek >= 0 && $slaves[_otw].pubertyXX == 1 && $slaves[_otw].pregType < 12 && $slaves[_otw].bellyImplant == -1 && $slaves[_otw].broodmother == 0 && $slaves[_otw].inflation <= 2 && $slaves[_otw].physicalAge < 70>>
-			<<set _name = SlaveFullName($slaves[_otw])>>
-			<br>[[_name|Surrogacy][$receptrix = $slaves[_otw], cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "transplant"]] <<if $slaves[_otw].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>>
-			<<set _eligibility = 1>>
-		<</if>>
-	<</capture>>
-<</for>>
-<<if (_eligibility == 0)>>
-	<br>//You have no slaves capable of acting as a surrogate.//
-<</if>>
-
-<<if $PC.vagina != -1 && $donatrix.ID != -1 && $PC.preg >= 0 && $PC.preg < 4 && $PC.pregType < 8 && $PC.physicalAge < 70>>
-	<br>
-	[[Use your own womb|Surrogacy][$receptrix = $PC, cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "transplant"]]
-<</if>>
diff --git a/src/pregmod/surrogacy.js b/src/pregmod/surrogacy.js
index 09cd48c1d62079d8d77fc9e0b7e4be6ecff61dfe..42a9ccf38cf8b43d11b62cd14bc6b14ddd551353 100644
--- a/src/pregmod/surrogacy.js
+++ b/src/pregmod/surrogacy.js
@@ -89,16 +89,16 @@ App.UI.surrogacy = function() {
 		case "transplant":
 			if (receptrix.ID === -1) {
 				r.push(`Since the surgery required only a local anesthetic, you are very aware that you are now carrying ${slave.slaveName}'s child. You slowly rise to your feet, a hand to your lower belly, appreciating the new life growing within you.`);
-				const _fetus = WombRemoveFetus(slave, wombIndex);
-				WombAddFetus(V.PC, _fetus);
+				const fetus = WombRemoveFetus(slave, wombIndex);
+				WombAddFetus(V.PC, fetus);
 				V.PC.pregKnown = 1;
 				V.PC.preg = WombMaxPreg(V.PC);
 				slave.preg = WombMaxPreg(slave);
 				WombNormalizePreg(V.PC);
 				WombNormalizePreg(slave);
 			} else {
-				const _fetus = WombRemoveFetus(donatrix, wombIndex);
-				WombAddFetus(receptrix, _fetus);
+				const fetus = WombRemoveFetus(donatrix, wombIndex);
+				WombAddFetus(receptrix, fetus);
 				receptrix.pregKnown = 1;
 				receptrix.preg = WombMaxPreg(receptrix);
 				donatrix.preg = WombMaxPreg(donatrix);
diff --git a/src/pregmod/surrogacyWorkaround.tw b/src/pregmod/surrogacyWorkaround.tw
deleted file mode 100644
index a3ec7035d37494c7c39813195c2d4119fe0b448a..0000000000000000000000000000000000000000
--- a/src/pregmod/surrogacyWorkaround.tw
+++ /dev/null
@@ -1,102 +0,0 @@
-:: Surrogacy Workaround [nobr]
-
-<<set $nextButton = "Cancel", _eligibility = 0, _eligibilityI = 0, _eligibility2 = 0>>
-<<if $donatrix.ID == $PC.ID>>
-	<<set _donatrixID = -1>>
-<<else>>
-	<<set _donatrixID = 0>>
-<</if>>
-<<if $impregnatrix != "Undecided" && $impregnatrix.ID == -1>>
-	<<set _impreg = PlayerName()>>
-<<elseif $impregnatrix != "Undecided">>
-	<<set _impreg = SlaveFullName($impregnatrix)>>
-<<else>>
-	<<set _impreg = $impregnatrix>>
-<</if>>
-
-<<if $receptrix != "Undecided" && $receptrix.ID == -1>>
-	<<set _receive = PlayerName()>>
-<<elseif $receptrix != "Undecided">>
-	<<set _receive = SlaveFullName($receptrix)>>
-<<else>>
-	<<set _receive = $receptrix>>
-<</if>>
-
-<p class="scene-intro">
-	<<if _donatrixID == -1>>
-		You've prepared yourself to have an egg taken from your ovaries;
-	<<else>>
-		<<= getSlave($AS).slaveName>> is prepped to have an egg harvested from $his ovaries;
-	<</if>>
-	now you must select a target to fertilize it and who will carry it to term.
-</p>
-
-
-_impreg will provide the seed and _receive shall carry it.
-<<if _impreg != "Undecided" && _receive != "Undecided">>
-	[[Implant fertilized ovum|Surrogacy][cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "surrogacy"]]
-<</if>>
-
-<br><br>
-
-__Semen donatrix: _impreg __
-
-<br>
-<<for _sw = 0; _sw < $slaves.length; _sw++>>
-	<<capture _sw>>
-		<<if $slaves[_sw].balls > 0 && $slaves[_sw].pubertyXY == 1 && isSlaveAvailable($slaves[_sw]) && canBreed($donatrix, $slaves[_sw])>>
-			<<set _name = SlaveFullName($slaves[_sw])>>
-			<br>[[_name|Surrogacy Workaround][$impregnatrix = $slaves[_sw]]]
-			<<set _eligibility = 1>>
-		<</if>>
-	<</capture>>
-<</for>>
-<<if (_eligibility == 0)>>
-	<br>//You have no slaves with potent sperm.//
-<</if>>
-
-<<if $incubator.tanks.length > 0 && $incubator.setting.reproduction === 2>>
-	<br><br>__Incubator settings are resulting in large-scale fluid secretion. Select an eligible incubatee to milk for semen:__
-	<br>
-	<<for _tank range $incubator.tanks>>
-		<<capture _tank>>
-			<<if _tank.balls > 0 && _tank.dick > 0 && canBreed($donatrix, _tank)>>
-				<<set _name3 = _tank.slaveName>>
-				[[_name3|Surrogacy Workaround][$impregnatrix = _tank]]
-				<<set _eligibilityI = 1>>
-			<</if>>
-		<</capture>>
-	<</for>>
-	<<if (_eligibilityI == 0)>>
-		<br>//You have no growing slaves producing sperm.//
-	<</if>>
-<</if>>
-
-<<if $PC.balls != 0>>
-	<br>
-	[[Use your own|Surrogacy Workaround][$impregnatrix = $PC]]
-<</if>>
-
-<br><br>
-
-__Chosen surrogate: _receive __
-
-<br>
-
-<<for _sw1 = 0; _sw1 < $slaves.length; _sw1++>>
-	<<capture _sw1>>
-		<<if ($slaves[_sw1].ovaries > 0 || $slaves[_sw1].mpreg > 0) && isSlaveAvailable($slaves[_sw1]) && $slaves[_sw1].preg >= 0 && $slaves[_sw1].preg < 4 && $slaves[_sw1].pregWeek >= 0 && $slaves[_sw1].pubertyXX == 1 && $slaves[_sw1].pregType < 12 && $slaves[_sw1].bellyImplant == -1 && $slaves[_sw1].broodmother == 0 && $slaves[_sw1].inflation <= 2 && $slaves[_sw1].physicalAge < 70>>
-			<<set _name2 = SlaveFullName($slaves[_sw1])>>
-			<br>[[_name2|Surrogacy Workaround][$receptrix = $slaves[_sw1]]] <<if $slaves[_sw1].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>>
-			<<set _eligibility2 = 1>>
-		<</if>>
-	<</capture>>
-<</for>>
-<<if (_eligibility2 == 0)>>
-	<br>//You have no slaves capable of acting as a surrogate.//
-<</if>>
-
-<<if $PC.vagina != -1 && $PC.preg >= 0 && $PC.preg < 4 && $PC.pregType < 8 && $PC.physicalAge < 70>>
-	<br>
-	[[Use your own womb|Surrogacy Workaround][$receptrix = $PC]]
-<</if>>
diff --git a/src/pregmod/testGenetics.tw b/src/pregmod/testGenetics.tw
deleted file mode 100644
index 772a5bf26760754e04fbe1bf124a8e487ba674bf..0000000000000000000000000000000000000000
--- a/src/pregmod/testGenetics.tw
+++ /dev/null
@@ -1,73 +0,0 @@
-:: test genetics [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Options">>
-<<set _seed = 0>>
-
-All slave array slaves MUST be present in genePool or else there is a malfunction.
-<table><caption style="background-color: rgba(127, 127, 127, 0.2)">genePool</caption>
-<tr><th>index</th><th>name</th><th>ID</th><th>origin</th></tr>
-<<for _i = 0; _i < $genePool.length; _i++>>
-	<tr>
-		<td>_i</td>
-		<td>$genePool[_i].slaveName</td>
-		<td>$genePool[_i].ID</td>
-		<td>$genePool[_i].origin</td>
-	</tr>
-<</for>>
-</table>
-
-<<set _neededProperties = ['genes', 'origSkin', 'eye.origColor', 'origHColor', 'nationality', 'origRace', 'face', 'faceShape', 'markings', 'intelligence', 'underArmHStyle', 'pubicHStyle']>>
-<table><caption style="background-color: rgba(127, 127, 127, 0.2)">slaves</caption>
-<tr><th>index</th><th>name</th><th>ID</th><th>origin</th><th>assignment</th></tr>
-<<for _i = 0; _i < $slaves.length; _i++>>
-	<<set _s = $slaves[_i]>>
-	<<set _error = $genePool.every(function(g) { return $slaves[_i].ID !== g.ID; })>>
-	<<if _error>><<set _errorCause = "Doesn't exist in the gene pool">><</if>>
-	<<if !_error>>
-		<<set _missingProperties = _neededProperties.filter(function(p) {
-			p = p.split(".");
-			let c = _s;
-			for (const r of p) {
-				if (!(r in c)) {
-					return true;
-				}
-				c = c[r];
-			}
-			return false;
-		})>>
-		<<if _missingProperties.length > 0>>
-			<<set _error = true, _errorCause = "Missing properties: " + _missingProperties.join(", ")>>
-		<</if>>
-	<</if>>
-	<<if _error>>
-		<tr class="red">
-			<td>_i</td>
-			<td>_s.slaveName</td>
-			<td>_s.ID</td>
-			<td>_s.origin</td>
-			<td>_s.assignment</td>
-			<td>_errorCause</td>
-		</tr>
-	<<else>>
-		<tr class="green">
-			<td>_i</td>
-			<td>_s.slaveName</td>
-			<td>_s.ID</td>
-			<td>_s.origin</td>
-			<td>_s.assignment</td>
-			<td></td>
-		</tr>
-	<</if>>
-<</for>>
-</table>
-
-<<if _errorCause>>
-	@@.red;Errors in the gene pool detected! Please report this.@@
-	<<link "Add missing slaves to the gene pool" "Main">>
-		<<for _i = 0; _i < $slaves.length; _i++>>
-			<<if $genePool.every(function(g) { return $slaves[_i].ID !== g.ID; })>>
-				<<set $genePool.push($slaves[_i])>>
-			<</if>>
-		<</for>>
-	<</link>> //This will not fix missing properties.//
-<</if>>
diff --git a/src/pregmod/theBlackMarket.js b/src/pregmod/theBlackMarket.js
index 991d8858222b95f927e0d4cb42666ab37266b743..d4df76636385aa4839fea677ce58f2e4bcc775f8 100644
--- a/src/pregmod/theBlackMarket.js
+++ b/src/pregmod/theBlackMarket.js
@@ -42,10 +42,10 @@ App.UI.theBlackMarket = function() {
 		//<br><br>
 		r.push(`A convoy of scientists from the banned wetware CPU project are present and selling their leftover wares.`);
 		//[[Browse CPUs|Slave Markets][V.market.slaveMarket = "wetware", V.slavesSeen += 1]] |
-		if (V.cash > _minimumFive) {
+		if (V.cash > minimumFive) {
 			//[[(x5)|Bulk Slave Intro][V.market.slaveMarket = "wetware", V.market.introType = "bulk", V.market.numSlaves = 5]] |
 		}
-		if (V.cash > _minimumTen) {
+		if (V.cash > minimumTen) {
 			//[[(x10)|Bulk Slave Intro][V.market.slaveMarket = "wetware", V.market.introType = "bulk", V.market.numSlaves = 10]] |
 		}
 	}
@@ -138,7 +138,7 @@ App.UI.theBlackMarket = function() {
 									`${(cashFormat(implantCash))}.`
 								));
 							} else {
-								r.push(`You cannot afford the asking price of <span class="cash dec">${(cashFormat(implantCash))}</span> for absurdly huge implant designs. "No big fake boobs for you. How sad it must be to be flat and enslaved by such a poor${(V.PC.title === 1) ? "Master" : "Mistress"}."`);
+								r.push(`You cannot afford the asking price of <span class="cash dec">${(cashFormat(implantCash))}</span> for absurdly huge implant designs. "No big fake boobs for you. How sad it must be to be flat and enslaved by such a poor ${(V.PC.title === 1) ? "Master" : "Mistress"}."`);
 							}
 						} else {
 							r.push(`You lack the facilities needed to produce implants of this caliber, so absurdly huge implant designs are currently unobtainable.`);
@@ -328,7 +328,7 @@ App.UI.theBlackMarket = function() {
 								r.push(`You lack the facilities required to produce complex gene-altering treatments.`);
 							} else {
 								if (V.arcologies[0].childhoodFertilityInducedNCSResearch === 0) {
-									const _match = (V.arcologies[0].FSYouthPreferentialist > 0) ? "Knowing your arcology, I think you could be happy with the results!" : "I'm not sure this is a good match for your arcology's current society at this moment, but I'm sure you could have fun with it.";
+									const match = (V.arcologies[0].FSYouthPreferentialist > 0) ? "Knowing your arcology, I think you could be happy with the results!" : "I'm not sure this is a good match for your arcology's current society at this moment, but I'm sure you could have fun with it.";
 									if (V.pedo_mode) {
 										r.push(
 											`"If you like sexy little toy dolls, I mean biological`,
@@ -336,7 +336,7 @@ App.UI.theBlackMarket = function() {
 											`or`,
 											App.UI.DOM.makeElement("span", "shotas", ["coral", "bold"]),
 											`for life, then this is the one for you. I picked it up from an exotics dealer, who picked it up from some old world government research center.`,
-											_match,
+											match,
 											`Remember, though, no money back on this. Technology like this doesn't exist anywhere else, your younger slaves will stay that way forever, and your older ones will slowly begin to regress towards that nice mid-childhood state. If you want to build yourself a cadre of`,
 											App.UI.DOM.makeElement("span", "preteen", ["coral", "bold"]),
 											`delights for yourself or your customers, then buy now!"`
@@ -344,7 +344,7 @@ App.UI.theBlackMarket = function() {
 									} else {
 										r.push(
 											`"This might be a little too shady or perverted for you. But, if you want your slaves to last longer, you know, look younger for longer, well this treatment can help. However it comes at a price, this treatment will eventually turn your slave girls younger and younger looking, until the point you might not want to use them as sex slaves because they'll appear as teenagers or even younger. I'm serious, your slaves treated with this treatment will eventually look like children! They won't be, really, but this is no fountain of perpetual youth, and to be fair, maybe none of this will be up your alley. If that's the case, I guess you could just sell them once they get too young looking, and possibly for a higher price than if they looked older. It's, at best, for possibly more discerning or eclectic tastes then you might have. I picked it up from an exotics dealer, who picked it up from some old world government research center.`,
-											_match,
+											match,
 											`Remember, though, no money back on this. Technology like this doesn't exist anywhere else, your treated slaves will stay and become younger looking forever, and your older ones will slowly begin to regress towards a disturbingly young mid-childhood state. All those caveats aside, if this sounds like something you'd want, then buy now!"`
 										);
 									}
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 77f00e57e2afc3a30bec005aa7f3207f8578c641..7f13df408a7c8c11d1301665c7527692bb8a3126 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -42,10 +42,9 @@
 <<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",
-"bad dream",
 "bonded love",
 "breast expansion blues",
 "confident tanning",
@@ -57,25 +56,12 @@
 "fucktoy tribbing",
 "gaped asshole",
 "happy dance",
-"heavy piercing",
-"huge naturals",
-"huge tits",
-"hugely pregnant",
-"ignorant horny",
 "implant inspection",
-"mods please",
 "orchiectomy please",
-"rebellious arrogant",
-"resistant gelding",
-"resistant shower",
-"restricted profession",
-"sexy succubus",
 "shaped areolae",
-"shift masturbation",
 "shift sleep",
 "shower slip",
 "slave dick huge",
-"sleeping ambivalent",
 "sore shoulders",
 "spa boobs",
 "subjugation blues",
@@ -84,10 +70,7 @@
 "tittymonster inspection",
 "torpedo squeeze",
 "transition anxiety",
-"trusting HG",
-"unhappy virgin",
-"used whore",
-"vocal disobedience"].includes($RESSevent)>>
+"unhappy virgin"].includes($RESSevent)>>
 	<<set $activeSlave.clothes = "no clothing">>
 <</if>>
 
@@ -114,31 +97,6 @@
 
 <<switch $RESSevent>>
 
-<<case "first period">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> appears in the door of your office, uncertain if $he should disturb you. $He stumbles through the doorway, hands on $his <<if $activeSlave.weight >= 95>>fat belly<<elseif $activeSlave.belly >= 2000>>bloated belly<<elseif $activeSlave.weight >= 30>>chubby belly<<else>>flat belly<</if>>, before stepping forward to stand in front of your desk. $His chest is rising and falling with panicked hyperventilation. The poor $girl is terrified for some reason.
-<br><br>
-You press $him on why $he is acting this way.
-<<if !canTalk($activeSlave)>>
-	$He uses gestures to point to $his stomach, and explains that $he is feeling an unusual pain.
-<<else>>
-	"My belly, <<Master>>," $he <<say>>s apologetically. "It hurt<<s>> and I don't know why. It ju<<s>>t <<s>>tarted re<<c>>ently."
-<</if>>
-You check $his records and discover $he has very likely just become a woman.
-<<set $activeSlave.pubertyXX = 1>>
-
-<<case "wet dreams">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> appears in the door of your office early in the morning, hesitating before stepping in. You question why $he has come to see you and $he gingerly approaches your desk.
-<br><br>
-<<if !canTalk($activeSlave)>>
-	$He uses gestures to point to $his crotch, and explains that $he has accidentally started wetting $his bed.
-<<else>>
-	"I'm <<s>>orry, <<Master>>," $he <<say>>s apologetically. "I keep wetting my bed at night, and it feel<<s>> <<s>>o good too."
-<</if>>
-You check $his records for any potential health issues that could be causing this annoyance when it dawns on you. $activeSlave.slaveName is likely becoming potent, and now is the perfect time to cement $his sexuality.
-<<set $activeSlave.pubertyXY = 1>>
-
 <<case "surprising wakeup">>
 
 You are awakened from a sound sleep by someone eagerly <<if $PC.dick != 0>>sucking your dick<<else>>eating you out<</if>>. Your slaves know better than to disturb you, let alone take the initiative, but you are shocked when you pull back the sheets and reveal the smiling <<= App.UI.slaveDescriptionDialog($activeSlave)>>.
@@ -389,179 +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 "sore ass">>
-
-One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>>
-<<if (!hasAnyLegs($activeSlave))>>
-	scooting $himself from side to side uncomfortably,
-<<elseif ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0)>>
-	crawling gingerly,
-<<elseif (shoeHeelCategory($activeSlave) > 1)>>
-	tottering along painfully,
-<<else>>
-	walking a little funny,
-<</if>>
-as though $he has a sore butt. You call $him over to inspect $his backdoor to see if $he needs care, <<if (!hasAnyLegs($activeSlave))>>and set $his helpless body down, spreading $his buttocks to examine $his anus.<<else>>and order $him to spread $his buttocks for you so you can examine $his anus.<</if>> $His asshole is fine, just a little sore from hard buttfucks. $He complies with you, but as you probe $him gently with a finger,
-<<if !canTalk($activeSlave) && (!hasAnyArms($activeSlave))>>
-	$he wriggles desperately and turns to mouth "it hurts <<Master>> please don't assrape me" at you.
-<<elseif !canTalk($activeSlave)>>
-	$he gestures desperately, telling you $his butt hurts and asking you not to assfuck $him.
-<<else>>
-	$he bursts out, "<<Master>>, my butt i<<s>> <<s>>o <<s>>ore! Plea<<s>>e don't u<<s>>e my a<<ss>>, <<Master>>. Plea<<s>>e."
-<</if>>
-
-<<case "resistant shower">>
-
-Though $assistant.name constantly monitors all your slaves, you keep an eye on the video feeds yourself. There's nothing like the personal, human touch. You notice one night that <<= App.UI.slaveDescriptionDialog($activeSlave)>> is crouched in the bottom of the shower. Sensing something amiss, you discreetly investigate, and find that $he's crying quietly under the warm water.
-
-<<case "resistant gelding">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is standing in the bathroom in front of the sink, with one leg up on the counter so $he can inspect $his genitalia. <<if canSee($activeSlave)>>From the feeds, it's obvious $he's grieved by what $he sees. As you watch, $he sobs quietly, reaching towards where $his scrotum used to be with a trembling hand. Apparently, $he's having trouble accepting $his status as a gelded slut<<else>>From the feeds, it's obvious $he's grieved by what $he feels. As you watch, $he sobs quietly, reaching towards where $his scrotum used to be with a trembling hand. Apparently, $he's having trouble accepting $his status as a gelded slut<</if>>.
-
-<<case "rebellious arrogant">>
-
-You have a lot of work to do with <<= App.UI.slaveDescriptionDialog($activeSlave)>>. $He compounds the usual rebellious anger at being a slave with an apparently unshakeable conviction that $he is better than you. Oddly, $he seems to maintain the idea that enslaving other people is somehow inappropriate, and that having done so has lowered you morally. This morning, $he did not appear to start $his morning chores as previously ordered. $He sleeps on a bedroll: a brief investigation discloses that $he is still in it, and has pulled the blanket up over $his head. $He refuses to acknowledge your peremptory command to get up.
-
-<<case "vocal disobedience">>
-
-One morning, despite the fact that $he is not allowed to speak without being spoken to, <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if canSee($activeSlave)>>looks you directly in the eye<<else>>faces you<</if>> and asks
-<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-	boldly through $his
-	<<if ($activeSlave.lips > 70)>>
-		massive dick-sucking lips,
-	<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-		inconvenient oral piercings,
-	<<else>>
-		lisp,
-	<</if>>
-	"I'm tired, can I have the day off?" $He didn't even call you <<= getWrittenTitle($activeSlave)>>.
-<<else>>
-	boldly, "I'm tired, can I have the day off, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>?"
-<</if>>
-
-<<case "fearful humiliation">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> generally obeys orders, even if $he isn't yet a truly devoted sex slave. $He blushes furiously when given any sexual command, but $his true feelings about humiliation become clear when $he is ordered to serve in front of others, even other slaves. It sometimes seems the number of people watching $him get fondled, used, or fucked directly reduces the distance between $him and $his next blushing or even sobbing orgasm.
-
-<<case "heavy piercing">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>>'s intimate areas are heavily pierced. This is great; it draws attention to $his holes and makes $him look like the sex slave $he is. However, it does necessitate some extra maintenance. It's the end of the day, and $activeSlave.slaveName is in a bathroom <<if canSee($activeSlave)>>carefully checking each of $his piercings<<else>>meticulously cleaning each of $his piercings<</if>>. Many of them come in contact with fluids on a regular basis, so $he cleans them conscientiously.
-<br><br>
-As you watch $him, it occurs to you that since $activeSlave.slaveName isn't fully devoted to you yet, there's all manner of inventive ways you could have a little fun and increase $his submission to you at the same time.
-
-<<case "cumslut whore">>
-
-Late at night, <<= App.UI.slaveDescriptionDialog($activeSlave)>> returns to the living area of the penthouse. It's the end of $his day as a working girl, and despite being obviously tired, $he's smiling with obvious sexual satiation. Every so often, $he'll get a dreamy expression and lick $his lips. $He fetishizes cum to the extent that getting to eat a <<if $showInches == 2>>mile<<else>>kilometer<</if>> of dick really satisfies $him.
-
-<<case "loose buttslut">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> has a little free time this evening, so $he finds a quiet corner and engages in $his anal proclivities. Since $his asshole is so stretched out, $he sticks the base of a huge dildo to the ground and
-<<if $activeSlave.belly >= 100000>>
-	struggles to lower $his heavy, very gravid body down onto it,
-<<elseif $activeSlave.belly >= 10000>>
-	cautiously lowers $his <<if $activeSlave.bellyFluid >= 10000>><<print $activeSlave.inflationType>>-stuffed<<else>>very gravid<</if>> body on it,
-<<elseif $activeSlave.belly >= 5000>>
-	delicately lowers $his <<if $activeSlave.bellyFluid >= 5000>>bloated<<else>>gravid<</if>> body on it,
-<<else>>
-	squats on it,
-<</if>>
-moaning happily as the massive thing inches into $him. $He starts to slide up and down it <<if hasBothArms($activeSlave)>>hands-free<<else>>automatically<</if>>, so $he
-<<if canAchieveErection($activeSlave)>>
-	<<if $activeSlave.dick > 5>>
-		jacks off $his huge cock with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-	<<elseif $activeSlave.dick > 2>>
-		jacks off with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>.
-	<<elseif $activeSlave.dick > 0>>
-		rubs $his little penis with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>.
-	<</if>>
-<<elseif $activeSlave.dick > 5>>
-	massages $his huge, limp cock with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-<<elseif $activeSlave.dick > 2>>
-	attempts to jack off $his limp dick with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand while <<if $activeSlave.nipples != "fuckable">>pinching<<else>>fingering<</if>> a nipple with the other<</if>>.
-<<elseif $activeSlave.dick > 0>>
-	rubs $his little penis with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>.
-<<elseif $activeSlave.vagina == -1>>
-	rubs the sensitive area around $his asspussy with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>.
-<<else>>
-	rubs $his clit with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>.
-<</if>>
-As $he enjoys $himself, $his loose sphincter relaxes still further until it's barely gripping the dildo.
-
-<<case "hormone dysfunction">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you. You're busy with other things, so $he waits patiently even though $he's clearly very unhappy. Told to explain $himself, $he gestures at $his totally flaccid
-<<if !canTalk($activeSlave)>>
-	penis.
-<<else>>
-	<<if ($activeSlave.lips > 70)>>
-		penis and <<say>>s through $his huge lips,
-	<<elseif ($activeSlave.lipsPiercing + $activeSlave.tonguePiercing > 2)>>
-		penis and <<say>>s through $his piercings,
-	<<else>>
-		penis and <<say>>s,
-	<</if>>
-	"<<Master>>, I can't get it up."
-<</if>>
-Ever since the rules have permitted it, $activeSlave.slaveName has been a constant masturbator. If $he can help it, $he never sucks or gives up $his ass without a hand between $his legs, pumping away.
-<br><br>
-<<if !canTalk($activeSlave)>>
-	$He mimics masturbation and then traces a finger down $his cheek, as though it were a tear.
-<<else>>
-	"I can't come like thi<<s>>, <<Master>>."
-<</if>>
-It makes sense; $he's probably never masturbated without a hard dick. $He's clearly in desperate need of release, and more than a little sad the hormones $he's taking have given $him erectile dysfunction.
-
-<<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.
@@ -629,20 +414,6 @@ The showers your slaves use are well vented and transparent walled so that you c
 	<</if>>
 <</if>>
 
-<<case "devoted old">>
-
-At the end of a long week, <<= App.UI.slaveDescriptionDialog($activeSlave)>> moves past your office toward bed. This is completely normal part of the arcology routine, but you notice as $he passes that $he's wearing a preoccupied, almost sad expression. You call $him over, and $he makes a visible effort to brighten up as $he comes before you and asks your pleasure. You ask $him what's the matter, and $his face falls.
-<br><br>
-"<<Master>>, I'm <<s>>o <<s>>orry you noti<<c>>ed,"
-<<if ($activeSlave.lips > 70)>>
-	$he lisps through $his dick-sucking lips.
-<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-	$he lisps through $his ridiculous piercings.
-<<else>>
-	$he <<say>>s penitently.
-<</if>>
-"I'm feeling a little <<s>>tiff and tired, <<Master>>. I wi<<sh>> I wa<<s>> a little younger <<s>>o I could <<s>>erve you better, that'<<s>> all."
-
 <<case "tendon fall">>
 
 There is a horrible crash from the bathroom. You rush in to see <<= App.UI.slaveDescriptionDialog($activeSlave)>> curled up helplessly in the bottom of the shower with the water playing over $his <<if $activeSlave.belly >= 5000>><<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>><<else>>altered<</if>> body. $He takes off $his heels to shower, making $him unable to stand independently. Apparently, $he lost $his grip on the handrail while trying to soap $himself, and having fallen, can't seem to reach the rail to haul $himself up again. $He pleads<<if ($activeSlave.lips > 70)>> through $his huge lips<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>> through $his piercings<</if>>, "Help me, <<Master>>!"
@@ -702,526 +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 "huge tits">>
-
-There is a horrible crash from the shower. You rush in to see <<= App.UI.slaveDescriptionDialog($activeSlave)>> face-down and covered in soap. $He's uninjured, but $his tits are so huge that, soapy as $he is, $he can't seem to stand again. $His udders have $him pinned to the ground with $his legs sticking out of the shower. $He pleads
-<<if ($activeSlave.lips > 70)>>
-	through $his huge lips,
-<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-	through $his piercings,
-<<else>>
-	piteously,
-<</if>>
-"Help me, <<Master>>!"
-
-<<case "trusting HG">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is a busy $girl. Your Head Girl is heading for bed, but $he's not done with the day's work just yet. $He walks into your office with a pensive look on $his face, using a tablet to fiddle with slaves' schedules for tomorrow. Since $he was about to retire, $he's nude: you can't help but notice, in the dimmed light of nighttime in your penthouse, the way the low glow of the tablet
-<<if ($activeSlave.boobs > 5000)>>
-	falls across the tops of $his absurd boobs, since $he's forced to hold it on top of them to use it.
-<<elseif ($activeSlave.belly >= 10000)>>
-	falls across the top of $his <<print _belly>>, tautly <<if $activeSlave.belly >= 3000>>pregnant<<else>>swollen<</if>> belly.
-<<elseif !($activeSlave.chastityPenis) && canAchieveErection($activeSlave)>>
-	<<if ($activeSlave.dick > 4)>>
-		makes $his perpetual, formidable erection cast a shadow.
-	<<elseif ($activeSlave.dick > 2)>>
-		catches the head of $his stiffly erect dick.
-	<<else>>
-		highlights $his stiff little girldick.
-	<</if>>
-<<elseif ($activeSlave.nipples == "huge")>>
-	throws a shadow off each of $his massive nipples and down the lower halves of $his boobs.
-<<elseif ($activeSlave.belly >= 1500)>>
-	makes $his rounded middle cast a shadow.
-<<elseif ($activeSlave.muscles > 95)>>
-	gives extra definition to $his glorious muscles.
-<<elseif ($activeSlave.weight > 95)>>
-	highlights $his soft belly.
-<<elseif ($activeSlave.dick > 0)>>
-	rests on the base of $his soft cock.
-<<elseif ($activeSlave.weight > 10)>>
-	flatters $his soft body.
-<<else>>
-	flatters $him.
-<</if>>
-<br><br>
-$He did not expect to find you here, and is so preoccupied that $he doesn't notice you right away. When $he does, $he smiles. "Good evening,
-<<if $HGFormality == 1>>
-	<<Master>>,"
-	$he murmurs properly, and keeps working. Only a slight blush, barely detectable in the low light, betrays $his consternation at not greeting you immediately.
-<<elseif $activeSlave.trust > 95>>
-	<<if def $PC.customTitle>>
-		<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-			$PC.customTitleLisp,"
-		<<else>>
-			$PC.customTitle,"
-		<</if>>
-	<<elseif $PC.title != 0>>
-		<<S>>ir,"
-	<<else>>
-		Ma'am,"
-	<</if>>
-	$he murmurs. Even in the dim light, you perceive a slight blush of pleasure from $him as $he savors the status of being allowed to call you that. $He goes back to working with a little smile still playing across $his lips.
-<<else>>
-	um,
-	<<if def $PC.customTitle>>
-		<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-			$PC.customTitleLisp,"
-		<<else>>
-			$PC.customTitle,"
-		<</if>>
-	<<elseif $PC.title != 0>>
-		<<S>>-<<s>>ir,"
-	<<else>>
-		M-ma'am,"
-	<</if>>
-	$he stammers hesitantly. $He isn't comfortable with your permission to be less formal in private, and blushes furiously at $his awkwardness. $He takes refuge in $his tablet.
-<</if>>
-
-<<case "ignorant horny">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is first on the inspection schedule, and as you watch $him enter your office, you note several good signs about $his progress towards becoming a good sex slave. $He enters obediently, without pretending to be thrilled to be here, but also without hesitation. Best of all,
-<<if ($activeSlave.chastityPenis) && canAchieveErection($activeSlave)>>
-	$he's squirming with discomfort over the lack of room in $his chastity.
-<<elseif ($activeSlave.dick > 4) && canAchieveErection($activeSlave)>>
-	$he's sporting a massive half-erection which slaps lewdly against $his thighs as $he walks.
-<<elseif ($activeSlave.dick > 2) && canAchieveErection($activeSlave)>>
-	$his dick is half-erect, bobbing lewdly as $he walks.
-<<elseif ($activeSlave.dick > 0) && canAchieveErection($activeSlave)>>
-	$his pathetic little bitch dick is half-erect.
-<<elseif ($activeSlave.dick > 6)>>
-	$his enormous dick is slightly engorged and dripping precum.
-<<elseif ($activeSlave.dick > 0)>>
-	$his soft bitch dick is dripping precum.
-<<elseif ($activeSlave.labia > 1)>>
-	$his lovely pussylips are flushed and wet.
-<<elseif ($activeSlave.clit > 1)>>
-	$his glorious bitch button is stiffly erect.
-<<elseif ($activeSlave.vagina == -1)>>
-	$he's unconsciously sticking $his ass out. Getting fucked there is $his main sexual outlet, now that $he lacks genitals.
-<<else>>
-	$his pussy is flushed and moist.
-<</if>>
-<br><br>
-<<if ($activeSlave.aphrodisiacs > 0) || $activeSlave.inflationType == "aphrodisiac">>
-	The aphrodisiacs racing through $his system have $him desperate to get off, right now.
-<<elseif ($activeSlave.clitPiercing == 3) && ($activeSlave.clitSetting != "none")>>
-	$His <<if $activeSlave.vagina > -1>>clit<<else>>frenulum<</if>> piercing is keeping $his arousal exquisitely balanced for $his inspection.
-<<else>>
-	The mild aphrodisiacs in the slave food have clearly built up some arousal that $he hasn't been able to address recently.
-<</if>>
-$He hasn't been with you long; it's been a mere <<print $week-$activeSlave.weekAcquired>> weeks since $he became your slave. $He may not be fully cognizant of how $his libido is being altered. New slaves aren't informed of the true extent of your abilities to force sexual need. It can be useful for a new $girl to wonder if some of the horniness $he feels is natural, and suspect that $he's nothing but a dirty slut who deserves to be a sex slave.
-
-<<case "cage relief">>
-
-You come face to face with <<= App.UI.slaveDescriptionDialog($activeSlave)>> in a hallway of your penthouse, entirely by happenstance. <<if canSee($activeSlave)>>$His <<= App.Desc.eyesColor($activeSlave)>> lock with yours, and $he stares at you dumbly for a long moment<<else>>Once $he regains $his footing after bumping into you, $he gazes towards you dumbly for a long moment<</if>>. Then $he squares $his <<if $activeSlave.shoulders > 0>>broad<<elseif $activeSlave.shoulders < 0>>pretty<<else>>feminine<</if>> shoulders and bites $his lower lip, obviously doing $his best to think quickly. Right when you're about to reprimand $him for not greeting you properly, $he surprises you by throwing $himself abjectly on the ground in front of you<<if $activeSlave.belly >= 10000>>, $his rear forced into the air by $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>distended<</if>> belly<</if>>.
-<br><br>
-<<if !canTalk($activeSlave)>>
-	$He uses gestures to apologize for $his rudeness, and then gets to $his knee<<if hasBothLegs($activeSlave)>>s<</if>> so $he can use $his hand<<if hasBothArms($activeSlave)>>s<</if>> to gesture more clearly. $His <<if hasBothArms($activeSlave)>>hands are<<else>>hand is<</if>> shaky as $he begs, making two false starts before unmistakably gesturing to ask you to cut $his balls off. Once $he <<if canSee($activeSlave)>>sees<<else>>figures<</if>> that you understand, $he begins to cry openly. $He gestures that $he can barely get off wearing $his chastity cage, that it hurts when $he does, and that $he's constantly oppressed by the need for release. $He thinks that it would be easier to be soft all the time, so $he could climax without discomfort. $He begs hard, and promises to be a good little bitch.
-<<else>>
-	"Plea<<s>>e, <<Master>>," the prostrate slave <<say>>s shakily, sounding like $he's on the verge of tears. "P-plea<<s>>e cut my ball<<s>> off." <<if canHear($activeSlave)>>Hearing $himself <<say>> it, $he<<else>>$He<</if>> begins to cry openly. "I c-can't t-take it anymore. I can b-barely get off wearing thi<<s>> cage on my dick, and when I d-do, it h-hurt<<s>>," $he sobs. "I need to g-g-get off <<s>>-<<s>>o bad. Plea<<s>>e, plea<<s>>e, if I were <<s>>oft all the time, I wouldn't get hard, <<s>>o I could come wh-whenever." $He <<if canSee($activeSlave)>>looks up at<<else>>angles $his head towards you<</if>> you in supplication, tears streaking $his face. "Plea<<s>>e, <<Master>>! I'll be <<s>>-<<s>>uch a good little bitch, I promi<<s>>e!"
-<</if>>
-
-<<case "used whore">>
-
-<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-	<<set _slavename = lispReplace($activeSlave.slaveName)>>
-<<else>>
-	<<set _slavename = $activeSlave.slaveName>>
-<</if>>
-
-At the end of a long day, you take a moment to watch the comings and goings of your arcology to decompress. While doing so, you notice someone who's clearly had a longer day than you. <<= App.UI.slaveDescriptionDialog($activeSlave)>> is <<if $activeSlave.belly >= 5000>>slowly waddling, one hand under $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly and the other on the small of $his back,<<else>>making<</if>> $his tired way back to the kitchen for a meal and then bed after a long day of sex work. $He's stripped off $his soiled clothes already, and is clearly too tired to care about nudity at all.
-<br><br>
-$He comes around the corner and
-<<if ($PC.belly >= 100000)>>
-	slams into your massively distended belly, nearly knocking you over.
-<<elseif ($PC.belly >= 10000)>>
-	bumps into your heavily gravid middle.
-<<elseif ($PC.belly >= 5000)>>
-	bumps into your rounded middle.
-<<elseif ($PC.balls >= 14)>>
-	nearly knees your prominent testicles.
-<<elseif ($PC.boobs >= 800)>>
-	runs into your prominent rack.
-<<else>>
-	almost runs into you.
-<</if>>
-$He stops and <<if canSee($activeSlave)>>stares<<else>>faces you<</if>>, struggling to find the appropriate thing to say or do, but too exhausted to manage it. Even though $he's been obediently cleaning $himself between fucks, $he looks used up. $His $activeSlave.skin skin is reddened here and there.
-<<if $activeSlave.belly >= 750000>>
-	$His _belly belly is heavily bruised, the super-stretched skin nearly at its limit from the weight put on it and the forces pushing against it.
-<<elseif $activeSlave.belly >= 600000>>
-	$His _belly belly is deep red and heavily bruised; it's clear that at least one client roughly fucked $him over it.
-<<elseif $activeSlave.belly >= 450000>>
-	$His _belly belly looks extremely painful, it's obvious $he got fucked over it.
-<<elseif $activeSlave.belly >= 300000>>
-	$His _belly belly is black and blue, it's obvious $he got fucked over it.
-<<elseif $activeSlave.belly >= 150000>>
-	$His _belly belly is heavily chafed from rubbing the floor as $he struggled to keep $his weight off it.
-<<elseif $activeSlave.belly >= 100000>>
-	$His _belly belly is heavily chafed from rubbing against the floor.
-<<elseif $activeSlave.belly >= 10000>>
-	The tip of $his huge belly is chafed from rubbing against the floor.
-<</if>>
-<<if canDoVaginal($activeSlave)>> $His <<if ($activeSlave.labia > 1)>>generous<<else>>poor<</if>> pussylips are puffy, and you have no doubt $his vagina is quite sore.<</if>><<if canDoAnal($activeSlave)>> The awkward way $he's standing suggests that $his <<if ($activeSlave.anus > 2)>>gaping<<elseif ($activeSlave.anus > 1)>>big<<else>>tight<</if>> asshole has had more than one dick up it recently.<</if>>
-<<if $activeSlave.nipples != "fuckable">>
-	Even $his nipples are pinker than usual, having been cruelly pinched<<if $activeSlave.lactation > 0>> and milked<</if>>.
-	<<if $activeSlave.lactation > 0>>
-		<<set $activeSlave.lactationDuration = 2>>
-		<<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>>
-	<<else>>
-		<<= induceLactation($activeSlave, 2)>>
-	<</if>>
-<<else>>
-	Even $his nipples show signs of wear, having prolapsed slightly from heavy use.
-<</if>>
-
-<<case "desperately horny">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you, looking deeply unhappy and shivering occasionally.
-<<if ($activeSlave.rules.speech == "restrictive")>>
-	Since $he is not allowed to speak, $he just enters your office and stands there, unsure what to do.
-<<else>>
-	<<if !canTalk($activeSlave)>>
-		$He tries to communicate something with $his hand<<if hasBothArms($activeSlave)>>s<</if>>, but $he's so distracted $he can't manage it. $He starts to shake a little and gives up.
-	<<else>>
-		"<<Master>>, plea<<s>>e! Plea<<s>>e — I — plea<<s>>e, I need to — oh, <<Master>> —" $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps frantically<<else>>babbles<</if>>. $He starts to shake a little and lapses into silence.
-	<</if>>
-<</if>>
-The reason for $his distress is obvious:
-<<if ($activeSlave.chastityPenis == 1)>>
-	$his chastity cage is mostly solid, but it has a small hole below where the tip of $his dick is held, and this is dripping precum. $He's sexually helpless, and sexually overcharged to the point where $he's dripping more precum than a usual dickgirl might ejaculate normally.
-<<elseif ($activeSlave.dick > 0) && ($activeSlave.hormoneBalance >= 100) && !canAchieveErection($activeSlave)>>
-	though the hormones are keeping it soft, $his member is dripping a stream of precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm.
-<<elseif ($activeSlave.dick > 0) && $activeSlave.balls > 0 && $activeSlave.ballType == "sterile" && !canAchieveErection($activeSlave)>>
-	though $he's chemically castrated, $his soft member is dripping a stream of watery precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm.
-<<elseif ($activeSlave.dick > 0) && ($activeSlave.balls == 0) && !canAchieveErection($activeSlave)>>
-	though $he's gelded, $his soft member is dripping a stream of watery precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm.
-<<elseif ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-	though $he's far too large to get hard, $his engorged member is dripping a stream of watery precum; droplets of the stuff spatter the floor. One of $his spasms brushes the length of $his cock against $his thigh, and the stimulation almost brings $him to orgasm.
-<<elseif $activeSlave.dick > 4>>
-	$his gigantic member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm.
-<<elseif $activeSlave.dick > 2>>
-	$his impressive member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm.
-<<elseif $activeSlave.dick > 0>>
-	$his little member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm.
-<<elseif ($activeSlave.chastityVagina)>>
-	female juices are leaking out from behind $his chastity belt. $His cunt desperately wants to be fucked, and is dripping natural lubricant to ease penetration by cocks that cannot reach it through its protective shield.
-<<elseif $activeSlave.clit > 3>>
-	$his dick-like clit is painfully engorged and juts out massively. The stimulation of the air on $his clit keeps $him on the brink of orgasm.
-<<elseif $activeSlave.clit > 0>>
-	$his lovely clit is painfully engorged, and $his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $his clit brushing accidentally against $his hand, and the stimulation almost brings $him to orgasm.
-<<elseif $activeSlave.labia > 0>>
-	$his lovely pussylips are painfully engorged, and $his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $his generous labia brushing against $his thighs, and the stimulation almost brings $him to orgasm.
-<<elseif $activeSlave.vagina == -1>>
-	though $he has no external genitalia to display it, $he's flushed and uncomfortable, and is unconsciously presenting $his ass, since that's $his only real avenue to climax.
-<<else>>
-	$his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $him enough stimulation that it almost brings $him to orgasm.
-<</if>>
-<br><br>
-This is the result of not getting off for several days while on the slave diet provided by the nutritional systems. The mild aphrodisiacs included in $his food increase $his sex drive, and the increased libido can become cumulative if it's not regularly addressed. It looks like $he hasn't really gotten $hers in a couple of days, and the poor $girl can likely think of nothing but that. $He's so horny $he'll do anything for release. However, $he did come to you with $his trouble rather than masturbating illicitly.
-
-<<case "restricted profession">>
-
-<<set _shoutitoutloud = $enunciate.title.toUpperCase()>>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is <<if (!hasAnyLegs($activeSlave))>>sitting <<if (hasAnyArms($activeSlave))>>helplessly<<else>>limblessly<</if>><<elseif !canWalk($activeSlave)>>kneeling<<else>>standing<</if>> before your desk for $his regular inspection. $He is studiously observing the letter of the rule against speaking, and is doing $his best to make your inspection as efficient as possible. $His desire to please radiates off $him in almost palpable waves. $He obviously wants to communicate something to you, but can't do it without breaking the rules.
-
-<<case "mods please">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is such a good
-$desc
-that $he enjoys being inspected, even if the inspection doesn't immediately transition into sex. At the moment, $he's luxuriating under your gaze, eagerly offering the sight of every <<if $showInches == 2>>inch<<else>>centimeter<</if>> of $his nude body with you. $He is confident in $his appearance, and more than happy to share it.
-<br><br>
-<<if canSee($activeSlave)>>Seeing<<else>>Feeling<</if>> your intent gaze, $he
-<<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps<<else>>asks<</if>>, "<<Master>>, may I plea<<s>>e a<<s>>k you for <<s>>omething?"
-
-At your <<if canSee($activeSlave)>>nod<<else>>acknowledgment<</if>>, $he
-<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishKnown == 1)>>
-	gives a submissive shudder, and turns to show you $his bare back.
-	"<<Master>>, may I have a cor<<s>>et pier<<c>>ing? I would love to feel more, um, bound. Tied up. Plea<<s>>e?"
-	$He awaits your answer coquettishly, <<if canSee($activeSlave)>>$his <<= App.Desc.eyesColor($activeSlave)>> huge<<else>>a look of begging on $his face<</if>>.
-<<elseif ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishKnown == 1)>>
-	blows you a wet kiss.
-	"<<Master>>, may I have a tongue pier<<c>>ing? It would take my dick <<s>>ucking to the next level. Plea<<s>>e?"
-	$He sticks out $his tongue helpfully, leaving $his favorite fuckhole wide open so you can see down $his hungry throat.
-<<elseif ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishKnown == 1)>>
-	blushes with humiliation.
-	"<<Master>>, may I have a t-tattoo? L-like, on my fa<<c>>e. A mean one. Plea<<s>>e?"
-	$He hangs $his head.
-<<elseif ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>>
-	spins around to show off $his favorite fuckhole, bending over <<if $activeSlave.belly >= 5000>>as far as $he can with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>> belly in the way<<else>>farther than usual<</if>> to indicate the area between it and <<if $activeSlave.vagina > -1>>$his cunt<<elseif ($activeSlave.balls > 0) && ($activeSlave.scrotum > 0)>>$his ballsack<<elseif $activeSlave.dick == 0>>$his featurelessly smooth groin and its little cumhole<<else>>the base of $his soft bitchclit<</if>>.
-	"<<Master>>, may I have a pier<<c>>ing right here? Right below my butthole? It would keep me <<s>>o ready for a buttfuck. I mean, more than I already am. Plea<<s>>e?"
-	The shameless buttslut begins to wink $his asshole meaningfully.
-<<elseif ($activeSlave.fetish == "boobs") && ($activeSlave.fetishKnown == 1)>>
-	wiggles $his shoulders to give $his boobs some motion.
-	"<<Master>>, may I have <<s>>ome nipple pier<<c>>ings? It would be like having <<s>>omeone playing with my nipple<<s>>, but, like, all the time. Plea<<s>>e?"
-	$He starts to bounce flirtily.
-<<elseif ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1)>>
-	blushes suddenly and hangs $his head.
-	<<if $activeSlave.belly >= 10001>>
-		"<<Master>>, may I have a pier<<c>>ing? Right here? A big one?" $He indicates $his popped navel. "I feel it like it would get my belly more attention, plu<<s>> I'd hate to not take advantage of my new outie. Plea<<s>>e?
-	<<else>>
-		"<<Master>>, may I have a tattoo? Right here?" $He indicates $his <<if $activeSlave.belly > 1500>>rounded belly<<else>>abdomen<</if>>. "I would love an adverti<<s>>ement that I want to be, um, filled up.<<if $activeSlave.pregKnown == 1>>Well, when I'm empty again.<</if>> Plea<<s>>e?"
-	<</if>>
-	$He <<if canSee($activeSlave)>>looks<<else>>gazes<</if>> at you hopefully.
-<<elseif ($activeSlave.fetish == "dom") && ($activeSlave.fetishKnown == 1)>>
-	tosses $his head, a <<if canSee($activeSlave)>>gleam in $his eye<<else>>devious look on $his face<</if>>.
-	"<<Master>>, may I have a tattoo? Right here?" $He indicates $his eyebrow, temple, and cheek. "It would be cool if other girl<<s>> <<s>>aw me and were all, 'I'm about to get fucked.' Plea<<s>>e?"
-	$He smiles at you hopefully.
-<<elseif ($activeSlave.fetish == "sadist") && ($activeSlave.fetishKnown == 1)>>
-	tosses $his head, a <<if canSee($activeSlave)>>gleam in $his eye<<else>>malicious look on $his face<</if>>.
-	<<if canAchieveErection($activeSlave)>>
-		"<<Master>>, may I have a <<sh>>aft pier<<c>>ing? If I get to <<s>>tick it in another girl, I'd love to <<if canSee($activeSlave)>><<s>>ee her fa<<c>>e<<else>>feel her <<sh>>udder<</if>> when that extra little bit of metal <<s>>lide<<s>> in<<s>>ide $him. Plea<<s>>e?"
-	<<elseif $activeSlave.dick > 0>>
-		"<<Master>>, may I have a tongue pier<<c>>ing? If I get to eat another girl out, I'd love to li<<s>>ten to her <<s>>queal when that little bit of metal <<s>>crape<<s>> again<<s>>t her. Plea<<s>>e? Plea<<s>>e?"
-	<<else>>
-		"<<Master>>, may I have a labia pier<<c>>ing? If I get to trib another girl, I'd love to <<if canSee($activeSlave)>><<s>>ee her fa<<c>>e<<else>>feel her <<sh>>udder<</if>> when that little bit of metal grind<<s>> again<<s>>t her. Plea<<s>>e?"
-	<</if>>
-	$He shudders at the thought, <<if canSee($activeSlave)>>looking<<else>>gazing<</if>> at you hopefully.
-<<elseif ($activeSlave.fetish == "masochist") && ($activeSlave.fetishKnown == 1)>>
-	bites $his lower lip, looking aroused.
-	<<if $activeSlave.dick > 0>>
-		"<<Master>>, may I have a dick pier<<c>>ing? Right th-through my cock. Oh f-fuck it would hurt. Plea<<s>>e?"
-	<<else>>
-		"<<Master>>, may I have a pu<<ss>>y pier<<c>>ing? Right th-through me. Oh f-fuck it would hurt. Plea<<s>>e?"
-	<</if>>
-	$He shivers at the thought, <<if canSee($activeSlave)>>looking<<else>>gazing<</if>> at you hopefully.
-<<else>>
-	bats $his eyes at you, and turns halfway to display $his boobs in profile.
-	"<<Master>>, may I have my nipple<<s>> pier<<c>>ed? It'<<s>> <<s>>illy and girly, but I gue<<ss>> — I gue<<ss>> I'd like <<s>>omething <<s>>illy and girly. Plea<<s>>e?"
-	$He blushes prettily and <<if canSee($activeSlave)>>looks<<else>>gazes<</if>> at you hopefully.
-<</if>>
-
-<<case "dickgirl PC">>
-
-Having just enjoyed one of your slaves, you take a quick post-coital rinse in one of the showers scattered around the arcology for the purpose. Thus refreshed, you step out and come face to face with <<= App.UI.slaveDescriptionDialog($activeSlave)>>, who is going about $his assigned business. $His <<= App.Desc.eyesColor($activeSlave)>> lock with yours for a surprised moment, and then flick down submissively.
-<br><br>
-As $his gaze travels down your body towards the floor,
-<<if $activeSlave.attrXY <= 35>>
-	it lingers for a moment on your
-	<<if $PC.boobs >= 1400>>
-		enormous <<if $PC.boobsImplant > 0>>chest balloons<<else>>cow tits<</if>>
-	<<elseif $PC.boobs >= 1200>>
-		huge<<if $PC.boobsImplant > 0>>, clearly fake<<else>>, heavy<</if>> breasts
-	<<elseif $PC.boobs >= 1000>>
-		big<<if $PC.boobsImplant > 0>>, perky<</if>> breasts
-	<<elseif $PC.boobs >= 800>>
-		generous breasts
-	<<elseif $PC.boobs >= 650>>
-		handfilling breasts
-	<<elseif $PC.boobs >= 500>>
-		average breasts
-	<<elseif $PC.boobs >= 300>>
-		small breasts
-	<</if>>
-	before continuing to track downward. When it reaches your cock, still half-hard from the sex and the warm shower, $he stiffens with discomfort.
-<<else>>
-	$he averts $his eyes from your
-	<<if $PC.boobs >= 1400>>
-		enormous, bare <<if $PC.boobsImplant > 0>>chest balloons<<else>>cow tits<</if>>
-	<<elseif $PC.boobs >= 1200>>
-		huge, bare<<if $PC.boobsImplant > 0>>, clearly fake<<else>>, heavy<</if>> breasts
-	<<elseif $PC.boobs >= 1000>>
-		big, bare<<if $PC.boobsImplant > 0>>, perky<</if>> breasts
-	<<elseif $PC.boobs >= 800>>
-		generous, bare breasts
-	<<elseif $PC.boobs >= 650>>
-		handfilling, bare breasts
-	<<elseif $PC.boobs >= 500>>
-		average, bare breasts
-	<<elseif $PC.boobs >= 300>>
-		small, bare breasts
-	<</if>>
-	as best $he can, quickly looking farther down. $His gaze lingers for a moment on your cock, still half-hard from the sex and the warm shower, but $he's stiff with discomfort.
-<</if>>
-$He swallows uncomfortably, frozen in place and staring at the floor. $His eyes flick up again, stealing a glance at
-<<if $activeSlave.attrXY <= 35>>
-	your boobs and studiously avoiding your dick.
-<<else>>
-	your dick<<if $PC.balls >= 8>> and enormous testicles, while<<else>> and<</if>> studiously avoiding your boobs.
-<</if>>
-<<if !canTalk($activeSlave)>>
-	$He gestures a proper greeting, hands shaking with nervousness.
-<<else>>
-	"Um, hi, <<Master>>," $he <<say>>s nervously.
-<</if>>
-<<if $activeSlave.attrKnown != 1>>
-	<br><br>
-	Just like that, the existing mystery about $his feelings about girls and guys is @@.lightcoral;cleared up.@@
-	<<set $activeSlave.attrKnown = 1>>
-<</if>>
-
-<<case "resistant anal virgin">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> has never had anything significant up $his ass. Living in $arcologies[0].name, $he can't have missed that anal sex is a part of most slaves' lives. $He <<if canSee($activeSlave)>>witnesses<<elseif canHear($activeSlave)>>hears<<else>>thinks about<</if>> sodomy several times a day, at least.
-<br><br>
-Lately, you've noticed that $he reacts to these <<if canSee($activeSlave)>>sights<<elseif canHear($activeSlave)>>sounds<<else>>thoughts<</if>> with a well-concealed flash of apprehension. It seems $he's figured out that $he will probably be required to take it up $his little <<if $seeRace == 1>>$activeSlave.race <</if>>butt someday, and isn't enthusiastic about the prospect. You could probably exploit this.
-
-<<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 "sleeping ambivalent">>
-
-Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex. <<= App.UI.slaveDescriptionDialog($activeSlave)>> catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. $He probably went to sleep with $his sheet pulled up to $his chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but $he's shrugged it down. Half $his torso is bare.
-<br><br>
-The dim blue light plays across $his $activeSlave.skin skin. <<if $activeSlave.boobs > 2000>>$His massive boob on that side is slightly shifted by each breath<<elseif $activeSlave.boobs > 800>>$His breast on that side rises and falls with each breath<<else>>That side of $his chest rises and falls with each breath<</if>>.
-<<if $activeSlave.belly >= 5000>> $His _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly is only partially covered by the sheet, leaving most of it visible.<</if>>
-$He's sleeping soundly, $his breaths coming deep and slow. Most slaves where $he is mentally are troubled by bad dreams, but the poor $girl is evidently too tired for that.
-
-<<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>>
@@ -1356,29 +607,6 @@ Coming to a stop, $he <<if $activeSlave.height > 190>>bends the long, long way d
 	"I love you, <<Master>>," $he whispers.
 <</if>>
 
-<<case "bad dream">>
-
-Passing near the slave dormitory late at night, you hear a quiet cry within. This is strange; most slaves housed there are not inclined or not allowed to have sex in the middle of the night, and in any case, the noise wasn't one of pleasure. Looking in, you see a jerky movement near the door. It's <<= App.UI.slaveDescriptionDialog($activeSlave)>>, and $he's obviously having a bad dream. $He raises <<if hasBothArms($activeSlave)>>an<<else>>$his<</if>> arm to fend off some imagined danger, and in doing so, pushes the sheet down around $his waist. $He sleeps naked, like all your slaves, and the movement bares $his <<if $activeSlave.boobs > 2000>>udders<<elseif $activeSlave.boobs > 1000>>heavy breasts<<elseif $activeSlave.boobs > 400>>boobs<<else>>little tits<</if>><<if $activeSlave.belly >= 5000>> and _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>> to the cool night air. The low blue light outlines $his nipples as they <<if $activeSlave.nipples != "fuckable">>stiffen<<else>>swell<</if>> at the sudden change of temperature,
-<<switch $activeSlave.nipples>>
-<<case "tiny">>
-	pricking up into little buds.
-<<case "flat">>
-	becoming visible against $his areolae.
-<<case "puffy">>
-	the puffy promontories jutting even farther out.
-<<case "partially inverted">>
-	just starting to poke past their inversion.
-<<case "inverted">>
-	the twin domes formed by their inverted shapes becoming more prominent.
-<<case "huge">>
-	becoming so large they cast long shadows across $his bed.
-<<case "fuckable">>
-	the fuckable holes steadily closing and starting to poke outwards.
-<<default>>
-	becoming attractively erect.
-<</switch>>
-Still dreaming, $he clasps $his arm<<if hasBothArms($activeSlave)>>s<</if>> protectively over $his <<if $activeSlave.pregKnown == 1>>unborn child<<if $activeSlave.pregType > 1>>ren<</if>><<else>>vulnerable chest<</if>>, and rolls to one side. Halfway into a fetal position, $he turns $his head against $his pillow, murmuring "N-no — plea<<s>>e no — I'll d-do anyth-thing — no..."
-
 <<case "shower slip">>
 
 <<= App.UI.slaveDescriptionDialog($activeSlave)>> finishes $his morning shower and sleepily turns to dry off. $He slips a little on the moist bathroom floor, trips over $his own feet, and starts to stumble. $His fall is immediately arrested as $he's caught by a pair of strong<<if $PC.title == 0>> yet feminine<</if>> arms. Coming to rest against
@@ -1984,265 +1212,9 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 
 <<switch $RESSevent>>
 
-<<case "first period">>
+<<case "surprising wakeup">>
 
-<<link "Explain $he's just becoming a woman">>
-	<<replace "#result">>
-		You tell $him that $he is just undergoing $his first period, and that the pain $he is feeling is perfectly natural.
-		<<if !canTalk($activeSlave)>>
-			$He brings $his hands back to $his stomach, an elated look on $his face. $He makes a gesture resembling a rounded belly.
-		<<else>>
-			"I-I'm a woman now? <<Master>>, that m-mean<<s>>, I can get pregnant now." $He trails off.
-		<</if>>
-		Whether or not $he gets pregnant is for you to decide, but for now you tell $him what $he should expect to change, both in and to $his body. $activeSlave.slaveName @@.mediumaquamarine;appreciates@@ you taking the time to explain $his developing body.
-		<<set $activeSlave.trust += 5>>
-	<</replace>>
-<</link>>
-<<if ($PC.dick != 0) && ($activeSlave.eggType == "human")>>
-	<br><<link "Demonstrate what this means">>
-		<<replace "#result">>
-			You tell $him that $he is just becoming a woman, and to celebrate, you are going to put a child in $him.
-			<<if !canTalk($activeSlave)>>
-				$He gasps and rubs a hand across $his stomach.
-			<<else>>
-				"But I'm <<s>>till a child my<<s>>elf, <<Master>>, I can't get pregnant yet!"
-			<</if>>
-			You tell $him that prior to this week, that would have been true. However, now that $he has become fertile, it's time that $he learned what $his body was made for. You guide $him to the couch and tell $him to lie on $his back so that you may take $him. $He breaks down when $he feels your cock enter $his
-			<<if $activeSlave.vagina == 0>>
-				delightfully tight, virgin
-			<<elseif $activeSlave.vagina == 1>>
-				deliciously tight
-			<<elseif $activeSlave.vagina == 2>>
-				well experienced
-			<<else>>
-				fucked-out
-			<</if>>
-			cunt. $His new urges cause $him to reach up to hug $himself close to you,
-			<<if ($activeSlave.boobs < 600)>>
-				$his modest breasts let $him snuggle close to you, face-to-face, as you take $him.
-			<<elseif ($activeSlave.boobs < 10000)>>
-				$his big tits form a soft cushion between you as you take $him.
-			<<else>>
-				$his massive tits stop $him from bringing $himself too close to you as you take $him.
-			<</if>>
-			$He enjoys $himself immensely, but $he loses it again when $he feels your seed in $him, realizing that $he will find $himself swelling with your child over the coming months. $He has become @@.hotpink;more submissive@@ to your will now that $his very first egg has been fertilized by $his <<= getWrittenTitle($activeSlave)>>.
-			<<set $activeSlave.devotion += 5, $activeSlave.preg = 1, $activeSlave.pregWeek = 1, $activeSlave.pregKnown = 1, $activeSlave.pregSource = -1>>
-			<<set $activeSlave.pregType = setPregType($activeSlave)>>
-			<<set WombImpregnate($activeSlave, $activeSlave.pregType, -1, 1)>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>>
-<</if>>
-<br><<link "Tell $him $he'll just be taking it up the ass more">>
-	<<replace "#result">>
-		In one swift motion, you pull out a chastity belt and lock it onto $him. $He gasps as $he feels it hug close to $his pussy. You explain that $he has just become a woman, and thus, will be taking it up the ass until you decide it's time for $him to become pregnant.
-		<<if !canTalk($activeSlave)>>
-			$He rubs a hand across $his stomach.
-		<<else>>
-			"You don't want me to get pregnant, <<Master>>?"
-		<</if>>
-		You bring $him over to the couch, set $him on your lap, and teasingly call $him a buttslut. Every so often you graze a finger around $his chastity belt, noting how much $his body wants you in $him, but you only make it the center of attention once the poor over-aroused slave
-		<<if !canTalk($activeSlave)>>
-			begins to use piteous gestures to beg you abjectly to penetrate $him.
-		<<else>>
-			<<say>>s, "I can't take it any more, <<Master>>! Plea<<s>>e fuck me pregnant!"
-		<</if>>
-		You snicker, but remind $him that no matter how much $he wants to be knocked up, $his belt will direct all the dicks $he takes into $his rear. You line up and insert your <<if ($PC.dick == 0)>>strap-on<<else>>cock<</if>> with $his ass and begin fucking $him, all the while reminding $him that $he will not be getting pregnant. When $he finally orgasms, <<if ($PC.dick == 0)>>$his unabashed enjoyment<<else>>the strength of $his spasming sphincter<</if>> sends you over as well. $He's left in a confused haze; $his body tells $him to get pregnant, but you tell $him to take it anally. $He @@.hotpink;sides with your decision@@ and vows to be an anal whore for you. <<if $activeSlave.fetish == "none">>@@.coral;Overcoming $his urges to become a mother via anal causes $him to become a buttslut.@@<<set $activeSlave.fetish = "buttslut", $activeSlave.fetishStrength = 10>><</if>>
-		<<set $activeSlave.devotion += 5, $activeSlave.chastityVagina = 1>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his virginity//<</if>>
-
-<<case "wet dreams">>
-
-<<link "Explain $he's just growing up">>
-	<<replace "#result">>
-		You tell $him that $his body is preparing to be able to impregnate girls, and that what happens at night happens to all boys. Though as a slave, $he should consider $himself lucky to be allowed to keep $his male genitalia.
-		<<if !canTalk($activeSlave)>>
-			$He brings $his hands to $his growing erection, a bubble of precum forming on its tip. $He fondles $himself as $he ponders $his new potency.
-		<<else>>
-			"I-I can get girl<<s>> pregnant now? <<Master>>, that m-mean<<s>> I'll have to be more careful." $He trails off.
-		<</if>>
-		You tell $him to keep $his dick in check or risk losing it, before continuing to read off the other various changes that will occur in $him. $activeSlave.slaveName @@.mediumaquamarine;appreciates@@ you taking the time to explain $his developing body.
-		<<set $activeSlave.trust += 5>>
-	<</replace>>
-<</link>>
-<br><<link "Teach $him $his place">>
-	<<if $PC.dick == 0>>
-			<<replace "#result">>
-			You tell $him that $he is just becoming a potent $woman, and as such, $he will need to learn that you are the dominant force in $his life.
-			<<if !canTalk($activeSlave)>>
-				$His expression shifts to confusion.
-			<<else>>
-				"What doe<<s>> that mean, <<Master>>?"
-			<</if>>
-			You quickly approach and catch $him, forcing $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid <<else>>distended <</if>><</if>>body face-up onto the couch. $He <<if canSee($activeSlave)>>watches you carefully<<elseif canHear($activeSlave)>>listens to your movements<<else>>waits with trepidation<</if>> as you size up $his fully erect
-			<<if $activeSlave.dick == 1>>
-				tiny dick.
-			<<elseif $activeSlave.dick == 2>>
-				cute dick.
-			<<elseif $activeSlave.dick == 3>>
-				dick.
-			<<elseif $activeSlave.dick == 4>>
-				big dick.
-			<<elseif $activeSlave.dick == 5>>
-				impressive dick.
-			<<elseif $activeSlave.dick == 6>>
-				huge dick.
-			<<elseif $activeSlave.dick == 7>>
-				gigantic dick
-			<<elseif $activeSlave.dick == 8>>
-				titanic dick
-			<<elseif $activeSlave.dick == 9>>
-				absurd dick
-			<<elseif $activeSlave.dick == 10>>
-				inhuman dick
-			<<else>>
-				hypertrophied dick
-			<</if>>
-			You push $him back down as you straddle $his
-			<<if $activeSlave.belly >= 1500>>
-				_belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly
-			<<elseif $activeSlave.boobs > 2000>>
-				huge tits
-			<<else>>
-				chest
-			<</if>>
-			planting your moistening pussy over the $girl's face. You lean forward, teasing $his twitching cock, as you grind against $his face. As $he begins to moan with lust, you quickly bind the base of $his penis, denying $his release. You grind your cunt into $his face, telling $him that YOU are the one who'll be orgasming here, not $him. Only once you have taught $him $his place by soaking $his face in your cum do you release $his dick and lean back to avoid the coming blast. Just undoing the binding is enough to set $him over the edge, coating $his <<if $activeSlave.bellyPreg >= 1500>>pregnancy<<else>>belly<</if>> in $his virile sperm. You turn around and order the exhausted $girl to clean $himself up and go back to $his assignment; $he @@.hotpink;complies meekly,@@ understanding that having a potent penis is meaningless in $his position.<<if $activeSlave.fetish == "none">>The next time $he walks past your office, you can't help notice the growing erection $he carries. @@.coral; Your dominating display has left $him craving domination.@@<<set $activeSlave.fetish = "submissive", $activeSlave.fetishStrength = 10>><</if>>
-			<<set $activeSlave.devotion += 5>>
-		<</replace>>
-	<<else>>
-		<<replace "#result">>
-			You tell $him that $he is just becoming a potent $woman, and as such, $he will need to learn that you are the dominant force in $his life.
-			<<if !canTalk($activeSlave)>>
-				$His expression shifts to confusion.
-			<<else>>
-				"What doe<<s>> that mean, <<Master>>?"
-			<</if>>
-			You quickly approach and catch $him, forcing $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid <<else>>distended <</if>><</if>>body face-down onto the couch<<if $activeSlave.belly >= 100000>> as best you can<</if>>. $He <<if canSee($activeSlave)>>watches you carefully<<else>>listens to your movements<</if>> as you size up $his fully erect
-			<<if $activeSlave.dick == 1>>
-				tiny dick.
-			<<elseif $activeSlave.dick == 2>>
-				cute dick.
-			<<elseif $activeSlave.dick == 3>>
-				dick.
-			<<elseif $activeSlave.dick == 4>>
-				big dick.
-			<<elseif $activeSlave.dick == 5>>
-				impressive dick.
-			<<elseif $activeSlave.dick == 6>>
-				huge dick.
-			<<elseif $activeSlave.dick == 7>>
-				gigantic dick
-			<<elseif $activeSlave.dick == 8>>
-				titanic dick
-			<<elseif $activeSlave.dick == 9>>
-				absurd dick
-			<<elseif $activeSlave.dick == 10>>
-				inhuman dick
-			<<else>>
-				hypertrophied dick
-			<</if>>
-			You push $his face into the cushions as you mount $his
-			<<if $activeSlave.butt > 6>>
-				ridiculous
-			<<elseif $activeSlave.butt > 5>>
-				gigantic
-			<<elseif $activeSlave.butt > 4>>
-				enormous
-			<<elseif $activeSlave.butt > 3>>
-				huge
-			<<elseif $activeSlave.butt > 2>>
-				big
-			<<elseif $activeSlave.butt > 1>>
-				plump
-			<<elseif $activeSlave.butt > 0>>
-				small
-			<<else>>
-				flat
-			<</if>>
-			butt, sinking your cock deep into $his <<if $activeSlave.anus == 0>>virgin<</if>> asspussy. You lean forward, running your hands across $his nipples<<if $activeSlave.belly >= 5000>> and _belly <<if $activeSlave.belly >= 3000>>pregnant <</if>>belly<</if>> as you move to tease $his stiff prick. Between your dick in $his ass and your hand on $his cock, $he rapidly approaches $his peak. Quickly, you bind the base of $his penis, denying $his release and eliciting a long moan from the pent-up $girl. You begin thrusting hard, telling $him that YOU are the one who'll be orgasming here, not $him. Only once you have taught $him $his place by filling $his asspussy with your cum do you allow $his release. Just undoing the binding is enough to set $him over the edge, coating the cushions<<if $activeSlave.belly >= 5000>> and the bottom of $his _belly <<if $activeSlave.belly >= 3000>>pregnant <</if>>belly<</if>> in $his virile sperm. You dismount and order the exhausted $girl to clean $himself and the couch up before going back to $his assignment; $he @@.hotpink;complies meekly,@@ understanding that having a potent penis is meaningless in $his position.<<if $activeSlave.fetish == "none">>The next time $he walks past your office, you can't help notice the growing erection $he carries. @@.coral;Your dominating display has left $him craving domination.@@<<set $activeSlave.fetish = "submissive", $activeSlave.fetishStrength = 10>><</if>>
-			<<set $activeSlave.devotion += 5>>
-		<</replace>>
-	<</if>>
-<</link>><<if ($activeSlave.anus == 0) && ($PC.dick != 0)>> //This option will take $his anal virginity//<</if>>
-<<if $PC.vagina > 0>>
-	<br><<link "Let me teach you how to use it">>
-		<<replace "#result">>
-			You tell $him that $he is just becoming a potent $woman, and as such, $he will need to learn how to please $his partners.
-			<<if !canTalk($activeSlave)>>
-				$His expression shifts to confusion.
-			<<else>>
-				"What'<<s>> that mean, <<Master>>?"
-			<</if>>
-			You quickly approach and catch $him, forcing $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid <<else>>distended <</if>><</if>>body face-up onto the couch. $He <<if canSee($activeSlave)>>watches you carefully<<elseif canHear($activeSlave)>>listens to your movements<<else>>waits with trepidation<</if>> as you size up $his fully erect
-			<<if $activeSlave.dick == 1>>
-				tiny dick.
-			<<elseif $activeSlave.dick == 2>>
-				cute dick.
-			<<elseif $activeSlave.dick == 3>>
-				dick.
-			<<elseif $activeSlave.dick == 4>>
-				big dick.
-			<<elseif $activeSlave.dick == 5>>
-				impressive dick.
-			<<elseif $activeSlave.dick == 6>>
-				huge dick.
-			<<elseif $activeSlave.dick == 7>>
-				gigantic dick
-			<<elseif $activeSlave.dick == 8>>
-				titanic dick
-			<<elseif $activeSlave.dick == 9>>
-				absurd dick
-			<<elseif $activeSlave.dick == 10>>
-				inhuman dick
-			<<else>>
-				hypertrophied dick
-			<</if>>
-			You push $him back down as you straddle $his cock, lining it up before lowering <<if $PC.belly >= 1500>>your pregnant body until $he delightfully penetrates you<<else>>yourself onto $his needy prick<</if>>. You slowly ride $his dick, instructing $him the proper way to thrust into you and how to adequately support your weight. Once $he gets the hand of things, you dismount and lie down on the couch, legs spread, beckoning $him into you. $He gingerly inserts $his cock<<if $activeSlave.belly >= 100000>> while you do your best to manage $his _belly stomach<</if>> and begins thrusting, slowly at first, before getting the hang of things and speeding up<<if $PC.dick != 0>>, your own neglected dick bobbing along to $his thrusts<</if>>. As soon as you feel $his beginning to tense you <<if $PC.pregKnown == 1>>tell $him it's safe to cum in you, you're already pregnant<<else>>order $him to pull out<</if>>. The poor $girl is so caught up in $his lust, $he can't stop thrusting. Before you can rectify this, $he pushes you over the edge and gushes deep into you as you climax<<if $PC.dick != 0>> and spray your own cum <<if $PC.belly >= 5000 && $activeSlave.belly >= 5000>>into the cramped space between your swollen bodies<<elseif $activeSlave.belly >= 100000>>across your belly and the underside of $hers<<else>>across $his chest<</if>><</if>>. $He gingerly pulls $himself from you, apologizes @@.hotpink;meekly@@ for losing control, and snuggles up next to you. Cumming in $his <<= getWrittenTitle($activeSlave)>>'s pussy as $his first time builds @@.mediumaquamarine;a special bond@@ with you.
-			<<if $PC.preg == 0 && $PC.pregWeek == 0>>
-				You aren't on contraceptives right now; $his first time may be more fruitful than $he realizes.
-			<</if>>
-			<<set $activeSlave.devotion += 10, $activeSlave.trust += 20>>
-			<<run seX($activeSlave, "penetrative", $PC, "vaginal")>>
-			<<if canImpreg($PC, $activeSlave)>>
-				<<= knockMeUp($PC, 60, 0, $activeSlave.ID)>>
-			<</if>>
-		<</replace>>
-	<</link>> //This option will penetrate you//
-<</if>>
-<br><<link "Tell $him it doesn't matter, $he won't be using it">>
-	<<replace "#result">>
-		In one swift motion, one pull out a chastity cage and lock it onto $him. $He gasps as $he feels it hug close to $his struggling erection. You explain that $he has just become potent, and thus, will be restricted until you feel differently.
-		<<if !canTalk($activeSlave)>>
-			$He rubs a hand across $his caged dick.
-		<<else>>
-			"You don't want me to u<<s>>e my peni<<s>>, <<Master>>?"
-		<</if>>
-		You bring $him over to the couch, set $him on your lap, and teasingly call $him a buttslut. Every so often you graze a finger around $his chastity cage, torturing $his dick and balls, but you only make it the center of attention once the poor over-aroused slave
-		<<if !canTalk($activeSlave)>>
-			begins to use piteous gestures to beg you abjectly to penetrate $him.
-		<<else>>
-			begs, "I can't take it any more, <<Master>>! Plea<<s>>e fuck me!"
-		<</if>>
-		You snicker, but remind $him that $he has no say in $his release. You line up and insert your <<if ($PC.dick == 0)>>strap-on<<else>>cock<</if>> up $his ass and begin slowly fucking $him, making sure to stimulate $his prostate. When $he finally orgasms <<if ($PC.dick == 0)>>$his unabashed enjoyment<<else>>the strength of $his spasming sphincter<</if>> sends you over as well. $He's left in a confused haze; $his body tells $him to fuck, but you tell $him to get fucked. $He @@.hotpink;sides with your decision@@ and vows to be the one taking dick for you. <<if $activeSlave.fetish == "none">>@@.coral;Overcoming $his urges to become a father via anal cause $him to become a buttslut.@@<<set $activeSlave.fetish = "buttslut", $activeSlave.fetishStrength = 10>><</if>>
-		<<set $activeSlave.devotion += 5, $activeSlave.chastityPenis = 1>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<<if $seeExtreme == 1 && $activeSlave.indentureRestrictions <= 0>>
-	<br><<link "Geld $him to render $him impotent again">>
-		<<set $activeSlave.balls = 0, $activeSlave.trust -= 20>>
-		<<run surgeryDamage($activeSlave, 10)>>
-		<<replace "#result">>
-			You bluntly tell $him $he is becoming potent, and that is something you can't allow to roam unchecked amongst your fertile slaves. You drag $him to the remote surgery and strap $him face-down with $his legs spread <<if $activeSlave.belly >= 5000>>$his _belly rounded belly forcing $his rear into the air<</if>>. $He doesn't understand what's happening, since the anesthetics totally deprive $him of any sensation. $He's so drugged and drowsy with @@.health.dec;surgical recovery@@ that it takes a while for $him to figure out what's happened. When $he does, $his poor mind scarcely processes the @@.gold;horror@@ of what's happened. $He numbly carries on, terrified.
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "surprising wakeup">>
-
-<<link "Permit $him to continue">>
+<<link "Permit $him to continue">>
 	<<replace "#result">>
 		You can't complain, it feels really good. You don't know where this skill was lurking in $his broken mind, but you're glad to see it put to good use. <<if $PC.dick != 0>>Just as you are about to cum, $he takes the full length of your dick down $his throat, diligently taking in every drop of cum<<else>>Even as you buck with pleasure, $he diligently keeps $his tongue to your clit and pussy, making sure you don't go a moment without pleasure<</if>>. You don't have an orgasm like that every day, and as $he looks at you lovingly, you prod $him with your still hard <<if $PC.dick != 0>>cock<<else>>clit<</if>> for round two.
 		$He is @@.green;no longer mindbroken@@ and for whatever twisted reasons deeply and sincerely @@.hotpink;loves@@ and @@.mediumaquamarine;trusts@@ you.
@@ -3073,4912 +2045,449 @@ $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 "sore ass">>
-
-<<link "Punish $his ass for insolence">>
-	<<replace "#result">>
-		You inform $him sternly that you will ensure that $he is not permanently damaged, and that otherwise, $he is to take anal pain like a good buttslave. $He starts to beg and whine as you lean back in your chair and <<if $PC.dick == 0>>hold $him upside down on your chest so $he can lick your pussy while you use a dildo on $his ass.<<else>>set $him on your chest before reaching around to line your cock up with $his sore hole. $He shudders and writhes when you start pushing yourself inside.<</if>> You use hard pinches to $his nipples to punish $his whining, forcing $him to take a long, painful buttfuck in silence. @@.gold;$He has become more afraid of you.@@
-		<<if ($activeSlave.anus < 3)>>$His week of tough anal experience has @@.lime;permanently loosened $his anus.@@<<set $activeSlave.anus += 1>><</if>>
-		<<set $activeSlave.trust -= 5>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>>
-<br><<link "Give $him some care">>
-	<<replace "#result">>
-		$He's filled with anxiety as you
-		<<if $activeSlave.belly < 1500>>
-			lay $him face-down on your desk,
-		<<else>>
-			direct $him to lay on $his side on your desk<<if $activeSlave.belly >= 300000>> with $his _belly belly hanging over the edge<</if>>,
-		<</if>>
-		but is surprised and reassured when $he's penetrated not by a <<if $PC.dick == 0>>strap-on<<else>>turgid<<if $PC.vagina != -1>> futa<</if>> cock<</if>> but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get $his butt back into fucking shape. @@.mediumaquamarine;$He has become more accepting of anal slavery,@@ and @@.health.inc;$his asshole feels better.@@
-		<<if ($activeSlave.anus > 2)>>Your expert care has @@.orange;allowed $his loose asspussy to recover a little of its natural shape and size.@@<<set $activeSlave.anus -= 1>><</if>>
-		<<set $activeSlave.trust += 4, $activeSlave.minorInjury = 0>>
-	<</replace>>
-<</link>>
-
-<<case "resistant shower">>
+<<case "shift sleep">>
 
-<<link "Enter the shower and quietly comfort $him">>
-	<<replace "#result">>
-		$He starts with surprise <<if canSee($activeSlave)>>as you enter the shower<<elseif canHear($activeSlave)>>as $he hears you enter the shower<<else>>as $he feels the water being disturbed by your body<</if>>, and then <<if canSee($activeSlave)>>looks at<<else>>turns to<</if>> you in shock as you sit down beside $him, ignoring the water soaking your clothes. $He does not resist when you draw $him gently into your lap. $He's stiff and uncomfortable as you hold $him gently, but $he eventually relaxes and allows $his head to rest <<if ($PC.boobs >= 300)>>between your breasts<<else>>against your shoulder<</if>>. $He's utterly conflicted; the hateful person who $he is expected to fuck is tenderly comforting $him. $He finally seems to accept the animal comfort, whatever its source, and begins to @@.mediumaquamarine;trust@@ you to do more than just use $him.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Talk through $his problems with $him">>
+<<link "Relaxed sex">>
 	<<replace "#result">>
-		You enter the bathroom and quietly wait until $he's done. When the water shuts off, $he stands up absently and spins so the shower's air dry function can blow the water off $him. (You can't help but notice
-		<<if ($activeSlave.weight > 30)>>
-			a lot of motion across $his
-			<<if $activeSlave.weight > 190>>
-				expansive
-			<<elseif $activeSlave.weight > 130>>
-				fat
-			<<elseif $activeSlave.weight > 95>>
-				thick
-			<<else>>
-				chubby
-			<</if>>
-			body when the air jets play across $him.)
-		<<elseif ($activeSlave.belly >= 5000)>>
-			how firm $his _belly belly is.)
-		<<elseif ($activeSlave.dick > 1)>>
-			$his soft cock flop around as one of the air jets strikes it.)
+		You flip the sheet off your naked body, revealing your already <<if $PC.dick == 0>>wet pussy<<else>>stiff prick<<if $PC.vagina != -1>> and the wet pussy below it<</if>><</if>>. $He slides $himself down, pressing $his
+		<<if ($activeSlave.boobs > 2000)>>
+			ridiculous tits
 		<<elseif ($activeSlave.boobs > 800)>>
-			<<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>>
-				how $his fake tits refuse to jiggle under the air jets.)
-			<<else>>
-				how the air jets produce a lot of delectable jiggling when they strike $his boobs.)
-			<</if>>
-		<<elseif ($activeSlave.butt > 4)>>
-			how $he has to spread $his big buttcheeks to let an air jet dry between them.)
-		<<elseif ($activeSlave.labia > 0)>>
-			how one of the air jets creates some motion in $his generous labia.)
-		<<elseif ($activeSlave.muscles > 5)>>
-			how the air jets make $his taut abs look even more impressive.)
-		<<else>>
-			$his nipples <<if $activeSlave.nipples != "fuckable">>stiffen<<else>>engorge<</if>> under the air jets.)
-		<</if>>
-		As $he rotates, <<if canSee($activeSlave)>>$he notices you with a start and looks concerned, but you do your best to look reassuring and beckon<<else>>you gently call $his name. $He jumps at the sound of your voice and looks concerned, but you do your best to calm $him and gingerly coax<</if>> $him out of the shower.
-		<br><br>
-		You ask $him what's troubling $him, and the look of concern returns. Suspecting that $he's afraid of telling the truth, you gently encourage $him to be honest, and assure $him that you're simply taking an interest in $his well-being. $He still hesitates, but eventually sniffles a little and
-		<<if !canTalk($activeSlave)>>
-			reluctantly gestures,
-		<<elseif SlaveStatsChecker.checkForLisp($activeSlave)>>
-			lisps,
-		<<else>>
-			admits,
-		<</if>>
-		<<if ($activeSlave.sexualFlaw == "hates oral") && ($activeSlave.counter.oral > 0)>>
-			"It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting fa<<c>>efucked."
-		<<elseif ($activeSlave.sexualFlaw == "hates anal") && ($activeSlave.counter.anal > 0)>>
-			"It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting a<<ss>>raped."
-		<<elseif ($activeSlave.sexualFlaw == "hates penetration") && ($activeSlave.counter.anal > 0)>>
-			"It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting fucked."
-		<<elseif ($activeSlave.behavioralFlaw == "hates women")>>
-			"<<S>>orry, <<Master>>. I ju<<s>>t h-hate girl<<s>>. They're gro<<ss>>."
-		<<elseif ($activeSlave.behavioralFlaw == "hates men")>>
-			"<<S>>orry, <<Master>>. I ju<<s>>t h-hate cock<<s>>. I don't want to <<s>>ee another one, ever again."
-		<<elseif ($activeSlave.sexualFlaw == "idealistic") && ($activeSlave.counter.oral > 0 || $activeSlave.counter.anal > 0 || $activeSlave.counter.vaginal > 0 || $activeSlave.counter.mammary > 0)>>
-			"I feel like I'm going cra<<z>>y, <<Master>>. No one here <<s>>eem<<s>> to know that rape i<<s>> wrong. Th-they ju<<s>>t r-rape me."
-		<<elseif ($activeSlave.sexualFlaw == "shamefast")>>
-			"I want to cover my<<s>>elf <<s>>o badly, <<Master>>. I'm <<s>>o embarra<<ss>>ed all the time. I'm <<s>>o tired of being embarra<<ss>>ed."
-		<<elseif ($activeSlave.sexualFlaw == "repressed") && ($activeSlave.counter.oral > 0 || $activeSlave.counter.anal > 0 || $activeSlave.counter.vaginal > 0 || $activeSlave.counter.mammary > 0)>>
-			"I'm filthy, <<Master>>. I've been u<<s>>ed, and I can't ever be clean again. I'm a d-dirty, <<s>>inful whore."
-		<<else>>
-			"<<S>>orry, <<Master>>. I wa<<s>> ju<<s>>t r-remembering, b-before — all thi<<s>>."
-		<</if>>
-		You tell $him kindly that you understand, and that $he'll be trained to address this. Then, you turn and go. $He's mystified; though $he's not overjoyed by the promise of correction, $he finds $himself @@.hotpink;less resistant@@ to following your plans.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Use $him when $he gets out">>
-		<<replace "#result">>
-			Eventually $he finishes and switches the shower to dry. The airflow dries $him and $he steps out, but as $he does, $he's seized and flung over the countertop with a slap as $his naked, $activeSlave.skin <<if $activeSlave.belly >= 5000>> _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>skin<</if>> hits the surface.
-			<<if $activeSlave.vagina > -1 && !canDoVaginal($activeSlave)>>
-				With $his chastity belt protecting $his pussy, you ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass instead, drawing a pained sob.
-			<<elseif $activeSlave.vagina == -1>>
-				You ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass, drawing a pained sob.
-			<<elseif !canDoAnal($activeSlave)>>
-				You ram mercilessly into $his cunt, forcing a few gasps out of $him before it sinks in that this is happening.
-			<<else>>
-				You take $his silly cunt just long enough to force a few gasps out of $him before you pull out and ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass, drawing a pained sob.
-			<</if>>
-			As $he takes the pounding sullenly, <<if canSee($activeSlave)>>$he has a direct view of $his own eyes in the mirror, and clearly @@.gold;is disturbed by what $he sees.@@<<elseif canHear($activeSlave)>>$he can hear nothing but the sound of $his brutal rape, and clearly @@.gold;is disturbed by what $he hears.@@<<else>>$his blindness and deafness mean that one of the few things $he can feel is $his own rape, which @@.gold;disturbs $him to no end.@@<</if>>
-			<<set $activeSlave.trust -= 5>>
-			<<= 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>>
-
-<<case "resistant gelding">>
-
-<<link "Abuse $his ass">>
-	<<replace "#result">>
-		$He turns around as <<if canHear($activeSlave)>>$he hears <</if>>you enter the bathroom, fear and loathing on $his face, but you seize $his shoulder and spin $his back around without a word. You drag $him across the counter until $his face is over the sink, and turn it on. $He struggles in sheer incomprehension as you hold $his head over the filling basin with one hand and roughly grope $his butt with the other. When the sink is full, you tell $him to spread $his buttocks for you like a good butthole bitch. $He hesitates, so you push $his face under the surface of the water and hold it there until $he complies. You shove <<if $PC.dick == 0>>a dildo<<else>>your member<</if>> up $his anus so harshly that $he spasms and reflexively tries to get away, so you push $him under again until $he stops struggling. For the next ten minutes, $he gets shoved under water whenever $he offers the slightest resistance to anal rape. Soon, $his tears are pattering down into the sink. The next time you decide to buttfuck $him, $he's @@.gold;compliant from sheer terror.@@
-		<<set $activeSlave.trust -= 5>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>>
-<br><<link "Reassure $him of $his sexual worth">>
-	<<replace "#result">>
-		$He turns around as <<if canHear($activeSlave)>>$he hears <</if>>you enter the bathroom, fear and loathing on $his face, but is surprised by <<if canSee($activeSlave)>>your gentle expression<<else>>by how calm your steps seem<</if>>. $He's more shocked still when you give $him a reassuring hug and kiss $his unresisting mouth. $He's so unable to figure out what's happening that $he eventually gives up and relaxes into you. You gently turn $him around to face the mirror again, and working from the top of $his head, describe $his body in minute detail, explaining how pretty and valuable a sex slave $he is. When you're about to reach $his butt,
-		<<if canTalk($activeSlave)>>
-			$he uses gestures to beg you not to assrape $him.
-		<<else>>
-			<<if ($activeSlave.lips > 70)>>
-				$he begs meekly through $his massive dick-sucking lips,
-			<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-				$he begs meekly through $his mouthful of piercings,
-			<<else>>
-				$he begs meekly,
-			<</if>>
-			"<<Master>>, plea<<s>>e, plea<<s>>e don't a<<ss>>rape me. I don't think I can take it."
-		<</if>>
-		You patiently explain that taking <<if $PC.dick == 0>>anything you feel like inserting into $his backdoor<<else>>your cock<</if>> is $his duty, and begin to massage $his sphincter open with a single gentle finger. $He doesn't enjoy the ensuing assfuck, but $he doesn't truly hate it either and @@.hotpink;begins to hope@@ that being your butt slave won't be so painful after all.
-		<<set $activeSlave.devotion += 4>>
-		<<= slaveSkillIncrease('anal', $activeSlave, 10)>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>>
-<br><<link "Comfort $him">>
-	<<replace "#result">>
-		$He turns around as <<if canHear($activeSlave)>>$he hears<</if>> you enter the bathroom, fear and loathing on $his face, but is surprised by <<if canSee($activeSlave)>>your gentle expression<<else>>by how calm your steps seem<</if>>. $He's more shocked still when you give $him a reassuring hug and kiss $his unresisting mouth. $He's so unable to figure out what's happening that $he eventually gives up and relaxes into you. You run your hands along $his body and kiss $his deeply for a long while before reassuring $him of $his value to you. $He looks confused, but goes about $his business with dry eyes. $He hates you a little less, but wonders whether $he can get away with retaining some independence.
-	<</replace>>
-<</link>>
-
-<<case "rebellious arrogant">>
-
-<<link "Force $him out of bed and humiliate $him publicly">>
-	<<replace "#result">>
-		You drag $him unceremoniously out of bed and straight down into the public areas of $arcologies[0].name. $His struggles and protests grow more frantic as $he
-		<<set _textArray = []>>
-		<<if canSee($activeSlave)>>
-			<<set _textArray.push("sees the first passersby beginning to stare at the little spectacle")>>
-		<</if>>
-		<<if canHear($activeSlave)>>
-			<<set _textArray.push("begins to hear the various catcalls and other comments directed at $him")>>
-		<<else>>
-			<<set _textArray.push("feels the outdoor air on $his body")>>
-		<</if>>
-		<<if _textArray.length === 1>>
-			<<print _textArray[0] + ".">>
-		<<elseif _textArray.length === 2>>
-			<<print _textArray[0] + " and " + _textArray[1] + ".">>
-		<<elseif _textArray.length === 3>>
-			<<print _textArray[0] + ", " + _textArray[2] + " and " _textArray[3] + ".">>
-		<</if>>
-		You force $him right there, thoroughly raping the struggling $girl in public. @@.gold;$He learns the consequences of refusal,@@
-		<<if $arcologies[0].FSDegradationist !== "unset">>
-			and @@.green;your citizens certainly enjoy the public spectacle.@@
-			<<run repX(100, "event", $activeSlave)>>
+			big breasts
+		<<elseif ($activeSlave.boobs > 300)>>
+			nice boobs
 		<<else>>
-			but @@.red;your reputation has been decreased by the unseemly commotion.@@
-			<<run repX(-100, "event", $activeSlave)>>
+			trim chest
 		<</if>>
-		<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			<<= VCheck.Both($activeSlave, 1)>>
-		<<elseif canDoVaginal($activeSlave)>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<elseif canDoAnal($activeSlave)>>
-			<<= VCheck.Anal($activeSlave, 1)>>
+		against your legs, and nuzzles $his warm nose and wet tongue against
+		<<if $PC.balls >= 9>>
+			your oversized nuts.
+		<<elseif $PC.vagina != -1>>
+			your moist folds.
 		<<else>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
+			your ballsack.
 		<</if>>
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>><<if (($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave)))>> //This option will take $his virginity//<</if>>
-<br><<link "Let $him stay in bed">>
-	<<replace "#result">>
-		You shrug and walk out of the room and back to your office; you've got more important things to worry about than some drowsy brat. $activeSlave.slaveName, for $his part, gets out of bed not long after you leave, but is surprised at @@.orangered;how easily $he got away with this,@@ and is wondering @@.mediumorchid;what else $he could get away with.@@
-		<<set $activeSlave.trust += 10>>
-		<<set $activeSlave.devotion -= 10>>
+		You run a languid hand through $his hair, but soon relax into a pleasant, tired fugue, letting yourself enjoy $his ministrations. You almost drift off under the slow oral loving, but a sudden coolness against you brings you partially awake again: $he's taken $his mouth off you, leaving the night air against your saliva-wetted <<if $PC.vagina != -1>>pussylips<<else>>cock<</if>>. $He quickly realizes the error, and applies $himself diligently to you, never letting the warm feeling die down again. You orgasm twice, which $he absorbs without stopping, looking up at you with an expression that's unidentifiable in the gloom. But when you finally reach down and give $his <<if ($activeSlave.belly >= 10000)>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly a light pat<<else>>shoulder a little tug<</if>> to let $him know that's enough, $he @@.mediumaquamarine;cuddles up close to you@@ without hesitation.
+		<<set $activeSlave.trust += 4>>
+		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
 	<</replace>>
 <</link>>
-<<if $seePee == 1>>
-	<br><<link "Let $him stay in bed, but move it to a public restroom">>
-		<<replace "#result">>
-			You quickly pin the blanket to the mattress, securing $him in place. You direct that a urinal in one of $arcologies[0].name's public restrooms be unbolted and replaced by the mattress, slave and all. $He's been swearing and threatening all this time, but the calumny reaches a shrieking crescendo (though muffled by the blanket) when $he feels urine beginning to soak through the blanket. After an hour or so $he's begging to be let out, @@.gold;swearing $he'll improve $his conduct.@@
-			<<set $activeSlave.trust -= 5>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Let $him stay in bed, but move it to a whorehouse">>
-		<<replace "#result">>
-			You quickly pin the blanket to the mattress, securing $him in place. You direct that $he be brought to an arcology salon that serves as a slave brothel. Once $he's there, you take a pair of scissors and cut a slit through the sheets. $He's been swearing and threatening all this time, but the calumny reaches a shrieking crescendo when $he feels a cock being shoved through the slit and between $his buttocks. Being muffled and held immobile for rape for hire @@.gold;terrifies $him@@ but @@.yellowgreen;earns some cash.@@
-			<<set $activeSlave.trust -= 5>>
-			<<if canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", "public", "penetrative", 5)>>
-				<<if canDoAnal($activeSlave)>>
-					<<run seX($activeSlave, "anal", "public", "penetrative", 5)>>
-					<<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-						After the patrons have their way with $him, @@.lime;both $his pussy and asshole have been broken in.@@ $He @@.mediumorchid;hates@@ losing $his virginities in such an undignified manner and @@.gold;fears@@ what will be taken from $him next.
-						<<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++, $activeSlave.anus++>>
-					<<elseif $activeSlave.vagina == 0>>
-						After the patrons have their way with $him, @@.lime;$he's certainly no longer a virgin.@@ $He @@.mediumorchid;hates@@ losing $his virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next.
-						<<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++>>
-					<<elseif $activeSlave.anus == 0>>
-						After the patrons have their way with $him, @@.lime;$he's certainly no longer an anal virgin.@@ $He @@.mediumorchid;hates@@ losing $his anal virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next.
-						<<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>>
-					<</if>>
-					<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-						<<run knockMeUp($activeSlave, 25, 2, -2)>>
+<<if $activeSlave.belly < 150000>>
+	<<if canDoVaginal($activeSlave)>>
+		<br><<link "Surprise sex">>
+			<<replace "#result">>
+				You uncoil from under the sheet like a striking serpent, tackling $his $activeSlave.skin body off the edge of the bed<<if ($activeSlave.bellyPreg >= 1500)>>, twisting in midair,<</if>> and onto the floor with a crash. The wind is knocked out of $him with an audible grunt as<<if ($activeSlave.bellyPreg >= 1500)>> $he lands on top of you and rolls over<<else>> you land on top of $him<</if>>.
+				<<if ($activeSlave.bellyPreg < 1500)>>
+					<<if $activeSlave.belly >= 10000>>
+						$His _belly belly squashes out to either side of $his torso,
+					<<elseif ($activeSlave.boobs > 2000)>>
+						$His huge breasts squash out to either side of $his torso,
+					<<elseif ($activeSlave.dick > 0)>>
+						$He shifts desperately to get some weight off $his trapped dick,
+					<<else>>
+						$He squirms reflexively,
 					<</if>>
+				<<elseif ($activeSlave.boobs > 2000)>>
+					$His huge breasts flop to either side of $his torso,
 				<<else>>
-					<<if $activeSlave.vagina == 0>>
-						After the patrons have their way with $him, @@.lime;$he's certainly no longer a virgin.@@ $He @@.mediumorchid;hates@@ losing $his virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next.
-						<<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++>>
-					<</if>>
-					<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-						<<run knockMeUp($activeSlave, 25, 0, -2)>>
-					<</if>>
+					$He squirms reflexively,
 				<</if>>
-			<<elseif canDoAnal($activeSlave)>>
-				<<run seX($activeSlave, "anal", "public", "penetrative", 10)>>
-				<<if $activeSlave.anus == 0>>
-					After the patrons have their way with $him, @@.lime;$he's certainly no longer an anal virgin.@@ $He @@.mediumorchid;hates@@ losing $his anal virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next.
-					<<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>>
-					<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-						<<run knockMeUp($activeSlave, 50, 1, -2)>>
-					<</if>>
+				but your attention is directed farther down: you wrap an arm around $his hips, hoist $him, shove a cushion under $his middle, and spread $his
+				<<if $activeSlave.butt > 5>>
+					inconveniently plush butt
+				<<elseif $activeSlave.butt > 2>>
+					big buttocks
+				<<else>>
+					trim buttocks
 				<</if>>
-			<</if>>
-			<<run cashX(100, "event", $activeSlave)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if $arcade > 0>>
-	<br><<link "Sentence $him to a month in the arcade">>
-		<<replace "#result">>
-			$activeSlave.slaveName screams and begs when $he realizes what $his punishment is, but you are obdurate.
-			<<if ($activeSlave.muscles > 30)>>
-				$His powerful form has to be sedated for immurement in the arcade.
-			<<elseif ($activeSlave.weight >= 190)>>
-				$He is so massively fat that immuring $him in the arcade is a struggle, even when $he isn't trying to.
-			<<elseif $activeSlave.belly >= 120000>>
-				$He is so enormously gravid that immuring $him in the arcade is a hassle, even though $his _belly middle limits $his ability to struggle.
-			<<elseif ($activeSlave.weight >= -10)>>
-				$His desperate struggles make immuring $him in the arcade difficult.
-			<<elseif $activeSlave.belly >= 1500>>
-				$His <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>_belly<</if>> body makes it slightly difficult to fit $him properly into the restraints for immurement in the arcade.
-			<<elseif $activeSlave.muscles < -15>>
-				$His weak body makes immuring $him in the arcade pathetically easy.
-			<<else>>
-				$His thin form makes immuring $him in the arcade pathetically easy.
-			<</if>>
-			After $he's properly confined, the only sign of $his discomfiture is a slight movement of $his $activeSlave.skin butt as $he wriggles desperately against $his restraints.
-			<<= assignJob($activeSlave, "be confined in the arcade")>>
-			<<set $activeSlave.sentence = 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "vocal disobedience">>
-
-<<link "Give $him a rough spanking">>
-	<<replace "#result">>
-		<<if (hasAnyLegs($activeSlave))>>
-			You tie the protesting slave to your desk
-			<<if $activeSlave.belly >= 5000>>
-				with $his chest against the top of the desk with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly hanging of the side, so that
-			<<else>>
-				so that $his chest is against the top of the desk and
-			<</if>>
-			$he's standing upright with $his ass in the air.
-		<<else>>
-			<<if $activeSlave.belly >= 300000>>
-				You carefully balance the protesting, defenseless torso atop $his own _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>stomach<</if>>.
-			<<elseif $activeSlave.belly >= 5000>>
-				You place the protesting, defenseless torso on your lap, face-down with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>> belly between your legs.
-			<<else>>
-				You place the protesting, defenseless torso on your desk, face-down.
-			<</if>>
-		<</if>>
-		You spank $him severely, leaving $his buttocks bright pink. $He must count the strokes or have $his punishment start over. Sobbing, $he counts
-		<<if ($activeSlave.lips > 70)>>
-			through $his massive dick-sucking lips,
-		<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-			through $his inconvenient oral piercings
-		<</if>>
-		"<<S>>i<<x>>, AAGHHH, <<s>>even, AAGHHH, <<s>>even"
-		and then realizes $his mistake and begs for mercy — in vain, of course. You finish $him off with a rough
-		<<if canDoVaginal($activeSlave)>>
-			fuck, with $him jerking against $his restraints every time you stroke into $his sore buttocks.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<elseif canDoAnal($activeSlave)>>
-			assfuck, with $him jerking against $his restraints every time you stroke into $his sore buttocks.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<else>>
-			throatfuck, with $him jerking against $his restraints every time you hilt yourself and slap $his ass.
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<</if>>
-		@@.gold;$He learns from the experience.@@
-		<<set $activeSlave.trust -= 5>>
-	<</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 canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Sentence $him to public use">>
-		<<replace "#result">>
-			When $he <<if canSee($activeSlave)>>sees $he's being taken to a sex booth<<elseif canHear($activeSlave)>>hears the sounds of a public sex parlor<<else>>finally figures out $his destination<</if>>, $he begins to cry. $He begs
-			<<if ($activeSlave.lips > 70)>>
-				through $his massive dick-sucking lips,
-			<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-				through $his inconvenient oral piercings,
-			<<else>>
-				through $his tears,
-			<</if>>
-			"Plea<<s>>e, no, <<Master>>, I'll be good —" but is cut off when the machine closes around $his head. It will offer $his
-			<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-				ass and pussy
-			<<elseif canDoAnal($activeSlave)>>
-				ass
-			<<else>>
-				pussy
-			<</if>>
-			to anyone who pays for the rest of the week, and keep $his fed and cleaned. $His world will become nothing but silent, featureless darkness and dick. @@.yellowgreen;You earn some money off $him,@@ and by the end of the night $his
-			<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-				holes get
-			<<else>>
-				hole gets
-			<</if>>
-			<<if (canDoAnal($activeSlave) && $activeSlave.anus == 0) || (canDoVaginal($activeSlave) && $activeSlave.vagina == 0)>>
-				well stretched.
-			<<else>>
-				@@.lime;well stretched.@@
-			<</if>>
-			@@.hotpink;$He learns from the experience.@@
-			<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-				<<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-					@@.lime;$He's lost both $his virginity and anal cherry.@@
-				<<elseif $activeSlave.vagina == 0>>
-					@@.lime;$He's lost $his virginity.@@
-				<<elseif $activeSlave.anus == 0>>
-					@@.lime; $He's lost $his anal cherry.@@
-				<</if>>
-				<<set $activeSlave.vagina++, $activeSlave.anus++>>
-				<<run seX($activeSlave, "vaginal", "public", "penetrative", 10)>>
-				<<run seX($activeSlave, "anal", "public", "penetrative", 10)>>
-				<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-					<<= knockMeUp($activeSlave, 25, 2, -2)>>
-				<</if>>
-			<<elseif canDoAnal($activeSlave)>>
-				<<if $activeSlave.anus == 0>>
-					@@.lime; $He's lost $his anal cherry.@@
-				<</if>>
-				<<set $activeSlave.anus++>>
-				<<run seX($activeSlave, "anal", "public", "penetrative", 5)>>
-				<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-					<<= knockMeUp($activeSlave, 50, 1, -2)>>
-				<</if>>
-			<<else>>
-				<<if $activeSlave.vagina == 0>>
-					@@.lime;$He's lost $his virginity.@@
-				<</if>>
-				<<set $activeSlave.vagina++>>
-				<<run seX($activeSlave, "vaginal", "public", "penetrative", 20)>>
-				<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-					<<= knockMeUp($activeSlave, 50, 0, -2)>>
-				<</if>>
-			<</if>>
-			<<set $activeSlave.devotion += 4>>
-			<<run cashX(50, "event", $activeSlave)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<br><<link "Give $him the day off">>
-	<<replace "#result">>
-		$He skips away happily and spends the rest of the day lounging around. $His obedience to you @@.mediumorchid;has decreased.@@
-		<<set $activeSlave.devotion -= 5>>
-	<</replace>>
-<</link>>
-
-<<case "fearful humiliation">>
-
-<<link "Publicly prove the depths of $his humiliation to $him">>
-	<<replace "#result">>
-		You drag a fearful, embarrassed<<if $activeSlave.belly >= 1500>>, <<if $activeSlave.bellyPreg >= 0>>pregnant<<else>>swollen<</if>><</if>> and totally naked $activeSlave.slaveName out into a public hall. A small knot of passersby gather around grinning, enjoying the sight of $his nakedness and anticipating a show. To $his surprise, you order $him to take a few minutes to recount $his life story. $He's hesitant at first, but obeys, only realizing as $he nears the present day what an abject story of degradation and humiliation $his life truly is. $He continues shakily, describing in brief $his current life, crying a little and trembling with arousal. At a whispered command from you, $he concludes
-		<<if !canTalk($activeSlave)>>
-			in embarrassed gestures, "and now my <<= getWrittenTitle($activeSlave)>> is going to fuck my worthless body in public."
-		<<else>>
-			"and now my <<Master>> i<<s>> going to fuck my worthle<<ss>> body in public."
-		<</if>>
-		You take $him standing there, as $he cries with mixed shame and sexual pleasure.
-		<<if !canDoVaginal($activeSlave)>>
-			$He <<if ($activeSlave.dick > 0)>>cums even though $he's soft<<else>>climaxes even though $he's filled<</if>> with the shame, <<if $PC.dick == 0>>$his anus clenching around the strap-on you're pumping in and out of it<<else>>adding a sad little dribble to the load dripping out of $his asshole<</if>>.
-		<<else>>
-			<<if $PC.dick == 0>>You make $him clean $his pussyjuice off your strap-on with $his bitch mouth before you take it off.<<else>>As you pull out of $his clenching pussy, cum runs down $his quavering thighs.<</if>>
-		<</if>>
-		@@.hotpink;$He has become more submissive to you,@@ and @@.green;your reputation has increased.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run repX(500, "event", $activeSlave)>>
-		<<if canDoVaginal($activeSlave)>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-	<</replace>>
-<</link>>
-<br><<link "Use a bait and switch tactic on $him, before public use">>
-	<<replace "#result">>
-		You instruct $him to get cleaned up and get dressed in $his nicest clothing. $He obeys, mystified, and is further puzzled to find that you're taking $him out for a nice evening at a small bar. You share a tasty meal and listen to good music played on the little stage by an older slave. As the set concludes, you lean over and give $activeSlave.slaveName $his real orders for the evening. $He freezes in terror but eventually makes $his way up to the stage, strips in front of all the patrons, and says
-		<<if !canTalk($activeSlave)>>
-			in embarrassed gestures, "Please use me, I'm cheap."
-		<<else>>
-			"One credit per fuck, if you'll do my worthle<<ss>> body on <<s>>tage."
-		<</if>>
-		By the end of the night, $he's been fucked by almost everyone in the bar, and $his itch for humiliation has been well and truly scratched. As you collect $his earnings from the thoroughly pleased bartender, $he lies quiescent in a puddle of cum and exhaustion. @@.yellowgreen;You've collected a decent fee,@@ and @@.green;your reputation has increased.@@
-		<<run repX(500, "event", $activeSlave)>>
-		<<run cashX(100, "event", $activeSlave)>>
-		<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 10)>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 10)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 25, 2, -2)>>
-			<</if>>
-		<<elseif canDoVaginal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 20)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 50, 0, -2)>>
-			<</if>>
-		<<else>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 20)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 50, 1, -2)>>
-			<</if>>
-		<</if>>
-	<</replace>>
-<</link>>
-
-<<case "heavy piercing">>
-
-<<link "Weight $his piercings and fuck $him so they swing">>
-	<<replace "#result">>
-		You order $him to make sure all of $his piercings have rings in them, and then come join you when $he's done. $He enters your office with a mixture of fear and curiosity on $his face. You put $him down on <<if hasAllLimbs($activeSlave)>>all fours<<else>>the ground<</if>><<if hasBothLegs($activeSlave)>> with $his legs spread<</if>><<if $activeSlave.belly >= 50000>>, belly brushing the floor<</if>>, <<if canSee($activeSlave)>>blindfold $him, <</if>>and then start clipping little metal weights on short chains to each of $his piercings. Before long, $his nipples are painfully stretched under the tugging, <<if ($activeSlave.dick > 0)>>and the weights up and down $his cock are causing $his considerable discomfort.<<elseif $activeSlave.vagina == -1>>and though $he lacks any external genitalia to weight, you make sure $his ass feels the burn.<<else>>$his pussylips are being pulled downward, and even $his clit is agonizingly tortured.<</if>> You fuck $him thoroughly, pounding $him so the weights swing. $He sobs and begs. @@.hotpink;$He has become more submissive to you.@@
-		<<set $activeSlave.devotion += 4>>
-		<<if canDoVaginal($activeSlave)>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<br><<link "Secure $him by $his piercings for public use">>
-	<<replace "#result">>
-		You order $him to make sure all of $his piercings have rings in them, and then come to you when $he's done. $He enters your office with a mixture of fear and curiosity on $his face. You lead $him outside and secure $him in a side hall so that $his ass is presented to anyone who takes interest. $He's forced to maintain this exact posture by a light chain between <<if $activeSlave.belly > 10000>>$his popped navel and a ring on the ground.<<elseif ($activeSlave.dick > 0)>>$his dickhead and a ring on the ground.<<elseif $activeSlave.vagina == -1>>$his nipples and a ring on the ground.<<else>>$his pussy and a ring on the ground.<</if>> You fuck $his ass to check the bondage; it's good. The chain is out of the way, and $he jerks and struggles amusingly to keep it from tugging $him painfully. You pull out to leave $his fucked butt with cum dribbling out of it, and leave $him to the tender mercies of the growing crowd. @@.green;The sadists among the public are duly grateful.@@
-		<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-			<<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-				They take pleasure in claiming @@.lime;both $his virginity and anal cherry.@@
-			<<elseif $activeSlave.vagina == 0>>
-				They take pleasure in claiming @@.lime;$his virginity.@@
-			<<elseif $activeSlave.anus == 0>>
-				They take pleasure in claiming @@.lime;$his anal cherry.@@
-			<</if>>
-			<<set $activeSlave.vagina++, $activeSlave.anus++>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 5)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 5)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 10, 2, -2)>>
-			<</if>>
-		<<elseif canDoAnal($activeSlave)>>
-			<<if $activeSlave.anus == 0>>
-				They take pleasure in claiming @@.lime;$his anal cherry.@@
-			<</if>>
-			<<set $activeSlave.anus++>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 10)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 25, 1, -2)>>
-			<</if>>
-		<<else>>
-			<<if $activeSlave.vagina == 0>>
-				They take pleasure in claiming @@.lime;$his virginity.@@
-			<</if>>
-			<<set $activeSlave.vagina++>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 5)>>
-			<<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-				<<= knockMeUp($activeSlave, 25, 0, -2)>>
-			<</if>>
-		<</if>>
-		<<run repX(2500, "event", $activeSlave)>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-
-<<case "cumslut whore">>
-
-<<link "$He must have at least a little room left">>
-	<<replace "#result">>
-		You call $activeSlave.slaveName in and ask how full $he is. $He looks confused for a moment but soon figures out what you mean.
-		<<if !canTalk($activeSlave) && (!hasAnyArms($activeSlave))>>
-			As a mute amputee $he communicates poorly,
-			<<if $activeSlave.inflationType == "cum">>
-				<<if $activeSlave.bellyFluid >= 10000>>
-					but $he sticks out $his hugely bloated cum-belly and opens wide, $his intent clear.
-				<<elseif $activeSlave.bellyFluid >= 5000>>
-					but $he wiggles around so $his cum-filled belly sloshes audibly before opening wide.
-				<<else>>
-					but $he sticks out $his cum-swollen belly and opens wide, $his intent clear.
-				<</if>>
-			<<else>>
-				but $he does manage to look hungry.
-			<</if>>
-		<<elseif !canTalk($activeSlave)>>
-			<<if $activeSlave.inflationType == "cum">>
-				<<if $activeSlave.bellyFluid >= 10000>>
-					$He strokes $his hugely bloated cum-belly, makes a sign for "never," and then makes a sign for "enough."
-				<<elseif $activeSlave.bellyFluid >= 5000>>
-					$He jiggles $his cum-filled belly lewdly, makes a sign for "need," and then makes a sign for "more."
-				<<else>>
-					$He pats $his cum-swollen belly, makes a sign for "much," and then makes a sign for "room."
-				<</if>>
-			<<else>>
-				$He gestures at $his<<if $activeSlave.belly >= 1500>> _belly<</if>> stomach, makes a sign for "full," and then makes a sign for "never."
-			<</if>>
-		<<else>>
-			<<if $activeSlave.inflationType == "cum">>
-				<<if $activeSlave.bellyFluid >= 10000>>
-					$He strokes $his hugely bloated cum-belly, "Oh <<Master>>, I've had <<s>>o much cum already today, but I can't help my<<s>>elf if you're offering me even more. I'll find <<s>>ome room in there,"
-				<<elseif $activeSlave.bellyFluid >= 5000>>
-					$He jiggles $his cum-filled belly lewdly, "Oh <<Master>>, there'<<s>> <<s>>o much already in me, but I feel <<s>>o empty <<s>>till."
-				<<else>>
-					$He pats $his cum-swollen stomach, "Oh <<Master>>, thi<<s>> little belly i<<s>> nothing, I alway<<s>> have room for more,"
-				<</if>>
-			<<else>>
-				"Oh <<Master>>, I'll never be full again,"
-			<</if>>
-			$he <<say>>s<<if $activeSlave.lips > 70>> past $his enormous lips<<elseif $activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2>> past $his mouthful of piercings<</if>>.
-		<</if>>
-		$He comes eagerly over and sucks you off with enthusiasm. As you cum, $he orgasms quickly at the <<if canTaste($activeSlave)>>taste<<else>>feeling<</if>> of the stuff hitting $his mouth<<if $PC.balls >= 10>>, even as your load keeps flowing into $his gullet<<if $PC.balls >= 30>> steadily bloated the poor $girl<</if>><</if>>.
-		<<if !canTalk($activeSlave)>>
-			$He <<if !canTaste($activeSlave)>>(rather ironically) <</if>>signs that you taste great.
-		<<else>>
-			"<<Master>>, you ta<<s>>te great," $he <<if !canTaste($activeSlave)>>(rather ironically) <</if>>purrs.
-		<</if>>
-		@@.mediumaquamarine;$He has become more trusting@@ in your willingness to give $him what $he wants.
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br><<link "Cum in $his mouth all night">>
-	<<replace "#result">>
-		You've had a busy day, so you've been unusually remiss in fucking your slaves. Naturally, this means you'll be spending the evening wandering around your home using your living sexual appliances. $activeSlave.slaveName is instructed to follow you and assist. $He's tired, so <<if (!hasAnyArms($activeSlave))>>you bring <<if (isAmputee($activeSlave))>>$his limbless torso<<else>>$him<</if>> along as a cum receptacle. Whenever you're about to finish in another slave, you pull out and fill $his mouth instead.<<else>>you let $him tag meekly along, masturbating gently as you use other slaves or just watching lazily. But whenever you're on the point of coming, you switch to $his mouth and let $him finish you with a few sucks and pumps of $his fatigued hand<<if (hasBothArms($activeSlave))>>s<</if>>.<</if>> By the time you put the exhausted $activeSlave.slaveName to bed $he's in a haze of cum-induced pleasure. @@.hotpink;$He has become more submissive to you.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative", 5)>>
-	<</replace>>
-<</link>>
-<<if (cumSlaves().length >= 5)>>
-	<br><<link "Give $him access to the Dairy's cockmilk">>
-		<<replace "#result">>
-			You let $him know you have a sexual accessory for $him to use. This isn't too unusual, so $he comes to your office without much anticipation. $He doesn't understand why you have an enormous sealed canister of fresh cum on your desk, but when you explain that it's $hers to play with on the job, $he starts to bounce with excitement. Not all of $his customers are interested in cum play, but quite a few are, and $he spends almost as much time cleaning up the gorgeous messes that get made as $he does making them. It's a valuable and @@.yellowgreen;profitable@@ whore who @@.hotpink;looks forward@@ to $his next customer.
-			<<set $activeSlave.devotion += 10>>
-			<<run cashX(random(500,1000), "event", $activeSlave)>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "loose buttslut">>
-
-<<link "Add something to fill $him completely">>
-	<<replace "#result">>
-		$He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear you<<else>>sense your presence<</if>> until you<<if $PC.dick == 0>> don a strap-on and<</if>> tip $him over face forward. With $him on $his knees, $his dildo-stuffed ass is in the air; $he's still masturbating between $his legs. After a moment's consideration, you slide two exploratory fingers in alongside the dildo. $He gasps and masturbates harder. Thus encouraged, you shove <<if $PC.dick == 0>>the strap-on<<else>>your member<</if>> in alongside the dildo. <<if $activeSlave.voice != 0>>$He screams at the surprise double anal, sobbing and begging,<<else>>$He screams noiselessly at the surprise double anal, waving $his hands in distress,<</if>> but $he doesn't try to stop you and doggedly keeps rubbing. By the time you're finished $his asshole is a gaping hole much bigger than the average pussy. @@.hotpink;$He has become more submissive to you.@@
-		<<set $activeSlave.devotion += 4>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<</replace>>
-<</link>>
-<br><<link "Let $him use a machine">>
-	<<replace "#result">>
-		There's no reason for $him to do that in a quiet corner. You interrupt $him and bring $him into your office, setting $him up on a machine so $he can have that dildo rammed up $his ass for as long as $he likes. Your office is filled with the rhythmic sounds of a sloppy anus being pounded for a good long while.
-		<<if $assistant.personality > 0>>
-			The
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				monstrous voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my cocks, slave."
-			<<case "shemale">>
-				sultry voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my dick, bitch."
-			<<case "amazon">>
-				aggressive voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "be a warrior."
-			<<case "businesswoman">>
-				dominant voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "stop struggling and be a good $girl."
-			<<case "goddess" "hypergoddess">>
-				calming voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax and accept what you deserve, $girl."
-			<<case "loli">>
-				young, naïve voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll get better."
-			<<case "preggololi">>
-				young voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, you know it'll be fun!"
-			<<case "angel">>
-				harmonious voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll be over soon."
-			<<case "cherub">>
-				cheerful voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll feel better if you do!"
-			<<case "incubus">>
-				forceful voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my dick, cocksleeve, take it till you split!"
-			<<case "succubus">>
-				sultry voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "enjoy the pounding while it lasts."
-			<<case "imp">>
-				mischievous voice of your assistant's avatar can also be heard, mocking $activeSlave.slaveName, "your butthole is going to be so loose after this! You'll be nothing more than a used up whore!"
-			<<case "witch">>
-				uncertain voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "just relax and get it over with."
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				unclear voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "scream louder and let it fill your body completely."
-			<<case "schoolgirl">>
-				girly voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "be quiet, or Teacher will hear us."
-			<<default>>
-				poor slave is taken to the very limit by your assistant.
-			<</switch>>
-			<<run seX($activeSlave, "anal", "assistant", "penetrative")>>
-		<<else>>
-			<<run actX($activeSlave, "anal")>>
-		<</if>>
-		By the time $he's climaxed out, $he's so tired and apathetic that $he can't bring $himself to get off it or ask for help, so $he just relaxes and enjoys the internal massage<<if $activeSlave.dick != 0>> while $his flaccid dick twitches weakly<</if>>. @@.mediumaquamarine;$He has become more trusting of you,@@ since you knew just what $he needed.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<<if $HeadGirlID != 0 && $HeadGirlID != $activeSlave.ID>>
-	<br><<link "Call your Head Girl in for double anal">>
-		<<setLocalPronouns _S.HeadGirl 2>>
-		<<replace "#result">>
-			When _S.HeadGirl.slaveName comes into your office in response to your summons, _he2 finds $activeSlave.slaveName sitting in your lap with your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his gaping butt<<if $PC.vagina != -1>><<if $PC.dick != 0>>, your bare pussy very visible at the base of your working cock<</if>><</if>>. _S.HeadGirl.slaveName's expression softens when _he2 realizes _he2's here for pleasure, not business. $activeSlave.slaveName gasps a little when $he <<if canHear($activeSlave)>>hears you tell _S.HeadGirl.slaveName to join you up $his asshole,<<else>>feels you pull apart $his asscheeks to make some room for _S.HeadGirl.slaveName,<</if>> but $he doesn't protest.
-			<<if ($activeSlave.chastityPenis == 1)>>
-				Since your poor Head Girl can't use _his2 caged cock, _he2 takes a dildo and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<<elseif canAchieveErection() && _S.HeadGirl.dick > 7>>
-				Even though your Head Girl is rock-hard and ready to fuck, _his2 cock is far too large to fit into even the most stretched slave's holes. Sighing, _he2 takes a dildo and shoves it up $activeSlave.slaveName's already-filled butt instead.
-			<<elseif canAchieveErection() && _S.HeadGirl.dick > 6>>
-				Your lusty Head Girl is already hard and forces _his2 oversized cock up $activeSlave.slaveName's already-filled butt while <<if $activeSlave.nipples != "fuckable">>tweaking<<else>>fingering<</if>> the moaning slave's nipples.
-			<<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.hormoneBalance >= 100)>>
-				Since your poor Head Girl can't get hard due to _his2 hormone therapy, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.balls > 0) && (_S.HeadGirl.ballType == "sterile")>>
-				Since your poor Head Girl can't get hard due to _his2 chemical castration, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado
-			<<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.balls == 0)>>
-				Since your poor Head Girl can't get hard due to _his2 orchiectomy, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<<elseif !canAchieveErection(_S.HeadGirl) && _S.HeadGirl.dick > 6>>
-				Since your poor Head Girl is far too big to get hard, much to $activeSlave.slaveName's disappointment, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<<elseif !canAchieveErection(_S.HeadGirl) && _S.HeadGirl.dick > 0>>
-				Since your poor Head Girl can't get it up for one reason or another, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<<elseif _S.HeadGirl.dick > 0>>
-				Your lusty Head Girl is already hard and shoves _himself2 up $activeSlave.slaveName's already-filled butt while <<if $activeSlave.nipples != "fuckable">>tweaking<<else>>fingering<</if>> the writhing slave's nipples.
-			<<else>>
-				_He2 dons a strap-on and shoves it up $activeSlave.slaveName's already-filled butt without further ado.
-			<</if>>
-			The two of you jackhammer in and out of $activeSlave.slaveName's ass without mercy; the poor anal whore does $his best to relax, but two phalli at once is a lot, even for $him. $He's only allowed an anal respite when $his sphincter is really fucked out and there's little butthole fun to be had from $him any longer. $He has become @@.hotpink;more submissive to you,@@ and _S.HeadGirl.slaveName @@.hotpink;enjoyed@@ taking a break to fuck $him with you.
-			<<set $activeSlave.devotion += 4, _S.HeadGirl.devotion += 4>>
-			<<run seX($activeSlave, "anal", $PC, "penetrative")>>
-			<<run seX($activeSlave, "anal", _S.HeadGirl, "penetrative")>>
-			<<if canImpreg($activeSlave, $PC)>>
-				<<run knockMeUp($activeSlave, 5, 0, -1)>>
-			<</if>>
-			<<if canImpreg($activeSlave, _S.HeadGirl)>>
-				<<run knockMeUp($activeSlave, 5, 0, $HeadGirlID)>>
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "hormone dysfunction">>
-
-<<link "Give $him some vasodilators so $he can get relief">>
-	<<replace "#result">>
-		You give $him a shot and send $him on $his way. Within a few minutes it gives $him a raging hard-on that lasts for hours. $He spends every spare moment masturbating furiously. Of course, this is a temporary solution, and will just make the eventual return of $his problem more disappointing. @@.mediumorchid;$He is bitterly frustrated.@@
-		<<set $activeSlave.devotion -= 5>>
-	<</replace>>
-<</link>>
-<br><<link "Sissy slave <<= $girl>>s don't need to climax to serve">>
-	<<replace "#result">>
-		You explain patiently that $he needs to stop focusing on getting off. $He's a sex slave, and what matters is that $he pleasures others. If $he doesn't climax $himself, that's unfortunate but not really significant. $He looks terribly forlorn, so to drive home the point you push $him down to the floor, give $him a rough facefuck, and send $him away with tousled hair, <<if $PC.dick == 0>>a tired tongue<<else>>a mouthful of ejaculate<</if>>, and the same limp dick as before. @@.mediumorchid;It's frustrating for $him.@@
-		<<set $activeSlave.devotion -= 2>>
-		<<if ($activeSlave.clitSetting != $activeSlave.fetish)>>
-			But, $he slowly @@.lightcoral;accepts $his new role as a submissive little sex toy.@@
-			<<set $activeSlave.fetishStrength = 65, $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.fetish = "submissive">>
-		<</if>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if $activeSlave.prostate != 0 && canDoAnal($activeSlave)>>
-	<br><<link "Prostate stimulation ought to do the trick">>
-		<<replace "#result">>
-			You explain that $he will have to find a new way to climax to be a happy little shemale slut. As you do, you push $him against a wall and force $him up on tiptoe so that $his butt is conveniently positioned, and then ram <<if $PC.dick == 0>>a vibrating strap-on<<else>>yourself<</if>> up $his ass. $He squeals and dances against the wall on tiptoe, impaled on your <<if $PC.dick == 0>>fake cock<<else>>member<</if>>. $He doesn't climax to anal then, or the next time you assfuck $him, or the time after that; but some time later a long buttsex session ends when $he gives a little shake and a whimper and dribbles a pathetic squirt of cum from $his still-limp dick. By the end of the week @@.mediumaquamarine;$he's smiling trustingly@@ and offering you $his butt every chance $he gets.
-			<<= VCheck.Anal($activeSlave, 10)>>
-			<<set $activeSlave.trust += 4>>
-			<<if ($activeSlave.clitSetting != $activeSlave.fetish)>>
-				@@.lightcoral;$He's become a confirmed anal addict.@@
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.fetish = "buttslut">>
-			<</if>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($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">>
-	<<replace "#result">>
-		You flip the sheet off your naked body, revealing your already <<if $PC.dick == 0>>wet pussy<<else>>stiff prick<<if $PC.vagina != -1>> and the wet pussy below it<</if>><</if>>. $He slides $himself down, pressing $his
-		<<if ($activeSlave.boobs > 2000)>>
-			ridiculous tits
-		<<elseif ($activeSlave.boobs > 800)>>
-			big breasts
-		<<elseif ($activeSlave.boobs > 300)>>
-			nice boobs
-		<<else>>
-			trim chest
-		<</if>>
-		against your legs, and nuzzles $his warm nose and wet tongue against
-		<<if $PC.balls >= 9>>
-			your oversized nuts.
-		<<elseif $PC.vagina != -1>>
-			your moist folds.
-		<<else>>
-			your ballsack.
-		<</if>>
-		You run a languid hand through $his hair, but soon relax into a pleasant, tired fugue, letting yourself enjoy $his ministrations. You almost drift off under the slow oral loving, but a sudden coolness against you brings you partially awake again: $he's taken $his mouth off you, leaving the night air against your saliva-wetted <<if $PC.vagina != -1>>pussylips<<else>>cock<</if>>. $He quickly realizes the error, and applies $himself diligently to you, never letting the warm feeling die down again. You orgasm twice, which $he absorbs without stopping, looking up at you with an expression that's unidentifiable in the gloom. But when you finally reach down and give $his <<if ($activeSlave.belly >= 10000)>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly a light pat<<else>>shoulder a little tug<</if>> to let $him know that's enough, $he @@.mediumaquamarine;cuddles up close to you@@ without hesitation.
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if $activeSlave.belly < 150000>>
-	<<if canDoVaginal($activeSlave)>>
-		<br><<link "Surprise sex">>
-			<<replace "#result">>
-				You uncoil from under the sheet like a striking serpent, tackling $his $activeSlave.skin body off the edge of the bed<<if ($activeSlave.bellyPreg >= 1500)>>, twisting in midair,<</if>> and onto the floor with a crash. The wind is knocked out of $him with an audible grunt as<<if ($activeSlave.bellyPreg >= 1500)>> $he lands on top of you and rolls over<<else>> you land on top of $him<</if>>.
-				<<if ($activeSlave.bellyPreg < 1500)>>
-					<<if $activeSlave.belly >= 10000>>
-						$His _belly belly squashes out to either side of $his torso,
-					<<elseif ($activeSlave.boobs > 2000)>>
-						$His huge breasts squash out to either side of $his torso,
-					<<elseif ($activeSlave.dick > 0)>>
-						$He shifts desperately to get some weight off $his trapped dick,
-					<<else>>
-						$He squirms reflexively,
-					<</if>>
-				<<elseif ($activeSlave.boobs > 2000)>>
-					$His huge breasts flop to either side of $his torso,
-				<<else>>
-					$He squirms reflexively,
-				<</if>>
-				but your attention is directed farther down: you wrap an arm around $his hips, hoist $him, shove a cushion under $his middle, and spread $his
-				<<if $activeSlave.butt > 5>>
-					inconveniently plush butt
-				<<elseif $activeSlave.butt > 2>>
-					big buttocks
-				<<else>>
-					trim buttocks
-				<</if>>
-				with one hand to get at $his pussy. You feel $him take a deep breath under you, and $he lets it out as you press <<if $PC.dick == 0>>the tip of your strap-on<<else>>your dickhead<</if>> against $his moist slit. The relaxation
-				<<if $activeSlave.vagina > 2>>
-					gapes $his vagina wide, welcoming you in without any resistance at all.
-				<<elseif $activeSlave.vagina > 1>>
-					welcomes you in, offering you only a delicious bit of resistance to push against.
-				<<else>>
-					welcomes you in, though $he does buck a little at the first penetration.
-				<</if>>
-				You surprised $him badly, but the adrenaline melts into arousal as you pump in and out of $his cunt. $He grinds shamelessly against the cushion; since $he's being a good $girl, you reach up to your bedside without giving $him any respite to fetch
-				<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-					an egg vibe. You shove it between $him and the cushion to give $his limp dick some stimulation.
-				<<elseif $activeSlave.dick > 4>>
-					a huge onahole. You push it between $him and the cushion so $he can fuck it.
-				<<elseif $activeSlave.dick > 0>>
-					an onahole. You push it between $him and the cushion so $he can fuck it.
-				<<elseif $activeSlave.clit > 1>>
-					a shallow vibrating onahole. You push it between $him and the cushion so $he can stuff $his pseudophallic clit into it.
-				<<elseif canDoAnal($activeSlave)>>
-					an egg vibe. You push it into $his ass to stimulate $his <<if $activeSlave.prostate > 0>>prostate<<else>>insides<</if>>.
-				<<else>>
-					an egg vibe. You place it under $him so it can stimulate the sensitive skin between $his legs, just beneath $his asspussy.
-				<</if>>
-				<<if !canTalk($activeSlave)>>
-					$His hands jerk out a spastic thank you in the darkness,
-				<<else>>
-					$He coos a wordless thanks,
-				<</if>>
-				and $he starts humping away. If $he thought you were too tired for sex, you certainly @@.hotpink;impress $him;@@ as you spend an hour exhausting yourself against $his vagina, $he wonders whether $his <<= getWrittenTitle($activeSlave)>> is ever too tired to fuck.
-				<<set $activeSlave.devotion += 4>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<</replace>>
-		<</link>><<if ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>>
-	<</if>>
-	<<if canDoAnal($activeSlave)>>
-		<br><<link "Surprise buttsex">>
-			<<replace "#result">>
-				You uncoil from under the sheet like a striking serpent, tackling $his $activeSlave.skin body off the edge of the bed<<if ($activeSlave.bellyPreg >= 1500)>>, twisting in midair,<</if>> and onto the floor with a crash. The wind is knocked out of $him with an audible grunt as<<if ($activeSlave.bellyPreg >= 1500)>> $he lands on top of you and rolls over<<else>> you land on top of $him<</if>>.
-				<<if ($activeSlave.bellyPreg < 1500)>>
-					<<if $activeSlave.belly >= 10000>>
-						$His _belly belly squashes out to either side of $his torso,
-					<<elseif ($activeSlave.boobs > 2000)>>
-						$His huge breasts squash out to either side of $his torso,
-					<<elseif ($activeSlave.dick > 0)>>
-						$He shifts desperately to get some weight off $his trapped dick,
-					<<else>>
-						$He squirms reflexively,
-					<</if>>
-				<<elseif ($activeSlave.boobs > 2000)>>
-					$His huge breasts flop to either side of $his torso,
-				<<else>>
-					$He squirms reflexively,
-				<</if>>
-				but your attention is directed farther down: you wrap an arm around $his hips, hoist $him, shove a cushion under $his middle, and spread $his
-				<<if $activeSlave.butt > 5>>
-					inconveniently plush butt
-				<<elseif $activeSlave.butt > 2>>
-					big buttocks
-				<<else>>
-					trim buttocks
-				<</if>>
-				with one hand to get at $his asshole. You feel $him take a deep breath under you, and $he lets it out as you press <<if $PC.dick == 0>>the tip of your strap-on<<else>>your dickhead<</if>> against $his anus. The relaxation
-				<<if $activeSlave.anus > 2>>
-					gapes $his asspussy wide, welcoming you in without any resistance at all.
-				<<elseif $activeSlave.anus > 1>>
-					welcomes you in, offering you only a delicious bit of resistance to push against.
-				<<else>>
-					saves $him from too much anal pain, though $he does buck a little at the first penetration.
-				<</if>>
-				You surprised $him badly, but the adrenaline melts into arousal as you pump in and out of $his ass. $He grinds shamelessly against the cushion; since $he's being a good $girl, you reach up to your bedside without giving $him any respite to fetch
-				<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-					an egg vibe. You shove it between $him and the cushion to give $his limp dick some stimulation.
-				<<elseif $activeSlave.dick > 4>>
-					a huge onahole. You push it between $him and the cushion so $he can fuck it.
-				<<elseif $activeSlave.dick > 0>>
-					an onahole. You push it between $him and the cushion so $he can fuck it.
-				<<elseif $activeSlave.clit > 1>>
-					a shallow vibrating onahole. You push it between $him and the cushion so $he can stuff $his pseudophallic clit into it.
-				<<elseif $activeSlave.vagina == -1>>
-					an egg vibe. You place it under $him so it can stimulate the sensitive skin between $his legs, just beneath $his asspussy.
-				<<else>>
-					an egg vibe. You push it between $him and the cushion so $he can rub $his <<if !canDoVaginal($activeSlave)>>chaste <</if>>pussy against it.
-				<</if>>
-				<<if !canTalk($activeSlave)>>
-					$His hands jerk out a spastic thank you in the darkness,
-				<<else>>
-					$He coos a wordless thanks,
-				<</if>>
-				and $he starts humping away. If $he thought you were too tired for sex, you certainly @@.hotpink;impress $him;@@ as you spend an hour exhausting yourself against $his asshole, $he wonders whether $his <<= getWrittenTitle($activeSlave)>> is ever too tired to fuck a butt.
-				<<set $activeSlave.devotion += 4>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</replace>>
-		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-	<</if>>
-<</if>>
-
-<<case "slave dick huge">>
-
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<<link "Enter the shower and take $him">>
-		<<replace "#result">>
-			$He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear<<else>>notice<</if>> you until you seize $him under the armpits and drag $him to $his feet. $His massive dickhead pops free of $his mouth and $he squeaks in surprise as you push $his<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>> body<</if>> against the wall of the shower and stuff your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his
-			<<if canDoVaginal($activeSlave)>>
-				cunt.
-			<<else>>
-				ass.
-			<</if>>
-			$He was already very close to orgasm, and the stimulation of $his dick rubbing against the warm, wet wall<<if $activeSlave.belly >= 1500>> of the shower and $his belly<<else>> of the shower<</if>>, not to mention the feeling of being
-			<<if canDoVaginal($activeSlave)>>
-				fucked,
-			<<else>>
-				buttfucked,
-			<</if>>
-			is enough that $he climaxes quickly. <<if $activeSlave.balls == 3>>$His huge load coats the shower wall with cum. <</if>>You pull out and let $him finish by <<if $PC.dick == 0>>giving you oral<<else>>sucking your dick<<if $PC.vagina != -1>> and eating your pussy<</if>><</if>>, since $he started by sucking $himself. @@.hotpink;$He has become more submissive to you.@@
-			<<set $activeSlave.devotion += 4>>
-			<<if canDoVaginal($activeSlave)>>
-				<<if ($activeSlave.vagina == 0)>>
-					@@.lime;This breaks in $activeSlave.slaveName's virgin pussy.@@
-					<<set $activeSlave.vagina = 1>>
-					@@.hotpink;$He enjoys losing $his cherry to you.@@
-					<<set $activeSlave.devotion += 4>>
-				<</if>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<else>>
-				<<if ($activeSlave.anus == 0)>>
-					@@.lime;This breaks in $activeSlave.slaveName's virgin ass.@@
-					<<set $activeSlave.anus = 1>>
-					@@.hotpink;$He enjoys losing $his butt cherry to you.@@
-					<<set $activeSlave.devotion += 4>>
-				<</if>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if ($PC.dick != 0)>>
-	<br><<link "The only dick $he should suck is $his <<= getWrittenTitle($activeSlave)>>'s">>
-		<<replace "#result">>
-			$He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear<<else>>notice<</if>> you until you seize $his hair and pull $his head back. $His massive dickhead pops free of $his mouth and $he squeaks in surprise. The noise is cut off by a gag as you ram yourself down $his throat. $He plays with your <<if $PC.vagina != -1>>cunt<<else>>balls<</if>> as you facefuck $him and jacks off with $his other hand. $He was so close when you intruded that $he cums long before you do. There's a lot of cum in the shower when you're through. <<if $activeSlave.balls == 3>>$His huge balls made an especially major contribution. <</if>>@@.hotpink;$He has become more submissive to you.@@
-			<<set $activeSlave.devotion += 4>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.belly < 5000) && (canDoAnal($activeSlave) || canDoVaginal($activeSlave))>>
-	<br><<link "See if $he can do that while you take $him">>
-		<<replace "#result">>
-			You interrupt $activeSlave.slaveName and make $him lie on a nearby bed. After some preparatory stretching, during which $his frustrated erection flops forlornly around, you manage to get both $his ankles behind $his head. In this position $he manages to resume sucking on the head of $his penis as you slip into $him.
-			<<if canDoVaginal($activeSlave)>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-			So contorted, $his
-			<<if canDoVaginal($activeSlave)>>
-				pussy
-			<<else>>
-				anus
-			<</if>>
-			is not well angled for comfortable
-			<<if canDoVaginal($activeSlave)>>
-				penetration,
-			<<else>>
-				sodomy,
-			<</if>>
-			so $he is soon moaning and grunting into $his cock as you fuck $him.
-			$He finishes <<if $activeSlave.balls >= 3>>$his enormous ejaculation <</if>>into $his own mouth and then <<if $PC.dick == 0>>finds $himself giving you oral directly, since you pulled your strap-on off<<else>>receives your load into $his now-brimming throat<<if $PC.vagina != -1>>. $He barely has time to swallow before you press your pussy against $his mouth<</if>><</if>>. @@.hotpink;$His devotion to you has increased.@@
-			<<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 "devoted old">>
-
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<<link "Cheer $him up">>
-		<<replace "#result">>
-			You close in on $him, and $he starts to present $himself with the force of long habit. However, you take $him by the hand and draw $him in close, running your fingertips along $his cheekbone, looking into $his <<= App.Desc.eyesColor($activeSlave)>>. <<if canSee($activeSlave)>>$He only holds your gaze for a brief moment before blushing and looking down again,<<else>>Once $he feels your hand stop, $he quickly glances down while<</if>> muttering another apology. You raise $his chin again with a gentle hand and give $him a deep kiss. After a moment $he hugs you with almost painful
-			<<if $activeSlave.belly >= 100000>>
-				fierceness, a feat given the size of $his _belly <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>belly, where
-			<<elseif $activeSlave.belly >= 5000>>
-				fierceness, pushing $his _belly <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>belly into yours, where
-			<<else>>
-				fierceness, and
-			<</if>>
-			you can feel a heat radiating from $him. $He makes to get down on $his knees to serve you again, but instead, you
-			<<if $activeSlave.belly >= 300000>>
-				help $him up and guide
-			<<elseif $activeSlave.belly >= 5000>>
-				gently scoop $him up and carry
-			<<else>>
-				scoop $him up and carry
-			<</if>>
-			$him to bed, laying the bemused $girl down before cuddling up behind $him. The two of you make languid love, with you <<if canHear($activeSlave)>>murmuring reassuringly into $his ear, <</if>>nibbling $his neck, cupping $his breasts,<<if $activeSlave.belly >= 1500>>rubbing $his distended midriff,<</if>> and massaging $his shoulders by turns. After a lovely climax together in $his
-			<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-				pussy $he coquettishly shifts $himself to line your recovering cock up with $his ass,
-				<<set _didVaginal = 1, _didAnal = 1>>
-			<<elseif canDoVaginal($activeSlave)>>
-				pussy $he coquettishly shifts $himself to face you,
-				<<set _didVaginal = 1>>
-			<<else>>
-				ass $he coquettishly shifts $himself to face you,
-				<<set _didAnal = 1>>
-			<</if>>
-			<<if canSee($activeSlave)>>looking with @@.hotpink;adoration@@ and new @@.mediumaquamarine;confidence@@ into your eyes<<else>>gazing with @@.hotpink;adoration@@ and new @@.mediumaquamarine;confidence@@ at your face<</if>>.
-			<<set $activeSlave.devotion += 4, $activeSlave.trust += 4>>
-			<<if _didVaginal == 1 && _didAnal == 1>>
-				<<= VCheck.Both($activeSlave, 1)>>
-			<<elseif _didVaginal == 1>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<elseif _didAnal == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<br><<link "Perform a health exam personally">>
-	<<replace "#result">>
-		$He gets a weekly health exam from the automated systems, which also do their best to monitor $his well-being, but $he does not protest as you take $him to the surgery and give $him a <<if $PC.skill.medicine >= 100>>professional examination. It feels good to put the old skills to use on an attractive patient<<else>>thorough examination<</if>>. There's nothing the matter other than that $he hasn't been 18 for a long time. $He looks a little sad at some of the results, but whenever $he does, you place a hand on $his cheek and give $him a kiss. $He gets the idea.
-		"I under<<s>>tand, <<Master>>. I can <<s>>till <<s>>erve you," $he <<say>>s.
-		You adjust $his diet and exercise a little, which should @@.health.inc;slightly improve@@ $his health<<if $PC.skill.medicine >= 100>>, and prescribe some new supplements that might help $him @@.health.inc;feel $his best@@ all the time<<run improveCondition($activeSlave, 10)>><</if>>. As $he gets up from the chair and makes to resume $his duties, you give $him a light swat across the buttocks. $He squeaks and turns to @@.mediumaquamarine;giggle at you,@@ giving you a broad wink and shaking $his tits a little for you.
-		<<set $activeSlave.trust += 4>>
-		<<run improveCondition($activeSlave, 10)>>
-	<</replace>>
-<</link>>
-<<if _S.HeadGirl && $HeadGirlID != $activeSlave.ID>>
-	<br><<link "Give $him an afternoon off for some quality time with your Head Girl">>
-		<<setLocalPronouns _S.HeadGirl 2>>
-		<<replace "#result">>
-			_S.HeadGirl.slaveName understands the situation immediately. _He2 gets _himself2 and $activeSlave.slaveName dressed for a nice, non-sexual 'date' in $clubName, and leads $him out by the hand with a wink over _his2 shoulder to you. Your Head Girl understands just what kind of break from sexual servitude $activeSlave.slaveName really needs. They enjoy a nice meal, take a stroll and talk as friends, and get some inconsequential but relaxing beauty treatments together. They both @@.hotpink;enjoy the relaxation,@@ and $activeSlave.slaveName @@.health.inc;feels much better@@ after the rest, too.
-			<<set $activeSlave.devotion += 4>>
-			<<run cashX(forceNeg(500), "event", $activeSlave), improveCondition($activeSlave, 10)>>
-			<<set _S.HeadGirl.devotion += 4>>
-		<</replace>>
-	<</link>> //This option will cost <<print cashFormat(500)>>//
-<</if>>
-
-<<case "tendon fall">>
-
-<<link "Help $him clean $himself">>
-	<<replace "#result">>
-		You step into the running water and seat yourself in the shower, drawing $him into your lap. $He seems surprised and <<if canSee($activeSlave)>>stares at you through the steam<<else>>gazes towards you<</if>> for a moment before looking away with a blush. $He expects you to <<if $PC.dick == 0>>ride $his wet face<<else>>insert your member into $his wet body<</if>>, but finds you handing $him the soap instead. You gently support $him as $he washes, partaking of physical closeness and support. @@.hotpink;$He has become more devoted to you.@@
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<<if canDoVaginal($activeSlave) || canDoAnal($activeSlave)>>
-	<br><<link "Fuck $his prostrate body">>
-		<<replace "#result">>
-			You make no answer, entering the shower to stand over $him prostrate form. You reach down and grope $him soapy <<if $seeRace == 1>>$activeSlave.race <</if>>buttocks, questing fingers moving towards $his asscrack.
-			<<if ($activeSlave.anus > 2) && canDoAnal($activeSlave)>>
-				$His rectum is so fucked out and loose that your groping hand almost slides up it.
-			<<elseif ($activeSlave.vagina > 2) && canDoVaginal($activeSlave)>>
-				$His pussy is so fucked out and loose that your groping hand almost slides up it.
-			<<else>>
-				You finger fuck $him for a while, the sting of the soap on $his sensitive insides making $him gasp.
-			<</if>>
-			As $he moans down on the shower floor, you lie down behind $him, spooning $his helpless body<<if $activeSlave.belly >= 5000>>, your hands encircling $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>><</if>>.
-			<<if $PC.dick != 0>>
-				Your cock slides into $him with ease
-			<<elseif $PC.boobs >= 300>>
-				$His soft back is delicious against your hard nipples
-			<<else>>
-				The contours of $his soft rear feel lovely against your feminine petals
-			<</if>>
-			and the warm water playing over your warm bodies is a comforting accompaniment to the comforting sex.
-			<<if $PC.dick == 0>>
-				You ride yourself against $his warm wet body until you climax from the rubbing alone
-			<<else>>
-				You leave a load of cum in
-				<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-					each of $his holes
-					<<set _didVaginal = 1, _didAnal = 1>>
-				<<elseif canDoAnal($activeSlave)>>
-					$his loosened butthole
-					<<set _didAnal = 1>>
-				<<else>>
-					$his loosened vagina
-					<<set _didVaginal = 1>>
-				<</if>>
-				<<if $PC.vagina != -1>> and make $him eat your pussy for a quick aftershock,<</if>>
-			<</if>>
-			and only then do you help $him back to $his feet. $He drips soap, water, and <<if $PC.dick == 0>>your juices<<else>>ejaculate<</if>>. @@.hotpink;$He has become more submissive.@@
-			<<if _didVaginal == 1 && _didAnal == 1>>
-				<<= VCheck.Both($activeSlave, 1)>>
-			<<elseif _didVaginal == 1>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<elseif _didAnal == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>><<if $PC.dick != 0 && (($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave)))>> //This option will take $his virginity//<</if>>
-<</if>>
-<br><<link "Let $him struggle">>
-	<<replace "#result">>
-		$He struggles for a while until you get bored and leave $him to it. Eventually $his thrashing brings another slave in, who helps $him. This interdependence between slaves @@.mediumorchid;reduces $his devotion.@@
-		<<set $activeSlave.devotion -= 5>>
-	<</replace>>
-<</link>>
-
-<<case "unhappy virgin">>
-
-<<if canDoAnal($activeSlave)>>
-	<<link "No, and $his role is to suck dick and take it in the ass">>
-		<<replace "#result">>
-			You patiently explain that you've decided to use $him as an oral and anal slave, and leave $his pussy unfucked. $He's unsurprised, but $he understands your decision. You usually fuck slaves during your inspection, and you don't exempt $him from this, but you do let $him take it easy. Rather than facefucking $him you let $him suckle you gently. Rather that a hard buttfuck, you take $him to the couch and gently spoon $him with your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his ass while making out with $him and playing with $his nipples. $He understands your forbearance and @@.hotpink;appreciates how kind $his <<= getWrittenTitle($activeSlave)>> is.@@
-			<<set $activeSlave.devotion += 4>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</replace>>
-	<</link>>
-<<else>>
-	<<link "No, and $his role is to suck dick and like it">>
-		<<replace "#result">>
-			You patiently explain that you've decided to use $him as an oral slave, since $his ass is off-limits, and leave $his pussy unfucked. $He's unsurprised, but $he understands your decision. You usually fuck slaves during your inspection, and you don't exempt $him from this, but you do let $him take it easy. Rather than facefucking $him you let $him suckle you gently, calmly patting $his head as $he does. $He understands your forbearance and @@.hotpink;appreciates how kind $his <<= getWrittenTitle($activeSlave)>> is.@@
-			<<set $activeSlave.devotion += 4>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<</replace>>
-	<</link>>
-<</if>>
-<br><<link "No, and $he shouldn't have asked">>
-	<<replace "#result">>
-		Despite being allowed to ask questions $he should not question $his <<= getWrittenTitle($activeSlave)>>'s choices about $his sexual duties. To communicate the point, you<<if $PC.dick == 0>> don a strap-on and<</if>> order $him to lie on the desk, on $his back, with $his throat slack for penetration.
-		<<if canDoAnal($activeSlave)>>
-			After a good long throatfuck that leaves $him gasping and moaning, you flip $him over and fuck $his ass until $he's squealing with each thrust.
-		<<else>>
-			Only after an extended and forceful series of throatfuckings that leaves the bewildered $desc gasping for air and barely conscious, do you feel $he has learned what hole $he should be focused on. For good measure, you deepthroat $him one last time, to really drive the point home.
-		<</if>>
-		As $he leaves, sore all over, $he's @@.mediumorchid;badly confused@@ that $he was apparently punished for asking questions.
-		<<set $activeSlave.devotion -= 5>>
-		<<if canDoAnal($activeSlave)>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<<else>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative", 4)>>
-		<</if>>
-	<</replace>>
-<</link>>
-<br><<link "Yes, the time has come">>
-	<<replace "#result">>
-		$He framed $his desire to lose $his virginity in businesslike terms, but $his reaction to your assent suggests that $he also wouldn't mind having vanilla sex with $his <<= getWrittenTitle($activeSlave)>>. You're already quite
-		<<if $PC.dick == 0>>
-			turned on by the idea, so you pull on a strap-on, pull $him over to the couch<<if ($activeSlave.chastityVagina)>>, unfasten $his chastity belt<</if>>,
-		<<else>>
-			hard, so you just lie down with $him on the couch<<if ($activeSlave.chastityVagina)>>, unfasten $his chastity belt,<</if>>
-		<</if>>
-		and have gentle vaginal sex in the missionary position <<if $PC.vagina != -1>><<if $PC.dick != 0>>, your own pussy moving back and forth gently at the base of your dick as you fuck $him<</if>><</if>>. $He gasps at the first penetration, but you take it slowly and lavish attention on $his lips, breasts, and nipples. Soon $he's shamelessly enjoying $himself. $His first vaginal sex is crowned with an abdominal-clenching orgasm. $He @@.hotpink;adores $his kind <<= getWrittenTitle($activeSlave)>>.@@
-		<<set $activeSlave.devotion += 10, $activeSlave.vagina = 1>>
-		<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-		<<if $activeSlave.chastityVagina == 1>><<set $activeSlave.chastityVagina = 0>><</if>>
-		<<if canImpreg($activeSlave, $PC)>>
-			<<= knockMeUp($activeSlave, 25, 0, -1)>>
-		<</if>>
-	<</replace>>
-<</link>><<if ($activeSlave.chastityVagina)>> //This option will remove $his chastity belt//<</if>>
-
-<<case "fearful balls">>
-
-<<link "Threaten $him with castration">>
-	<<replace "#result">>
-		You open a drawer of your desk and extract a razor-sharp ceramic-bladed knife. <<if canSee($activeSlave)>>You make a show of inspecting its edge and then place it on your desk before looking meaningfully at $his ballsack. $He watches this display with wide eyes<<else>>You describe what it is you took out of your desk and how easily it could be used to remove $his ballsack. $He cocks $his head slightly<</if>> until $he gets your meaning, and then collapses to the ground, almost wetting $himself.
-		<<if !canTalk($activeSlave)>>
-			$He frantically uses $his hand<<if hasBothArms($activeSlave)>>s<</if>> to promise you perfect obedience if you'll only spare $him from emasculation.
-		<<else>>
-			$He begs through tears, "Plea<<s>>e no, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>! Plea<<s>>e let me keep them! Plea<<s>>e!"
-		<</if>>
-		You patiently inform $him that $he can — for now, and so long as $he is a good little $girl. $He flees from the room backwards, bowing, scraping, and profusely thanking you, repeating desperate @@.gold;promises of good behavior.@@
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<br><<link "Force obedience using pain">>
-	<<replace "#result">>
-		You shove $his unresisting<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>swollen<</if>><</if>> body over the couch and seize $his ballsack. When $he feels your tight grip $he spasms and tries to pull away reflexively, but goes limp when $he feels the agony of a warning squeeze. You fasten a tight rubber ring around the base of $his sack, leaving $him writhing on the couch in considerable discomfort. After letting $him wriggle for a while, you tell $him that $he can have it off when $he gets you off. $He scrabbles for your <<if $PC.dick == 0>>pussy and desperately starts to perform cunnilingus; after a while you get bored and ride $his face. You finally climax<<else>>dick and starts to desperately suck you off<<if $PC.vagina != -1>> and eat you out<</if>>; you let $him work for a while before getting bored and adding painful slaps to $his cheeks. You blow your load down $his throat<</if>> and then stand, <<if canSee($activeSlave)>>brandishing the knife<<else>>swishing the knife through the air<</if>>. <<if canSee($activeSlave)>>$His eyes are huge<<else>>$He grimaces<</if>> with terror, but $he holds still. $His private parts have gone so numb that $he has to <<if canSee($activeSlave)>>look down<<else>>run $his hand across $his scrotum<</if>> in trepidation to verify that you cut the rubber, not $him. $He leaves with the pins and needles working their agonizing way back into $him along with the blood flow to $his balls, promising tearfully to @@.gold;stay out of trouble.@@
-		<<set $activeSlave.trust -= 5>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br><<link "Geld $him gradually">>
-	<<replace "#result">>
-		You shove $his unresisting<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>swollen<</if>><</if>> body over the couch and seize $his ballsack. When $he feels your tight grip $he spasms and tries to pull away reflexively, but goes limp when $he feels the agony of a warning squeeze. You fasten a tight rubber ring around the base of $his sack, leaving $him writhing on the couch in considerable discomfort. You add leather mittens to $his hands to stop $him from removing the rubber, and then observe that this is a method used to geld livestock. $His tearful begging goes on until you tire of it and put $him out. <<= capFirstChar($assistant.name)>> tracks $his agonized, weeping progress around the arcology for the many hours it takes the lack of blood flow to necessitate a trip to the remote surgery. When that time comes, you make $him beg you to remove $his balls for an hour straight before you do — and $he's so desperate for relief from the pain that $he does it. The experience has left $him @@.health.dec;slightly injured,@@ @@.orange;gelded,@@ @@.red;thoroughly traumatized,@@ and @@.gold;willing to do anything@@ to avoid any more pain.
-		<<set $activeSlave.behavioralFlaw = "odd", $activeSlave.trust -= 20, $activeSlave.balls = 0, $activeSlave.scrotum = 0>>
-		<<run surgeryDamage($activeSlave, 10)>>
-	<</replace>>
-<</link>>
-
-<<case "extreme aphrodisiacs">>
-
-<<link "Take pity and give $him relief">>
-	<<replace "#result">>
-		You sit on the edge of the bed and draw $him down to sit on your lap. This way, you can enjoy gently fucking $him while you draw orgasm after orgasm out of $him with your hands. $He'll only be relieved for a few hours, but $he's @@.hotpink;tearfully grateful all the same.@@
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "See how rough you can be and still get $him to cum">>
-	<<replace "#result">>
-		The aphrodisiac dosage $he's on will let $him orgasm to almost anything. You spend a few minutes playing with $his nipples, skillfully edging $him away from climax, and $he's almost vibrating with discomfort. $He's so desperate that $he sobs with relief when you order $him to
-		<<if ($activeSlave.heels == 1) && shoeHeelCategory($activeSlave) == 0>>
-			kneel
-		<<elseif shoeHeelCategory($activeSlave) > 1>>
-			totter up
-		<<else>>
-			stand
-		<</if>>
-		<<if $activeSlave.belly >= 5000>>
-			_belly belly
-		<</if>>
-		against a wall and spread $his buttocks. A little saliva and<<if $PC.vagina != -1>> a bit of your own pussyjuice, transferred by a couple of fingers, and<</if>> <<if $PC.dick == 0>>your vibrating strap-on<<else>>your dick<</if>> is up $his willing ass. The position is uncomfortable for $him, and you are not gentle, but $he comes anyway. By the end of the night $his butthole is so sore that $he <<if $activeSlave.belly >= 5000>>lies on $his side<<else>>lies on $his stomach<</if>> every chance $he gets. $His submissiveness @@.hotpink;has increased.@@
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Send $him away">>
-	<<replace "#result">>
-		$He leaves with ill-concealed disappointment, and is faced with the choice between covert, rule-breaking masturbation or a sleepless night. $His regard for you @@.mediumorchid;has decreased.@@
-		<<set $activeSlave.devotion -= 5>>
-	<</replace>>
-<</link>>
-
-<<case "shaped areolae">>
-
-<<link "Show $him off around the arcology">>
-	<<replace "#result">>
-		You give $activeSlave.slaveName a variation on a usual slave gown. It's just as gorgeous, but this one actually covers $his <<if $activeSlave.belly >= 1500>>_belly <<if $activeSlave.bellyPreg >= 1500>>pregnancy<<else>>belly<</if>>, <</if>>ass and crotch as well. In fact, it covers $his
-		<<if isAmputee($activeSlave)>>
-			limbless torso and head completely: everything except the lower part of $his face, and $his boobs.
-		<<else>>
-			<<if hasAllLimbs($activeSlave)>>arms, legs,<<else>>limbs<</if>> and $his face from the nose up. The only flesh visible at all is $his mouth, $his chin, and $his huge breasts, supported and presented by gentle corseting.
-		<</if>>
-		<<if !hasAnyLegs($activeSlave)>>
-			You carry $him around
-			<<if $club != 0>>
-				$clubName.
-			<<else>>
-				$arcologies[0].name's clubs.
-			<</if>>
-		<<else>>
-			You place a gentle hand on the small of $his back to guide $him, and stroll around
-			<<if $club != 0>>
-				$clubName.
-			<<else>>
-				$arcologies[0].name's clubs.
-			<</if>>
-		<</if>>
-		$activeSlave.slaveName <<if canSee($activeSlave)>>is blinded by the silk over $his face<<else>>may not be able to see<</if>>, but $he can still <<if canHear($activeSlave)>>hear the appreciative murmurs<<else>>feel the appreciative presence<</if>> of onlookers as they eye $his magnificent breasts with their <<= $activeSlave.areolaeShape>>-shaped areolae. $He shivers a little with suppressed pride. @@.hotpink;$His devotion to you has increased,@@ and @@.green;your reputation as a person with unique property grows.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run repX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<br><<link "Use that pride as an advertisement">>
-	<<replace "#result">>
-		There's all sorts of business going on in $arcologies[0].name, from flesh rented or bought down to more pedestrian affairs. Advertisement never goes amiss. You place $activeSlave.slaveName naked on a slowly rotating pedestal surrounded by a clear plastiglass tube on a busy thoroughfare in the lower parts of $arcologies[0].name. These devices are often used to display slaves for sale or slave whores for rent; $activeSlave.slaveName is simply identified by your name as arcology owner, which is thus @@.yellowgreen;identified with business prosperity.@@ $He spends the day serving as eye candy for passersby, rotating gently on the pedestal as $he shows off $his body, giving pride of place to $his <<= $activeSlave.areolaeShape>>-shaped areolae. $He loves all the attention, and @@.hotpink;$his devotion to you has increased.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run cashX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-
-<<case "huge tits">>
-
-<<link "Join $him in the shower">>
-	<<replace "#result">>
-		You step into the running water and help $him to $his feet with exaggerated gallantry. $He seems surprised <<if canSee($activeSlave)>>and stares at<<else>>faces<</if>> you through the steam for a moment before looking away with a blush. Before long you have $his back against the shower wall, $his titanic udders<<if $activeSlave.belly >= 5000>> and _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>> belly<</if>> offering an amusing challenge as they slide soapily between you as you fuck. $He comes in no time at all, and a brief massage of $his huge soapy nipples produces a whimpering aftershock orgasm. <<if canSee($activeSlave)>>$His <<= App.Desc.eyesColor($activeSlave)>> stare straight into yours<<else>>You stare into $his <<= App.Desc.eyesColor($activeSlave)>><</if>> as $he writhes with overstimulation, @@.mediumaquamarine;$his trust in your stewardship of $his pleasure total.@@
-		<<if canDoVaginal($activeSlave)>><<= VCheck.Vaginal($activeSlave, 1)>><<elseif canDoAnal($activeSlave)>><<= VCheck.Anal($activeSlave, 1)>><</if>>
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>> <<if ($activeSlave.vagina == 0) && canDoVaginal($activeSlave)>>//This option will take $his virginity//<<elseif ($activeSlave.vagina == -1) && ($activeSlave.anus == 0) && canDoAnal($activeSlave)>>//This option will take $his anal virginity//<</if>>
-<br><<link "Fuck $his immobilized body">>
-	<<replace "#result">>
-		You make no answer, groping $his soapy <<if $seeRace == 1>>$activeSlave.race <</if>>buttocks.
-		<<if ($activeSlave.anus > 2) && canDoAnal($activeSlave)>>
-			$His rectum is so fucked out and loose that your groping hand almost slides up it.
-		<<elseif ($activeSlave.vagina > 2) && canDoVaginal($activeSlave)>>
-			$His pussy is so fucked out and loose that your groping hand almost slides up it.
-		<<else>>
-			You finger fuck $him for a while, the sting of the soap on $his sensitive insides making $him gasp.
-		<</if>>
-		It's not like you can't tie $him up and fuck $him whenever you like, but sliding back and forth on $his soapy body is kind of nice.
-		<<if $PC.dick == 0>>
-			You ride yourself against $him until you orgasm
-		<<else>>
-			You leave a load of cum in
-			<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-				each of $his holes
-				<<set _didVaginal = 1, _didAnal = 1>>
-			<<elseif canDoAnal($activeSlave)>>
-				$his loosened butthole
-				<<set _didAnal = 1>>
-			<<else>>
-				$his loosened vagina
-				<<set _didVaginal = 1>>
-			<</if>>
-			<<if $PC.vagina != -1>> and make $him eat your pussy for a quick aftershock,<</if>>
-		<</if>>
-		and only then do you help $him back to $his feet. $He drips soap, water, and <<if $PC.dick == 0>>your juices<<else>>ejaculate<</if>>. @@.hotpink;$He has become more submissive.@@
-		<<if _didVaginal == 1 && _didAnal == 1>>
-			<<= VCheck.Both($activeSlave, 1)>>
-		<<elseif _didVaginal == 1>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<elseif _didAnal == 1>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0) || ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>>
-<br><<link "Let $him figure it out">>
-	<<replace "#result">>
-		$He flounders around for a while until you get bored and leave $him to it. Eventually $his whining brings another slave in, who helps $him. This interdependence between slaves @@.mediumorchid;reduces $his devotion.@@
-		<<set $activeSlave.devotion -= 5>>
-	<</replace>>
-<</link>>
-
-<<case "trusting HG">>
-
-<<link "Commend $his service">>
-	<<replace "#result">>
-		You clear your throat and compliment $him, commending $his work ethic, trustworthiness, and loyalty. $He blushes much harder as $he understands. "Thank you,
-		<<if $HGFormality == 1>>
-			<<Master>>!"
-		<<else>>
-			<<if def $PC.customTitle>><<Master>><<elseif $PC.title != 0>><<S>>ir<<else>>Ma'am<</if>>!"
-		<</if>>
-		$he says fervently, and gestures at the tablet.
-		"I've noti<<c>>ed a couple of the <<s>>lave<<s>> working better together re<<c>>ently, <<s>>o I'm making <<s>>ome minor adju<<s>>tment<<s>> to give them more <<sh>>ift<<s>> together."
-		<br><br>
-		You're sure $he'll do $his best, and you tell $him so. $He thanks you again, and you both go back to your work. Though your Head Girl continues manipulating $his tablet diligently, $he can't seem to stop $himself from @@.hotpink;stealing the occasional glance at you.@@ $His <<= App.Desc.eyesColor($activeSlave)>>, dark in the dimness of the office, seem to have an unaccountable sheen.
-		<<if $assistant.personality != 0>>
-		<<setSpokenAssistantPronouns $activeSlave>>
-		<<= capFirstChar($assistant.name)>>'s $assistant.appearance avatar appears on your desktop, glowing brightly, and ruins the moment. "$activeSlave.slaveName loooves $his <<if def $PC.customTitle>>$PC.customTitle<<elseif $PC.title != 0>>Maaaster<<else>>Miiistress<</if>>," _heA taunts,
-		<<switch $assistant.appearance>>
-		<<case "monstergirl">>
-			_hisA hair forming a heart shape.
-		<<case "shemale">>
-			using _hisA hands to make a heart shape over _hisA balls.
-		<<case "amazon">>
-			grinning far more sweetly than _hisA muscular form should be able to manage.
-		<<case "businesswoman">>
-			though _heA's blushing _himselfA.
-		<<case "cherub" "fairy" "pregnant fairy">>
-			flitting around and giggling excitedly.
-		<<case "goddess">>
-			massaging _hisA pregnant belly meaningfully.
-		<<case "hypergoddess">>
-			massaging _hisA squirming pregnant belly meaningfully.
-		<<case "loli">>
-			giggling playfully.
-		<<case "preggololi">>
-			giggling playfully, though _hisA hands have wandered to _hisA crotch.
-		<<case "angel">>
-			using _hisA hands to make a heart shape.
-		<<case "incubus">>
-			using _hisA hands to make a heart shape around _hisA erection as _heA thrusts.
-		<<case "succubus">>
-			<<if $PC.dick != 0>>forms an "O" with _hisA lips and makes exaggerated head bobbing motions<<else>>forms a "V" with _hisA fingers and wiggles _hisA tongue in it<</if>>.
-		<<case "imp">>
-			flapping around and cackling manically.
-		<<case "witch">>
-			while holding out a mostly empty vial of love potion.
-		<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-			forming half of _himselfA into an enormous pussy, the other into a giant dick, and introducing the two to each other.
-		<<case "schoolgirl">>
-			the very picture of a malicious school<<= _girlA>>.
-		<<default>>
-			turning _hisA avatar a throbbing pink.
-		<</switch>>
-		<br><br>
-		Your Head Girl turns a darker shade of red. "Oh, <<sh>>ut up, you little
-		<<switch $assistant.appearance>>
-		<<case "monstergirl">>
-			mon<<s>>ter,"
-		<<case "shemale">>
-			cockmon<<s>>ter,"
-		<<case "amazon">>
-			dyke,"
-		<<case "businesswoman">>
-			witch,"
-		<<case "fairy" "pregnant fairy">>
-			mo<<s>>quito,"
-		<<case "goddess" "hypergoddess">>
-			cow,"
-		<<case "loli">>
-			midget,"
-		<<case "preggololi">>
-			<<s>>lut <<loliA>>,"
-		<<case "angel">>
-			turkey,"
-		<<case "cherub">>
-			dove,"
-		<<case "incubus">>
-			dick,"
-		<<case "succubus">>
-			cunt,"
-		<<case "imp">>
-			bat,"
-		<<case "witch">>
-			blunderer,"
-		<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-			<<sh>>ape<<sh>>ifter,"
-		<<case "schoolgirl">>
-			<<s>>lut,"
-		<<default>>
-			toa<<s>>ter,"
-		<</switch>>
-		$he says cattily, but $he smiles as well.
-		<</if>>
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Share some refreshments with $him">>
-	<<replace "#result">>
-		You reach into the back of your desk, where your private reserves are, and wordlessly offer $him a
-		<<if $PC.refreshmentType == 0>>
-			$PC.refreshment.
-		<<elseif $PC.refreshmentType == 1>>
-			glass of $PC.refreshment.
-		<<elseif $PC.refreshmentType == 2>>
-			plate of $PC.refreshment.
-		<<elseif $PC.refreshmentType == 3>>
-			line of $PC.refreshment.
-		<<elseif $PC.refreshmentType == 4>>
-			syringe of $PC.refreshment.
-		<<elseif $PC.refreshmentType == 5>>
-			pill of $PC.refreshment.
-		<<elseif $PC.refreshmentType == 6>>
-			tab of $PC.refreshment.
-		<</if>>
-		$He stares at you disbelievingly for a moment before stammering $his thanks and accepting it with both hands. $He holds it uncertainly, watching you get one yourself.
-		<br><br>
-		$He is first among your slaves, but $he is still very much a slave. $He neither receives nor expects
-		<<if $PC.refreshmentType == 0>>
-			indulgences like tobacco and other smokables. Carcinogens are sometimes the necessary side effects of slave body modification, not an acceptable downside of luxury.
-		<<elseif $PC.refreshmentType == 1>>
-			drink other than what the slave feeding systems provide $him. $He might be your Head Girl, but the liquid food keeps $his libido charged, $his body healthy, and $his asshole invitingly clean, just like any other slave.
-		<<elseif $PC.refreshmentType == 2>>
-			food other than what the slave feeding systems provide $him. $He might be your Head Girl, but the liquid food keeps $his libido charged, $his body healthy, and $his asshole invitingly clean, just like any other slave.
-		<<else>>
-			drugs other than what the drug dispensers provide $him. Addictive drugs are rarely provided to slaves, replaced instead with slightly healthier, but no less addictive, aphrodisiacs.
-		<</if>>
-		But it'll do no harm, just this once, and you tell $him so. $He nods, not wanting to spoil the moment by speaking.
-		<br><br>
-		<<if $PC.refreshmentType == 0>>
-			After you light $his $PC.refreshment for $him, $he holds the <<if canTaste($activeSlave)>>first taste<<else>>feeling<</if>> of its smoke in $his mouth for a long, sensual moment before letting it trickle back out through $his lips.
-		<<elseif $PC.refreshmentType == 1 || $PC.refreshmentType == 2>>
-			$He holds the <<if canTaste($activeSlave)>>first taste<<else>>feeling<</if>> of it in $his mouth for a long, sensual moment before swallowing reverently.
-		<<else>>
-			$He savors the thrill of using $PC.refreshment for a moment, before turning to you, an almost desperate need on $his face.
-		<</if>>
-		You return to work, and $he follows your example, though $he's rather distracted. When $he finishes $hers, $he sets $his tablet down for a moment and comes over to you, doing $his best to show $his naked body to its best advantage as $he comes. $He gives you a deep kiss,
-		<<if $PC.refreshmentType == 0 || $PC.refreshmentType == 1 || $PC.refreshmentType == 2>>
-			which tastes of fine $PC.refreshment, with a hint of $activeSlave.slaveName,
-		<<else>>
-			with plenty of tongue,
-		<</if>>
-		and then goes back to work, @@.mediumaquamarine;smiling unconsciously@@ as $he savors the lingering <<if $PC.refreshmentType == 3 || $PC.refreshmentType == 4 || $PC.refreshmentType == 5 || $PC.refreshmentType == 6>>rush<<else>><<if canTaste($activeSlave)>>flavor<<else>>sensation<</if>><</if>>.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-
-<<case "ignorant horny">>
-
-<<link "Tell $him the truth">>
-	<<replace "#result">>
-		You explain the effects of the
-		<<if ($activeSlave.aphrodisiacs > 0) || $activeSlave.inflationType == "aphrodisiac">>
-			sex drugs
-		<<elseif ($activeSlave.clitPiercing == 3) && ($activeSlave.clitSetting != "none")>>
-			advanced <<if $activeSlave.vagina > -1>>clit<<else>>frenulum<</if>> piercing
-		<<else>>
-			slave food
-		<</if>>
-		briefly. Comprehension dawns across $his<<if $activeSlave.faceShape != "normal">> $activeSlave.faceShape<</if>> face.
-		"Yes <<Master>>," $he <<say>>s quietly, more to buy time to formulate a response than anything else. "Um. I <<s>>till really, really want to cum, though. W-would you plea<<s>>e fuck me? Plea<<s>>e, plea<<s>>e, <<Master>>, plea<<s>>e fuck
-		<<if ($activeSlave.vagina > 0) && ($activeSlave.preg > $activeSlave.pregData.normalBirth/4) && canDoVaginal($activeSlave)>>
-			my pregnant pu<<ss>>y."
-		<<elseif ($activeSlave.vagina > 0) && canDoVaginal($activeSlave)>>
-			me."
-		<<elseif canDoAnal($activeSlave)>>
-			my butt."
-		<<else>>
-			<<if ($activeSlave.vagina > 0) && ($activeSlave.preg > $activeSlave.pregData.normalBirth/4)>>
-				my pregnant pu<<ss>>y.
-			<<elseif ($activeSlave.vagina > 0)>>
-				me.
-			<<else>>
-				my butt.
-			<</if>>
-			I need it <<s>>o bad right now, plea<<s>>e rip off my cha<<s>>tity and fuck me <<s>>en<<s>>ele<<ss>>."
-		<</if>>
-		A vague hint of embarrassment at begging for <<if $PC.dick != 0>>a hard<<if $PC.vagina != -1>>futa<</if>> dicking<<else>>your strap-on<</if>> flickers across $his face, but hope for sexual release extinguishes it quickly.
-		<br><br>
-		<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-			$He groans with relief as your <<if $PC.dick != 0>>cock<<else>>phallus<</if>> enters $him. $He does not orgasm immediately, but $he knows sweet release is coming. You have $him atop your desk, on $his back, and $he's participating in $his own sexual degradation by holding $his legs spread wide apart for you. "Ohh," $he moans as you fuck $him, "thank you for telling me why I feel thi<<s>> way, <<Master>>. I gue<<ss>> thi<<s>> i<<s>> how I, oh, am now? Oh, oh, it feel<<s>> <<s>>o g-good! Ye<<s>>! AHH!"
-			<<if $PC.dick != 0>>
-				$His
-				<<if ($activeSlave.vagina > 0) && canDoVaginal($activeSlave)>>
-					cunt
-				<<else>>
-					asshole
-				<</if>>
-				tightens around your shaft delightfully as $he climaxes.
-			<<else>>
-				$He shudders with climax.
-			<</if>>
-			$He smiles @@.mediumaquamarine;trustingly@@ up at you in the afterglow,
-			<<if $activeSlave.balls > 0>>
-				$his ejaculate
-				<<if ($activeSlave.chastityPenis == 1)>>
-					seeping from $his chastity cage,
-				<<else>>
-					glistening on $his<<if $activeSlave.belly > 1500>> _belly<<if $activeSlave.bellyPreg >= 1500>> gravid<</if>><</if>> belly,
-				<</if>>
-			<</if>>
-			touched that you would tell $him something like that so honestly.
-			<<if ($activeSlave.vagina > 0) && canDoVaginal($activeSlave)>>
-				<<= VCheck.Both($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-		<<else>>
-			$He groans with lust as pull $him onto your lap to make out. "Ohh," $he moans as you run your hands across $his
-			<<if $activeSlave.boobsImplant >= 1000 && (($activeSlave.boobsImplant/$activeSlave.boobs) >= .60)>>
-				bimbo
-			<<elseif $activeSlave.boobs >= 1000 && $activeSlave.butt > 5 && $activeSlave.hips > 0>>
-				fecund
-			<<elseif $activeSlave.boobs >= 1000 && $activeSlave.butt > 5>>
-				voluptuous
-			<<elseif $activeSlave.weight > 190>>
-				voluminous
-			<<elseif $activeSlave.belly >= 5000>>
-				<<if $activeSlave.bellyPreg >= 3000>>
-					gravid
-				<<elseif $activeSlave.bellyImplant >= 3000>>
-					rounded
-				<<else>>
-					swollen
-				<</if>>
-			<<elseif $activeSlave.weight > 30>>
-				soft
-			<<elseif $activeSlave.muscles > 30>>
-				ripped
-			<<elseif $activeSlave.muscles > 5>>
-				toned
-			<<elseif $activeSlave.boobs >= 500>>
-				sultry
-			<<else>>
-				needy
-			<</if>>
-			body, "thank you for telling me why I feel thi<<s>> way, <<Master>>. I gue<<ss>> thi<<s>> i<<s>> how I, oh, am now?" You reward $him for the realization by
-			<<switch $activeSlave.nipples>>
-			<<case "huge">>
-				stroking $his lewdly erect nipples.
-			<<case "huge">>
-				tweaking $his revealed nipples.
-			<<case "puffy">>
-				cupping and fondling $his puffy nipples.
-			<<case "partially inverted">>
-				teasing $his fully exposed nipples.
-			<<case "inverted">>
-				squeezing $his puffy areolae until $his inverted nipples pop out for you to tease.
-			<<case "fuckable">>
-				sticking your fingers deep into $his nipples.
-			<<default>>
-				tweaking $his $activeSlave.nipples nipples.
-			<</switch>>
-			The pent-up $girl is so desperate for release, you can feel $him trembling with ecstasy from the nipple stimulation alone.
-			"Oh, oh, it feel<<s>> <<s>>o g-good! Ye<<s>>! AHH!"
-			$He shudders with climax, smiling @@.mediumaquamarine;trustingly@@ up at you in the afterglow,
-			<<if $activeSlave.balls > 0>>
-				$his ejaculate
-				<<if ($activeSlave.chastityPenis == 1)>>
-					seeping from $his chastity cage,
-				<<else>>
-					glistening on $his<<if $activeSlave.belly > 1500>> _belly<<if $activeSlave.bellyPreg >= 1500>> gravid<</if>><</if>> belly,
-				<</if>>
-			<</if>>
-			touched that you would tell $him something like that so honestly.
-			<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<<if ($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown != 1)>>
-	<br><<link "Trade some oral for release">>
-		<<replace "#result">>
-			You observe, noncommittally, that $he seems ready to get off.
-			"Ye<<s>> <<Master>>!" $he squeals, too <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -50>>horny<<else>>stupid<</if>> to notice the sarcasm. Sighing inwardly, you slide yourself back from your desk and glance downward significantly, indicating your <<if $PC.dick != 0>>dick<<if $PC.vagina != -1>> and pussy<</if>><<else>>girl parts<</if>>. $He hurries over, almost throwing $himself at your feet in $his eagerness. "Touch yourself", you say, making it an imperious command rather than kind permission. $He moans into your <<if $PC.dick != 0>>cock<<else>>cunt<</if>> with gratitude as $he
-			<<if canDoVaginal($activeSlave)>>
-				<<if $activeSlave.dick > 0 && !($activeSlave.chastityPenis)>>
-					wraps one hand around $his dick and slips the other into $his pussy.
-				<<else>>
-					dives for $his pussy with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-				<</if>>
-			<<elseif $activeSlave.dick > 0 && !($activeSlave.chastityPenis)>>
-				<<if canAchieveErection($activeSlave)>>
-					<<if $activeSlave.dick > 4>>
-						wraps $his hand<<if hasBothArms($activeSlave)>>s<</if>> around $his huge erection.
-					<<elseif canDoAnal($activeSlave) && $activeSlave.prostate > 0>>
-						wraps a hand around $his throbbing erection and reaches around to finger $his butt and stimulate $his prostate.$his
-					<<else>>
-						wraps a hand around $his throbbing erection.
-					<</if>>
-				<<else>>
-					<<if $activeSlave.dick > 4>>
-						dives for $his huge, soft cock with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-					<<else>>
-						reaches down to fondle $his limp dick.
-					<</if>>
-				<</if>>
-			<<elseif canDoAnal($activeSlave)>>
-				<<if $activeSlave.dick == 0>>
-					reaches down and around to rub $his <<if canDoAnal($activeSlave)>>anus and <</if>>perineum.
-				<<else>>
-					<<if $activeSlave.vagina == -1>>
-						reaches around to finger $his butt, since that's $his only hole.
-					<<elseif $activeSlave.chastityVagina == 1>>
-						reaches around to finger $his butt, since $his pussy's in chastity.
-					<<else>>
-						dives for $his pussy with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-					<</if>>
-				<</if>>
-			<<elseif $activeSlave.vagina == -1 && $activeSlave.dick == 0>>
-				<<if $activeSlave.balls > 4>>
-					cups $his desperate balls, massaging them and encouraging them to release their pent-up cum.
-				<<else>>
-					reaches down and around to rub $his <<if canDoAnal($activeSlave)>>anus and <</if>>perineum.
-				<</if>>
-			<<else>>
-				brings $his hand<<if hasBothArms($activeSlave)>>s<</if>> to $his breasts to <<if $activeSlave.nipples != "fuckable">>tease $his erect<<else>>finger $his swollen<</if>> nipples.
-			<</if>>
-			<br><br>
-			$He's extremely pent up, and orgasms twice with <<if $PC.dick != 0>>your dick in $his mouth<<if $PC.vagina != -1>> first and $his tongue quivering along your pussylips second<</if>><<else>>$his mouth on your cunt<</if>>. The mental effects of this formative little experience are impossible to control with precision. Over the next few days, you notice that whenever <<if canSee($activeSlave)>>$he sees you<<else>>you see $him<</if>>,
-			<<if (random(0,1) == 1)>>
-				$he licks $his lips unconsciously. $He seems to be developing the beginnings of a lovely @@.lightcoral;oral fixation.@@
-				<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>>
-			<<else>>
-				$he betrays mixed feelings. The shocking intimacy of reaching sexual release as $he used $his mouth to pleasure you seems to be @@.hotpink;affecting $him.@@
-				<<set $activeSlave.devotion += 4>>
-			<</if>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "buttslut") || ($activeSlave.fetishKnown != 1)>>
-	<<if ($activeSlave.vagina == -1) && ($activeSlave.attrXY <= 65)>>
-		<br><<link "Make $him cum like a girl">>
-			<<replace "#result">>
-				You order $him to get $his ass up on your desk. $He obeys, though not without a flicker of trepidation. $He points $his butt at you like a sex slave should, and doesn't crane around to <<if canSee($activeSlave)>>see<<else>>feel<</if>> what you're doing behind $him, but $he's stiff with the awareness that <<if $PC.dick != 0>>there's almost certainly a hard<<if $PC.vagina != -1>> futa<</if>> dick about<<else>>you're almost certainly donning a strap-on<</if>> to slide inside $his girly asspussy. $He's not wrong, and $he lets out a little moan as <<if $PC.dick != 0>>your cockhead<<if $PC.vagina != -1>>, which you kindly lubed with a bit of your pussyjuice,<</if>><<else>>its broad tip<</if>> <<if $activeSlave.anus > 2>>slides easily inside $his whorish anus<<elseif $activeSlave.anus == 2>>slides up $his experienced butthole<<else>>forces its way inside $his tight sphincter<</if>>.
-				<br><br>
-				As you fuck $him, you pull $his torso up so you can play with $his <<if $activeSlave.boobs > 2000>>udders<<elseif $activeSlave.boobs > 800>>tits<<else>>nipples<</if>> and whisper manipulation into $his ear. You tell $him $he's about to cum like a girl. $He says nothing, but $his body language communicates incomprehension. Girls, you tell $him, cum when they get fucked. They cum when <<if $PC.title == 1>>guys<<else>>their betters<</if>> stick dick inside them. $He bursts into tears, sobbing with shame and degradation even as $he shakes and <<if $activeSlave.balls > 0>>squirts cum<<else>>dribbles ejaculate<</if>>. The next time $he sees you,
-				<<if (random(0,1) == 1)>>
-					$he visibly gathers $his courage, and flirtatiously @@.lightcoral;offers you $his ass.@@
-					<<set $activeSlave.fetish = "buttslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>>
-				<<else>>
-					$he manages to stop $himself from breaking down, and seems to be @@.hotpink;working hard@@ to convince $himself that $he's a girl.
-					<<set $activeSlave.devotion += 4>>
-				<</if>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</replace>>
-		<</link>>
-	<<elseif ($activeSlave.vagina > -1)>>
-		<br><<link "Work on broadening $his sexual horizons">>
-			<<replace "#result">>
-				$He seems a little too focused on $his hot cunt. You order $him to get up on your desk, and $he obeys eagerly, $his <<if canSee($activeSlave)>><<= App.Desc.eyesColor($activeSlave)>> shining<<else>>facial expression filled<</if>> with lust. <<if canSee($activeSlave)>>They focus<<else>>$He focuses<</if>> on <<if $PC.dick != 0>>your cock as you bring it to bear<<if $PC.vagina != -1>>, not to mention the pussy at its base<</if>><<else>>your strap-on as you step into it<</if>>, and $he's about to express $his gratitude when you push the slave, who is sitting on the edge of your desk with $his legs spread to provide you access to $his pussy, over onto $his back. $He barely has time to reorient $himself when $he feels <<if $activeSlave.anus > 2>>a sudden fullness in $his loose ass<<elseif $activeSlave.anus == 2>>a presence inside $his experienced ass<<else>>something starting to push its way up $his poor little bottom<</if>>.
-				<br><br>
-				$He cannot hide $his disappointment, but has the presence of mind not to protest as you assfuck $him hard enough that $his <<if $activeSlave.boobs > 2000>>ridiculous tits almost hit $him in the face with each stroke<<elseif $activeSlave.boobs > 800>>big boobs bounce all over the place<<else>>boobs bounce<</if>><<if $activeSlave.belly >= 10000>> and taut belly is forced back<</if>>. $His orgasm sneaks up on $him, and comes by surprise, forcing a squeal out of $him as $his sphincter tightens down involuntarily. $He gets up gingerly, clearly feeling sore,
-				<<if (random(0,1) == 1)>>
-					and looks preoccupied. $He reaches idly around and massages $his well-fucked backdoor meditatively, biting $his lower lip as $he investigates. Maybe, $he seems to be thinking, @@.lightcoral;anal is fun?@@
-					<<set $activeSlave.fetish = "buttslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>>
-				<<else>>
-					but @@.hotpink;does $his honest best@@ to look grateful. $He knows $he's a sex slave and can't afford to be particular about little things like getting buttfucked.
-					<<set $activeSlave.devotion += 4>>
-				<</if>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</replace>>
-		<</link>>
-	<</if>>
-<</if>>
-
-<<case "cage relief">>
-
-<<link "Help $him get off">>
-	<<replace "#result">>
-		You take $him by the hand and pull $him to $his feet, and then kiss $him. $He knows that this means no, but melts into you anyway, accepting the comforting gesture for what it is. $He's surprised when you do not break the kiss, but continues to make out with you compliantly. You take $him by the hands, intertwining your fingers with $hers and holding them down at your sides for a while before wrapping $his arms around you at your
-		<<if $PC.belly >= 10000>>
-			heavily pregnant
-		<<elseif $PC.belly >= 5000>>
-			gravid
-		<<elseif $PC.belly >= 1500>>
-			swollen
-		<<elseif $arcologies[0].FSPhysicalIdealist != "unset">>
-			muscular
-		<<elseif $PC.title == 0>>
-			feminine
-		<<else>>
-			masculine
-		<</if>>
-		waist. Your hands, thus freed to grope $him, tenderly hold $his head and neck instead, cupping $his <<if $activeSlave.face > 95>>gorgeous<<elseif $activeSlave.face >= -10>>pretty<<else>>homely<</if>> jawline and making $him moan at the intimacy.
-		<br><br>
-		$He's completely forgotten $his troubles, and you see that it stays that way. You consider yourself something of an expert on human stimulation at this point, and you manage $hers expertly. (Admittedly, you're also cheating, using discreet scanning of $his vital signs to check on $his state of arousal.) Whenever $he's in danger of achieving an erection, which would remind $him of $his chastity cage with a twinge of discomfort, you cool your makeout session off slightly, massaging $him capably instead of kissing $him deeply. After some time, $he shudders, to $his own complete surprise and to your unsurprised satisfaction. $He's just done what in a normal sexual encounter would be considered premature ejaculation, since you wrought $him to such a subtle state of arousal that $he got off without really getting hard. $He can muster no coherent response, but @@.mediumaquamarine;hugs you convulsively,@@ sobbing into your
-		<<if $PC.boobs >= 1400>>
-			enormous<<if $PC.boobsImplant != 0>> fake<</if>> breasts
-		<<elseif $PC.boobs >= 1200>>
-			huge<<if $PC.boobsImplant != 0>> fake<</if>> breasts
-		<<elseif $PC.boobs >= 1000>>
-			big<<if $PC.boobsImplant != 0>> firm<</if>> breasts
-		<<elseif $PC.boobs >= 300>>
-			boobs
-		<<elseif $arcologies[0].FSPhysicalIdealist != "unset">>
-			strong shoulder
-		<<elseif $PC.title == 0>>
-			feminine shoulder
-		<<else>>
-			masculine shoulder
-		<</if>>
-		with gratitude and release.
-		<br><br>
-		The scans suggest $his discomfort will return in less than half an hour.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Cut $his balls off">>
-	<<replace "#result">>
-		You agree, on the condition that $he be a good little bitch like $he promised. $He thanks you frantically, following you with mixed relief, gratitude, and deep terror as you lead $him to the surgery. It's a medically simple procedure, but $he's @@.health.dec;retained for recovery@@ for some time, a common precaution in your penthouse where the surgery affects an area that might be reinjured by sexual use without a short break for the curatives to take effect. When the medical equipment verifies that $he can be fucked without pain or danger to $his health, you order $him to come back up to your office. $He is a @@.hotpink;very good little bitch,@@
-		<<if canDoAnal($activeSlave)>>
-			taking <<if $PC.dick != 0>>a hard buttfuck<<else>>a hard anal fingerfuck<</if>> with apparent enthusiasm and a strong orgasm, though of course $his continued use of a chastity cage conceals almost all the effects.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<else>>
-			enduring all of your teasing without the slightest hint of an erection. Even though $his chastity blocks the use of $his ass, you still focus most of your attention on $his rear for the day the belt comes off.
-		<</if>>
-		When $he goes to the bathroom afterward, however, you see $him <<if canSee($activeSlave)>>glance at $himself in the mirror, just once, and then @@.gold;glance away again,@@<<else>>run $his hand under $his cock, just once, and then @@.gold;quickly removing $his hand,@@<</if>> a tear leaking down $his cheek.
-		<<set $activeSlave.balls = 0, $activeSlave.scrotum = 0, $activeSlave.trust -= 4, $activeSlave.devotion += 4>>
-		<<run surgeryDamage($activeSlave, 5)>>
-	<</replace>>
-	<<replace "#art-frame">>
-		/* 000-250-006 */
-		<<if $seeImages == 1>>
-			<<if $imageChoice == 1>>
-				<div class="imageRef lrgVector"><div class="mask">&nbsp;</div><<SlaveArt $activeSlave 3 0>></div>
-			<<else>>
-				<div class="imageRef lrgRender"><div class="mask">&nbsp;</div><<SlaveArt $activeSlave 3 0>></div>
-			<</if>>
-		<</if>>
-		/* 000-250-006 */
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0) && canDoAnal($activeSlave)>> //This option will take $his anal virginity//<</if>>
-<<if canDoAnal($activeSlave)>>
-	<br><<link "Use $his cage to torture $him">>
-		<<replace "#result">>
-			You make no reply at all, but walk around to stand behind the slave. $He knows $he's fucked, and starts to shake with fear. You put a foot on $his ass and shove $him down<<if $activeSlave.belly >= 5000>> so $his rear is pointed into the air again<<else>> to lie flat on the floor<</if>>, and then straddle $him, shoving <<if $PC.dick != 0>>your<<if $PC.vagina != -1>> futa<</if>> cock up $his butt<<else>>one more finger than $he can comfortably take up $his butt<</if>>. $He tries to beg some more, but you give $him a warning slap, and $he shuts up. Despite your roughness, $he's so horny that $he starts to get hard. You can't see or feel this directly, of course, but it's easy to tell from $his desperate sobbing and involuntary writhing, and the lovely spasming of $his anal sphincter. $His tears dry up as $he builds towards a climax; orgasm might be an uncomfortable experience for $him, but it will buy $him a few minutes free of discomfort.
-			<br><br>
-			But $he's to be disappointed. You <<if $PC.dick != 0>>worm a hand down between $his ass and your stomach, and shove a finger up inside $him, alongside your dick<<if $PC.vagina != -1>>, dexterously using the thumb of that hand to stroke your own pussy<</if>><<else>>use the hand that isn't fucking $him to pull one of $his arms around behind $him into a painful joint lock<</if>>. The pain ruins $his building orgasm, and $he cries with frustration and @@.gold;despair@@ as $he realizes that $he won't be getting off today. You force $him to experience this horrible near-release twice more, bringing $him to a terribly uncomfortable state of arousal and then using sudden pain to destroy any chance $he has of getting relief. All the wriggling and jerking around is good for you, though.
-			<<set $activeSlave.trust -= 4>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-<<if ((($activeSlave.fetish == "pregnancy" && $PC.belly >= 5000) || ($activeSlave.fetish == "cumslut" && $PC.balls >= 14) || ($activeSlave.fetish == "boobs" && $PC.boobs >= 1400)) && $activeSlave.fetishKnown == 1) || ((($activeSlave.attrXX > 70 && $activeSlave.attrXY < 50 && $PC.title == 0 && $PC.vagina != -1 && $PC.dick == 0) || ($activeSlave.attrXY > 70 && $activeSlave.attrXX < 50 && $PC.title == 1 && $PC.vagina == 0 && $PC.dick != 0)) && $activeSlave.attrKnown == 1)>>
-	<br><<link "Use your body to make $his cage feel even tighter">>
-		<<replace "#result">>
-			You order $him to pay close attention<<if canSee($activeSlave)>> and not look away<</if>>.
-			<<if ($activeSlave.fetish == "pregnancy" && $PC.belly >= 5000)>>
-				<<if canSee($activeSlave)>>
-					$He questions what you mean until you begin sensually swaying your
-					<<if $PC.belly >= 100000>>
-						massive pregnancy
-					<<elseif $PC.belly >= 60000>>
-						giant pregnancy
-					<<elseif $PC.belly >= 15000>>
-						advanced pregnancy
-					<<elseif $PC.belly >= 10000>>
-						big, pregnant belly
-					<<else>>
-						pregnant belly
-					<</if>>
-					and slowly stripping down. $He groans at the sight, $his dick rapidly hardening at the view of your motherly body. You make sure to play off $his pregnancy fetish in every way possible until the aroused slave is in tears from the pressure on $his cock.
-				<<else>>
-					$He questions what you mean until you grab $his head and push $his face against your
-					<<if $PC.belly >= 100000>>
-						massive pregnancy.
-					<<elseif $PC.belly >= 60000>>
-						giant pregnancy.
-					<<elseif $PC.belly >= 15000>>
-						advanced pregnancy.
-					<<elseif $PC.belly >= 10000>>
-						big, pregnant belly.
-					<<else>>
-						pregnant belly.
-					<</if>>
-					$He tries to recoil, bringing a hand to your middle. You catch it and run it along your motherly curve to your popped navel. You trace $his hand around it as $he groans at the sensation, $his dick rapidly hardening at the feel of your motherly body. You make sure to play off $his pregnancy fetish in every way possible until the aroused slave is in tears from the pressure on $his cock.
-				<</if>>
-			<<elseif ($activeSlave.fetish == "cumslut" && $PC.balls >= 14)>>
-				<<if canSee($activeSlave)>>
-					$He questions what you mean until you begin sensually caressing your massive balls and slowly stripping down. You quickly bring yourself erect and start to jack off. $He groans at the sight, licking $his lips a the thought of your coming load as $his dick rapidly hardens. You tease yourself and hype up just how big and messy your orgasm will be, making $him quiver with painful arousal. You moan as you feel the distinct sensation of your coming ejaculation, the sheer amount of sperm moving through you takes some time to release. You hug your nuts, thrusting repeatedly until the wave of cum forces its way out of your throbbing dick. You sigh with relief, just to rub it in $his face.
-				<<else>>
-					$He questions what you mean until you strip down and pull $his face directly into your massive balls. $He tries to recoil, bringing $his hand<<if hasBothArms($activeSlave)>>s<</if>> to the immense spheres. You catch them and use one to massage your nuts and encourage a nice big load for $him and the other the help jack you off. You can feel $him shaking from the pressure on $his dick. Not only do you paint $him with seed, but you sigh loudly with relief, just to rub it in.
-				<</if>>
-			<<elseif ($activeSlave.fetish == "boobs" && $PC.boobs >= 1400)>>
-				<<if canSee($activeSlave)>>
-					$He questions what you mean until you pull your arms back, forcing your enormous<<if $PC.boobsImplant != 0>> fake<</if>> breasts to pop free of your top. $He groans at the sight, $his dick rapidly hardening at the view of your impressive rack. You make sure to play off $his tit fetish in every way possible until the aroused slave is in tears from the pressure on $his cock.
-				<<else>>
-					$He questions what you mean until you grab $his head and push $his face against your enormous<<if $PC.boobsImplant != 0>> fake<</if>> breasts. $He tries to recoil, bringing $his hand<<if hasBothArms($activeSlave)>>s<</if>> to your breasts. You continue burying $his face in your rack as $he begins to grope you. $He groans at the sensation, $his dick rapidly hardening at the feel of your lovely tits. You make sure to play off $his boob fetish in every way possible until the aroused slave is in tears from the pressure on $his cock.
-				<</if>>
-			<<elseif ($activeSlave.attrXX > 70 && $activeSlave.attrXY < 50 && $PC.title == 0 && $PC.vagina != -1 && $PC.dick == 0)>>
-				<<if canSee($activeSlave)>>
-					$He questions what you mean until you begin your strip tease. $He groans at the sight, $his dick rapidly hardening at the view of your tits and pussy. You know just how arousing $he finds the female form, and you play off that until the aroused slave is in tears from the pressure on $his cock.
-				<<else>>
-					$He questions what you mean until you grab $his head and push $his face into your pussy. $He tries to recoil, bringing $his hand<<if hasBothArms($activeSlave)>>s<</if>> to your rear. You continue rubbing yourself against $his face as begins to grope you, enjoying your feminine features. $He groans as $his dick rapidly hardens at the feel of your curves and the <<if canSmell($activeSlave)>>scent of<<else>>warmth from<</if>> your arousal. You know just how arousing $he finds the female form, and you play off that until the aroused slave is in tears from the pressure on $his cock.
-				<</if>>
-			<<else>>
-				<<if canSee($activeSlave)>>
-					$He questions what you mean until you begin your strip tease. $He groans at the sight, $his dick rapidly hardening at the view of your erection. You know just how arousing $he finds the male form, and you play off that until the aroused slave is in tears from the pressure on $his cock.
-				<<else>>
-					$He questions what you mean until you grab $his head and push $his face against your dick. $He tries to recoil, bringing $his hand<<if hasBothArms($activeSlave)>>s<</if>> to your balls. You continue rubbing yourself against $his face as begins to fondle you, enjoying your masculine features. $He groans as $his dick rapidly hardens at the feel of your penis against your face and the <<if canSmell($activeSlave)>>scent of<<else>>warmth from<</if>> your arousal and precum. You know just how arousing $he finds the male form, and you play off that until the aroused slave is in tears from the pressure on $his cock.
-				<</if>>
-			<</if>>
-			You leave $him in a @@.gold;worse state than $he started in,@@ as $he's hornier than ever and still lacks any satisfying release. But that's $his problem, not yours.<<if $PC.belly >= 10000>> Even when so heavily pregnant, it feels good to know you can still bring a dick to full attention.<</if>>
-			<<set $activeSlave.trust -= 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-
-<<case "used whore">>
-
-<<link "Use $him anyway">>
-	<<replace "#result">>
-		You reach out, grab $his shoulder, and shove $him against the wall.
-		<<if !canTalk($activeSlave)>>
-			$He manages to use a gesture to beg you not to,
-		<<else>>
-			$He manages to beg, "Plea<<s>>e no, <<Master>> —"
-		<</if>>
-		before you give $him a hard warning slap on the ass to shut $him up. $He's quiet, but starts to sob a little when $he feels <<if $PC.dick == 0>>the head of a strap-on<<else>>your cock<</if>> against $his
-		<<if canDoAnal($activeSlave)>>
-			anus.
-			<<if ($activeSlave.anus > 2)>>
-				It's gaped before you even touch it, but it's clearly sore enough that $he dreads anal anyway.
-			<<elseif ($activeSlave.anus > 1)>>
-				It's been fucked loose, but it's clearly sore enough that $he dreads anal anyway.
-			<<else>>
-				It's somehow not gaped yet, and $he dreads having it stretched yet again.
-			<</if>>
-			<<if ($activeSlave.height >= 185)>>
-				$He's tall enough that the angle isn't that uncomfortable for $him.
-			<<elseif ($activeSlave.anus > 0)>>
-				$He hikes $himself desperately up on $his tiptoes to make the angle less uncomfortable for $him.
-			<<else>>
-				$He hikes $himself desperately up on $his tiptoes, but $he's so short the angle is desperately uncomfortable for $him.
-			<</if>>
-			$He decides to try begging one last time, and
-			<<if canDoVaginal($activeSlave)>>
-				<<if !canTalk($activeSlave)>>
-					signs to ask you to use $his pussy instead
-				<<else>>
-					whines, "Just u<<s>>e my pu<<ss>>y, plea<<s>>e!"
-				<</if>>
-			<<else>>
-				<<if !canTalk($activeSlave)>>
-					signs to ask you to let $him suck you off instead
-				<<else>>
-					whines, "Let me <<s>>uck you off, plea<<s>>e!"
-				<</if>>
-			<</if>>
-			as you shove <<if $PC.dick == 0>>the strap-on<<else>>yourself<</if>> up $his butt. $He reflexively tries to get away into the wall,
-			<<if $activeSlave.belly > 100000>>
-				$his _belly belly squashing out to either side.
-			<<elseif ($activeSlave.boobs > 2000)>>
-				$his enormous boobs squashing out to either side.
-			<<elseif ($activeSlave.boobs > 1000)>>
-				$his big boobs squashing out to either side.
-			<<elseif ($activeSlave.boobs > 300)>>
-				$his boobs crashing into it.
-			<<else>>
-				$his sore nipples giving $him a jerk as $he does.
-			<</if>>
-			After some continued whining through $his tears, $he gives up and just @@.gold;lets you@@ rape $his sore ass.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<else>>
-			pussy lips.
-			<<if ($activeSlave.vagina > 2)>>
-				It's gaped before you even touch it, but it's clearly sore enough that $he dreads penetration anyway.
-			<<elseif ($activeSlave.vagina > 1)>>
-				It's been fucked loose, but it's clearly been used enough that $he dreads penetration anyway.
-			<<else>>
-				It's somehow not loose yet, and $he dreads having it stretched yet again.
-			<</if>>
-			<<if ($activeSlave.height >= 185)>>
-				$He's tall enough that the angle isn't that uncomfortable for $him.
-			<<elseif ($activeSlave.anus > 0)>>
-				$He hikes $himself desperately up on $his tiptoes to make the angle less uncomfortable for $him.
-			<<else>>
-				$He hikes $himself desperately up on $his tiptoes, but $he's so short the angle is desperately uncomfortable for $him.
-			<</if>>
-			$He decides to try begging one last time, and
-			<<if !canTalk($activeSlave)>>
-				signs to ask you to let $him suck you off instead
-			<<else>>
-				whines, "Let me <<s>>uck you off, plea<<s>>e!"
-			<</if>>
-			as you shove <<if $PC.dick == 0>>the strap-on<<else>>yourself<</if>> up $his cunt. $He reflexively tries to get away into the wall,
-			<<if $activeSlave.belly > 100000>>
-				$his _belly belly squashing out to either side.
-			<<elseif ($activeSlave.boobs > 2000)>>
-				$his enormous boobs squashing out to either side.
-			<<elseif ($activeSlave.boobs > 1000)>>
-				$his big boobs squashing out to either side.
-			<<elseif ($activeSlave.boobs > 300)>>
-				$his boobs crashing into it.
-			<<else>>
-				$his sore nipples giving $him a jerk as $he does.
-			<</if>>
-			After some continued whining through $his tears, $he gives up and just @@.gold;lets you@@ rape $his sore vagina.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<</if>>
-		When you finally <<if ($PC.dick != 0)>>fill $his <<if canDoAnal($activeSlave)>>butt<<else>>pussy<</if>> with your ejaculate and pull out,<<if $PC.vagina != -1>> the motion releasing a waft of the combined cum and pussyjuice smell of a satisfied futa,<</if>><<else>>shudder with orgasm and withdraw your strap-on,<</if>> $he slumps and turns to go, looking a bit sad for some reason.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Manipulate $him into asking to suck you off">>
-	<<replace "#result">>
-		You reach out, grab $his shoulder, and shove $him against the wall.
-		<<if !canTalk($activeSlave)>>
-			$He manages to use a gesture to beg you not to,
-		<<else>>
-			$He manages to beg, "Plea<<s>>e no, <<Master>> —"
-		<</if>>
-		before you give $him a hard warning slap on the ass to shut $him up. $He's quiet, but starts to sob a little when $he feels <<if $PC.dick == 0>>the head of a strap-on<<else>>an invading<<if $PC.vagina != -1>> futa<</if>> cockhead<</if>> against $his
-		<<if canDoAnal($activeSlave)>>
-			anus.
-			<<if ($activeSlave.anus > 2)>>
-				It's gaped before you even touch it, but it's clearly sore enough that $he dreads anal anyway.
-			<<elseif ($activeSlave.anus > 1)>>
-				It's been fucked loose, but it's clearly sore enough that $he dreads anal anyway.
-			<<else>>
-				It's somehow not gaped yet, and $he dreads having it stretched yet again.
-			<</if>>
-		<<else>>
-			pussy lips.
-			<<if ($activeSlave.vagina > 2)>>
-				It's gaped before you even touch it, but it's clearly sore enough that $he dreads penetration anyway.
-			<<elseif ($activeSlave.vagina > 1)>>
-				It's been fucked loose, but it's clearly been used enough that $he dreads penetration anyway.
-			<<else>>
-				It's somehow not loose yet, and $he dreads having it stretched yet again.
-			<</if>>
-		<</if>>
-		$He
-		<<if !canTalk($activeSlave)>>
-			signs let $him suck you off instead.
-		<<else>>
-			whines, "Let me <<s>>uck you off, plea<<s>>e!"
-		<</if>>
-		Having gotten $him to beg for what you wanted all along, you spin $him so $his
-		<<if $activeSlave.weight > 160>>
-			rippling
-		<<elseif $activeSlave.weight > 95>>
-			fat
-		<<elseif ($activeSlave.muscles > 95)>>
-			powerful
-		<<elseif ($activeSlave.muscles > 30)>>
-			strong
-		<<elseif ($activeSlave.muscles > 5)>>
-			toned
-		<<else>>
-			feminine
-		<</if>>
-		back hits the wall with a smack and shove $him down it until $his
-		<<if ($activeSlave.lips > 70)>>
-			massive
-		<<elseif ($activeSlave.lips > 40)>>
-			pillowlike
-		<<elseif $activeSlave.lips > 20>>
-			girlish
-		<<elseif $activeSlave.lips > 10>>
-			average
-		<<else>>
-			minuscule
-		<</if>>
-		lips are level with your <<if $PC.dick == 0>>fake dick<<else>>dick<</if>><<if $activeSlave.belly >= 100000>>, straddle $his _belly belly<</if>>, and push it into $his mouth without waiting for $him to get ready. $He gags, but does $his best to work $his tired mouth. When you're finally satisfied and you let $him up, you aim another slap at $his
-		<<if ($activeSlave.butt > 12)>>
-			inhuman ass
-		<<elseif ($activeSlave.butt > 5)>>
-			massive ass
-		<<elseif ($activeSlave.butt > 2)>>
-			big butt
-		<<elseif $activeSlave.butt > 0>>
-			nice ass
-		<<else>>
-			flat ass
-		<</if>>
-		and let $him see it coming; $he @@.hotpink;accepts@@ the spank due to fright at what you might do if $he dodged before fleeing.
-		<<set $activeSlave.devotion += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br><<link "Just talk with $him">>
-	<<replace "#result">>
-		You take $him by the hand, lead $him to a nearby couch, and sit down with $him, letting $him seat $himself beside you so $he can
-		<<if $activeSlave.belly >= 5000>>
-			rest $his <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>bulk against you
-		<<else>>
-			lean against you
-		<</if>>
-		without putting too much weight on $his poor overused butthole. You ask $him about $his day.
-		<<if !canTalk($activeSlave)>>
-			$He uses gestures to recount it through $his tears. Apparently while one guy was using $his anus, another thought it was hot and waited for him to be done before using $him in turn, without letting $him rest or clean $himself. It took four cocks total for another slave to notice and rescue $him.
-		<<else>>
-			$He <<say>>s, a little tearfully, "<<Master>>, thi<<s>> guy wanted to u<<s>>e my butt in public. <<S>>o of cour<<s>>e I let him, and he made me <<s>>it in hi<<s>> lap to do it, and held my leg<<if hasBothLegs($activeSlave)>><<s>><</if>> back <<s>>o everyone could <<s>>ee! And then another guy thought it wa<<s>> hot and waited, and then fucked me in my a<<ss>> too. Another <<s>>lave finally noti<<c>>ed and re<<s>>cued me after four cock<<s>>, <<Master>>. I'm really <<s>>ore."
-		<</if>>
-		$He <<if canSee($activeSlave)>>looks up at you with big <<= App.Desc.eyesColor($activeSlave)>><<else>>gazes at you<</if>> for a long moment, a final tear leaking down $his $activeSlave.skin cheek, before $he suddenly
-		<<if !canTalk($activeSlave)>>
-			shakes with mute laughter.
-		<<else>>
-			giggles.
-		<</if>>
-		$He explains $himself after a while: it's not what $he thought $he'd be doing with $his life,
-		<<switch $activeSlave.career>>
-		<<case "a bioreactor" "a breeder" "a breeding bull" "a dairy cow" "a dairy slave" "a Fuckdoll" "a Futanari Sister" "a slave" "a slave since birth" 0>>
-			once upon a time.
-		<<default>>
-			back when $he was <<= convertCareer($activeSlave)>>.
-		<</switch>>
-		<<if !canTalk($activeSlave)>>
-			$He points to $himself and uses both hands to mimic sodomy, as though to suggest that's all $he is, before giving you a rueful smile.
-		<<else>>
-			"_slavename the butthole ho, that'<<s>> me," $he <<say>>s sadly, before giving you a rueful smile.
-		<</if>>
-		$He kisses you on the cheek and @@.mediumaquamarine;thanks you@@ for listening instead of raping $him.
-		<<set $activeSlave.trust += 4>>
-		<br><br><span id="result2">
-			<<link "Kiss $him back">>
-				<<replace "#result2">>
-					You turn to kiss $him back, on the lips this time. $He <<if canSee($activeSlave)>>sees<<else>>feels<</if>> your intention and @@.mediumaquamarine;complies trustingly,@@ closing $his eyes and tilting $his head slightly so your lips lock perfectly.
-					<<if ($activeSlave.lips > 70)>>
-						$His ridiculous, pillowlike lips part softly.
-					<<elseif ($activeSlave.teeth == "pointy")>>
-						$He opens $his jaw wide, careful to keep $his shark's teeth well clear of you.
-					<<elseif ($activeSlave.teeth == "fangs")>>
-						$He keeps $his jaw steady so you may work around $his fangs easier.
-					<<elseif ($activeSlave.teeth == "fang")>>
-						You try your best to work around $his lone fang.
-					<</if>>
-					After a few seconds, $he realizes you aren't planning to break the kiss anytime soon, and softens, $his<<if $activeSlave.bellyPreg >= 1500>> pregnant<</if>> body relaxing against yours. $He scoots closer to you, bringing $his legs up under $him on the couch cushions so $he can face you comfortably. $He leans one
-					<<if $activeSlave.weight > 160>>
-						extremely well padded
-					<<elseif $activeSlave.weight > 95>>
-						well padded
-					<<elseif ($activeSlave.muscles > 30)>>
-						muscular
-					<<elseif ($activeSlave.weight > 10)>>
-						plush
-					<<elseif $activeSlave.hips > -1>>
-						pretty
-					<</if>>
-					hip against your leg, hiking $himself half onto your lap so $he can make out with you without having to sit with any weight on $his sore butthole.
-					<<set $activeSlave.trust += 2>>
-				<</replace>>
-			<</link>>
-			<br><<link "Rape $him">>
-				<<replace "#result2">>
-					But $he's wrong to place that kind of faith in you. As $he withdraws from the kiss, you snake a betraying hand between $his butt and the couch, and shove
-					<<if $activeSlave.anus <= 1>>
-						two rude fingers up $his sore little anus.
-					<<elseif $activeSlave.anus == 2>>
-						three rude fingers up $his sore anus.
-					<<else>>
-						all four of your fingers and your thumb, formed into a point, as far up $his loose butt as they will go.
-					<</if>>
-					$He lets out a pained "oh," and then goes silent. For such a little sound, it bears a great weight of @@.gold;betrayed trust.@@ You insert your fingers to the knuckle, making $him writhe with discomfort, and then turf $him off the couch to land
-					<<if $activeSlave.belly >= 300000>>
-						across $his _belly stomach
-					<<else>>
-						face first
-					<</if>>
-					on the floor in front of you. $He tries to spread $his butt and angle $his hips like a good $girl, but you slap $his hands away and push your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> inside $him without regard for $his poor anus. $He shudders and begins to cry, and keeps crying as you ravage $his asshole. When you climax and pull out, $he continues to weep, but stumbles off to wash. When $he comes back, $he's still sniffling, but without being prompted,
-					<<if $activeSlave.belly >= 300000>>
-						@@.hotpink;$he leans over $his belly and offers you $his sore butthole again.@@
-					<<else>>
-						@@.hotpink;$he gets down on $his knees and offers you $his sore butthole again.@@
-					<</if>>
-					<<set $activeSlave.trust -= 4, $activeSlave.devotion += 5>>
-					<<= VCheck.Anal($activeSlave, 1)>>
-				<</replace>>
-			<</link>>
-		</span>
-	<</replace>>
-<</link>>
-
-<<case "desperately horny">>
-
-<<link "Touch $him enough to get $him off">>
-	<<replace "#result">>
-		You tell $him that $he deserves a reward for coming to you. $He almost bursts into tears and nods jerkily, unable to do anything else. You brush a finger across $his cheek, $his ear, $his lips; at each touch $he <<if !canTalk($activeSlave)>>breathes in sharply<<else>>gasps<</if>>. Moving around behind $him, you run a hand down $his flank to $his hip, and then around to $his<<if $activeSlave.belly >= 10000 || $activeSlave.bellyPreg >= 5000>> popped<</if>> navel, and up to cup $his breasts. Your run a thumb <<if $activeSlave.nipples != "fuckable">>over<<else>>into<</if>> each nipple, almost tipping $him over the edge. Your hands move down again,
-		<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-			spreading $his buttocks to tease $his clenched anus, and then forward across $his perineum. From there, you trace $his labia and end with a pinch of $his clit — and this is enough.
-		<<elseif canDoAnal($activeSlave)>>
-			spreading $his buttocks to tease $his clenched anus, and then forward across $his perineum — and this is enough.
-		<<elseif canDoVaginal($activeSlave)>>
-			tracing $his labia, and then forward to $his clit — and this is enough.
-		<<else>>
-			to give $his buttcheeks a rub down before teasing at $his chastity — and this is enough.
-		<</if>>
-		$He spasms, pitching forward
-		<<if $activeSlave.belly >= 300000>>
-			onto $his obscene belly.
-		<<else>>
-			and almost falling.
-		<</if>>
-		$He hurries to clean up after $himself, sobbing with relief and thanking you; $his submissiveness @@.hotpink;has increased.@@
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<<if ($activeSlave.fetishKnown == 1) && ($activeSlave.fetish != "none")>>
-	<br><<link "Reward $him for coming to you">>
-		<<setNonlocalPronouns $seeDicks>>
-		<<replace "#result">>
-			$He almost cries with relief when you tell $him to
-			<<switch $activeSlave.fetish>>
-			<<case "submissive">>
-				lie down on your desk on $his side in the fetal position. $He clambers up hurriedly and hugs $his knees<<if $activeSlave.belly >= 10000>> as best $he can with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy <</if>>in the way<</if>>, spinning $himself around on the smooth surface so $his rear is pointing right at you. You stand up and pull $him over, $his $activeSlave.skin skin sliding across the cool glass desktop, until $his
-				<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
-					butt is right at the edge of the desk. You warm yourself up with a pussy fuck before shifting your attention to $his neglected asshole.
-					<<= VCheck.Both($activeSlave, 3)>>
-					When you finish, you
-				<<elseif canDoAnal($activeSlave)>>
-					butt is right at the edge of the desk.
-					<<= VCheck.Anal($activeSlave, 3)>>
-					You give it a good fuck and then
-				<<elseif canDoVaginal($activeSlave)>>
-					pussy is right at the edge of the desk.
-					<<= VCheck.Vaginal($activeSlave, 3)>>
-					You give it a good fuck and then
-				<<else>>
-					mouth is right at the edge of the desk. You give it a good fuck and then
-					<<run seX($activeSlave, "oral", $PC, "penetrative", 3)>>
-				<</if>>
-				order $him brusquely to clean up and come right back. You use $him as a nice little desktop <<if $PC.dick != 0>>cockholster<<else>>sex toy<</if>> for the rest of the day.
-			<<case "cumslut">>
-				get under your desk and <<if $PC.dick != 0>>suck a dick<<if $PC.vagina != -1>> and eat a pussy<</if>><<else>>eat pussy<</if>> while you work.
-				<<if $activeSlave.belly >= 120000>>
-					As $his _belly belly bumps into you, you sigh and swivel your chair to the side; there is no way $he'll fit under there in $his bloated state.
-				<</if>>
-				$He's so horny that $he's barely got <<if $PC.dick != 0>>your cock into $his mouth<<else>>$his lips and tongue on your cunt<</if>> before $he climaxes spontaneously, shivering and moaning nicely. You keep $him down there for a while, doing light work and orgasming occasionally as $he gently <<if $PC.dick != 0>>blows you<<if $PC.vagina != -1>> and eats you out<</if>><<else>>lavishes attention on your wet vagina<</if>>.
-				<<run seX($activeSlave, "oral", $PC, "penetrative", 3)>>
-			<<case "humiliation">>
-				run an unimportant message to a citizen across $arcologies[0].name. Naked. $He blushes with mixed embarrassment and anticipation. $He's so pent up that before taking ten steps out of your penthouse entryway and towards $his objective, the open stares $his naked, horny body is getting push $him over the edge.
-				<<if ($activeSlave.chastityPenis == 1)>>
-					As $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> along, $his chastity cage continues to stream precum. It spatters $his legs, making $his desperation completely obvious to anyone who looks at $his<<if $activeSlave.belly >= 150000>> from behind<</if>>.
-				<<elseif canAchieveErection($activeSlave)>>
-					$His rock hard cock,
-					<<if $activeSlave.belly >= 150000>>
-						forced down by the size of $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>stomach<</if>> as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, jerks suddenly and shoots out a little squirt of cum down the underside of $his belly.
-					<<else>>
-						sticking straight forward as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, jerks suddenly upward and shoots out a little squirt of cum<<if $activeSlave.belly >= 10000>> across the underside of $his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>.
-					<</if>>
-					As $he stumbles forward, each step releases another squirt.
-				<<elseif ($activeSlave.dick > 0)>>
-					$His <<if $activeSlave.dick > 6>>enormous <</if>>soft cock, flopping around as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, starts to twitch weakly and release little dribbles of cum. As $he stumbles forward, each step releases another squirt.
-				<<elseif $activeSlave.anus > 2>>
-					As $he stumbles a little with the orgasm, $his <<if canDoAnal($activeSlave)>>naked anus is easily visible from behind $him, and its lewd spasms attract attention<<else>>anus lewdly spasms under $his chastity, and $his odd motions attract attention<</if>>.
-				<<elseif canDoVaginal($activeSlave)>>
-					$He focuses $his attention on $his pussy, awkwardly stumbling along as $he tries to walk and finger $himself at the same time.
-				<<elseif canDoAnal($activeSlave)>>
-					$He focuses $his attention on $his asspussy, awkwardly stumbling along as $he tries to walk and play with $his own butt at the same time.
-				<<elseif $activeSlave.vagina > 0>>
-					$He squirts a little femcum down $his inner thighs as $he stumbles along, trailing the odor of a woman's pleasure behind $him.
-				<<else>>
-					$He focuses $his attention on $his breasts, awkwardly stumbling along as $he tries to walk and <<if $activeSlave.nipples != "fuckable">>tweak<<else>>finger<</if>> $his own nipples at the same time.
-				<</if>>
-				Passersby point and laugh, thrilling $him.
-			<<case "buttslut">>
-				sit on your lap.
-				<<if canDoAnal($activeSlave)>>
-					$He climaxes the instant your <<if $PC.dick != 0>>dickhead<<else>>strap-on<</if>> touches $his <<if $activeSlave.anus > 2>>anal gape<<else>>pucker<</if>>, but $he knows this is just the start, and $he laughs with pleasure as $his <<if $activeSlave.anus > 2>>lewd sphincter loosely squeezes<<else>>sphincter tightens against<</if>> the base of <<if $PC.dick != 0>>your cock<<else>>the strap-on<</if>>. You
-					<<if $activeSlave.belly >= 5000>>
-						spread your legs more and shove the<<if $activeSlave.bellyPreg >= 3000>>pregnant, <</if>>giggling buttslut down so $his _belly belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.
-					<<else>>
-						shove the giggling buttslut down so $his chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.
-					<</if>>
-					$He wraps $his legs around the back of the chair and hugs your knees with $his arms, securing $himself
-					<<if $activeSlave.belly >= 100000>>
-						to you as an anal cocksleeve for as long as you feel like keeping <<if $PC.dick != 0>>your penis lodged up a compliant butthole<<else>>the happy buttslut nice and full<</if>>.
-					<<else>>
-						under the desk as an anal cocksleeve for as long as you feel like keeping <<if $PC.dick != 0>>your penis lodged up a compliant butthole<<else>>the happy buttslut trapped under there<</if>>.
-					<</if>>
-					<<= VCheck.Anal($activeSlave, 1)>>
-				<<else>>
-					$He climaxes the instant your <<if $PC.dick != 0>>dickhead<<else>>strap-on<</if>> squeezes between $his
-					<<if $activeSlave.butt < 2>>
-						flat, tight cheeks,
-					<<elseif $activeSlave.butt <= 2>>
-						cute cheeks,
-					<<elseif $activeSlave.butt <= 3>>
-						round, firm cheeks,
-					<<elseif $activeSlave.butt <= 4>>
-						curvy, enticing buttcheeks,
-					<<elseif $activeSlave.butt <= 5>>
-						huge cheeks,
-					<<elseif $activeSlave.butt <= 6>>
-						massive, alluring cheeks,
-					<<elseif $activeSlave.butt <= 7>>
-						enormous cheeks,
-					<<elseif $activeSlave.butt <= 10>>
-						gigantic, jiggly cheeks,
-					<<elseif $activeSlave.butt <= 14>>
-						inhuman, cushiony butt cheeks,
-					<<elseif $activeSlave.butt <= 20>>
-						couch-like, super jiggly ass cheeks,
-					<</if>>
-					but $he knows this is just the start, and $he laughs with pleasure as hug $his rear around <<if $PC.dick != 0>>your cock<<else>>the strap-on<</if>>. You
-					<<if $activeSlave.belly >= 5000>>
-						spread your legs more and shove the<<if $activeSlave.bellyPreg >= 3000>>pregnant, <</if>>giggling buttslut down so $his _belly belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.
-					<<else>>
-						shove the giggling buttslut down so $his chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.
-					<</if>>
-					$He wraps $his legs around the back of the chair and hugs your knees with $his arms, securing $himself
-					<<if $activeSlave.belly >= 100000>>
-						to you as an a cockbun for as long as you feel like keeping <<if $PC.dick != 0>>your penis wrapped in a happy buttslut<<else>>the happy buttslut entertained<</if>>.
-					<<else>>
-						under the desk as a cockbun for as long as you feel like keeping the happy buttslut trapped under there.
-					<</if>>
-					under the desk as cockbun for as long as you feel like keeping the happy buttslut trapped under there.
-				<</if>>
-			<<case "boobs">>
-				lie atop your desk. You don't bother specifying that $he's to lie on $his back, since the boob slut jumps up and presents $his tits without instructions. You keep working with one hand while you idly tease and <<if $activeSlave.nipples != "fuckable">>flick<<else>>finger<</if>> the nearest <<if $activeSlave.lactation > 0>>milky <</if>> nipple with the other. $He's so horny that $he immediately experiences an immodest orgasm, $his back arching away from the cool glass desktop as $he rides its waves. $He giggles a little, and then gasps as you resume playing with $him.
-				<<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, 4)>>
-				<</if>>
-			<<case "pregnancy">>
-				<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-					join you on the couch. Since <<if ($activeSlave.vagina >= 0)>>you're saving $his pussy<<else>>this slave $girl doesn't have a pussy<</if>>, and $his tight little rosebud is off limits, your options are a bit limited. But you work with what you have, playing with $his
-					<<if isFertile($activeSlave)>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how pregnancy would make them drip with cream.
-						<<else>>
-							breasts and describing in whispers how big they'll swell if $he got pregnant.
-						<</if>>
-					<<elseif $activeSlave.preg > $activeSlave.pregData.normalBirth/2>>
-						<<if $activeSlave.lactation == 1>>
-							nipples and describing in whispers how nice and swollen $he is with milk.
-						<<else>>
-							breasts and describing in whispers how big $he's gotten since $he got pregnant.
-						<</if>>
-					<<elseif $activeSlave.preg > 0>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how $his pregnancy will soon have them drip with cream.
-						<<else>>
-							breasts and describing in whispers how $his pregnancy will soon swell them to feed $his child<<if $activeSlave.pregType > 1>>ren<</if>>.
-						<</if>>
-					<<else>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how they'd drip with cream if only $he could get pregnant.
-						<<else>>
-							breasts and describing in whispers how big they'd swell if only $he could get pregnant.
-						<</if>>
-					<</if>>
-					$He gasps and shudders against you.
-					<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-				<<elseif ($activeSlave.anus == 0) && ($activeSlave.vagina <= 0)>>
-					join you on the couch. Since <<if ($activeSlave.vagina == 0)>>$he's a virgin and you haven't elected to introduce $him to pussyfucking just yet<<else>>this slave $girl doesn't have a pussy<</if>>, and $his tight little rosebud is fresh and unspoiled, your options are a bit limited. But you work with what you have, playing with $his
-					<<if isFertile($activeSlave)>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how pregnancy would make them drip with cream.
-						<<else>>
-							breasts and describing in whispers how big they'll swell if $he got pregnant.
-						<</if>>
-					<<elseif $activeSlave.preg > $activeSlave.pregData.normalBirth/2>>
-						<<if $activeSlave.lactation == 1>>
-							nipples and describing in whispers how nice and swollen $he is with milk.
-						<<else>>
-							breasts and describing in whispers how big $he's gotten since $he got pregnant.
-						<</if>>
-					<<elseif $activeSlave.preg > 0>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how $his pregnancy will soon have them drip with cream.
-						<<else>>
-							breasts and describing in whispers how $his pregnancy will soon swell them to feed $his child<<if $activeSlave.pregType > 1>>ren<</if>>.
-						<</if>>
-					<<else>>
-						<<if $activeSlave.lactation == 0>>
-							nipples and describing in whispers how they'd drip with cream if only $he could get pregnant.
-						<<else>>
-							breasts and describing in whispers how big they'd swell if only $he could get pregnant.
-						<</if>>
-					<</if>>
-					$He gasps and shudders against you.
-					<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-				<<elseif $activeSlave.pregKnown == 1>>
-					join you on the couch. <<if $PC.dick != 0>>You orgasm inside $him promptly, and then tell $him you'll be leaving your seed inside $him to do its work while you have $him again.<<else>>You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into $him. You tell $him you'll be leaving it inside $him to do its work while you have $him again.<</if>> $He gasps at the appeal of the idea and grinds $himself against you hungrily.
-					<<if !canDoVaginal($activeSlave)>>
-						<<if $activeSlave.mpreg == 1>>
-							$He's already pregnant, but that doesn't disrupt $his fantasy of being even more pregnant.
-						<<else>>
-							It's $his butt you're fucking, but that doesn't disrupt $his fantasy.
-						<</if>>
-						<<= VCheck.Anal($activeSlave, 1)>>
-					<<else>>
-						$He's already pregnant, but that doesn't disrupt $his fantasy of being even more pregnant.
-						<<= VCheck.Vaginal($activeSlave, 1)>>
-					<</if>>
-				<<else>>
-					join you on the couch. <<if $PC.dick != 0>>You orgasm inside $him promptly, and then tell $him you'll be leaving your seed inside $him to do its work while you have $him again.<<else>>You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into $him. You tell $him you'll be leaving it inside $him to do its work while you have $him again.<</if>> $He gasps at the appeal of the idea and grinds $himself against you hungrily.
-					<<if !canDoVaginal($activeSlave)>>
-						<<if $activeSlave.mpreg == 1>>
-							$He's eager to get pregnant and intends to put $his asspussy to use.
-						<<else>>
-							It's $his butt you're fucking, but that doesn't disrupt $his fantasy.
-						<</if>>
-						<<= VCheck.Anal($activeSlave, 1)>>
-					<<else>>
-						$He's eager to get pregnant and intends to put $his pussy to use.
-						<<= VCheck.Vaginal($activeSlave, 1)>>
-					<</if>>
-				<</if>>
-			<<case "dom">>
-				wait a moment, because you know what $he needs. $He's mystified, but steels $himself and waits. Another slave appears for an inspection, and _heU discovers that _heU's to be inspected with $activeSlave.slaveName's <<if canPenetrate($activeSlave)>>cock up _hisU asshole<<else>>fingers assfucking _himU<</if>>. The dominant $activeSlave.slaveName climaxes immediately to $his use of the poor slave, rubbing <<if $activeSlave.belly >= 5000>>$his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>$himself<</if>> all over the other slave's buttocks while $he continues banging _hisU backdoor.
-				<<run seX($activeSlave, "penetrative", "slaves", "anal")>>
-			<<case "sadist">>
-				wait a moment, because you know what $he needs. $He's mystified, but steels $himself and waits. Another slave appears for a trivial punishment, and _heU discovers that _heU's to be punished by $activeSlave.slaveName's <<if canPenetrate($activeSlave)>>dick<<else>>fingers<</if>>, forced up _hisU anus. The dominant $activeSlave.slaveName climaxes quickly, but quickly recovers and keeps assraping the poor _girlU.
-				<<run seX($activeSlave, "penetrative", "slaves", "anal")>>
-			<<case "masochist">>
-				get $his ass up on your desk and
-				<<if $activeSlave.belly >= 300000>>
-					lie off the side atop $his _belly stomach.
-				<<elseif $activeSlave.belly < 1500>>
-					lie on $his side.
-				<<else>>
-					lie face-down.
-				<</if>>
-				$He <<if $activeSlave.belly >= 10000>>struggles to heft $his <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>body<<else>>clambers<</if>> up, and you let $his lie there for a while, tortured by anticipation and arousal, before giving $his nearest buttock a harsh open-handed slap. The shock and pain send $him over the edge immediately, and $he grinds forward into the desk involuntarily; the feeling of the cool desk against $his <<if ($activeSlave.dick > 0)>>dickhead<<elseif $activeSlave.vagina == -1>>crotch<<else>>mons<</if>> slams $him into a second climax, and $he sobs with overstimulation. You keep $him there for a good long while, using $him as a desktop toy that makes interesting noises when you hit it.
-			<</switch>>
-			<<if ($activeSlave.fetishStrength > 95)>>
-				Since $he's totally sure of what gets $him off, this proof you know it too makes $him @@.mediumaquamarine;trust you.@@
-				<<set $activeSlave.trust += 5>>
-			<<else>>
-				Since $he's developing $his kinks, this reinforcement of $his sexual identity @@.lightcoral;advances $his fetish.@@
-				<<set $activeSlave.fetishStrength += 4>>
-			<</if>>
-		<</replace>>
-	<</link>><<if (canDoVaginal($activeSlave) && $activeSlave.vagina == 0) || (canDoAnal($activeSlave) && $activeSlave.anus == 0)>> //This option may take $his virginity//<</if>>
-<</if>>
-<br>Let $him get off:
-<<if ($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while $he sucks">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. From now on, $he can come to you and ask to <<if $PC.dick == 0>>perform cunnilingus on you<<else>>blow you<<if $PC.vagina != -1>> and eat you out<</if>><</if>>, and masturbate while $he does. $He nods through $his tears and hurriedly gets to $his knees, gagging in $his clumsy eagerness, crying a little with relief as $he masturbates furiously<<if $PC.vagina != -1>><<if $PC.dick != 0>> and does $his best to simultaneously please both a cock and a cunt with only one mouth<</if>><</if>>. $He doesn't even pause after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-			<<set $activeSlave.devotion += 4>>
-			<<run seX($activeSlave, "oral", $PC, "penetrative", 5)>>
-			<<if ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>> has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>>.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "boobs") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "during nipple play">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. From now on, $he can come to you and offer you $his breasts; $he will be allowed to masturbate while you do. $He nods through $his tears and hurriedly presents $his chest, crying a little with relief as $he feels <<if $activeSlave.nipples != "fuckable">>you nip a nipple with your teeth<<elseif $PC.dick != 0>>your dick slip into a nipple<<else>>your tongue penetrate into $his nipple<</if>>. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-			<<set $activeSlave.devotion += 4>>
-			<<run seX($activeSlave, "mammary", $PC, "penetrative", 5)>>
-			<<if ($activeSlave.fetish == "boobs") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of breast play has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "boobs", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at every brush against $his breasts.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if (($activeSlave.fetish != "pregnancy") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)) && canDoVaginal($activeSlave)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "during insemination play">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.vagina > 3)>>hopelessly gaped pussy<<elseif ($activeSlave.vagina > 2)>>loose pussy<<elseif ($activeSlave.vagina > 1)>>nice pussy<<else>>tight pussy<</if>>; $he will be allowed to masturbate while you fill $him with cum. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a spurting strap-on<<else>>your cock<</if>> into $his spasming cunt. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-			<<= VCheck.Vaginal($activeSlave, 5)>>
-			<<set $activeSlave.devotion += 4>>
-			<<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of pregnancy play has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "pregnancy", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of getting pregnant.@@
-			<</if>>
-		<</replace>>
-	<</link>><<if ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if ($activeSlave.fetish != "buttslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<<if canDoAnal($activeSlave)>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while $he takes it up the ass">>
-			<<replace "#result">>
-				You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.anus > 3)>>hopelessly gaped rectum<<elseif ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<else>>tight asshole<</if>>; $he will be allowed to masturbate while you buttfuck $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming rectum. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-				<<= VCheck.Anal($activeSlave, 5)>>
-				<<set $activeSlave.devotion += 4>>
-				<<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>>
-					<<set $activeSlave.fetishStrength += 4>>
-					@@.lightcoral;$His enjoyment of anal has increased.@@
-				<<elseif random(1,100) > 50>>
-					<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "buttslut", $activeSlave.fetishKnown = 1>>
-					Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of anal sex.@@
-				<</if>>
-			<</replace>>
-		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-	<</if>>
-<</if>>
-<<if ($activeSlave.fetish != "humiliation") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "in public">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can masturbate in public, sitting with $his legs spread for as much exposure as possible. $He nods through $his tears and sprints out of your office, dripping as $he goes. $He throws $himself to the ground outside, to the considerable amusement of passersby, spreading $his legs painfully wide. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-			<<set $activeSlave.devotion += 4>>
-			<<if ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of humiliation has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "humiliation", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's starting to long for humiliation.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "submissive") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "after submitting to you">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules.
-			<<if canDoVaginal($activeSlave)>>
-				For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.vagina > 3)>>hopelessly loose pussy<<elseif ($activeSlave.vagina > 2)>>big slit of a pussy<<elseif ($activeSlave.vagina > 1)>>nice pussy<<else>>tight pussy<</if>>; $he will be allowed to masturbate after, but only after, you are finished with $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his nether lips apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming vagina. You are not gentle, and despite the stimulation $he does not orgasm by the time you <<if $PC.dick == 0>>climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch<<else>>blow your load in $his ass<</if>>. $He's so eager to get off $he doesn't bother to move, and just
-				<<if $activeSlave.belly >= 1500>>
-					snakes a hand down to fondle $himself.
-				<<else>>
-					rolls onto $his face to hump $himself against $his hand, against the desk.
-				<</if>>
-				<<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>Your cum leaks out of $his used cunt and onto $his working hand<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-				<<= VCheck.Vaginal($activeSlave, 5)>>
-			<<elseif canDoAnal($activeSlave)>>
-				For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.anus > 3)>>hopelessly gaped rectum<<elseif ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<else>>tight asshole<</if>>; $he will be allowed to masturbate after, but only after, you are finished with $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming rectum. You are not gentle, and despite the anal stimulation $he does not orgasm by the time you <<if $PC.dick == 0>>climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch<<else>>blow your load in $his ass<</if>>. $He's so eager to get off $he doesn't bother to move, and just
-				<<if $activeSlave.belly >= 1500>>
-					snakes a hand down to fondle $himself.
-				<<else>>
-					rolls onto $his face to hump $himself against $his hand, against the desk.
-				<</if>>
-				<<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>Your cum leaks out of $his used backdoor and onto $his working hand<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-				<<= VCheck.Anal($activeSlave, 5)>>
-			<<else>>
-				For the rest of the week, $he can come to you and politely ask to <<if $PC.dick != 0>>suck you off<<else>>eat you out<</if>>; $he will be allowed to masturbate after, but only after, you are satisfied. $He nods through $his tears and
-				<<if $activeSlave.belly >= 300000>>
-					leans over $his _belly stomach,
-				<<else>>
-					<<if $activeSlave.belly >= 10000>>
-						struggles
-					<<else>>
-						hurriedly gets
-					<</if>>
-					to $his knees,
-				<</if>>
-				where $he brings $his face to your <<if $PC.dick != 0>>erect cock<<else>>moist pussy<</if>> and $his hand to $his crotch. $He starts crying a little with relief as $he feels you slowly <<if $PC.dick == 0>>push your slit against<<else>>insert your cock into<</if>> $his mouth. You are not gentle, and by the time you <<if $PC.dick != 0>>blow your load down $his throat<<else>>splash $his face with your girlcum<</if>>, $he still hasn't reached $his climax. $He's so eager to get off $he doesn't bother to move, and just humps $himself against $his hand, against
-				<<if $activeSlave.belly >= 300000>>
-					$his belly.
-				<<else>>
-					your leg.
-				<</if>>
-				<<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>After the momentary pause of your climax, you pull $his face back to your crotch for a second round<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-				<<run seX($activeSlave, "oral", $PC, "penetrative", 5)>>
-			<</if>>
-			<<set $activeSlave.devotion += 4>>
-			<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of submission has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "submissive", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of submission.@@
-			<</if>>
-		<</replace>>
-	<</link>><<if (canDoVaginal($activeSlave) && $activeSlave.vagina == 0) || (canDoAnal($activeSlave) && $activeSlave.anus == 0)>> //This option may take $his virginity//<</if>>
-<</if>>
-<<if ($activeSlave.fetish != "masochist") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while in pain">>
-		<<replace "#result">>
-			You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and masturbate: but you will abuse $him while $he does. $He starts to cry in fear, but <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk anyway. You swat $his thighs apart so $he can get a hand down there. $He hesitates desperately before touching $himself, knowing that as soon as $he does the pain will start, but $his horniness wins out. You aim a vicious flick at $his <<if ($activeSlave.nipples == "huge")>>absurd nipples<<elseif ($activeSlave.nipples != "tiny")>>big nipples<<else>>nipples<</if>> and then take a crop out of your desk, flogging $his <<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>>fake<<elseif ($activeSlave.boobs > 1000)>>jiggling<<else>>firm<</if>> breasts without mercy. $He finally orgasms and flees, falling over $his own feet in $his desperation; $his acceptance of sexual slavery @@.hotpink;has increased.@@
-			<<set $activeSlave.devotion += 4>>
-			<<if ($activeSlave.fetish == "masochist") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of pain has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "masochist", $activeSlave.fetishKnown = 1>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of $his <<= getWrittenTitle($activeSlave)>> beating $him.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "restricted profession">>
-
-<<link "Let $him speak briefly if $he's very quiet">>
-		<<replace "#result">>
-		You stand up from your desk and approach $him very closely without touching $him. Looking straight
-		<<if hasAnyEyes($activeSlave)>>
-			into $his eye<<if hasBothEyes($activeSlave)>>s<</if>>,
-			which are
-			<<if canSee($activeSlave)>>
-				fixed helplessly on you,
-			<<else>>
-				gazing in your general direction,
-			<</if>>
-		<<else>>
-			at $him,
-		<</if>>
-		you tell $him that you'll let $him say whatever it is $he needs to say to you, but only if $he's very quiet. $He <<if canSee($activeSlave)>>looks at you with huge eyes but<</if>> nods vigorously. $He waits until you lean into $him, making $him shiver at your proximity, before putting $his
-		<<if $activeSlave.lips > 70>>
-			ridiculous
-		<<elseif $activeSlave.lips > 40>>
-			enormous
-		<<elseif $activeSlave.lips > 20>>
-			pillowlike
-		<<else>>
-			girlish
-		<</if>>
-		lips next to your ear and whispering nervously, "I love you, <<Master>>." $He recoils a little as if burned by the audacity of $his words, but only manages to back off a little before you gather $his
-		<<if isAmputee($activeSlave)>>
-			limbless
-		<<elseif $activeSlave.bellyPreg >= 1500>>
-			gravid
-		<<elseif $activeSlave.belly >= 1500>>
-			_belly
-		<<else>>
-			rocking
-		<</if>>
-		torso into your arms, holding the back of $his head with one hand and rubbing $his quivering back with the other. Eventually, $he relaxes into
-		<<if ($PC.boobs >= 300)>>
-			<<if $PC.boobsImplant != 0>>
-				your fake breasts,
-			<<else>>
-				your soft chest,
-			<</if>>
-		<<else>>
-			you,
-		<</if>>
-		knowing that $his <<= getWrittenTitle($activeSlave)>> can never and will never reciprocate, but @@.hotpink;accepting@@ that the loving physical contact is a tremendously kind gesture for a master to make.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Make $him say it in public">>
-	<<replace "#result">>
-		Since you suspect you know what it is $he wants to say, you <<if !hasAnyLegs($activeSlave)>>carry $him out<<elseif hasAnyArms($activeSlave)>>lead $him by the hand<<else>>have $him follow you<</if>> onto the club, busy with citizens. You tell $him quietly that $he's to shout whatever it is $he wanted to say, if it's something everyone should hear; otherwise $he's to keep it to $himself. $He <<if canSee($activeSlave)>>looks around<<elseif canHear($activeSlave)>>listens<<else>>opens $his mouth<</if>> nervously, $his $activeSlave.skin skin betraying a growing blush, before clearing $his throat twice, licking $his lips, and howling "I LOVE MY _shoutitoutloud" at the tops of $his lungs. When this is out of $him $he collapses a little, as though the pressure of holding it inside were propping $him up. This attracted a considerable amount of attention, almost all of it @@.green;positive,@@ with many passersby laughing at the fun, and your fellow slaveowners giving you discreet winks and quiet congratulations.
-		<<run repX(750, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<br><<link "Keep $him quiet but spend some time with $him">>
-	<<replace "#result">>
-		You announce that you're finished with business for the day, and feel like some quiet time. $He cannot keep <<if canSee($activeSlave)>>a gleam of humor out of $his eye<<else>>the corners of $his lips from rising slightly<</if>> at <<if canHear($activeSlave)>>hearing<<else>>the phrase<</if>> 'quiet time,' and $he <<if !hasAnyLegs($activeSlave)>>presents $himself to be carried<<else>>follows you<</if>> happily enough. When $he <<if canSee($activeSlave)>>sees<<else>>realizes<</if>> you're headed to your bedroom $he begins to anticipate $his <<= getWrittenTitle($activeSlave)>>'s <<if $PC.dick == 0>>strap-on<<else>>cock<</if>>, but is surprised to find that instead of using $him you simply
-		<<if isAmputee($activeSlave)>>
-			place $him in bed and curl up around $his limbless torso.
-		<<elseif $activeSlave.bellyPreg >= 5000>>
-			help $him into bed and curl up with $him, your arms encircling $his prominent baby bump.
-		<<elseif $activeSlave.belly >= 5000>>
-			help $him into bed and curl up with $him, your arms encircling $his _belly dome of a middle.
-		<<else>>
-			climb into bed and pull $him under the sheets with you.
-		<</if>>
-		$He's almost disappointed, but after looking into your resting face for a while, nestles $his head onto your broad chest and goes to sleep with a @@.hotpink;look of contentment@@ on $his face. When the two of you wake from your brief nap, you ask $him if $he has anything else to communicate to you. $He smiles sleepily and shakes $his head no.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-
-<<case "mods please">>
-
-<<link "Perform it yourself">>
-	<<replace "#result">>
-		You stand up from behind your desk and head towards the body modification studio, <<if canSee($activeSlave)>>crooking a finger at<<else>>calling<</if>> $him as you as you go. $He follows bouncily, thanking you profusely, and then thanking you again when it becomes apparent to $him that you intend to do the body art yourself. $He snuggles into the chair, relaxing as the restraints bind $him in. They're not really necessary to modify a willing $girl, never mind one this enthusiastic, but they could possibly prevent $him from flinching, and it's not like $he resents being bound at this point.
-		<br><br>
-		Manipulating the machine, you
-		<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishKnown == 1)>>
-			place the first piercing, eliciting a hum of mild pain and abject submission from $activeSlave.slaveName. The piercing session goes on and on, with the slave sinking into a boneless, mindless state in which $his being is completely in your hands. $He's almost sleepy when you finally release $him, but $he rises and <<if canSee($activeSlave)>>turns, craning around to see in the mirror<<else>>gingerly feeling around $his new piercings<</if>>. $He @@.hotpink;smiles devotedly,@@ and asks you when $he'll be healed enough that $he can be laced up.
-			<<set $activeSlave.corsetPiercing = 1>>
-		<<elseif ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishKnown == 1)>>
-			hold $his mouth agape and place the first piercing. $He can't make much of a facial expression with $his mouth that wide, but there is a lewd <<if canSee($activeSlave)>>glint in $his eye<<else>>look on $his face<</if>> when $he realizes $he's getting more than one. When you're done, $he's sore enough that $he gestures $his thanks, @@.hotpink;smiling devotedly,@@ and begs you to try $him out when $he's healed up.
-			<<set $activeSlave.tonguePiercing = 2>>
-		<<elseif ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishKnown == 1)>>
-			activate the ink gun, its low buzzing drawing a moan of anticipation out of $activeSlave.slaveName. Working at a touchscreen, you exercise your artistic talents, inscribing the slave's status as a sex object on $his forehead. The pain is intense, but $he tolerates it, the tears running fast out of the corners of $his eyes and low groans rising out of $his throat. When $he's finally allowed to rise<<if canSee($activeSlave)>> and sees $himself in a mirror<<elseif canHear($activeSlave)>>and listens intently on your descriptions of $his new face<</if>>, $he blushes furiously and cries harder, knowing that $his status as a humiliation slut is now permanent. This culmination of $his deeply perverse sense of self @@.hotpink;draws $him closer to you.@@
-			<<set $activeSlave.lipsTat = "degradation">>
-		<<elseif ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>>
-			place a spreader to keep $his legs and cheeks apart and start piercing. $He whines with the pain, and then gasps when $he realizes that the piercing is going on much longer than $he expected. You give $him a couple of huge piercings below $his anus, big enough that $he'll never be free of them rubbing against $his slutty butthole. Not done yet, you put some small, smooth studs around it, just to make sure nobody can possibly misunderstand where to fuck this bitch. $He gets up gingerly, but @@.hotpink;smiling sluttily.@@
-			<<set $activeSlave.anusPiercing = 2>>
-		<<elseif ($activeSlave.fetish == "boobs") && ($activeSlave.fetishKnown == 1)>>
-			<<if ($activeSlave.nipples.includes("inverted"))>>
-				use a couple of its actuators to stimulate $his nipples until they're almost all the way protruded, and then direct them to pull them out all the way. $He screams wholeheartedly at the pain, yelling on and on until $he's out of breath and relaxes against the restraints, gasping and crying.
-			<<else>>
-				use its actuators to pull $his nipples out as far as they will go, forcing a gasp of pain out of $him.
-			<</if>>
-			$He expects a simple nipple piercing, one for each boob; what $he gets is a set of heavy rings in each nipple. $He's no masochist, so the pleasure will come later, but $he moans as $he feels the gradual addition of weight to $his nipples. $He rises very carefully, trying to keep $his boobs still, and @@.hotpink;smiles devotedly@@ at you. Soon enough, $he'll be able to orgasm by walking.
-			<<set $activeSlave.nipplesPiercing = 2>>
-		<<elseif ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1)>>
-			<<if $activeSlave.belly >= 10001>>
-				hold $his _belly stomach steady and pierce $his navel with the largest, heaviest ring available. There is a lewd <<if canSee($activeSlave)>>glint in $his eye<<else>>look on $his face<</if>> as $he feels the new weight settle against $his middle. $He rises very carefully, trying to keep $his new piercing from moving, and @@.hotpink;smiles devotedly@@ at you. Soon enough, all eyes will be on $his belly as $he waddles by.
-				<<set $activeSlave.navelPiercing = 2>>
-			<<else>>
-				activate the ink gun, its low buzzing drawing a moan of anticipation out of $activeSlave.slaveName. Working at a touchscreen, you exercise your artistic talents, beautifying $his <<if $activeSlave.belly >= 150>> _belly stomach<<else>>abdomen<</if>> with an inducement to fuck $him.
-				<<if canSee($activeSlave)>>
-					<<if $activeSlave.belly >= 5000>>
-						$He can't see what you are inking into the underside of $his belly, but $he tries anyway.
-					<<else>>
-						$He's just able to crane $his head enough to see the work, and eagerly watches.
-					<</if>>
-					When you're done, $he stares at $himself for a long time,
-				<<else>>
-					Once you finish $his new tattoo, you describe it to $him in detail. $He pauses for a moment,
-				<</if>>
-				a curiously mixed expression on $his face. This is $his life now; it's permanently a part of $him, and @@.hotpink;$he knows it.@@
-				<<set $activeSlave.vaginaTat = "lewd crest">>
-			<</if>>
-		<<elseif ($activeSlave.fetish == "dom") && ($activeSlave.fetishKnown == 1)>>
-			activate the ink gun, its low buzzing drawing a moan of anticipation out of $activeSlave.slaveName. Working at a touchscreen, you exercise your artistic talents, making the side of $his face fierce with tribal patterns. Tattooing over such thin and sensitive skin is intensely painful, but $he tolerates it, permitting nothing but a low and continuing growl to escape. $He's obviously tired out by the pain when $he's finally allowed to rise, but $he <<if canSee($activeSlave)>>looks at $himself in the mirror<<elseif canHear($activeSlave)>>listens to your description<<else>>traces the design with $his fingertips<</if>> with @@.hotpink;obvious approval.@@
-			<<set $activeSlave.lipsTat = "tribal patterns">>
-		<<elseif ($activeSlave.fetish == "sadist") && ($activeSlave.fetishKnown == 1)>>
-			<<if canAchieveErection($activeSlave)>>
-				take hold of $his most intimate parts and put a set of massive piercings straight through $his shaft. $He shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when $he gets gingerly up from the chair, $he doesn't look eager to stick $his cock in anything, but $he's @@.hotpink;thankful enough.@@
-				<<set $activeSlave.dickPiercing = 2>>
-			<<elseif $activeSlave.dick > 0>>
-				hold $his mouth agape and place the first piercing. $He can't make much of a facial expression with $his mouth that wide, but there is a lewd <<if canSee($activeSlave)>>glint in $his eye<<else>>look on $his face<</if>> when $he realizes $he's getting more than one. When you're done, $he's sore enough that $he gestures $his thanks, @@.hotpink;smiling devotedly;@@ $he looks eager to try out $his new piercing on a fresh pussy.
-				<<set $activeSlave.tonguePiercing = 2>>
-			<<else>>
-				take hold of $his most intimate parts and put a set of massive piercings straight through $his pussylips. $He shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when $he gets gingerly up from the chair, $he doesn't look eager to trib anything, but $he's @@.hotpink;thankful enough.@@
-				<<set $activeSlave.vaginaPiercing = 2>>
-			<</if>>
-		<<elseif ($activeSlave.fetish == "masochist") && ($activeSlave.fetishKnown == 1)>>
-			take hold of $his most intimate parts and put a series of massive piercing straight through $his
-			<<if $activeSlave.dick > 0>>
-				shaft.
-				<<set $activeSlave.dickPiercing = 2>>
-			<<else>>
-				pussylips.
-				<<set $activeSlave.vaginaPiercing = 2>>
-			<</if>>
-			$He shrieks with agony and then orgasms as strongly as you've ever seen a slave climax, $his every fiber tensing against the restraints. For a long, long time $he has to work to breathe, the overstimulation clearing slowly. When you finally let $him up, $he hasn't remembered how to talk yet, but $his gaze says it for $him. It looks like $he's just had @@.hotpink;the best sex of $his life.@@
-		<<else>>
-			<<if ($activeSlave.nipples.includes("inverted"))>>
-				use a couple of its actuators to stimulate $his nipples until they're almost all the way protruded, and then direct them to pull them out all the way. $He screams wholeheartedly at the pain, yelling on and on until $he's out of breath and relaxes against the restraints, gasping and crying.
-			<<else>>
-				use its actuators to pull $his nipples out as far as they will go, forcing a gasp of pain out of $him.
-			<</if>>
-			This done, you give $him a simple pair of barbell nipple piercings. The machine makes this take less time than it takes to describe it, and after a shocked squeal of pain $he's released. $He rises carefully, trying to keep $his boobs still, and @@.hotpink;smiles thankfully@@ at you. $He <<if canSee($activeSlave)>>glances at $himself in the mirror<<else>>listens to your description of $him<</if>>, looking pleased.
-			<<set $activeSlave.nipplesPiercing = 1>>
-		<</if>>
-		<<set $activeSlave.devotion += 5>>
-	<</replace>>
-<</link>>
-<br><<link "$He's beautiful just the way $he is">>
-	<<replace "#result">>
-		You tell $him firmly that $he's beautiful just the way $he is. $He blushes and giggles at the absurdly trite statement. You conclude the inspection, and $he continues on to the next item in $his life as a sex slave, @@.mediumaquamarine;pleased and reassured@@ that you have a plan for what $he should look like.
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<br><<link "No, and slaves should not make requests of this kind">>
-	<<replace "#result">>
-		You tell $him firmly that you don't intend to apply body modifications to $him, your tone communicating that further requests on this subject are not permitted. $He understands clearly and looks a little crushed, but trusts that $he won't be punished for violating a rule you hadn't promulgated. You repair the oversight immediately, directing your personal assistant to spread notice that decisions about body modifications are yours alone.
-		<<set $modRequestsAllowed = 0>>
-	<</replace>>
-<</link>>
-
-<<case "dickgirl PC">>
-
-<<link "Permit $him to serve you in a way $he'll be comfortable with">>
-	<<replace "#result">>
-		The poor $girl is having trouble with
-		<<if $activeSlave.attrXY <= 35>>
-			guys, so you decide to be kind to $him and play up your feminine side. You lift $his $activeSlave.skin chin with a soft touch, and kiss $him gently on the lips, pressing your breasts full against $his
-			<<if $activeSlave.boobs > 5000>>
-				titanic udders, which are squashed between you.
-			<<elseif $activeSlave.boobs > 1000>>
-				own lovely boobs.
-			<<else>>
-				chest.
-			<</if>>
-			You keep your hips cocked back and to the side, so that your rapidly stiffening dick stays clear of $him. Taking $his hands in your own, you guide them to your
-			<<if $PC.boobs >= 1400>>
-				enormous <<if $PC.boobsImplant != 0>>chest balloons<<else>>cow tits<</if>>.
-			<<elseif $PC.boobs >= 1200>>
-				huge<<if $PC.boobsImplant != 0>>, clearly fake<<else>>, heavy<</if>> breasts.
-			<<elseif $PC.boobs >= 1000>>
-				big<<if $PC.boobsImplant != 0>>, perky<</if>> breasts.
-			<<elseif $PC.boobs >= 800>>
-				generous breasts.
-			<<elseif $PC.boobs >= 650>>
-				handfilling breasts
-			<<elseif $PC.boobs >= 500>>
-				average breasts
-			<<elseif $PC.boobs >= 300>>
-				small breasts
-			<</if>>
-			<br><br>
-			$He hesitates, clearly surprised that you're allowing $him to fondle you, but building arousal is making $him forget $his awkwardness and $he begins to play with your boobs in earnest. You direct $his fingers to your nipples, and $he obeys the nonverbal cue, devoting more attention to the <<if $PC.lactation > 0>>milky<<else>>hard<</if>>, sensitive nubs. Satisfied that $he's got the idea, you run your hands lightly down $his
-			<<if $activeSlave.weight > 190>>
-				voluminous
-			<<elseif $activeSlave.belly >= 5000>>
-				<<if $activeSlave.bellyPreg >= 3000>>
-					gravid
-				<<elseif $activeSlave.bellyImplant >= 3000>>
-					rounded
-				<<else>>
-					swollen
-				<</if>>
-			<<elseif $activeSlave.weight > 30>>
-				soft
-			<<elseif $activeSlave.muscles > 30>>
-				rock hard
-			<<elseif $activeSlave.weight > 10>>
-				plush
-			<<elseif $activeSlave.muscles > 5>>
-				toned
-			<<else>>
-				soft
-			<</if>>
-			body and give $his
-			<<if $activeSlave.butt > 15>>
-				obscene
-			<<elseif $activeSlave.butt > 10>>
-				absurd
-			<<elseif $activeSlave.butt > 6>>
-				monstrous
-			<<elseif $activeSlave.butt > 3>>
-				healthy
-			<<else>>
-				cute
-			<</if>>
-			buttocks a gentle massage.
-			<br><br>
-			$He has $his eyes closed, and is spared any indication that $he's petting and being petted by a person with a cock. $His arousal builds quickly, and so does yours. You resolve the situation by using a hand on each of you: you finish yourself off with practiced ease while giving $his
-			<<if canDoVaginal($activeSlave)>>
-				clit
-			<<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				own erection
-			<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				fat member
-			<<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				soft member
-			<<elseif ($activeSlave.chastityPenis == 1)>>
-				nipples
-			<<elseif ($activeSlave.chastityVagina)>>
-				nipples
-			<<else>>
-				soft perineum
-			<</if>>
-			some manual stimulation that tips $him over the edge. $He opens $his eyes slowly, @@.hotpink;grateful@@ that you were so merciful.
-		<<elseif $activeSlave.attrXX <= 35>>
-			girls, so you decide to be kind to $him and play up your masculine side. You grab the side of $his neck with a rough grip, and pull $him downward, forcing $him to $his knees. $He goes willingly, $his field of vision filling with your rapidly hardening member.
-			<<if ($activeSlave.teeth == "removable")>>
-				$He quickly pulls $his removable teeth out, getting ready to offer you $his soft facepussy.
-			<<elseif ($activeSlave.teeth == "pointy")>>
-				$He runs $his tongue over $his frightening teeth carefully, and then opens $his jaws wide, getting ready to keep $his fangs well clear of your shaft.
-			<<elseif ($activeSlave.teeth == "fangs")>>
-				$He runs $his tongue over $his fangs carefully, and then opens $his jaws wide, getting ready to keep $his teeth well clear of your shaft.
-			<<elseif ($activeSlave.teeth == "fang")>>
-				$He gets ready to take you from an angle to avoid $his fang meeting your member.
-			<<elseif ($activeSlave.teeth == "straightening braces") || ($activeSlave.teeth == "cosmetic braces")>>
-				$He runs $his tongue over $his braces, and then opens wide, mindful of keeping $his orthodontia clear of your shaft.
-			<<elseif ($activeSlave.teeth == "gapped")>>
-				$He runs $his tongue across the gap in $his front teeth and opens wide.
-			<</if>>
-			$He takes you into $his mouth without hesitation, and keeps $his eyes closed. $He visibly concentrates all $his attention on your dick, ignoring the breasts that are starting to bounce right over $his head as you begin rocking your hips with enjoyment.
-			<br><br>
-			You run a possessive hand through $his $activeSlave.hColor hair, and let $him know what a good little cocksucker $he is. $He moans submissively in response, and the humming feels so wonderful that you order $him to do it again. Knowing that you're being nice to $him by letting $his ignore your more feminine characteristics for the moment, $he does $his best to please you, humming as best $he can and using both hands to pleasure your base and balls. You blow your load down $his throat, and $he swallows it all. $He opens $his eyes slowly, @@.mediumaquamarine;relieved@@ that you were so merciful.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br><<link "Force $him to get off to all of you">>
-	<<replace "#result">>
-		The closeminded $girl is having trouble with
-		<<if $activeSlave.attrXY <= 35>>
-			guys, so $he gets to spend some quality time with your dick. You walk into $him, running into the surprised slave, driving $him backward into the far wall. You kiss $him, pinch $him, and grope $him roughly the whole time, pressing your breasts maliciously against $his
-			<<if $activeSlave.boobs > 5000>>
-				titanic udders, which are squashed between you.
-			<<elseif $activeSlave.boobs > 1000>>
-				own lovely boobs.
-			<<else>>
-				chest.
-			<</if>>
-			When $his
-			<<if $activeSlave.butt > 15>>
-				obscene
-			<<elseif $activeSlave.butt > 10>>
-				absurd
-			<<elseif $activeSlave.butt > 6>>
-				monstrous
-			<<elseif $activeSlave.butt > 3>>
-				healthy
-			<<else>>
-				cute
-			<</if>>
-			buttocks crash against the wall, you smash yourself against $him. $He shudders involuntarily as $he feels your stiffening dick between you<<if $activeSlave.belly >= 5000>> and $his rounded stomach<</if>>, and then again as it rapidly achieves full hardness, crushed between your warm bodies.
-			<br><br>
-			Making out with $him so insistently that $he's short of breath, you begin to hump yourself against $him, sliding your prick against $his <<if $activeSlave.belly >= 5000>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>><</if>><</if>>belly, thighs, and
-			<<if canDoVaginal($activeSlave)>>
-				labia.
-			<<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				own dick.
-			<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				fat cock.
-			<<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				limp member.
-			<<elseif ($activeSlave.chastityPenis == 1)>>
-				caged dick.
-			<<elseif ($activeSlave.chastityVagina)>>
-				chastity belt.
-			<<else>>
-				soft perineum.
-			<</if>>
-			$He shudders uncomfortably as $he realizes that $he's getting aroused, $his
-			<<if $activeSlave.vagina > -1>>
-				pussy moistening
-			<<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				dick hardening
-			<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				dick struggling to engorge
-			<<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-				girldick starting to ooze precum
-			<<elseif ($activeSlave.chastityPenis == 1)>>
-				chastity cage growing ever tighter
-			<<else>>
-				tiny front hole starting to ooze precum
-			<</if>>
-			from the stimulation, despite $his lack of appetite for cock.
-			<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-				$He knows what's coming when you push $him
-				<<if $activeSlave.belly >= 300000>>
-					over $his _belly stomach,
-				<<else>>
-					to $his knees,
-				<</if>>
-				and does $his best to relax.
-				<br><br>
-				$He screws $his eyes shut tight and $his mouth tighter as you prod at $his face with your member. Tiring of $his reluctance, you give $him a brusque order to open $his eyes and gaze upon the dick $he will soon be deepthroating. $He obeys, but unwillingly, and steadies $himself to take its length. You tell $him to do $his best to watch, and begin thrusting. $He groans from the internal fullness and sexual confusion. $He stares as best $he can at your penis, transfixed by the sight of it thrusting into $his mouth and the feeling of $his lips around its girth.
-				<br><br>
-				$He slips a hand to $his crotch, $his arousal overwhelming $his preferences. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, holding back to $his point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $his mouth, and your obvious pleasure force $him over the edge, and $he comes so hard that $he chokes on your cock. You pull out of $him, and $he struggles to catch $his breath, the action sending a blob of $his owner's semen running down $his chin.
-				<<run seX($activeSlave, "oral", $PC, "penetrative", 7)>>
-			<<elseif $activeSlave.belly >= 10000>>
-				$He knows what's coming when you push $him
-				<<if $activeSlave.belly >= 300000>>
-					over $his _belly stomach,
-				<<else>>
-					to $his knees,
-				<</if>>
-				and does $his best to relax.
-				<br><br>
-				$He screws $his eyes shut tight as you maneuver yourself inside $his
-				<<if canDoVaginal($activeSlave)>>
-					<<if $activeSlave.vagina > 2>>
-						cavernous cunt.
-					<<elseif $activeSlave.vagina > 1>>
-						welcoming pussy.
-					<<else>>
-						tight flower.
-					<</if>>
-				<<else>>
-					<<if $activeSlave.anus > 2>>
-						unresisting asspussy.
-					<<elseif $activeSlave.anus > 1>>
-						welcoming butthole.
-					<<else>>
-						tight anus.
-					<</if>>
-				<</if>>
-				Once you're situated, you give $him a brusque order to open $his eyes and look behind $him. $He obeys, but unwillingly, bending as best $he can to see how physically close you are. $He can't see where it enters $his
-				<<if canDoVaginal($activeSlave)>>
-					womanhood,
-				<<else>>
-					bowels,
-				<</if>>
-				but $he's very aware of it. You tell $him to do $his best to watch, and begin thrusting. $He groans from the awkward position, internal fullness, and sexual confusion. Turned as much as $he can, $he stares, transfixed by the sight of you thrusting into $his body.
-				<<if canDoVaginal($activeSlave)>>
-					<<= VCheck.Vaginal($activeSlave, 7)>>
-				<<else>>
-					<<= VCheck.Anal($activeSlave, 7)>>
-				<</if>>
-				<br><br>
-				You snake a hand under $him and begin to stimulate $him manually. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, bringing $him to the point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $him, and your obvious pleasure force $him over the edge, and $he comes so hard that $he wriggles involuntarily against you. You release $him, and $he barely manages to catch $himself from collapsing, the motion sending a blob of $his owner's semen running down $his thigh.
-			<<else>>
-				$He knows what's coming when you pin $his torso even harder and reach down to pull $his knees up to clasp you around your waist, and does $his best to relax.
-				<br><br>
-				$He screws $his eyes shut tight as you maneuver yourself inside $his
-				<<if canDoVaginal($activeSlave)>>
-					<<if $activeSlave.vagina > 2>>
-						cavernous cunt.
-					<<elseif $activeSlave.vagina > 1>>
-						welcoming pussy.
-					<<else>>
-						tight flower.
-					<</if>>
-				<<else>>
-					<<if $activeSlave.anus > 2>>
-						unresisting asspussy.
-					<<elseif $activeSlave.anus > 1>>
-						welcoming butthole.
-					<<else>>
-						tight anus.
-					<</if>>
-				<</if>>
-				Once you're confident your member is properly seated inside $him, and you won't drop $him, you give $him a brusque order to open $his eyes and look down. $He obeys, but unwillingly, bending as best $he can to look at the base of your dick where it
-				<<if canDoVaginal($activeSlave)>>
-					enters $his womanhood.
-				<<else>>
-					disappears beneath
-					<<if canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-						$his own erect cock.
-					<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-						$his own dangling cock.
-					<<elseif ($activeSlave.chastityPenis == 1)>>
-						$his chastity.
-					<<else>>
-						$him. $He can't see where it enters $his bowels, but $he's very aware of it.
-					<</if>>
-				<</if>>
-				You tell $him to do $his best to watch, and begin thrusting. $He groans from the awkward position, internal fullness, and sexual confusion. Bent almost in half, $he stares, transfixed by the sight of your penis delving inside $his body.
-				<<if canDoVaginal($activeSlave)>>
-					<<= VCheck.Vaginal($activeSlave, 7)>>
-				<<else>>
-					<<= VCheck.Anal($activeSlave, 7)>>
-				<</if>>
-				<br><br>
-				You push a hand between the two of you and begin to stimulate $him manually. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, bringing $him to the point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $him, and your obvious pleasure force $him over the edge, and $he comes so hard that $he wriggles involuntarily within your grasp. You drop $him, and $he barely manages to catch $himself on shaking legs, the motion sending a blob of $his owner's semen running down $his thigh.
-			<</if>>
-			<br><br>
-			Over the week, you force $him to achieve daily orgasm as your cock pounds in and out of $him. It's difficult, blowing your load inside a compliant slave $girl every day, but you make the necessary sacrifice.
-			<<if random(1,2) == 1>>
-				After a few days, $he's @@.green;obviously reconsidering $his previous hesitations about dick.@@
-				<<set $activeSlave.attrXY += 5>>
-			<<else>>
-				$He takes it like a good slave. $His dislike for dick doesn't change, but $he gets better at @@.hotpink;suppressing $his own inclinations@@ and serving as your cum receptacle.
-				<<set $activeSlave.devotion += 4>>
-			<</if>>
-		<<elseif $activeSlave.attrXX <= 35>>
-			girls, so $he gets to spend some quality time with your feminine side. You kiss $him, teasing your tongue against $him, and press your breasts maliciously against $his
-			<<if $activeSlave.boobs > 5000>>
-				titanic udders, which are squashed between you.
-			<<elseif $activeSlave.boobs > 1000>>
-				own lovely boobs.
-			<<else>>
-				chest.
-			<</if>>
-			$He shrinks away from you involuntarily, but you stroke loving hands down $his temples, the sides of $his neck, and $his upper arms. $He shudders involuntarily, and you can almost feel $him hate $himself through your lip lock. You cock your hips back and to the side, keeping your prick well clear of $him. As far as $he can feel, you're all boobs and feminine lips.
-			<br><br>
-			<<if $activeSlave.toyHole == "dick" || ($policies.sexualOpenness == 1 && canPenetrate($activeSlave))>>
-				You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt<<if $activeSlave.belly >= 5000>>, working your way under $his _belly belly<</if>>. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your
-				<<if $PC.butt >= 5>>
-					enormous, <<if $PC.buttImplant != 0>>beachball cheeks<<else>>wobbling ass<</if>>,
-				<<elseif $PC.butt >= 4>>
-					huge, <<if $PC.buttImplant != 0>>balloon of an<<else>>soft<</if>> ass,
-				<<elseif $PC.butt >= 3>>
-					big<<if $PC.buttImplant != 0>> fake<</if>> ass,
-				<<else>>
-					ass,
-				<</if>>
-				leading $him like a music teacher guiding a student's hands. When $he's groping your buttocks properly, you grind against $him for a while, grinning to yourself as you feel an unwilling erection building between your cheeks. Pleased, you lean forward and line up your <<if $PC.vagina != -1>>pussy<<else>>asshole<</if>> with $his dick head and push back into $him. You repeat until $his hips start moving on their own. You bite on your finger at the sensation of $his cock inside you and, using your other hand, begin to jerk yourself off. Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick; it must feel as though $he is banging a beautiful woman. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, taking $him to the point of climax before enjoying your own orgasm. The heat of your insides, the tightening and twitching of your <<if $PC.vagina != -1>>vagina<<else>>rectum<</if>> around $his cock, and your obvious pleasure force $him over the edge, and $he comes so hard that $he nearly knocks your to the floor. You scoot forward, letting $him slip from you. $He gets a splendid sight of your still gaped <<if $PC.vagina != -1>>cunt<<else>>anus<</if>> begging for more<<if $activeSlave.balls > 0>> as a blob of $his semen drips from your body<</if>>.
-				<br><br>
-				Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having to savor a compliant slave's penis every day, but you make the necessary sacrifice.
-				<<if canImpreg($PC, $activeSlave)>>
-					<<= knockMeUp($PC, 40, 0, $activeSlave.ID)>>
-				<</if>>
-			<<elseif $activeSlave.belly >= 150000>>
-				You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt, working your way under $his _belly belly. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your
-				<<if $PC.butt >= 5>>
-					enormous, <<if $PC.buttImplant != 0>>beachball cheeks<<else>>wobbling ass<</if>>,
-				<<elseif $PC.butt >= 4>>
-					huge, <<if $PC.buttImplant != 0>>balloon of an<<else>>soft<</if>> ass,
-				<<elseif $PC.butt >= 3>>
-					big<<if $PC.buttImplant != 0>> fake<</if>> ass,
-				<<else>>
-					ass,
-				<</if>>
-				leading $him like a music teacher guiding a student's hands. When $he's groping your buttocks properly, you grind against $him for a while, grinning to yourself as you feel
-				<<if canDoVaginal($activeSlave)>>
-					an unwilling heat building low behind you. Pleased, you lean back and start to play with $his clit, using your other hand to jerk off.
-				<<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					an unwilling erection building between your cheeks. Pleased, you lean back and start to play with $his dick, using your other hand to jerk yourself off.
-				<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					the huge cock behind you start to leak onto your back. Pleased, you lean back and start to play with $his dick, using your other hand to jerk yourself off.
-				<<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					the pretty girldick behind you start to leak. Pleased, you lean back and start to play with $his soft bitchclit, using your other hand to jerk yourself off.
-				<<elseif ($activeSlave.chastityPenis == 1)>>
-					an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity cage, using your other hand to jerk off.
-				<<elseif ($activeSlave.chastityVagina)>>
-					an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity, using your other hand to jerk off.
-				<<elseif ($activeSlave.race == "catgirl")>>
-					a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between $his legs.
-				<<else>>
-					a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between $his legs.
-				<</if>>
-				Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick. It must feel as though $he has a beautiful woman under $his middle, and is playing with $his ass while $he gets $him off manually. You complete the feeling by bucking against $him with extra enthusiasm when you climax.
-				<br><br>
-				Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having to grind against a compliant slave every day, but you make the necessary sacrifice.
-			<<else>>
-				You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt<<if $activeSlave.belly >= 10000>> as well as you can with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> pushing into you<</if>>. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your tits, leading $him like a music teacher guiding a student's hands. When $he's stroking your nipples properly, you grind against $him for a while, grinning to yourself as you feel
-				<<if canDoVaginal($activeSlave)>>
-					an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to play with $his clit, using your other hand to jerk off.
-				<<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					an unwilling erection building behind you. Pleased, you snake a hand around behind yourself and start to play with $his dick, using your other hand to jerk yourself off.
-				<<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					the huge cock behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with $his dick, using your other hand to jerk yourself off.
-				<<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>>
-					the pretty girldick behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with $his soft bitchclit, using your other hand to jerk yourself off.
-				<<elseif ($activeSlave.chastityPenis == 1)>>
-					an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity cage, using your other hand to jerk off.
-				<<elseif ($activeSlave.chastityVagina)>>
-					an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity, using your other hand to jerk off.
-				<<elseif ($activeSlave.race == "catgirl")>>
-					a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between $his legs.
-				<<else>>
-					a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between $his legs.
-				<</if>>
-				Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick. It must feel as though $he has a beautiful woman in $his arm<<if hasBothArms($activeSlave)>>s<</if>>, and is playing with $his boobs while $he gets $him off manually. You complete the feeling by craning around to rain nibbles and kisses on $his $activeSlave.faceShape face.
-				<br><br>
-				Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having one of your slaves detailed to stimulate your nipples every day, but you make the necessary sacrifice.
-			<</if>>
-			<<if random(1,2) == 1>>
-				After a few days, $he's @@.green;obviously reconsidering $his previous hesitations about tits and ass.@@
-				<<set $activeSlave.attrXX += 5>>
-			<<else>>
-				$He serves your feminine body like a good slave. $His dislike for sex with girls doesn't change, but $he gets better at @@.hotpink;suppressing $his own inclinations@@ and serving as your plaything.
-				<<set $activeSlave.devotion += 4>>
-			<</if>>
-		<</if>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.attrXY <= 35>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0) && $activeSlave.attrXY <= 35>> //This option will take $his anal virginity//<</if>>
-
-<<case "resistant anal virgin">>
-
-<<link "Let $him earn continued anal virginity">>
-	<<replace "#result">>
-		You tell $him $he's a sex slave, and that $he needs to learn how to take a dick up the ass.
-		<<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 butt alone.
-		<<else>>
-			$He begs, "Plea<<s>>e no, <<Master>>, plea<<s>>e don't rape me in my a<<ss>>, <<Master>>!"
-		<</if>>
-		You make a show of considering, and then tell $him that if $he's extra obedient, you might let $him keep $his butt — for now. You tell $him to <<if $PC.dick != 0>>blow you<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>lick your pussy<</if>>, and $he does with unusual obedience. When $he's done, you bend down and whisper in $his ear that if $he shows any sign of rebelliousness, you'll ruin $his little asshole. @@.gold;$He's terrified.@@
-		<<set $activeSlave.trust -= 5>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if hasAnyLegs($activeSlave)>>
-	<br><<link "Force $him to degrade $himself">>
-		<<replace "#result">>
-			Suction cup dildos are terribly useful. You place a moderate-sized one on a low table in your office<<if ($activeSlave.chastityAnus)>>, unlock $his chastity belt<</if>>, and order $him to squat down on it and fuck $his own asshole. $He hesitates, incredulous, and finds $himself bound to the couch and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When $he's been reduced to a state of abject, sobbing surrender, you free $him and repeat your orders as though nothing had happened. Still crying, $he hobbles over and up onto the table,
-			<<if $activeSlave.belly >= 300000 || $activeSlave.weight > 190>>
-				struggles to line $himself up, and finds it slammed into $his asshole when the table gives out under $his<<if $activeSlave.belly >= 300000>> gravid<</if>> weight. You leave $him there to struggle with the dildo wedged in $his rear until $he finally manages to pop it free from the table fragment stuck under mass and roll over. You haul $him onto
-			<<else>>
-				<<if $activeSlave.belly > 20>>gingerly lowers $his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>bulk onto it,<</if>> and fucks $his little ass open on the dildo. You keep $him up there until $his legs give out<<if $activeSlave.belly >= 10000 || $activeSlave.weight > 190>>and $his <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>weight pins $him on the toy;<<else>>, and<</if>> then let $him lie down on
-			<</if>>
-			the couch, telling $him to keep working the dildo with $his hand<<if hasBothArms($activeSlave)>>s<</if>> or suffer another whipping. After $he's had $his ass filled for a good while, $he has no trouble taking a <<if $PC.dick == 0>>strap-on<<else>>real dick<</if>> for the first time, and is by this point too exhausted to do anything but lie there and be a good little anal slave. @@.gold;$He fears you,@@ and @@.lime;$his butthole has been broken in.@@
-			<<set $activeSlave.trust -= 5, $activeSlave.anus = 1>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</replace>>
-	<</link>> //This option will take $his anal virginity//
-	<<if $activeSlave.vagina == 0>>
-		<br><<link "Make $him choose between $his virginities">>
-			<<replace "#result">>
-				You tell $him $he's a sex slave, and that $he needs to learn how to take a dick up the ass.
-				<<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 butt alone.
-				<<else>>
-					$He begs, "Plea<<s>>e no, <<Master>>, plea<<s>>e don't rape me in my a<<ss>>, <<Master>>!"
-				<</if>>
-				You make a show of considering, and then tell $him you know a way $he can continue being an anal virgin — for now. You want a new hole to play with, and $he has two untouched holes. $He gasps when $he realizes what you want. $He hesitates to answer, uncertain of which $he values more, and finds $himself bound to the couch<<if ($activeSlave.chastityAnus)>>, stripped of $his chastity,<</if>> and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When $he's been reduced to a state of abject, sobbing surrender, you free $him and repeat your orders as though nothing had happened. Still crying, $he prostrates $himself and
-				<<if $activeSlave.trust < 20>>
-					spreads $his butt for you.
-				<<else>>
-					$his pussylips for you.
-				<</if>>
-				You callously ram a dildo into $his fresh hole and tell $him to keep working $himself with it or suffer another whipping. After $he's fucked $himself for a good while, $he has no trouble taking a <<if $PC.dick == 0>>strap-on<<else>>real dick<</if>> for the first time, and is by this point too exhausted to do anything but lie there and take it a good little slave. @@.gold;$He fears you@@ but @@.hotpink;loses $himself to your rule.@@
-				<<if $activeSlave.trust < 20>>
-					@@.lime;$His butthole has been broken in.@@
-					<<set $activeSlave.anus = 1>>
-					<<= VCheck.Anal($activeSlave, 1)>>
-				<<else>>
-					@@.lime;$His pussy has been broken in.@@
-					<<set $activeSlave.vagina = 1>>
-					<<= VCheck.Vaginal($activeSlave, 1)>>
-				<</if>>
-				<<set $activeSlave.trust -= 5, $activeSlave.devotion += 3>>
-			<</replace>>
-		<</link>> //This option will take one of $his virginities//
-	<</if>>
-<</if>>
-
-<<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 "sleeping ambivalent">>
-
-<<link "Grope $his boob">>
-	<<replace "#result">>
-		$His eyes fly open as $he feels someone groping $him.
-		<<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>>
-			You're mauling $his fake boob, squeezing it and making the skin of $his breast, which is already stretched rather taut by the implant, stretch a bit farther.
-		<<elseif $activeSlave.boobs > 3000>>
-			You're hefting and massaging $his mass of breastflesh, playing with $his <<if ($activeSlave.boobsImplant/$activeSlave.boobs) < .60>>mostly <</if>>natural boob, making $his huge soft udder bounce and jiggle.
-		<<elseif $activeSlave.lactation > 0>>
-			You're kneading and massaging $his udder, and the milk begins to <<if $activeSlave.nipples != "fuckable">>bead at<<else>>leak from<</if>> the cow's nipple.
-		<<elseif $activeSlave.boobs > 300>>
-			You've got $his whole tit in your hands, jiggling and squeezing the entire thing.
-		<<else>>
-			You're massaging and squeezing $his flat chest.
-		<</if>>
-		$His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him.
-		<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-			Though $he's smart,
-		<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-			Though $he's not dumb,
-		<<else>>
-			$He's an idiot, and
-		<</if>>
-		in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by
-		<<switch $activeSlave.nipples>>
-		<<case "inverted">>
-			painfully protruding $his fully inverted nipple. $He puts up with even that, though $he cries a little as it pops out.
-		<<case "partially inverted">>
-			painfully protruding $his partially inverted nipple. $He puts up with that, too, though $he winces as it pops out.
-		<<case "huge">>
-			rolling $his huge nipple between a thumb and forefinger, hard enough to hurt. $He accepts the mammary abuse.
-		<<case "fuckable">>
-			forcing your entire fist into $his nipple. $He accepts the stimulation as best $he can.
-		<<default>>
-			playing with $his nipple, pinching it hard enough to hurt. $He accepts the mammary abuse.
-		<</switch>>
-		Satisfied, you leave $him to get back to sleep as best $he can.
-		<<set $activeSlave.devotion += 4>>
-		<<if $activeSlave.lactation > 0>>
-			<<set $activeSlave.lactationDuration = 2>>
-			<<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>>
-		<</if>>
-	<</replace>>
-<</link>>
-<<if $activeSlave.belly >= 5000 || $activeSlave.weight > 30>>
-	<br><<link "Rub $his belly">>
-		<<replace "#result">>
-			<<if $activeSlave.bellyPreg >= 5000>>
-				$His eyes fly open as soon as $he feels someone touching $his _belly, life-rounded, stomach.
-				<<if $activeSlave.weight > 10>>
-					You're massaging and teasing $his huge, soft belly.
-				<<elseif $activeSlave.muscles > 5>>
-					You're massaging and teasing $his taut belly and ruined abs.
-				<<else>>
-					You're massaging and teasing $his taut belly.
-				<</if>>
-				$His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him.
-				<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-					Though $he's smart,
-				<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-					Though $he's not dumb,
-				<<else>>
-					$He's an idiot, and
-				<</if>>
-				in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by
-				<<if $activeSlave.weight > 10>>
-					sinking your hands into $his fat to get a good feel of the life growing within.
-				<<else>>
-					feeling for the life growing within $him.
-				<</if>>
-				<<if $activeSlave.weight > 30>>
-					Though it takes some groping before you are met with a kick from $his unborn child.
-				<<elseif $activeSlave.pregType < 3>>
-					It doesn't take long before you are met with a kick from $his unborn child.
+				with one hand to get at $his pussy. You feel $him take a deep breath under you, and $he lets it out as you press <<if $PC.dick == 0>>the tip of your strap-on<<else>>your dickhead<</if>> against $his moist slit. The relaxation
+				<<if $activeSlave.vagina > 2>>
+					gapes $his vagina wide, welcoming you in without any resistance at all.
+				<<elseif $activeSlave.vagina > 1>>
+					welcomes you in, offering you only a delicious bit of resistance to push against.
 				<<else>>
-					$He is so full of children that your ministrations are met with a hail of motion.
+					welcomes you in, though $he does buck a little at the first penetration.
 				<</if>>
-				<<if $activeSlave.pregSource == -1>>Smiling at how active your children are<<else>>Satisfied<</if>>,
-			<<elseif $activeSlave.bellyImplant >= 5000>>
-				$His eyes fly open as soon as $he feels someone touching $his _belly stomach.
-				<<if $activeSlave.weight > 10>>
-					You're massaging and teasing $his huge, soft belly.
-				<<elseif $activeSlave.muscles > 5>>
-					You're massaging and teasing $his taut belly and ruined abs.
+				You surprised $him badly, but the adrenaline melts into arousal as you pump in and out of $his cunt. $He grinds shamelessly against the cushion; since $he's being a good $girl, you reach up to your bedside without giving $him any respite to fetch
+				<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
+					an egg vibe. You shove it between $him and the cushion to give $his limp dick some stimulation.
+				<<elseif $activeSlave.dick > 4>>
+					a huge onahole. You push it between $him and the cushion so $he can fuck it.
+				<<elseif $activeSlave.dick > 0>>
+					an onahole. You push it between $him and the cushion so $he can fuck it.
+				<<elseif $activeSlave.clit > 1>>
+					a shallow vibrating onahole. You push it between $him and the cushion so $he can stuff $his pseudophallic clit into it.
+				<<elseif canDoAnal($activeSlave)>>
+					an egg vibe. You push it into $his ass to stimulate $his <<if $activeSlave.prostate > 0>>prostate<<else>>insides<</if>>.
 				<<else>>
-					You're massaging and teasing $his taut belly.
+					an egg vibe. You place it under $him so it can stimulate the sensitive skin between $his legs, just beneath $his asspussy.
 				<</if>>
-				$His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him.
-				<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-					Though $he's smart,
-				<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-					Though $he's not dumb,
+				<<if !canTalk($activeSlave)>>
+					$His hands jerk out a spastic thank you in the darkness,
 				<<else>>
-					$He's an idiot, and
+					$He coos a wordless thanks,
 				<</if>>
-				in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by
-				<<if $activeSlave.weight > 10>>
-					sinking your hands into $his fat to get a good feel of the implant hidden within.
+				and $he starts humping away. If $he thought you were too tired for sex, you certainly @@.hotpink;impress $him;@@ as you spend an hour exhausting yourself against $his vagina, $he wonders whether $his <<= getWrittenTitle($activeSlave)>> is ever too tired to fuck.
+				<<set $activeSlave.devotion += 4>>
+				<<= VCheck.Vaginal($activeSlave, 1)>>
+			<</replace>>
+		<</link>><<if ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>>
+	<</if>>
+	<<if canDoAnal($activeSlave)>>
+		<br><<link "Surprise buttsex">>
+			<<replace "#result">>
+				You uncoil from under the sheet like a striking serpent, tackling $his $activeSlave.skin body off the edge of the bed<<if ($activeSlave.bellyPreg >= 1500)>>, twisting in midair,<</if>> and onto the floor with a crash. The wind is knocked out of $him with an audible grunt as<<if ($activeSlave.bellyPreg >= 1500)>> $he lands on top of you and rolls over<<else>> you land on top of $him<</if>>.
+				<<if ($activeSlave.bellyPreg < 1500)>>
+					<<if $activeSlave.belly >= 10000>>
+						$His _belly belly squashes out to either side of $his torso,
+					<<elseif ($activeSlave.boobs > 2000)>>
+						$His huge breasts squash out to either side of $his torso,
+					<<elseif ($activeSlave.dick > 0)>>
+						$He shifts desperately to get some weight off $his trapped dick,
+					<<else>>
+						$He squirms reflexively,
+					<</if>>
+				<<elseif ($activeSlave.boobs > 2000)>>
+					$His huge breasts flop to either side of $his torso,
 				<<else>>
-					feeling up the implant within $him.
+					$He squirms reflexively,
 				<</if>>
-				<<if $activeSlave.weight > 30>>
-					Though it takes some groping before you locate the firm sphere.
-				<<elseif $activeSlave.belly < 10000>>
-					It doesn't take long for you to have a solid grip on the firm sphere.
+				but your attention is directed farther down: you wrap an arm around $his hips, hoist $him, shove a cushion under $his middle, and spread $his
+				<<if $activeSlave.butt > 5>>
+					inconveniently plush butt
+				<<elseif $activeSlave.butt > 2>>
+					big buttocks
 				<<else>>
-					It's so huge it's hard to miss, but that just gives you more room to poke and prod at.
+					trim buttocks
 				<</if>>
-				Satisfied,
-			<<elseif $activeSlave.bellyFluid >= 5000>>
-				$His eyes fly open as soon as $he feels someone touching $his _belly, <<print $activeSlave.inflationType>>-filled stomach.
-				<<if $activeSlave.weight > 10>>
-					You're massaging and jiggling $his huge, soft belly, enjoying the sounds it makes as you move it.
-				<<elseif $activeSlave.muscles > 5>>
-					You're massaging and jiggling $his taut belly and stretched abs, enjoying the sounds it makes as you move it.
+				with one hand to get at $his asshole. You feel $him take a deep breath under you, and $he lets it out as you press <<if $PC.dick == 0>>the tip of your strap-on<<else>>your dickhead<</if>> against $his anus. The relaxation
+				<<if $activeSlave.anus > 2>>
+					gapes $his asspussy wide, welcoming you in without any resistance at all.
+				<<elseif $activeSlave.anus > 1>>
+					welcomes you in, offering you only a delicious bit of resistance to push against.
 				<<else>>
-					You're massaging and jiggling $his taut belly, enjoying the sounds it makes as you move it.
+					saves $him from too much anal pain, though $he does buck a little at the first penetration.
 				<</if>>
-				$His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him.
-				<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-					Though $he's smart,
-				<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-					Though $he's not dumb,
+				You surprised $him badly, but the adrenaline melts into arousal as you pump in and out of $his ass. $He grinds shamelessly against the cushion; since $he's being a good $girl, you reach up to your bedside without giving $him any respite to fetch
+				<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
+					an egg vibe. You shove it between $him and the cushion to give $his limp dick some stimulation.
+				<<elseif $activeSlave.dick > 4>>
+					a huge onahole. You push it between $him and the cushion so $he can fuck it.
+				<<elseif $activeSlave.dick > 0>>
+					an onahole. You push it between $him and the cushion so $he can fuck it.
+				<<elseif $activeSlave.clit > 1>>
+					a shallow vibrating onahole. You push it between $him and the cushion so $he can stuff $his pseudophallic clit into it.
+				<<elseif $activeSlave.vagina == -1>>
+					an egg vibe. You place it under $him so it can stimulate the sensitive skin between $his legs, just beneath $his asspussy.
 				<<else>>
-					$He's an idiot, and
+					an egg vibe. You push it between $him and the cushion so $he can rub $his <<if !canDoVaginal($activeSlave)>>chaste <</if>>pussy against it.
 				<</if>>
-				in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by
-				<<if $activeSlave.weight > 10>>
-					sinking your hands into $his fat to get a good grip
+				<<if !canTalk($activeSlave)>>
+					$His hands jerk out a spastic thank you in the darkness,
 				<<else>>
-					wrapping your hands around the sloshing globe
+					$He coos a wordless thanks,
 				<</if>>
-				and vigorously shaking. As $his gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause $his discomfort and not to disgorge $his contents. Satisfied,
+				and $he starts humping away. If $he thought you were too tired for sex, you certainly @@.hotpink;impress $him;@@ as you spend an hour exhausting yourself against $his asshole, $he wonders whether $his <<= getWrittenTitle($activeSlave)>> is ever too tired to fuck a butt.
+				<<set $activeSlave.devotion += 4>>
+				<<= VCheck.Anal($activeSlave, 1)>>
+			<</replace>>
+		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
+	<</if>>
+<</if>>
+
+<<case "slave dick huge">>
+
+<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
+	<<link "Enter the shower and take $him">>
+		<<replace "#result">>
+			$He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear<<else>>notice<</if>> you until you seize $him under the armpits and drag $him to $his feet. $His massive dickhead pops free of $his mouth and $he squeaks in surprise as you push $his<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>> body<</if>> against the wall of the shower and stuff your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his
+			<<if canDoVaginal($activeSlave)>>
+				cunt.
 			<<else>>
-				$His eyes fly open as soon as $he feels someone touching $his
-				<<if $activeSlave.weight > 190>>
-					expansive belly. You're massaging and jiggling $his obscene gut while teasing $his many folds and struggling to find $his belly button.
-				<<elseif $activeSlave.weight > 160>>
-					massive, soft belly. You're massaging and jiggling $his obscene gut while teasing $his many folds and hidden belly button.
-				<<elseif $activeSlave.weight > 130>>
-					huge, soft belly. You're massaging and jiggling $his thick gut while teasing $his folds and hidden belly button.
-				<<elseif $activeSlave.weight > 95>>
-					big soft belly. You're massaging and jiggling $his gut while teasing $his folds and hidden belly button.
-				<<else>>
-					chubby middle. You're massaging and jiggling $his tiny gut.
-				<</if>>
-				$His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him.
-				<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-					Though $he's smart,
-				<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-					Though $he's not dumb,
-				<<else>>
-					$He's an idiot, and
-				<</if>>
-				in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by roughly kneading $his pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied,
+				ass.
+			<</if>>
+			$He was already very close to orgasm, and the stimulation of $his dick rubbing against the warm, wet wall<<if $activeSlave.belly >= 1500>> of the shower and $his belly<<else>> of the shower<</if>>, not to mention the feeling of being
+			<<if canDoVaginal($activeSlave)>>
+				fucked,
+			<<else>>
+				buttfucked,
 			<</if>>
-			you leave $him to get back to sleep as best $he can.
+			is enough that $he climaxes quickly. <<if $activeSlave.balls == 3>>$His huge load coats the shower wall with cum. <</if>>You pull out and let $him finish by <<if $PC.dick == 0>>giving you oral<<else>>sucking your dick<<if $PC.vagina != -1>> and eating your pussy<</if>><</if>>, since $he started by sucking $himself. @@.hotpink;$He has become more submissive to you.@@
 			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if $PC.dick != 0>>
-	<br><<link "Cum on $his face">>
-		<<replace "#result">>
-			You stand over $him, quietly masturbating while watching $him sleep. Several of $his fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks<<= _womanP>>, and you don't feel the need to bend over $him to score good hits. Your load comes in three main jets: the first hits $him on the nipple, the second tracks up $his sternum and throat, and the third splashes full across $his face as $his eyes fly open<<if $PC.vagina != -1>>, each of these accompanied by some less directionally perfect girlcum<</if>>. $He sputters with surprise and then outrage, but <<if !canSee($activeSlave)>>once $he recognizes your <<if canTaste($activeSlave)>>taste<<else>>presence<</if>> and<<else>>then $he<</if>> realizes who it is standing over $him <<if canSee($activeSlave)>>and<<else>>does $he<</if>> @@.gold;freezes in terror.@@
-			<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-				$He's quick, and $he immediately realizes
-			<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-				$He's not dumb, and $he quickly realizes
+			<<if canDoVaginal($activeSlave)>>
+				<<if ($activeSlave.vagina == 0)>>
+					@@.lime;This breaks in $activeSlave.slaveName's virgin pussy.@@
+					<<set $activeSlave.vagina = 1>>
+					@@.hotpink;$He enjoys losing $his cherry to you.@@
+					<<set $activeSlave.devotion += 4>>
+				<</if>>
+				<<= VCheck.Vaginal($activeSlave, 1)>>
 			<<else>>
-				$He gradually manages to calculate
+				<<if ($activeSlave.anus == 0)>>
+					@@.lime;This breaks in $activeSlave.slaveName's virgin ass.@@
+					<<set $activeSlave.anus = 1>>
+					@@.hotpink;$He enjoys losing $his butt cherry to you.@@
+					<<set $activeSlave.devotion += 4>>
+				<</if>>
+				<<= VCheck.Anal($activeSlave, 1)>>
 			<</if>>
-			that doing anything other than thanking you would be phenomenally stupid. "Thank you, <<Master>>," $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps<<else>>mumbles<</if>> blearily. You leave $him to @@.hotpink;puzzle over $his own submissiveness,@@ covered in your cum.
-			<<set $activeSlave.devotion += 4, $activeSlave.trust -= 2>>
 		<</replace>>
-	<</link>>
-<<else>>
-	<br><<link "Squirt on $his face">>
+	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
+<</if>>
+<<if ($PC.dick != 0)>>
+	<br><<link "The only dick $he should suck is $his <<= getWrittenTitle($activeSlave)>>'s">>
 		<<replace "#result">>
-			You stand over $him, quietly masturbating while watching $him sleep. Several of $his fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle $his face without touching $him, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto $his face and down across $his chest. $He sputters with surprise and then outrage, but then $he <<if canSee($activeSlave)>>realizes whose pussy $he's staring straight into<<else>>recognizes your <<if canTaste($activeSlave)>>flavor<<else>>presence<</if>><</if>> and @@.gold;freezes in terror.@@
-			<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>
-				$He's quick, and $he immediately realizes
-			<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>>
-				$He's not dumb, and $he quickly realizes
-			<<else>>
-				$He gradually manages to calculate
-			<</if>>
-			that doing anything other than thanking you would be phenomenally stupid. "Thank you, <<Master>>," $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps<<else>>mumbles<</if>> blearily. You leave $him to @@.hotpink;puzzle over $his own submissiveness,@@ covered in your pussyjuice.
-			<<set $activeSlave.devotion += 4, $activeSlave.trust -= 2>>
+			$He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear<<else>>notice<</if>> you until you seize $his hair and pull $his head back. $His massive dickhead pops free of $his mouth and $he squeaks in surprise. The noise is cut off by a gag as you ram yourself down $his throat. $He plays with your <<if $PC.vagina != -1>>cunt<<else>>balls<</if>> as you facefuck $him and jacks off with $his other hand. $He was so close when you intruded that $he cums long before you do. There's a lot of cum in the shower when you're through. <<if $activeSlave.balls == 3>>$His huge balls made an especially major contribution. <</if>>@@.hotpink;$He has become more submissive to you.@@
+			<<set $activeSlave.devotion += 4>>
+			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
 		<</replace>>
 	<</link>>
 <</if>>
-<br><<link "Just watch $him for a little while">>
-	<<replace "#result">>
-		You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of $his slumbering little movements hold your attention for a time.<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/2>> You watch the subtle movements going on within $his womb as well.<</if>> After a while, you head to your own bed. Several of $his fellow slaves came and went as you watched $him, but if they're surprised by the sight, they have the presence of mind not to show it.
-		<br><br>
-		One of them quietly lets $him know about the incident the next day, though, and the overall impact on $his mental state is surprisingly positive. In a more normal human setting, the news that someone watched $him sleep last night without $his consent or even knowledge at the time would disturb $him greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, $he's obviously thinking, but @@.mediumaquamarine;perhaps you won't rape $him while $he sleeps.@@
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-
-<<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">>
+<<if ($activeSlave.belly < 5000) && (canDoAnal($activeSlave) || canDoVaginal($activeSlave))>>
+	<br><<link "See if $he can do that while you take $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
+			You interrupt $activeSlave.slaveName and make $him lie on a nearby bed. After some preparatory stretching, during which $his frustrated erection flops forlornly around, you manage to get both $his ankles behind $his head. In this position $he manages to resume sucking on the head of $his penis as you slip into $him.
+			<<if canDoVaginal($activeSlave)>>
+				<<= VCheck.Vaginal($activeSlave, 1)>>
 			<<else>>
-				needy
+				<<= VCheck.Anal($activeSlave, 1)>>
 			<</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.
+			So contorted, $his
+			<<if canDoVaginal($activeSlave)>>
+				pussy
 			<<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.
+				anus
 			<</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">>
+			is not well angled for comfortable
+			<<if canDoVaginal($activeSlave)>>
+				penetration,
 			<<else>>
-				end.
+				sodomy,
 			<</if>>
+			so $he is soon moaning and grunting into $his cock as you fuck $him.
+			$He finishes <<if $activeSlave.balls >= 3>>$his enormous ejaculation <</if>>into $his own mouth and then <<if $PC.dick == 0>>finds $himself giving you oral directly, since you pulled your strap-on off<<else>>receives your load into $his now-brimming throat<<if $PC.vagina != -1>>. $He barely has time to swallow before you press your pussy against $his mouth<</if>><</if>>. @@.hotpink;$His devotion to you has increased.@@
+			<<set $activeSlave.devotion += 4>>
 		<</replace>>
-	<</link>><<if $activeSlave.vagina == 0>> //This option will take $his virginity//<</if>>
+	<</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>>
-<<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.
+
+<<case "tendon fall">>
+
+<<link "Help $him clean $himself">>
+	<<replace "#result">>
+		You step into the running water and seat yourself in the shower, drawing $him into your lap. $He seems surprised and <<if canSee($activeSlave)>>stares at you through the steam<<else>>gazes towards you<</if>> for a moment before looking away with a blush. $He expects you to <<if $PC.dick == 0>>ride $his wet face<<else>>insert your member into $his wet body<</if>>, but finds you handing $him the soap instead. You gently support $him as $he washes, partaking of physical closeness and support. @@.hotpink;$He has become more devoted to you.@@
+		<<set $activeSlave.devotion += 4>>
+	<</replace>>
+<</link>>
+<<if canDoVaginal($activeSlave) || canDoAnal($activeSlave)>>
+	<br><<link "Fuck $his prostrate body">>
+		<<replace "#result">>
+			You make no answer, entering the shower to stand over $him prostrate form. You reach down and grope $him soapy <<if $seeRace == 1>>$activeSlave.race <</if>>buttocks, questing fingers moving towards $his asscrack.
+			<<if ($activeSlave.anus > 2) && canDoAnal($activeSlave)>>
+				$His rectum is so fucked out and loose that your groping hand almost slides up it.
+			<<elseif ($activeSlave.vagina > 2) && canDoVaginal($activeSlave)>>
+				$His pussy is so fucked out and loose that your groping hand almost slides up it.
 			<<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.
+				You finger fuck $him for a while, the sting of the soap on $his sensitive insides making $him gasp.
 			<</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
+			As $he moans down on the shower floor, you lie down behind $him, spooning $his helpless body<<if $activeSlave.belly >= 5000>>, your hands encircling $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>><</if>>.
+			<<if $PC.dick != 0>>
+				Your cock slides into $him with ease
+			<<elseif $PC.boobs >= 300>>
+				$His soft back is delicious against your hard nipples
 			<<else>>
-				$His tight asshole spasms with pain as it stretches to accommodate you, and
+				The contours of $his soft rear feel lovely against your feminine petals
 			<</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">>
+			and the warm water playing over your warm bodies is a comforting accompaniment to the comforting sex.
+			<<if $PC.dick == 0>>
+				You ride yourself against $his warm wet body until you climax from the rubbing alone
 			<<else>>
-				$He @@.hotpink;plays the role well.@@
+				You leave a load of cum in
+				<<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>>
+					each of $his holes
+					<<set _didVaginal = 1, _didAnal = 1>>
+				<<elseif canDoAnal($activeSlave)>>
+					$his loosened butthole
+					<<set _didAnal = 1>>
+				<<else>>
+					$his loosened vagina
+					<<set _didVaginal = 1>>
+				<</if>>
+				<<if $PC.vagina != -1>> and make $him eat your pussy for a quick aftershock,<</if>>
 			<</if>>
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-			<<else>>
-				<<run seX($activeSlave, "oral", $PC, "penetrative")>>
+			and only then do you help $him back to $his feet. $He drips soap, water, and <<if $PC.dick == 0>>your juices<<else>>ejaculate<</if>>. @@.hotpink;$He has become more submissive.@@
+			<<if _didVaginal == 1 && _didAnal == 1>>
+				<<= VCheck.Both($activeSlave, 1)>>
+			<<elseif _didVaginal == 1>>
+				<<= VCheck.Vaginal($activeSlave, 1)>>
+			<<elseif _didAnal == 1>>
+				<<= VCheck.Anal($activeSlave, 1)>>
 			<</if>>
-			<<= VCheck.Anal($activeSlave, 1)>>
+			<<set $activeSlave.devotion += 4>>
 		<</replace>>
-	<</link>>
+	<</link>><<if $PC.dick != 0 && (($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave)))>> //This option will take $his virginity//<</if>>
 <</if>>
+<br><<link "Let $him struggle">>
+	<<replace "#result">>
+		$He struggles for a while until you get bored and leave $him to it. Eventually $his thrashing brings another slave in, who helps $him. This interdependence between slaves @@.mediumorchid;reduces $his devotion.@@
+		<<set $activeSlave.devotion -= 5>>
+	<</replace>>
+<</link>>
 
-<<case "dick wringing">>
+<<case "unhappy virgin">>
 
-<<link "Address $his problem together">>
+<<if canDoAnal($activeSlave)>>
+	<<link "No, and $his role is to suck dick and take it in the ass">>
+		<<replace "#result">>
+			You patiently explain that you've decided to use $him as an oral and anal slave, and leave $his pussy unfucked. $He's unsurprised, but $he understands your decision. You usually fuck slaves during your inspection, and you don't exempt $him from this, but you do let $him take it easy. Rather than facefucking $him you let $him suckle you gently. Rather that a hard buttfuck, you take $him to the couch and gently spoon $him with your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his ass while making out with $him and playing with $his nipples. $He understands your forbearance and @@.hotpink;appreciates how kind $his <<= getWrittenTitle($activeSlave)>> is.@@
+			<<set $activeSlave.devotion += 4>>
+			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
+			<<= VCheck.Anal($activeSlave, 1)>>
+		<</replace>>
+	<</link>>
+<<else>>
+	<<link "No, and $his role is to suck dick and like it">>
+		<<replace "#result">>
+			You patiently explain that you've decided to use $him as an oral slave, since $his ass is off-limits, and leave $his pussy unfucked. $He's unsurprised, but $he understands your decision. You usually fuck slaves during your inspection, and you don't exempt $him from this, but you do let $him take it easy. Rather than facefucking $him you let $him suckle you gently, calmly patting $his head as $he does. $He understands your forbearance and @@.hotpink;appreciates how kind $his <<= getWrittenTitle($activeSlave)>> is.@@
+			<<set $activeSlave.devotion += 4>>
+			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
+		<</replace>>
+	<</link>>
+<</if>>
+<br><<link "No, and $he shouldn't have asked">>
 	<<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
+		Despite being allowed to ask questions $he should not question $his <<= getWrittenTitle($activeSlave)>>'s choices about $his sexual duties. To communicate the point, you<<if $PC.dick == 0>> don a strap-on and<</if>> order $him to lie on the desk, on $his back, with $his throat slack for penetration.
+		<<if canDoAnal($activeSlave)>>
+			After a good long throatfuck that leaves $him gasping and moaning, you flip $him over and fuck $his ass until $he's squealing with each thrust.
 		<<else>>
-			short $desc hops up
+			Only after an extended and forceful series of throatfuckings that leaves the bewildered $desc gasping for air and barely conscious, do you feel $he has learned what hole $he should be focused on. For good measure, you deepthroat $him one last time, to really drive the point home.
 		<</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.
+		As $he leaves, sore all over, $he's @@.mediumorchid;badly confused@@ that $he was apparently punished for asking questions.
+		<<set $activeSlave.devotion -= 5>>
+		<<if canDoAnal($activeSlave)>>
+			<<= VCheck.Anal($activeSlave, 1)>>
+			<<run seX($activeSlave, "oral", $PC, "penetrative")>>
 		<<else>>
-			up $his stomach.
+			<<run seX($activeSlave, "oral", $PC, "penetrative", 4)>>
 		<</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.
+	<</replace>>
+<</link>>
+<br><<link "Yes, the time has come">>
+	<<replace "#result">>
+		$He framed $his desire to lose $his virginity in businesslike terms, but $his reaction to your assent suggests that $he also wouldn't mind having vanilla sex with $his <<= getWrittenTitle($activeSlave)>>. You're already quite
+		<<if $PC.dick == 0>>
+			turned on by the idea, so you pull on a strap-on, pull $him over to the couch<<if ($activeSlave.chastityVagina)>>, unfasten $his chastity belt<</if>>,
 		<<else>>
-			asshole.
+			hard, so you just lie down with $him on the couch<<if ($activeSlave.chastityVagina)>>, unfasten $his chastity belt,<</if>>
 		<</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)>>
+		and have gentle vaginal sex in the missionary position <<if $PC.vagina != -1>><<if $PC.dick != 0>>, your own pussy moving back and forth gently at the base of your dick as you fuck $him<</if>><</if>>. $He gasps at the first penetration, but you take it slowly and lavish attention on $his lips, breasts, and nipples. Soon $he's shamelessly enjoying $himself. $His first vaginal sex is crowned with an abdominal-clenching orgasm. $He @@.hotpink;adores $his kind <<= getWrittenTitle($activeSlave)>>.@@
+		<<set $activeSlave.devotion += 10, $activeSlave.vagina = 1>>
+		<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
+		<<if $activeSlave.chastityVagina == 1>><<set $activeSlave.chastityVagina = 0>><</if>>
+		<<if canImpreg($activeSlave, $PC)>>
+			<<= knockMeUp($activeSlave, 25, 0, -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.
+	<</replace>>
+<</link>><<if ($activeSlave.chastityVagina)>> //This option will remove $his chastity belt//<</if>>
+
+<<case "fearful balls">>
+
+<<link "Threaten $him with castration">>
+	<<replace "#result">>
+		You open a drawer of your desk and extract a razor-sharp ceramic-bladed knife. <<if canSee($activeSlave)>>You make a show of inspecting its edge and then place it on your desk before looking meaningfully at $his ballsack. $He watches this display with wide eyes<<else>>You describe what it is you took out of your desk and how easily it could be used to remove $his ballsack. $He cocks $his head slightly<</if>> until $he gets your meaning, and then collapses to the ground, almost wetting $himself.
 		<<if !canTalk($activeSlave)>>
-			$He raises a shaky hand to @@.mediumaquamarine;gesture thanks.@@
-		<<elseif SlaveStatsChecker.checkForLisp($activeSlave)>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he lisps weakly.
+			$He frantically uses $his hand<<if hasBothArms($activeSlave)>>s<</if>> to promise you perfect obedience if you'll only spare $him from emasculation.
 		<<else>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he murmurs in a tiny voice.
+			$He begs through tears, "Plea<<s>>e no, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>! Plea<<s>>e let me keep them! Plea<<s>>e!"
 		<</if>>
-		<<set $activeSlave.trust += 4>>
+		You patiently inform $him that $he can — for now, and so long as $he is a good little $girl. $He flees from the room backwards, bowing, scraping, and profusely thanking you, repeating desperate @@.gold;promises of good behavior.@@
+		<<set $activeSlave.trust -= 5>>
 	<</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">>
+<</link>>
+<br><<link "Force obedience using pain">>
 	<<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,
+		You shove $his unresisting<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>swollen<</if>><</if>> body over the couch and seize $his ballsack. When $he feels your tight grip $he spasms and tries to pull away reflexively, but goes limp when $he feels the agony of a warning squeeze. You fasten a tight rubber ring around the base of $his sack, leaving $him writhing on the couch in considerable discomfort. After letting $him wriggle for a while, you tell $him that $he can have it off when $he gets you off. $He scrabbles for your <<if $PC.dick == 0>>pussy and desperately starts to perform cunnilingus; after a while you get bored and ride $his face. You finally climax<<else>>dick and starts to desperately suck you off<<if $PC.vagina != -1>> and eat you out<</if>>; you let $him work for a while before getting bored and adding painful slaps to $his cheeks. You blow your load down $his throat<</if>> and then stand, <<if canSee($activeSlave)>>brandishing the knife<<else>>swishing the knife through the air<</if>>. <<if canSee($activeSlave)>>$His eyes are huge<<else>>$He grimaces<</if>> with terror, but $he holds still. $His private parts have gone so numb that $he has to <<if canSee($activeSlave)>>look down<<else>>run $his hand across $his scrotum<</if>> in trepidation to verify that you cut the rubber, not $him. $He leaves with the pins and needles working their agonizing way back into $him along with the blood flow to $his balls, promising tearfully to @@.gold;stay out of trouble.@@
+		<<set $activeSlave.trust -= 5>>
+		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
+	<</replace>>
+<</link>>
+<br><<link "Geld $him gradually">>
+	<<replace "#result">>
+		You shove $his unresisting<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>swollen<</if>><</if>> body over the couch and seize $his ballsack. When $he feels your tight grip $he spasms and tries to pull away reflexively, but goes limp when $he feels the agony of a warning squeeze. You fasten a tight rubber ring around the base of $his sack, leaving $him writhing on the couch in considerable discomfort. You add leather mittens to $his hands to stop $him from removing the rubber, and then observe that this is a method used to geld livestock. $His tearful begging goes on until you tire of it and put $him out. <<= capFirstChar($assistant.name)>> tracks $his agonized, weeping progress around the arcology for the many hours it takes the lack of blood flow to necessitate a trip to the remote surgery. When that time comes, you make $him beg you to remove $his balls for an hour straight before you do — and $he's so desperate for relief from the pain that $he does it. The experience has left $him @@.health.dec;slightly injured,@@ @@.orange;gelded,@@ @@.red;thoroughly traumatized,@@ and @@.gold;willing to do anything@@ to avoid any more pain.
+		<<set $activeSlave.behavioralFlaw = "odd", $activeSlave.trust -= 20, $activeSlave.balls = 0, $activeSlave.scrotum = 0>>
+		<<run surgeryDamage($activeSlave, 10)>>
+	<</replace>>
+<</link>>
+
+<<case "extreme aphrodisiacs">>
+
+<<link "Take pity and give $him relief">>
+	<<replace "#result">>
+		You sit on the edge of the bed and draw $him down to sit on your lap. This way, you can enjoy gently fucking $him while you draw orgasm after orgasm out of $him with your hands. $He'll only be relieved for a few hours, but $he's @@.hotpink;tearfully grateful all the same.@@
+		<<set $activeSlave.devotion += 4>>
+	<</replace>>
+<</link>>
+<br><<link "See how rough you can be and still get $him to cum">>
+	<<replace "#result">>
+		The aphrodisiac dosage $he's on will let $him orgasm to almost anything. You spend a few minutes playing with $his nipples, skillfully edging $him away from climax, and $he's almost vibrating with discomfort. $He's so desperate that $he sobs with relief when you order $him to
+		<<if ($activeSlave.heels == 1) && shoeHeelCategory($activeSlave) == 0>>
+			kneel
+		<<elseif shoeHeelCategory($activeSlave) > 1>>
+			totter up
 		<<else>>
-			run your hands across $his bottom,
+			stand
 		<</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 $activeSlave.belly >= 5000>>
+			_belly belly
 		<</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.
+		against a wall and spread $his buttocks. A little saliva and<<if $PC.vagina != -1>> a bit of your own pussyjuice, transferred by a couple of fingers, and<</if>> <<if $PC.dick == 0>>your vibrating strap-on<<else>>your dick<</if>> is up $his willing ass. The position is uncomfortable for $him, and you are not gentle, but $he comes anyway. By the end of the night $his butthole is so sore that $he <<if $activeSlave.belly >= 5000>>lies on $his side<<else>>lies on $his stomach<</if>> every chance $he gets. $His submissiveness @@.hotpink;has increased.@@
+		<<set $activeSlave.devotion += 4>>
+	<</replace>>
+<</link>>
+<br><<link "Send $him away">>
+	<<replace "#result">>
+		$He leaves with ill-concealed disappointment, and is faced with the choice between covert, rule-breaking masturbation or a sleepless night. $His regard for you @@.mediumorchid;has decreased.@@
+		<<set $activeSlave.devotion -= 5>>
+	<</replace>>
+<</link>>
+
+<<case "shaped areolae">>
+
+<<link "Show $him off around the arcology">>
+	<<replace "#result">>
+		You give $activeSlave.slaveName a variation on a usual slave gown. It's just as gorgeous, but this one actually covers $his <<if $activeSlave.belly >= 1500>>_belly <<if $activeSlave.bellyPreg >= 1500>>pregnancy<<else>>belly<</if>>, <</if>>ass and crotch as well. In fact, it covers $his
+		<<if isAmputee($activeSlave)>>
+			limbless torso and head completely: everything except the lower part of $his face, and $his boobs.
 		<<else>>
-			$him.
+			<<if hasAllLimbs($activeSlave)>>arms, legs,<<else>>limbs<</if>> and $his face from the nose up. The only flesh visible at all is $his mouth, $his chin, and $his huge breasts, supported and presented by gentle corseting.
 		<</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")>>
+		<<if !hasAnyLegs($activeSlave)>>
+			You carry $him around
+			<<if $club != 0>>
+				$clubName.
 			<<else>>
-				<<run seX($activeSlave, "penetrative", $PC, "anal")>>
-			<</if>>
-			<<if canImpreg($PC, $activeSlave)>>
-				<<= knockMeUp($PC, 50, 0, $activeSlave.ID)>>
+				$arcologies[0].name's clubs.
 			<</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>>
+			You place a gentle hand on the small of $his back to guide $him, and stroll around
+			<<if $club != 0>>
+				$clubName.
 			<<else>>
-				<<run seX($activeSlave, "anal", $PC, "penetrative")>>
+				$arcologies[0].name's clubs.
 			<</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.
+		$activeSlave.slaveName <<if canSee($activeSlave)>>is blinded by the silk over $his face<<else>>may not be able to see<</if>>, but $he can still <<if canHear($activeSlave)>>hear the appreciative murmurs<<else>>feel the appreciative presence<</if>> of onlookers as they eye $his magnificent breasts with their <<= $activeSlave.areolaeShape>>-shaped areolae. $He shivers a little with suppressed pride. @@.hotpink;$His devotion to you has increased,@@ and @@.green;your reputation as a person with unique property grows.@@
 		<<set $activeSlave.devotion += 4>>
+		<<run repX(500, "event", $activeSlave)>>
 	<</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>>
+<</link>>
+<br><<link "Use that pride as an advertisement">>
+	<<replace "#result">>
+		There's all sorts of business going on in $arcologies[0].name, from flesh rented or bought down to more pedestrian affairs. Advertisement never goes amiss. You place $activeSlave.slaveName naked on a slowly rotating pedestal surrounded by a clear plastiglass tube on a busy thoroughfare in the lower parts of $arcologies[0].name. These devices are often used to display slaves for sale or slave whores for rent; $activeSlave.slaveName is simply identified by your name as arcology owner, which is thus @@.yellowgreen;identified with business prosperity.@@ $He spends the day serving as eye candy for passersby, rotating gently on the pedestal as $he shows off $his body, giving pride of place to $his <<= $activeSlave.areolaeShape>>-shaped areolae. $He loves all the attention, and @@.hotpink;$his devotion to you has increased.@@
+		<<set $activeSlave.devotion += 4>>
+		<<run cashX(500, "event", $activeSlave)>>
+	<</replace>>
+<</link>>
 
 <<case "fucktoy tribbing">>
 
@@ -8222,63 +2731,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</replace>>
 <</link>>
 
-<<case "bad dream">>
-
-/* TODO: add a positive variant */
-
-<<link "Let $him be">>
-	<<replace "#result">>
-		It may be for the best to not disturb $his unpeaceful slumber, you decide. Admiring the attractive view for just a moment longer, you turn back and head to your own bed. The next morning, it appears as though $activeSlave.slaveName doesn't even remember this nightmare.
-	<</replace>>
-<</link>>
-<br><<link "Hug $him">>
-	<<replace "#result">>
-		You reach out to hug $him, but as soon as your hand touches $his shoulder, $he writhes instinctively away. <<if canSee($activeSlave)>>$His eyes fly open, searching frantically for $his assailant. Seeing that it's you, $he screams and scrabbles away even harder. After making it a few feet, $he collects $his wits enough to bring $himself to a stop and stop screaming, though $he continues to sob, staring at you in terror<<else>>$He gropes frantically for $his assailant, before making contact with you. $He screams and scrabbles away, only stopping when $he collides with the nearest solid object. <<if canHear($activeSlave)>>Only after several call outs that it is you does $he stop screaming, though $he continues to sob, listening to your every breath in terror<<else>>After screaming $himself hoarse, $he realizes that $his assault has abruptly ended, and gently feels around $his surroundings with a shaking hand to discover $himself back in $his room<</if>><</if>>. $He remains frozen in place as you slowly advance on $him and give $him a light embrace. $His tears gradually stop, but $he does not relax, <<if canSee($activeSlave)>>remaining dumbly stiff<<else>>continuing to quake in fear<</if>> within your arms. Eventually you let $him go, and $he crawls pathetically back under $his sheet, still weeping softly. It seems $he is @@.gold;more afraid of you@@ than ever, and if you thought that a simple hug could win $him over, you were wrong.
-		<<if canSee($activeSlave)>>
-			<<set $activeSlave.trust -= 4>>
-		<<elseif canHear($activeSlave)>>
-			<<set $activeSlave.trust -= 5>>
-		<<else>>
-			<<set $activeSlave.trust -= 6>>
-		<</if>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Rape $him">>
-		<<replace "#result">>
-			You snatch the sheet off $him, shove $his uppermost shoulder down so $his face is smashed into the pillow, and bring your knees down between $his legs, spreading them to force $hers apart. You use the hand that isn't controlling $his torso to locate $his
-			<<if canDoVaginal($activeSlave)>>
-				<<if $activeSlave.vagina > 2>>
-					amusingly loose cunt
-				<<elseif $activeSlave.vagina > 1>>
-					large womanhood
-				<<elseif $activeSlave.vagina > 0>>
-					tight pussy
-				<<else>>
-					poor virgin pussy
-				<</if>>
-			<<else>>
-				<<if $activeSlave.anus > 2>>
-					amusingly broad asshole
-				<<elseif $activeSlave.anus > 1>>
-					big butthole
-				<<elseif $activeSlave.anus > 0>>
-					tight rosebud
-				<<else>>
-					poor virgin anus
-				<</if>>
-			<</if>>
-			in the dark as $he begins to @@.gold;struggle and scream.@@ $He comes fully awake when $he feels your rough fingers searching for and then finding $his
-			<<if ($activeSlave.vagina >= 0) && canDoVaginal($activeSlave)>>vagina<<else>>crinkled hole<</if>>, and $his noise increases to the point where it becomes annoying. You stuff $his face into the pillow and take $him mercilessly, using the pillow to cut off $his breath whenever $he struggles too much, until oncoming suffocation forces $him to go still and take it like a good little bitch.
-			<br><br>
-			@@.mediumorchid;Sometimes dreams do come true.@@
-			<br><br>
-			<<= VCheck.Simple($activeSlave, 1)>>
-			<<set $activeSlave.trust -= 4, $activeSlave.devotion -= 4>>
-		<</replace>>
-	<</link>><<if (($activeSlave.vagina == 0) && canDoVaginal($activeSlave)) || (($activeSlave.anus == 0) && canDoAnal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-
 <<case "shower slip">>
 
 <<link "Carry $him to where $he needs to go">>
diff --git a/src/uncategorized/barracks.tw b/src/uncategorized/barracks.tw
deleted file mode 100644
index 7f3186b09c81447bb5728823cfa61032ec669ce0..0000000000000000000000000000000000000000
--- a/src/uncategorized/barracks.tw
+++ /dev/null
@@ -1,195 +0,0 @@
-:: Barracks [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Main">>
-
-The mercenaries you retain to protect $arcologies[0].name are housed in this sector of the arcology, which is fitted out as a modern military facility. It's much less expensive to house them here than to let them live at free quarters in the living areas of the arcology. They live somewhat apart from the society they protect, down here, but
-<<if $personalArms > 0 && $invasionVictory > 0>>
-	you're always welcome here. You're their employer, but what's more important to them is that you also fought alongside them in victorious battle.
-<<else>>
-	they don't resent an unannounced visit from their employer.
-<</if>>
-As you enter the main bay of the armory, lined with modern arms and armor and a few muscular, scarred men and women looking after their gear or suiting up to stand post, you're greeted respectfully, with<<if $personalArms > 0 && $invasionVictory > 0>> jaunty salutes and<</if>> formal "<<= properTitle()>>"s<<if $personalArms > 0 && $invasionVictory > 0>>, but also with smiles and nods<</if>>.
-<<if $mercenaries >= 3>>
-	Though few of the mercenaries are visible,
-	<<if $mercenaries >= 5>>
-		the bay is huge. There's enough equipment for a full company here.
-	<<else>>
-		there's enough equipment for a full platoon here.
-	<</if>>
-<</if>>
-
-<<if $mercenariesTitle != "mercenaries">>
-	They've taken to their role as $mercenariesTitle.
-	<<switch $mercenariesTitle>>
-	<<case "Knights">>
-		Every set of gear has some kind of chivalric device on it, and the heavier sets of powered armor are accented with a lot of burnished steel.
-	<<case "Evocati">>
-		The heavier sets of powered armor have Roman standards mounted on their backs, and officers' helmets are distinguished by horsehair crests.
-	<<case "Black Eagles">>
-		Their ultra-heavy Imperial Plate is painted universally black and yellow, and prominently marked with the crest of your noble house. The officer's helmets have golden eagles painted over the faceplate to mark their status.
-	<<case "Shorn Ones">>
-		The bigger sets of power armor are adorned with multiple ornaments and painted with symbols of the gods and victory.
-	<<case "Imperial Guards">>
-		Their prototype armor is equipped with the latest weapons and their Imperial Chinese war banner strikes fear into the foes.
-	<<case "Medjay">>
-		The gear is accented with bronze and animal skins. Some of the heavier armored helmets even have faceplates styled after Pharaonic death masks.
-	<<case "Samurai">>
-		The gear is functional, but it has a distinctive Sengoku style to it. A ceramic wakizashi is an almost universal tertiary weapon.
-	<<case "Janissaries">>
-		They consider themselves a caste apart, and keep to themselves, priding themselves on relentless training and perpetual readiness.
-	<<case "Knights Templar">>
-		All the armor includes a modernized version of a white surcoat emblazoned with the symbol of the new faith.
-	<<case "Immortals">>
-		The lighting in the bay has been lowered, and the gear is styled to be menacing. There's a sense of leashed danger here.
-	<<case "Vast Legions">>
-		Their bulky, heavily armored prototype armor strikes terror into foes and causes the earth to shake when they walk.
-	<<case "Surgical Corps">>
-		Their prototype armor is equipped with the latest medical equipment.
-	<<case "Inglorious Bitches">>
-		Their garish neon pink prototype armor shines brightly.
-	<<case "Thousand Sons">>
-		Their prototype armor is designed to preserve a sample of the wearer's genetic material in the event of death.
-	<<case "Guardians of the Unborn">>
-		Their gear is designed to be accommodating to pregnant women and even includes a special kit in case a baby needs delivering and they're the only ones around.
-	<<case "Shadowed Hand">>
-		Their armor prominently displays the symbol of the Societal Elite and is designed to make it perfectly clear that they mean business.
-	<<case "Asgardians">>
-		Their armor has been modified to allow the wearers' muscular arms to remain visible, and the heavier armor seems to be equipped with capes.
-	<<case "Tasters">>
-		Their armor has been modified to handle all sorts of waistlines. They contain numerous pockets and containers; it's not unusual to see a merc offering someone a needed pick-me-up.
-	<<case "Knights of the Blood">>
-		Their gear is adorned with the badges and ensigns of racialist societies, and posters from the same sources are visible on the walls.
-	<<case "Knights of the Purge">>
-		Their prototype armor is equipped with the latest weapons.
-	<<case "Wardens">>
-		Their gear is designed to take their foes alive and relatively unharmed, though lethal force can be applied if need be.
-	<<case "Purifiers">>
-		Their prototype armor is equipped with a cleansing flamethrower. In addition to striking fear into their foes it also cooks a mean steak.
-	<<case "Abstemious">>
-		Their sleek prototype armor is equipped with advanced restraining weapons.
-	<<case "Rangers">>
-		Their gear has a heavy Western influence; everyone carries heavy revolvers everywhere, and the armor sports rope lariats for lassoing 'cattle.'
-	<<case "Shepherds">>
-		Their gear has a rather gaudy appearance; it makes it easier to attract wayward bimbos that way when they wander off and get lost.
-	<<case "Geniuses">>
-		Their prototype armor is extremely complex to control, but those who can reap the benefits.
-	<<case "Caretakers">>
-		Their towering prototype armor lets them stand out in a crowd and guide the way for those lost underfoot.
-	<<case "Titans">>
-		Their prototype armor towers over the average civilian and compacts for easy storage despite its size.
-	<</switch>>
-<</if>>
-There are doors to magazines, armories, and training areas to all sides, and muffled gunfire can be heard from the latter.
-
-<br><br>
-You head up a deck, to the staff area, and up one more, to look into the living area. It's comfortable and very well-kept, since they have a large number of slaves here to look after them. Relaxing mercenaries are scattered around the common areas, and most are enjoying a slave or two.
-<<if $FSAnnounced>>
-	<<setNonlocalPronouns $seeDicks>>
-	They're obviously adopting the customs of $arcologies[0].name.
-	<<set _vignette = 0>>
-	<<if $arcologies[0].FSSubjugationist != "unset">>
-		A mercenary is fingering <<print addA($arcologies[0].FSSubjugationistRace)>> _girlU's <<if $seeDicks != 100>>pussy<<else>>anus<</if>>. _HeU's wincing a little; _heU must be new here.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSSupremacist != "unset">>
-		<<if _vignette>>Another<<else>>A<</if>> mercenary, a woman, is being seen to by a multicultural bunch of subhumans of different races. She has one eating her out while two more are rubbing her feet.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSGenderRadicalist != "unset">>
-		<<if _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary, who's rather obviously earned enough money to pay for the surgeries and drugs to turn herself into an imposing futanari, is pounding a dickgirl slave.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSGenderFundamentalist != "unset">>
-		<<if _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is fucking a slave
-			<<if $arcologies[0].FSRestart != "unset">>
-				lotus style. His hands are greedily following _hisU womanly curves as they bang.
-			<<else>>
-				doggy style. He's massaging _hisU rounded belly as _heU enjoys _hisU first foray into motherhood.
-			<</if>>
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSPaternalist != "unset">>
-		<<if _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is making out with a pretty slave. An old romantic movie is playing on a wallscreen in front of them, forgotten.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSDegradationist != "unset">>
-		<<if _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is using a slave as a footrest as he relaxes. _HeU has a huge dildo up _hisU ass, and whenever _heU moves, he uses a foot to shove it farther inside _himU.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSIntellectualDependency != "unset">>
-		<<if _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is player strip poker with a pouting bimbo. _HeU's completely nude and unaware that the game is over, not that the merc minds.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSSlaveProfessionalism != "unset">>
-		<<if _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is practicing assembling and disassembling his sidearm under the learned eyes of his assisting slave. _HeU is making sure _hisU master is well prepared for the future and stroking his dick each time he does it right.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSBodyPurist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is idly playing with a slave's natural breasts as he watches a wallscreen. He's being gentle and _heU doesn't seem to mind.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSTransformationFetishist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is fucking a bimbo slave doggy style. _HisU fake tits are so huge that the motion is making them slap together under _himU.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSYouthPreferentialist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is getting a blowjob from a young slave. He's playing with _hisU <<if $seeDicks != 100>>fresh pussy<<else>>tight little anus<</if>> as _heU sucks his dick.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSMaturityPreferentialist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is getting a massage from a mature slave. _HeU's wearing a towel, but he sneaks a hand back and steals it, freeing _hisU heavy breasts.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSSlimnessEnthusiast != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is getting a lap dance from a lithe slave. _HeU's moving _hisU cute butt lower and lower, getting ready to impale _himselfU on his raging erection.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSAssetExpansionist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is almost hidden by a slave he's got in his lap. He has his head buried between _hisU monstrous breasts, and it's not clear how he's breathing.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSPetiteAdmiration != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary has a petite slave sitting on a weight bar. Each rep buries _hisU butt in his face.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSStatuesqueGlorification != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is having sex with a rather tall slave against the lockers. He has to stand on a nearby bench in order to properly penetrate _himU.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSPastoralist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is drinking a slave's milk, straight from the nipple, while idly massaging _hisU other breast, bringing out a thin stream of milk.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSPhysicalIdealist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is doing push-ups with a well-endowed slave sitting on his back to add weight. _HeU's counting his reps for him.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is doing squats with a rather portly slave sitting on his shoulders to add weight. _HeU pops a cookie into his mouth with each completed set.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSChattelReligionist != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is mounting a praying slave from behind. It doesn't distract _himU; _hisU quiet devotions become more fervent as he fucks _himU.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSRepopulationFocus != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is being ridden by an enormously pregnant slave. He's massaging _hisU taut belly as she uses _hisU hands to support _hisU sore boobs.
-		<<set _vignette++>>
-	<<elseif $arcologies[0].FSRestart != "unset">>
-		<<if _vignette >= $FSCreditCount>>Finally, a<<elseif _vignette >= 3>>Yet another<<elseif _vignette >= 2>>A third<<elseif _vignette>>Another<<else>>A<</if>> mercenary is being serviced by a slave with a visibly smooth crotch. He has a dildo rammed in _hisU ass and moves it along with _hisU sucking.
-		<<set _vignette++>>
-	<</if>>
-	<<if $arcologies[0].FSRomanRevivalist != "unset">>
-	<<elseif $arcologies[0].FSNeoImperialist != "unset">>
-	<<elseif $arcologies[0].FSAztecRevivalist != "unset">>
-	<<elseif $arcologies[0].FSEgyptianRevivalist != "unset">>
-	<<elseif $arcologies[0].FSEdoRevivalist != "unset">>
-	<<elseif $arcologies[0].FSArabianRevivalist != "unset">>
-	<<elseif $arcologies[0].FSChineseRevivalist != "unset">>
-	<</if>>
-<</if>>
-
-<<if $mercenariesHelpCorp > 0>>
-	<<setNonlocalPronouns $seeDicks>>
-	<br><br>
-	As you leave, a squad moves thunderously into the bay, fresh from a slave raid on behalf of your corporation. Most of their captures have been dropped off with the corporate receivers, but they've been given a pretty _girlU who isn't a good training prospect for the corporate brand, a common reward. The squad looks after their weapons and armor first, an inviolable rule, and as they do, they leave their naked slave standing in the middle of the bay, ignored. _HeU isn't even bound, but _heU's standing nude and alone amongst modern mercenaries, so _heU knows that resistance is futile. So _heU does the only thing left available to _himU: try to cover _himselfU with _hisU hands and cry.
-<</if>>
-
-<div class="choices" style="font-style:normal">
-	<<link "Decommission the armory and return this sector to manufacturing">>
-		<<run App.Arcology.cellUpgrade($building, App.Arcology.Cell.Manufacturing, "Barracks", "Manufacturing")>> <<set $barracks = 0>>
-		<<goto "Main">>
-	<</link>>
-</div>
\ No newline at end of file
diff --git a/src/uncategorized/clubAdvertisement.tw b/src/uncategorized/clubAdvertisement.tw
deleted file mode 100644
index cb85188466022d2c8a40d3f4d93388786f05f330..0000000000000000000000000000000000000000
--- a/src/uncategorized/clubAdvertisement.tw
+++ /dev/null
@@ -1,162 +0,0 @@
-:: Club Advertisement [nobr]
-
-<p class="scene-intro">
-	<<set _clubNameCaps = capFirstChar($clubName)>>
-	<<switch $clubDecoration>>
-		<<case "Roman Revivalist">>
-			_clubNameCaps is decorated like a Roman villa's entertainment rooms. There is a lot of white stone, plaster, and terracotta.
-		<<case "Neo-Imperialist">>
-			_clubNameCaps is a genuine temple of Imperial decadence. The blaze of bright neon lights flash and strobe on a mass of sweaty bodies, sleek speakers blaring synthetic music as banners with your family's crest flutter above the serenity of mindless dance. The stoic stone figures of Imperial Knights watching the entrance provide a stark contrast to the Bacchian passion of the dancers.
-		<<case "Aztec Revivalist">>
-			_clubNameCaps is decorated with obsidian figures inserted in the lime walls and giant oak pillars that give a homey feeling to the otherwise cold building.
-		<<case "Egyptian Revivalist">>
-			_clubNameCaps is decorated like a room in an ancient Egyptian palace. There are columns of warm stone and pools of clear water full of aquatic plants.
-		<<case "Edo Revivalist">>
-			_clubNameCaps is furnished as an Edo period theater. Performances of the traditional Japanese arts can be seen here, though more modern dancing happens in the evenings. In either case, geisha girls are present and willing.
-		<<case "Arabian Revivalist">>
-			_clubNameCaps is designed like an open plaza in an Arabian palace, with a raised stage in the center for erotic dancing. Diaphanous, flowing curtains billow across the space, dispersing the narcotic smoke billowing from a score of hookahs.
-		<<case "Chinese Revivalist">>
-			_clubNameCaps is furnished as an old Chinese disorderly house. It's intentionally packed in so that closeness and good cheer is obligatory here; prominent citizens share tables while their hangers-on jostle for room.
-		<<case "Chattel Religionist">>
-			_clubNameCaps isn't a religious establishment, but it almost looks like one. It's clean and proper, with beams of natural light that come down to highlight holy sex slaves' bodies.
-		<<case "Degradationist">>
-			_clubNameCaps has a perverted, debauched appearance. The décor is utilitarian so it can be cleaned easily, and the reason is obvious. Many patrons have brought their own slaves to publicly rape here.
-		<<case "Repopulationist">>
-			_clubNameCaps has a gaudy appearance. There are lots of deep soft chairs for pregnant patrons and slaves to rest in and screens showing girls with large bellies lining the walls.
-		<<case "Eugenics">>
-			_clubNameCaps has a gaudy appearance. There are screens lining the walls discouraging unprotected slave sex. The real action happens in the several exclusive rooms reserved for society's best.
-		<<case "Asset Expansionist">>
-			_clubNameCaps has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing off big tits and plush asses.
-		<<case "Transformation Fetishist">>
-			_clubNameCaps has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing off huge fake tits and plastic dick sucking lips.
-		<<case "Gender Radicalist">>
-			_clubNameCaps has a gaudy appearance. There are a lot of neon lights and there are screens everywhere, showing closeups of cocks fucking every imaginable orifice.
-		<<case "Gender Fundamentalist">>
-			_clubNameCaps has an old world appearance, a decidedly throwback atmosphere harking back to the glory days of cultures past.
-		<<case "Physical Idealist">>
-			_clubNameCaps isn't a gym, but it smells like one. The dancing is rough and competitive, and the drinks are rich with protein.
-		<<case "Supremacist">>
-			_clubNameCaps is decorated like an upper-class gentleman's club in the old countries of $arcologies[0].FSSupremacistRace people.
-		<<case "Subjugationist">>
-			_clubNameCaps is decorated like an upper-class gentleman's club in the old countries which favored $arcologies[0].FSSubjugationistRace slaves.
-		<<case "Paternalist">>
-			_clubNameCaps is handsome and well-kept, even romantic. Though the slaves here are sex slaves, every provision is made to encourage them to enjoy themselves.
-		<<case "Body Purist">>
-			_clubNameCaps is gorgeous, decorated and kept in the height of fashionable night establishment style. The music is cutting edge and everything and everyone is elegant.
-		<<case "Slimness Enthusiast">>
-			_clubNameCaps is distinctly gaudy, with lots of sugary drinks on offer. The music and décor are of a decidedly bubblegum quality.
-		<<case "Pastoralist">>
-			_clubNameCaps is decorated to resemble a frontier disorderly house. The drinks are pounded straight, and there's a set of swinging doors for bad men to part dramatically as they enter.
-		<<case "Maturity Preferentialist">>
-			_clubNameCaps is surprisingly elegant. The music consists of refined remixes of traditional dance music, offering slaves and citizens the chance to dance beautifully together.
-		<<case "Youth Preferentialist">>
-			_clubNameCaps is deafeningly loud. There's a bright light show running, offering staccato glimpses of the scene out on the dance floor.
-		<<case "Hedonistic">>
-			_clubNameCaps has a gaudy appearance. The dance floor is extra large to accommodate its extra wide dancers, though bodies grinding against each other is an inevitability. Plenty of roomy, comfortable booths encircle the room for an exhausted citizen to relax with his plush dance partner, and a wide selection of greasy food accompanies the drinks. <<if $arcologies[0].FSHedonisticDecadenceResearch == 1>>Platters of food are complementary for feeding slaves<<else>>Feeders are available in the booths to feed tired slaves<</if>> while they get fondled.
-		<<case "Intellectual Dependency">>
-			_clubNameCaps is distinctly gaudy and easy for slaves to move around in. The dancing is as energetic and sexual, and the drinks sugary and sweet.
-		<<case "Slave Professionalism">>
-			_clubNameCaps is decorated like an upper-class gentleman's club. It is where a true courtesan works their craft.
-		<<case "Petite Admiration">>
-			_clubNameCaps has a gaudy appearance. The dance floor is surrounded by raised platforms so even the shortest slave can be seen by the crowd.
-		<<case "Statuesque Glorification">>
-			_clubNameCaps has a tiered appearance. The booths and bar are positioned overlooking the dance floor so patrons may loom over the dancing slaves even when seated.
-	<</switch>>
-
-	<<if $clubAdsSpending > 0>>
-		Screens outside the entrance are showing softcore music videos to advertise $clubName.
-		<<if $clubAdsOld == 1>>
-			The featured strippers are all MILFs.
-		<<elseif $clubAdsOld == -1>>
-			The featured strippers are all nice and young.
-		<<elseif $clubAdsOld == -2>>
-			The featured strippers are all teenagers.
-		<<elseif $clubAdsOld == -3>>
-			The featured strippers are all lolis.
-		<<else>>
-			The featured strippers vary in age.
-		<</if>>
-		<<if $clubAdsStacked == 1>>
-			Lots of bouncing breasts and butts
-		<<elseif $clubAdsStacked == -1>>
-			Lots of trim breasts and shapely butts
-		<<else>>
-			A variety of breast and butt sizes and shapes
-		<</if>>
-		are on display, and
-		<<if $clubAdsImplanted == 1>>
-			most of these are augmented by implants.
-		<<elseif $clubAdsImplanted == -1>>
-			they're all natural.
-		<<else>>
-			some are augmented by implants.
-		<</if>>
-		<<if $seePreg == 1>>
-			<<if $clubAdsPreg == 1>>
-				Most of strippers have firm, rounded bellies.
-			<<elseif $clubAdsPreg == -1>>
-				Most of the strippers have firm, flat bellies.
-			<<else>>
-				Some of the strippers are pregnant.
-			<</if>>
-		<</if>>
-		<<if $clubAdsModded == 1>>
-			Everything is heavily pierced and tattooed.
-		<<elseif $clubAdsModded == -1>>
-			Everything is free of tattoos and piercings.
-		<<else>>
-			Some of these assets are tattooed and pierced, and some aren't.
-		<</if>>
-		The strippers get naked quickly, and show off
-		<<if $clubAdsXX == 1>>
-			their pussies and assholes.
-		<<elseif $clubAdsXX == -1>>
-			their assholes.
-		<<else>>
-			their holes.
-		<</if>>
-	<</if>>
-
-	<<if $clubAdsSpending >= 5000>>
-		Advertisements based on these scenes run constantly in media across $arcologies[0].name, and there's an active merchandising campaign underway to promote your club and its girls.
-	<<elseif $clubAdsSpending >= 4000>>
-		Advertisements based on these scenes run constantly in media across $arcologies[0].name.
-	<<elseif $clubAdsSpending >= 3000>>
-		Advertisements based on these scenes are run in media across $arcologies[0].name.
-	<<elseif $clubAdsSpending >= 2000>>
-		Advertisements based on these scenes run regularly in arcology media.
-	<<elseif $clubAdsSpending >= 1000>>
-		Advertisements based on these scenes run occasionally in arcology media.
-	<<else>>
-		$arcologies[0].name has a robust internal media that could be used to bring patrons into the club.
-	<</if>>
-</p>
-
-<p>
-	<div>
-		You are spending <<print cashFormatColor(forceNeg($clubAdsSpending))>> each week to advertise $clubName.
-	</div>
-
-	<div>
-		<<if $clubAdsSpending > 900>>
-			<<link "Decrease">><<set $clubAdsSpending -= 1000>><<goto "Club Advertisement">><</link>> |
-		<<else>>
-			Decrease |
-		<</if>>
-		<<if $clubAdsSpending < 5000>>
-			<<link "Increase">><<set $clubAdsSpending += 1000>><<goto "Club Advertisement">><</link>>
-		<<else>>
-			Increase
-		<</if>>
-	</div>
-</p>
-
-<h2>Design _clubNameCaps Ad Campaign</h2>
-
-<div class="note">
-	Will replace relevant variety bonuses
-</div>
-
-<p>
-	<<includeDOM App.Ads.report("club", true)>>
-</p>
diff --git a/src/uncategorized/newGamePlus.tw b/src/uncategorized/newGamePlus.tw
deleted file mode 100644
index 30631e212bf2b8f1774c20bb8a81d41f557e34fa..0000000000000000000000000000000000000000
--- a/src/uncategorized/newGamePlus.tw
+++ /dev/null
@@ -1,55 +0,0 @@
-:: New Game Plus [nobr]
-
-<<set $ui = "start">>
-<<if ndef $slavesToImportMax>><<set $slavesToImportMax = 5>><</if>>
-
-<<set _fee = 50000+($slavesToImportMax*10000)>>
-<<run setupLastWeeksCash()>>
-<<run setupLastWeeksRep()>>
-
-You have decided to start over and will be able to take a few things with you: a few slaves, a small fraction of your current reserves of money, and possibly even your experience as an arcology owner, which will give you a very powerful career background. Many of your other customizations and settings will be carried over as the defaults for your new game, but can be revised freely.
-
-<br><br>
-<<if $cash >= _fee>>
-	You have allocated funds to bring up to $slavesToImportMax slaves with you (or your equivalent) to a new arcology. It will cost @@.yellowgreen;<<print cashFormat(_fee)>>@@ to insure another slave's safe transfer. You have @@.yellowgreen;<<print cashFormat($cash)>>@@ to spend.
-	<br>[[Increase slave import capacity by 1.|New Game Plus][cashX(forceNeg(_fee), "capEx"), $slavesToImportMax++]]
-<<else>>
-	You lack the @@.yellowgreen;<<= cashFormat(_fee)>>@@ needed to bring any more than $slavesToImportMax slaves with you (or your equivalent) to a new arcology.
-<</if>>
-
-<br>
-<<set $ngpParams = { nationality: getRevivalistNationality(), prosperity: (250 * $arcologies[0].prosperity * $arcologies[0].ownership) }>>
-<<if $freshPC == 0>>
-	<<if $retainCareer == 1 && $PC.career != "arcology owner">>
-		<<if $week > 52 || ($PC.skill.slaving >= 100 && $PC.skill.trading >= 100 && $PC.skill.warfare >= 100 && $PC.skill.engineering >= 100 && $PC.skill.medicine >= 100 && $PC.skill.hacking >= 100)>>
-			You have acquired a fair amount of knowledge regarding arcologies and their day-to-day management in your time spent as one's owner qualifying you as an @@.orange;"arcology owner"!@@ Benefits include:
-			<br>@@.lime;20% reduced cost of construction.@@
-			<br>@@.lime;Free additional starting rep along with easy rep maintenance.@@
-			<br>@@.lime;Reduced mercenary costs.@@
-			<br>@@.lime;An eye for gingered slaves.@@
-			<br>@@.lime;An edge in all things data.@@
-			<br>
-			<<set $oldCareer = $PC.career>>
-			<<if $retainCareer === 1>>
-				[[Change career.|New Game Plus][$retainCareer = 0,$PC.career = "arcology owner"]]
-			<</if>>
-		<<else>>
-			You lack the experience needed to qualify for a career change to "arcology owner".
-		<</if>>
-	<</if>>
-	<<if $retainCareer === 0 && $PC.career === "arcology owner">>
-		[[Don't change career.|New Game Plus][$retainCareer = 1,$PC.career = $oldCareer]]
-	<</if>>
-	<br>[[Start over with a new player character.|New Game Plus][$freshPC = 1, $retainCareer = 1]]
-<<else>>
-	[[Use existing player character.|New Game Plus][$freshPC = 0]]
-<</if>>
-
-<br><br>
-<<if $cheatMode == 1>> 
-	[[DEBUG: Add all slaves to import list|New Game Plus][$slaves.forEach(s => assignJob(s, Job.IMPORTED))]]
-	<br> 
-<</if>>
-
-Select up to $slavesToImportMax slaves to be imported into a new game and then click [[here.|init][$saveImported = 1,$oldCareer = "undefined"]]
-<br><<includeDOM App.UI.SlaveList.listNGPSlaves()>>
\ No newline at end of file
diff --git a/src/uncategorized/randomEventRoll.tw b/src/uncategorized/randomEventRoll.tw
index e8af85bc01e4d49e1c12ad13b7043a4247a9f5f3..d214a3a7b751a35abfb8ada5e25fb0566bc9f350 100644
--- a/src/uncategorized/randomEventRoll.tw
+++ b/src/uncategorized/randomEventRoll.tw
@@ -1,5 +1,9 @@
 :: random event roll
 
+<<if $events.length == 0>>
+	<<set $events.push("RE no event")>>
+<</if>>
+
 <<set _goto = $events.random()>>
 <<if _goto.startsWith("JSRE")>>
 	<<run App.Events.setGlobalEventForPassageTransition(_goto)>>
diff --git a/src/uncategorized/randomIndividualEvent.tw b/src/uncategorized/randomIndividualEvent.tw
index 580afbe012af9f267b6e352e6e213486227eee79..779c8e869c825fea37bb13ac64b804e49b2f909f 100644
--- a/src/uncategorized/randomIndividualEvent.tw
+++ b/src/uncategorized/randomIndividualEvent.tw
@@ -20,7 +20,7 @@
 	<</if>>
 <<else>>
 	/* initialize event lists as arrays [], not objects {} */
-	<<set $events = [], $RESSevent = [], $RESSTRevent = [], $RETSevent = [], $RECIevent = [], $activeSlave = 0, $legendaryFacility = 0>>
+	<<set $events = [], $RESSevent = [], $RESSTRevent = [], $RETSevent = [], $RECIevent = [], $activeSlave = 0>>
 
 	<<run generateRandomEventPool($eventSlave)>>
 	/* EVENT RANDOMIZATION */
diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw
index 0858febeabbabf3c6596839b6291d4825203fa2b..2a7f886f4f6978a4d68fb79ef2a3a128df88e2b9 100644
--- a/src/uncategorized/randomNonindividualEvent.tw
+++ b/src/uncategorized/randomNonindividualEvent.tw
@@ -19,23 +19,20 @@
 	<</if>>
 <<else>>
 	/* initialize event lists as arrays [], not objects {} */
-	<<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, _recruitEvents = []>>
-	<<set $legendaryFacility = 1>>
-
-	/* Multislave Events */
-	<<set _L = App.Utils.countFacilityWorkers(["brothel", "clinic", "club", "dairy", "cellblock", "spa", "schoolroom", "servantsQuarters"])>>
+	<<set $events = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $activeSlave = 0>>
 
 	/* EVENT RANDOMIZATION */
-	<<for $i = 0; $i < $RecETSevent.length; $i++>>
-		<<set _recruitEvents.push("RecETS")>>
+	<<for $i = 0; $i < $PESSevent.length; $i++>>
+		<<set $events.push("PESS")>>
+	<</for>>
+	<<for $i = 0; $i < $PETSevent.length; $i++>>
+		<<set $events.push("PETS")>>
 	<</for>>
 	<<for $i = 0; $i < $REFIevent.length; $i++>>
 		<<set $events.push("REFI")>>
 	<</for>>
-	<<for $i = 0; $i < $REFSevent.length; $i++>>
-		<<set $events.push("REFS")>>
-	<</for>>
-	<<set _maxRecruitNumber = Math.min(10, Math.ceil($events.length/4))>>
+	<<set _recruitEvents = App.Events.getNonindividualRecruitmentEventsPassageList()>>
+	<<set _maxRecruitNumber = Math.min(10, Math.floor($events.length/4) + 1)>>
 	<<if _maxRecruitNumber < _recruitEvents.length>>
 		<<set _recruitEvents.shuffle()>>
 		<<set _recruitEvents.length = _maxRecruitNumber>>
diff --git a/src/uncategorized/subordinateTargeting.tw b/src/uncategorized/subordinateTargeting.tw
deleted file mode 100644
index b96d185186838ea2be8ec382b1f1a9d1c99ed2bc..0000000000000000000000000000000000000000
--- a/src/uncategorized/subordinateTargeting.tw
+++ /dev/null
@@ -1,42 +0,0 @@
-:: Subordinate Targeting [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Slave Interact">>
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-
-<<if getSlave($AS).subTarget == $AS>>
-	<<set getSlave($AS).subTarget = 0>>
-<<elseif getSlave($AS).subTarget == -1>>
-	<<if $universalRulesImpregnation != "Stud" || $AS != $StudID>>
-		<<set getSlave($AS).subTarget = 0>>
-	<</if>>
-<</if>>
-<<if getSlave($AS).assignment !== "be a subordinate slave">>
-	<<= assignJob(getSlave($AS), "be a subordinate slave")>>
-<</if>>
-<<set _st = $slaveIndices[getSlave($AS).subTarget]>>
-<<= getSlave($AS).slaveName>>
-<<if def _st>>
-	will submit to <span class='slave-name'>$slaves[_st].slaveName</span> this week.
-<<elseif getSlave($AS).subTarget == -1>>
-	is acting as your Stud and is tasked with keeping your chattel pregnant.
-<<else>>
-	has not been given to any particular slave, so $he will have to offer $himself to everyone this week.
-	<<set getSlave($AS).subTarget = 0>>
-<</if>>
-
-<<if getSlave($AS).subTarget == -1>>
-	<br><br><<link "Reign $him in" "Subordinate Targeting">><<set getSlave($AS).subTarget = 0, $StudID = 0>><</link>>
-<<else>>
-	<<if $universalRulesImpregnation == "Stud" && $StudID == 0>>
-		<br><br>[[Stud|Subordinate Targeting][getSlave($AS).subTarget = -1, $StudID = $AS]]
-	<</if>>
-	<br><br>[[None|Subordinate Targeting][getSlave($AS).subTarget = 0]]
-	<br><br>__Select a slave for $him to submit to, sexually:__
-	<<includeDOM App.UI.SlaveList.slaveSelectionList(
-			s => s.devotion >= -20 && s.fuckdoll === 0 && V.AS !== s.ID &&
-				(!isAmputee(getSlave(V.AS)) || !isAmputee(s)),
-			(s) => App.UI.DOM.passageLink(SlaveFullName(s), 'Subordinate Targeting', () => { getSlave(V.AS).subTarget = s.ID; }),
-		)>>
-
-<</if>>