diff --git a/.eslintignore b/.eslintignore
index 1cfd403f0016c26b5641e8b7b8ad4342b4428ab3..91dc02378d3c8d5d9e80485d043bf58e9660b885 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -7,4 +7,4 @@
 **/optionsMacro.js
 temp.**
 **.temp
-**/001-lib
\ No newline at end of file
+**/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/CHANGELOG.md b/CHANGELOG.md
index ff4fa81c34490fcfa3c6c772510086b7351686a8..ca65acf61570b65fc0b8815298625e98bd8c6fc1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ 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
@@ -677,7 +679,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 ## 0.10.7.1-1.5.3 - 2019-01-05
 
 * fixes
-* more cleaning 
+* more cleaning
 * `!` appears when you can upgrade an FS now too
 
 ## 0.10.7.1-1.5.2 - 2019-01-03
@@ -1314,7 +1316,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * raised the price of implant related research to compensate
 * fixes
 
-
 ## 0.10.7.1-0.7.12
 
 * fixes
@@ -1954,7 +1955,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 * anon's quick find slave index ui
 
-## 0.10.7.1-0.1.89 
+## 0.10.7.1-0.1.89
+
 * fixes and code optimizations
 * some extra fuckable nipples content in RESS
 
@@ -2171,7 +2173,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * fixes
 * more code cleanup
 
-## 0.10.7.1-0.1.49 
+## 0.10.7.1-0.1.49
 
 * fixes and typos
 * split socks from shoes
@@ -2222,8 +2224,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * new means to add, remove, and locate slaves via index map
 
 ## 0.10.7.1-0.1.40
+
 * added Fuckdoll impregnation
-* preglocke's fSlaveSlaveVagConsumate cleanup and content addition
+* preglocke's fSlaveSlaveVagConsummate cleanup and content addition
 
 ## 0.10.7.1-0.1.39 - 2018-04-10
 
@@ -2469,22 +2472,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * minor fix to generateXYslave
 
 ## 0.10.7.1-0.1.0
-* fixes severe issues with customized slave trade 
+
+* fixes severe issues with customized slave trade
   * Requires backwards compatibility - no exceptions
 
 ## Pre 0.10.7.1
-```
+
+```txt
 0.10.7.0/1
 
 2018-03-22
 
-	407
+ 407
 * spelling fixes
 * decreased memory usage, apparently significantly
 * added setPregType(), but not implemented it yet
-	*Severe issues with customized slave trade. If you are not using it, DO NOT USE THIS VERSION.
+* Severe issues with customized slave trade. If you are not using it, DO NOT USE THIS VERSION.
 
-	406
+ 406
 * minor fixes
 * major fixes and overhauling to autosurgery and to the RA
 * backwards compatibility should no longer unset all your rules
@@ -2492,25 +2497,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-03-21
 
-	405
+ 405
 * various text fixes
 * fixes to csec bug
 
-	404
+ 404
 * numerous reported bugs fixed
 * also a few typos
 
 2018-03-20
 
-	403.1
+ 403.1
 * fixed all reported bugs and typos
 
-	403
+ 403
 * XX, XY, and XXY diets now properly handle boobs
 * minor fixes
 * pregmodder can not spell "receive" thus necessitating a sanityCheck entry
 
-	402
+ 402
 * SFanon's new trio of recruits
 * Pregmodfan's continued fixing and tweaking of his preg tracking system
 * lower back brand location
@@ -2518,27 +2523,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-03-19
 
-	401
+ 401
 * tweaked saLongTermEffects pregnancy setting
 * various little fixes
 * fixed missed closing '>' in neighborsFSAdoption
 
 2018-03-18
 
-	400
+ 400
 * added neighbor FS Incest Festishist
 * new JS functions (areRelated())
 * more fixes
 
 2018-03-17
 
-	399.2
+ 399.2
 * added missing impregnation checks to slave-slave impreg
 
-	399.1
+ 399.1
 * policy now sets properly
 
-	399
+ 399
 * added incest focus policy (pre-EgyptianRevivalist bonus)
 * SFanon's fixes and tweaks
 * pregmodfan's fixes to the autosurgery
@@ -2548,71 +2553,71 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-03-16
 
-	398
+ 398
 * fixed HG, BG, and HG's slave not showing up in endweek if you have no other slaves in the penthouse
 * various text fixes
 
 2018-03-15
 
-	397
+ 397
 * fixed broken nice nurse outfit belly description
 * game start player pregnancies should be initialized properly now
 
-	396
+ 396
 * fixes to PC cheat menu
 * continued work on belly descriptions
 * minor text fixes
 
 2018-03-14
 
-	395.1
+ 395.1
 * fixes hostage inheriting starting girls wombs
 
-	395
+ 395
 * unbroke fake belly clothing descriptions
 * fixed starting girls sometimes having piercings
 
 2018-03-12
 
-	394
+ 394
 * more fixes to pregnancy clearing
 
 2018-03-11
 
-	393
+ 393
 * Incursion specialist background
 * little fixes
 
-	392
+ 392
 * SFanon's PC cheat menu
 * fixes to sellSlave and slaveSold
 
 2018-03-10
 
-	391
+ 391
 * finished saChoosesOwnClothes rework
 * fixes
 
 2018-03-09
 
-	390
+ 390
 * SugarCube updated to 2.24.0
 * little text fixes
 * tweaks to personal attention "sex" to make use of available tits and dicks where appropriate and to not use virgin holes
 
-	389
+ 389
 * various git fixes (brothel implant ads, custom slave voice, SF tweaks)
 * stripped JS of all "Sugarcube.State"s leaving it as "State"
 
 2018-03-08
 
-	388
+ 388
 * fixed a very very unlikely case in sister identification
 * fixed some improper pregnancy sets in the dairy
 * fixed more improper preg sets in saLongTermEffects
 * barred random impreg in dairies with preg settings on
 
-	387
+ 387
 * tweaked saGuardsYou to actually count facility heads the BG has trained when it comes to counting successors
 * your BG now considers servants and your harem in her count
 * a race now no longer can be both superior and inferior
@@ -2620,7 +2625,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * reordered full royal court enslavement to circumvent a possible ghost in the machine situation
 * partial revert to scheduledEvent to handle SugarCube BS
 
-	386
+ 386
 * tweaked childgen to only random face and int for playerXmarked if the child is below the minimum value
 * migrated mindbroken kicker cases from slaveAssignmentsReport to saTakeClasses and saStayConfined
 * hyperpreg and overwhelmingly female hormone balances now prevent oversized breasts from shrinking
@@ -2628,20 +2633,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * fixed bad initialization
 * various little text corrections
 
-	385
+ 385
 * fixed itt noted errors
 * lowercasedonkey's tabbed slave overview (find it in options)
 * tweaks for potential issues in scheduled events
 
 2018-03-07
 
-	384
+ 384
 * various git merges
 * devoted virgin event
 
 2018-03-04
 
-	383
+ 383
 * Revamped vector art content
 * Edit neighbor cheats
 * various submitted fixes
@@ -2649,78 +2654,78 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 ????
 
-	382
+ 382
 * overhauled saChoosesOwnClothes (currently trapped on a powerless computer)
 
 2018-03-02
 
-	381
+ 381
 * ocular implants now get consumed on use
 * fixed minor text bugs
 
 2018-03-01
 
-	380
+ 380
 * addition gui support for jquery (git only for now)
 * crimeanon's secEx replenish all option and fixes
 
 2018-02-28
 
-	379
+ 379
 * more fixes to player birth
 
-	378
+ 378
 * fixed issues with mindbreak/Fuckdolls and corsets/heels
 * masochists now get off from extreme corsets and heels
 * fixes to trade show
 
 2018-02-27
 
-	377
+ 377
 * major fix to youth and maturity pref failing not clearing SMR, law and PA appearance
 
-	376
+ 376
 * pregmodfan's fixes to player pregnancy
 
-	375
+ 375
 * Sfanon's fixes and tweaks
 * some more robust catchers for NaN'd rep
 * pregmodfan's tweaking to saAgent
 * cleaned out all the new sanityCheck complaints
 
-	374
+ 374
 * fixed pregnancy desync in startingGirls
 
 2018-02-26
 
-	373
+ 373
 * raWidgets now will not complain about "please you"
 * fixed policies and PA tabs requiring cybermod
 * some code cleanup in RETS
 * removed a mysterious <<break>> in the neighbors FS selection
 
-	372
+ 372
 * more prodding to seBirthWidgets
 * sidebar reorganization
 
 2018-02-25
 
-	371
+ 371
 * cleaned up seBirthWidgets some more to bring in back in line with original intent
 * various little fixes
 
-	370
+ 370
 * various bug fixes
 * more stuff from SFanon
-	Agent pregnancy bug still in play.
+ Agent pregnancy bug still in play.
 
 2018-02-24
 
-	369
+ 369
 * fixes for pregmodfan's pregnancy tracking
 * SFanon's continued SF work
 
-	368
+ 368
 * added missing dairy broodmother birth
 * hacking skill allows you to pose as a medical expert to gain access to some of surgeon's starting bonuses
 * reduced hacking bonus to be in line with other bonuses
@@ -2729,117 +2734,117 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-02-23
 
-	367
+ 367
 * filled another braces exploit
 * SFanon's SF work
 
-	366
+ 366
 * more support from pregmodfan to his new system
 * fixes to the facility decoration bug
 * other fixes
 * added a new hpreg recruit (in cheatmode only as preg counts that high aren't handled yet)
 
-	365
+ 365
 * SFanon's player hacking skill (basic implementation)
-	Still more to come with it.
+ Still more to come with it.
 
 2018-02-22
 
-	364
+ 364
 * sidebar notification when you can start a new FS
 * pregmodfan's new pregnancy tracking system
 * fixes to players being unable to manage HG, BG, rec
 
 2018-02-21
 
-	363
+ 363
 * added labor suppressant feedback to BellyDescription
 * tweaked Mercenary Romeo to avoid mastersuite slaves and your wives if given the option.
 * further tweaked Mercenary Romeo to only fire off if you have a public slave or a slave that has seen lots of public duty. MB, FD and NG+ exclusions.
 
 2018-02-20
 
-	362
+ 362
 * added .pregWeek to the advanced cheat edit slave
 * added slow gestation feedback to PregnancyDescription
 * added labor suppressant feedback to PregnancyDescription
 * added speed gestation feedback to PregnancyDescription
-	BellyDescription may need additions as well for the trio.
+ BellyDescription may need additions as well for the trio.
 
 2018-02-19
 
-	361
+ 361
 * revised fertility goddess nicknames to favor nationality based ones before others
 
-	360
+ 360
 * added fertility goddess nickname type (needs more nicknames)
 * added head girl tastes for Repop focus
 
 2018-02-18
 
-	359
+ 359
 * neighbors can now have the same potential number of FS as you instead of a hardset 4
 * this also caps the rival
 
-	358
+ 358
 * attempted to plug braces exploit
 
-	357
+ 357
 * submitted fixes
 * use another slave to impregnate her now respects chastity properly
 
 2018-02-17
 
-	356
+ 356
 * minor fixes
 * minor fixes submitted via git
 * more additions and fixes to the revamped vector art (I also now know what it is called.)
 * added option to c-section a slave should you feel like it
 
-	355
+ 355
 * minor fixes and a major fix to personal attention
 * additional new vectors for the new embedded vector art
 
 2018-02-16
 
-	354
+ 354
 * preg biometrics collar now reports new mother status
 * preg biometrics collar reporting early pregnancy now pleases repopulationists
 * submitted text improvements
 
 2018-02-15
 
-	353
+ 353
 * slaves now experience a postpartum state post pregnancy
-	It takes four weeks normally to end and during which they suffer a percentage reduction to FResult that diminishes each week until their normal cycle begins anew.
+ It takes four weeks normally to end and during which they suffer a percentage reduction to FResult that diminishes each week until their normal cycle begins anew.
 
 2018-02-14
 
-	352
+ 352
 * unbroken slaves' devotion loss due to knocking you up now increases in severity the more times it happens
 * fixed minor text issues
 * spellchecked the patch notes this time
 
-	351
+ 351
 * minor text fixes
 * slaver background now starts with discounted starting girls
 
-	350
+ 350
 * player pregnancy postpartum state active
 
-	349
+ 349
 * minor text fixes
 
 2018-02-13
 
-	348.1
+ 348.1
 * added missing "tails" vector
 
-	348
+ 348
 * anon's new unembedded hair vectors
 * some code condensing from fcanon
 
-	347
+ 347
 * untangled dispensary text
 * fixed some spelling issues and duplicate words
 * backend work for postpartum players
@@ -2847,125 +2852,125 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-02-12
 
-	346
+ 346
 * fixed new fertile ovaries organ
 * fixed bad <<FSChange>>
 
-	345
+ 345
 * now menopause reversal won't clear pregnancies
 
-	344
+ 344
 * fixed several text issues
 * added menopause reversal
 
-	343
+ 343
 * fixed missed closing ifs in seBirth
 * fixed mishandled rude title in fearful balls event
 
-	342
+ 342
 * FCanon's big ass patch
 * numerous bug fixes and optimizations
 
 2018-02-11
 
-	341
+ 341
 * broodmother shutdown added
 
-	340
+ 340
 * implemented broodmother shutdown variable
 * fixed HG + slave display on the arcology layout
 * fixed issues with the old-style UI
 * various little fixes
 
-	339
+ 339
 * FCanon's fixes
 * fixed some display issues involving $PC.customTitle
 
 2018-02-10
 
-	338
+ 338
 * various little text fixes
 * SugarCube updated to 2.23.5
 
-	337
+ 337
 * fcanon's RA assignment fixes
 
-	336
+ 336
 * finished cleaning birthWidgets and making sure clothing birth accommodates broodmothers
 
 2018-02-09
 
-	335
+ 335
 * fixed attackReport. Not going to ask how it ended up like that in the first place.
 * fixed dairy assigning ignoring facility caps
 
 2018-02-08
 
-	334
+ 334
 * fixed potential bad ages in two slave recruit events
 * various minor tweaks
 * birthWidgets cleaning
 
 2018-02-06
 
-	333.1
+ 333.1
 * removing the broodmother implant now actually does what it is supposed to
 
-	333
+ 333
 * phase 6 completed (broodmother type 1)
 * typo corrections
 
-	332
+ 332
 * minor sanityCheck fixes
 
 2018-02-05
 
-	331
+ 331
 * phase 6 work (all broodmother births completed)
 * various little submitted fixes and tweaks
 * FCanon's ra fixes
 
 2018-02-04
 
-	330
+ 330
 * fixed reappearing peacekeepers
 * phase 6 work
 
 2018-02-02
 
-	329
+ 329
 * fixed degrading names
 
-	328
+ 328
 * fixed reNickname and slaveSold
 
-	327
+ 327
 * various code cleanup
 * tweaks to agents
 * fixed grammatical issues involving luxurious hair
 * pregmodfan's nickname fixes and other fixes
 * phase 6 work
 
-	326
+ 326
 * SugarCube updated to 2.23.4
 
-	325
+ 325
 * reduced concentration of string implant malus
 * fixes to saAgent's fake belly removal
 * fixed permanent makeup text duplication
 * various minor text corrections
 * phase 6 work
 
-	324
+ 324
 * added saAgent
-	Some physical Agent stats are now tracked week to week.
+ Some physical Agent stats are now tracked week to week.
 
-	323
+ 323
 * fixed hidden headgirls
 
 2018-02-01
 
-	322
+ 322
 * fixed missed rep increase in strip club closing
 * removed excess "the"s
 * fcanon's agent work
@@ -2974,84 +2979,84 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-01-31
 
-	321
+ 321
 * added Faraen's vector art
 
-	320
+ 320
 * fix to assignWidgets not properly handling facility head assignment
 
-	319
+ 319
 * anon's master slaver multislave personal training
 * fixes
 
 2018-01-30
 
-	318.1
+ 318.1
 * critical fix to PMODinit bug
 
-	318
+ 318
 * fixed errant ".lightyellow;"
 * fixed nonlethal pit bug
 
-	317
+ 317
 * fixed virginity ignoring in saRules
 * fixed lack of virginity taking warning in RESS
 * fixed the barracks getting really confused about the number of mercs fucking slaves in it
 * anon's corp tweaks
 * re-initialized phase 6
 
-	316.2
+ 316.2
 * fixed bad string in FS acquisition
 
-	316.1
+ 316.1
 * better fix to race issue in sup FS acquisition
 
-	316
+ 316
 * partial fix to race issue in sup FS acquisition
 
-	315
+ 315
 * fixes to assayWidgets (beauty)
 
-	314
+ 314
 * fixed bad cashFormat() argument in costReport
 * fixed missed ) in saRecruitGirls
 * initialized phase 6
 
 2018-01-29
 
-	313
+ 313
 * fixed bad cashFormat()
 
-	312
+ 312
 * phase 5 completed (hyperpregnancy)
 * minor fixes
 * anon's $PC.trading tweaks to the corp
 * fixed the possibility of use counts going negative in glory holes
 
-	311
+ 311
 * anon's labReport fix
 
-	310
+ 310
 * crimeanon's fixes
 * anon's continued tweaking
 * fixed hostages sometimes showing up when they weren't supposed to be
 * fixed various little typos and errors
 
-	309
+ 309
 * various small fixes
 
-	308
+ 308
 * Sugarcube updated to 2.23.1
 
 2018-01-28
 
-	307
+ 307
 * various submitted text corrections
 
-	306
+ 306
 * fixed missed && in SpecialForceUpgradeOptions
 
-	305
+ 305
 * fixed issues with orphanage recruits
 * small text fixes
 * fixed mistargeted spans in custom slave
@@ -3061,84 +3066,84 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * anon's economy tweaks
 * crimeanon's fixes
 
-	304
+ 304
 * anon's tweaks
 * removed leftover code from RESS
 
-	303
+ 303
 * anon's corp tweaks
 
-	302
+ 302
 * fixed missing span in JFC
 
-	301
+ 301
 * anon's corp tweaks
 
 2018-01-27
 
-	300
+ 300
 * anon's corp tweaks
 * fixed the upgraded dispensary giving 50% off the reduced value instead of the original
 
-	299.2
+ 299.2
 * and now they are nuns and priests
 
-	299.1
+ 299.1
 * clergy capture slaves are now virgins
 
-	299
+ 299
 * converted anon's submitted clergy capture event into the second Chattel Religionist FS acquisition event
 * SFanon's fixes and tweaks
 * phase 4 work
 * fixed the dispensary giving 75% off instead of 25% off
 
-	298
+ 298
 * fixed the flesh heap only giving amps if $seeExtreme was off
 
-	297
+ 297
 * fixed minor bug in JFC
 
 2018-01-26
 
-	296
+ 296
 * SFanon's job fulfillment center slave market
 * anon's various fixes and tweaks
 
-	295
+ 295
 * starting girls can now be set to mindbroken
 * fixed some age bugs in reRecruit
 
 2018-01-25
 
-	294
+ 294
 * consolidated player asset descriptions
 * femPC can now officially be flat
 
-	293
+ 293
 * added a see pregnancy toggle to game options
 * crimeanon's secEx fixes
 
 2018-01-24
 
-	292
+ 292
 * continued implementation of $seePreg
 
-	291
+ 291
 * partial implementation of $seePreg
 
 2018-01-23
 
-	290
+ 290
 * small tweaks to FResult
 * fixed minor bugs
 * initialized .nipplesAccessory and $seePreg
 
 2018-01-22
 
-	289
+ 289
 * anon's continued tweaking
 
-	288
+ 288
 * SFanon's fixes to SFMBarracks
 * phase 4 work
 * XY ads now check for a dick instead of the lack of a vagina
@@ -3147,30 +3152,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-01-21
 
-	287
+ 287
 * anon's continued tweaks
 * fixed reversed degradationist check in new slave intro
 * cleaned up chattel religionist's clothing choices in saLongTermEvents
 
-	286
+ 286
 * minor fixes
 * anon's income tweaks
 * anon's vignettes
 
 2018-01-19
 
-	285
+ 285
 * SFanon's fixes
 
-	284
+ 284
 * fixed advertising issues regarding implants
 * fixed minor text issues
 
-	283
+ 283
 * fixed reversed futanari sisters career effects
 * minor text fixes
 
-	282
+ 282
 * Crimeanon's tweaks
 * SFanon's tweaks and SF cheat edit
 * minor fixes
@@ -3179,76 +3184,76 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-01-18
 
-	281
+ 281
 * fixed introSummary breast setting
 * fixed an oversight in authorityReport
 
 2018-01-17
 
-	280
+ 280
 * fixed multitude of problems brought in with v278
 
-	279
+ 279
 * fixed severe issue with "work as a servant"
 
-	278
+ 278
 * variety of contributed fixes and corrections
 
 2018-01-16
 
-	277
+ 277
 * fixed minor display issues
 * fixed potential $rep cause in involving SF's Colonel (or fucked up the check and made it worse)
 * added .ovaryAge to the cheat edit slaves
 
 2018-01-15
 
-	276
+ 276
 * fixed improper belly size unsetting in saInflation
 * slave on slave feeding now properly clears its variable
 * increased cost reduction of servant's quarters
 * added more mindbroken checks to cull inappropriate emotion
 
-	275
+ 275
 * various overlooked mindbreak checks added
 * phase 4 work
 
 2018-01-14
 
-	274
+ 274
 * fixed broken saWhore vignette
 * tweaked how sex counts work in the schoolroom
 
-	273
+ 273
 * fixed minor display bugs
 * warded against odd .burst hostage inheritance
 
 2018-01-13
 
-	272
+ 272
 * fixes to saRecruitGirls
 
-	271
+ 271
 * many new incest two slave recruit combinations
 * small fixes
 
 2018-01-12
 
-	270
+ 270
 * fixed bad RESS choice
 * tweaked puberty events
 
-	269
+ 269
 * servants can now qualify for a reduced selection of random events
-	They are always around, after all.
+ They are always around, after all.
 
-	268
+ 268
 * fixes to policies and master suite
 
-	267
+ 267
 * fixed age ads getting set to 0 when they shouldn't be
 
-	266
+ 266
 * Gutted random event selection and recoded it as JS
 * Crimeanon's fixes
 * SFanon's fixes
@@ -3256,286 +3261,286 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2018-01-10
 
-	265
+ 265
 * fVagina fixes
 * SFanon's cleaning
 
-	264
+ 264
 * allowed master suite slaves into RESS eligibility
 
-	263
+ 263
 * The rest of SFanon's fixes
 * minor corrections
 * fixed a number of ".SlaveName"s
 
-	262
+ 262
 * SFanon's fixes and policy cleanup
 
-	261
+ 261
 * small fixes
 * secEx fixes
 
 2018-01-09
 
-	260
+ 260
 * fixes to advertising
 
-	259.2
+ 259.2
 * fixed fVagina, again
 
-	259.1
+ 259.1
 * fixed fVagina
 
-	259
+ 259
 * fixes
 * phase 4 work
 * anons FCTV channel and story
 
 2018-01-06
 
-	258
+ 258
 * fixes
 * phase 4 work
 * backwards compatibility fixes for vanilla to pregmod saves
 
 2018-01-06
 
-	257
+ 257
 * fixes
 * phase 4 work
 * personal attention now respects chastity better
 
-	256
+ 256
 * Fully established eugenics is now abandonable after you've dealt with the uppity SE.
 * Corncobman's brothel/club advertisement and code tweaks
 * SFanon's fixes
 
 2018-01-04
 
-	255
+ 255
 * fixed reBoomerang bad variables
 
-	254
+ 254
 * minor typo corrections
 
-	253
+ 253
 * more minor fixes
 
-	252
+ 252
 * SFanon's cleaned up introSummary
 * fixed numerous zeroed stats in export slave
 * gave most ddDatabase slaves scrotums
 
-	251
+ 251
 * tweaked milking arcades to delay slave rotations somewhat (they'll stay healthier longer, but still will eventually require a recovery period)
 * minor fixes
 
 2018-01-03
 
-	250
+ 250
 * SFanon's stuff
 * minor fixes
 
 2018-01-02
 
-	249
+ 249
 * Sugarcube updated to 2.22.0
 * fixed lip implants vs natural lips TF check being wrong
 * other small fixes
 
 2018-01-01
 
-	248
+ 248
 * minor fixes
 
-	247
+ 247
 * fixed vaginal use incrementing the anal total in the arcade
 
 2017-12-31
 
-	246
+ 246
 * fixes
-	Fixes include $failedElite not clearing on ng+, excessive oral use and issues with serve you other slaves.
+ Fixes include $failedElite not clearing on ng+, excessive oral use and issues with serve you other slaves.
 
 2017-12-30
 
-	245
+ 245
 * finished .need fixing
 * saServeYouOtherSlaves work
 * minor fixes
 
-	244
+ 244
 * added stamina pills for player consumption
 
 2017-12-29
 
-	243
+ 243
 * fixed subordinate slave setting
 
-	242
+ 242
 * anon's new family tree display (not yet implemented in startingGirls, so don't freak out)
 * various little tweaks
 
-	241
+ 241
 * fixed bad variable in costs JS
 * fixed unclosed set in endWeek
 
-	240
+ 240
 * living rules cost optimization
 * code cleanup
 * fixed minor bugs involving the BG's room
 
 2017-12-28
 
-	239
+ 239
 * fixed reputation bug
 * fixed secBarracks bugs
 
-	238
+ 238
 * fixed slave summary bug
 
-	237
+ 237
 * fixes to eugenics bad end
 * SFanons tweaks fixes and content
 * at least one slave in subordinate targeting must have limbs
 
 2017-12-27
 
-	236
+ 236
 * fixes
-	RA XXY diets, scalemail bikini errors, bad engineering training and straps/latex showing up inappropriately in the vector art.
+ RA XXY diets, scalemail bikini errors, bad engineering training and straps/latex showing up inappropriately in the vector art.
 
-	235
+ 235
 * saRules now applies to the HG's slave
 * HG and BG no longer consume dormitory capacity if they have their own room
 * SFanon's fixes
 
 2017-12-26
 
-	234
+ 234
 * SFanon's fixes and numbers commaing
 
-	233
+ 233
 * fixes
 
-	232
+ 232
 * saRules now applies to the master suite
 * various little text fixes
 
 2017-12-25
 
-	231
+ 231
 * saRules now applies fully to the dairy
 
-	230.2
+ 230.2
 * minor elseif if catch in saPleaseYou
 
 2017-12-24
 
-	230.1
+ 230.1
 * quick revert to lastEyeSurgery()
 
-	230
+ 230
 * fixed eyes autosurgery?
 
-	229
+ 229
 * fixes
 * QoL changes to unit management in secEx
-	Fixes include the swan song follow-up never happening, RA getting too controlling about fertility drugs and incorrectly displayed training costs.
+* Fixes include the swan song follow-up never happening, RA getting too controlling about fertility drugs and incorrectly displayed training costs.
 
-	228
+ 228
 * code improvements
 * SFanon's player skill stuff
 
 2017-12-23
 
-	227
+ 227
 * various text fixes
 
-	226
+ 226
 * fix for removeActiveSlave incubator quirks
 
-	225
+ 225
 * SFanon's fixes
 * Milkmaid saRules
 
-	224
+ 224
 * SFanon's fixes
 * a bunch of lisping tweaks
 
 2017-12-22
 
-	223
+ 223
 * SFanon's stuff (mostly comma'd numbers)
 
-	222
+ 222
 * SFanon's stuff
 
-	221
+ 221
 * fixed servants quarters bugs
 
 2017-12-21
 
-	220
+ 220
 * saRules now applies to the servants quarters
 * fixes
-	Fixed an issue with reMalefactor displaying the wrong text block.
+* Fixed an issue with reMalefactor displaying the wrong text block.
 
-	219
+ 219
 * fixes
-	More cache clearing, fixes to reBoomerang preg setters and a typo in raWidgets causing trouble.
+* More cache clearing, fixes to reBoomerang preg setters and a typo in raWidgets causing trouble.
 
 2017-12-20
 
-	218
+ 218
 * SFanon's tweaks
 
-	217
+ 217
 * fixed sex count NaN in saRules-schoolroom
 * tweaked childgen to use current father name
 
 2017-12-19
 
-	216
+ 216
 * saRules now applies to the schoolroom
 * fixes
 
 2017-12-18
 
-	215
+ 215
 * fixed brothel devotion oddities
 * adjusted arcology sector demand
 * optional comma'd numbers
-	Every purchase and selling of an arcology sector will now make the next more expensive. Selling one increases it more than buying one, so while it may bring in quick money will make it more difficult to reacquire.
+* Every purchase and selling of an arcology sector will now make the next more expensive. Selling one increases it more than buying one, so while it may bring in quick money will make it more difficult to reacquire.
 
-	214
+ 214
 * saRules now applies to the spa
-	Also fixed luxury rules being retained when removed from certain facilities. Those will now default to "normal".
+ Also fixed luxury rules being retained when removed from certain facilities. Those will now default to "normal".
 
 2017-12-17
 
-	213
+ 213
 * lots of spelling corrections
 * fixes
 
-	212
+ 212
 * fixes
 * new outcome for reRebels
 
 2017-12-16
 
-	211
+ 211
 * fixes
 
-	210
+ 210
 * fixed "psychosupresants"
 
-	209
+ 209
 * minor fixes
 
 2017-12-15
 
-	208
+ 208
 * saRules now applies to the cellblock
 * new cellblock setting to forbid your wardeness from cumming inside your prisoners
 * git contributed fixes
@@ -3543,246 +3548,246 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-12-13
 
-	207
+ 207
 * git contributed code simplification and fixes
 
-	206
+ 206
 * git contributed fixes
 
 2017-12-12
 
-	205
+ 205
 * git contributed fixes and muscle range expansion to custom slave/starting girls
 
-	204
+ 204
 * saRules now applies to the clinic
 
-	203
+ 203
 * fixed bad if in saRules
 
-	202
+ 202
 * fixes
 
 2017-12-11
 
-	201
+ 201
 * SFanons stuff
 
-	200
+ 200
 * saRules now applies to the club
 
-	199
+ 199
 * fixes
 
-	198
+ 198
 * fixes
 * saRules now applies to the brothel
 
 2017-12-10
 
-	197
+ 197
 * anon's tweaks
-	Mostly little cheat edit tweaks to secEx.
+ Mostly little cheat edit tweaks to secEx.
 
-	196
+ 196
 * fixes
 * saRules tinkering
 
 2017-12-09
 
-	195.1
-	Should fix >>149556
+ 195.1
+ Should fix >>149556
 
-	195
+ 195
 * fixes
 * saRules tinkering
 
-	194.1
+ 194.1
 * same fix as >>149491 (Broken pharmaceutical fabricator purchase option)
 
-	194
+ 194
 * SFanon's passive PC skill gaining
 * anon's various additions and corrections
 * fixes
 
 2017-12-08
 
-	193
+ 193
 * fixes
 
-	192
+ 192
 * anon's leadership slave skills
 * fixes
 
 2017-12-06
 
-	191
+ 191
 * SFanon's fixes
 * Crimeanon's fixes
 
-	190
+ 190
 * SFanon's fixes
 
-	189
+ 189
 * fixes and tweaks
 
-	188
+ 188
 * fixes
 * SFanon's fixes
 * secEx tweaks
 
 2017-12-05
 
-	187
+ 187
 * fixes
 * SFanon's fixes
 
-	186
+ 186
 * fixes
 * SFanon's stuff
 
-	185
+ 185
 * fixed <<m>>
 
-	184
+ 184
 * tweaks to pregnancy breast growth
 * pregnancy overhaul phase 3 (belly implants) completed
 
-	183
+ 183
 * SugarCube 2.21.0
 * continued bellyImplant work
 
 2017-12-04
 
-	182
+ 182
 * fixes
 
-	181
+ 181
 * fixes
 * reduced value of milk and cum
 * continued bellyImplant work
 
-	180
+ 180
 * fixes
 
-	179
+ 179
 * fixes
 * FSanon's custom slave voice options
 * continued bellyImplant work
 
 2017-12-03
 
-	178
+ 178
 * fixes
 
 2017-12-02
 
-	177
+ 177
 * fixes
 
-	176
+ 176
 * fixed bugs
 
-	175
+ 175
 * added anon's siren song part 2
 * fixes
 * added tracking to ng+ slaves to keep them from stealing the spotlight in certain current game events
 
-	174
+ 174
 * added SFanon's eye and hair autosurgery settings
 
-	173
+ 173
 * The Hippolyta Academy added
 * fixes
 
 2017-12-01
 
-	172
+ 172
 * SFanon's stuff
 * anon's slave self impregnation
 * fixes
 
-	171
+ 171
 * fixed .pregSource not handling ng+
 * tweaked childgen
 
 2017-11-30
 
-	170
+ 170
 * added vector art anon's bushy pits
 * tweaked childgen
 
-	169
+ 169
 * SFanon's fixes
 * Doubled non size related bonuses in GR's big butt policy for slimness societies to offset the negative of big butts
 
 2017-11-29
 
-	168
+ 168
 * disabled broken vector
 * escorts now have a slight edge when it comes to teaching slaves sex skills
 
-	167
+ 167
 * SecEx battle prestige
 
-	166
+ 166
 * fixes
 * some minor tweaks
 
-	165
+ 165
 * fixes
 * dairy entry tweaks
 * color tweaking
 
 2017-11-28
 
-	164
+ 164
 * fixes
 * continued color wars
 
-	163
+ 163
 * minor fixes
 * color standardization/what the fuck does this color even mean?
 
-	162
+ 162
 * fixes
 * SFanon's fixes
 * Crimeanon's fixes
 
 2017-11-27
 
-	161
+ 161
 * fixed custom slaves making all slaves their race
 
-	160
+ 160
 * fixed reRecruit
 
-	159
+ 159
 * fixed bugs
 * added a policy for open slave dick use
 
 2017-11-26
 
-	158
+ 158
 * fixed lactation implant dairy setting bug
 
-	157
+ 157
 * added rumor reduction to reputation policies SecEx:
 * discounts for applicable PC experience
 * cyber upgrade for units
 
 2017-11-25
 
-	156
+ 156
 * SFanon's fixes and tweaks
 
-	155
+ 155
 * fixed princes
 
-	154
+ 154
 * fixed FCTV channels 12 and 13 not showing reruns should they run out of content
 
-	153
+ 153
 * Security Expansion mod officially added
 * finished phase 2 of the pregnancy overhaul (inflation overhaul)
 * added the option to not implant cattle for lactation implants to the dairy
@@ -3790,12 +3795,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-11-23
 
-	152
+ 152
 * fixes
 * changes to whoring/slutting/hole need
 * continued inflation work
 
-	151
+ 151
 * fixes
 * tweaks to BP and TF in regards to extreme facial surgery and race alteration
 * continued inflation changes
@@ -3803,26 +3808,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-11-21
 
-	150
+ 150
 * tweaks
 
-	149
+ 149
 * custom slave overhaul
 
 2017-11-20
 
-	148
+ 148
 * added settings to enable/disable lactation implants in flat slaves
 
-	147
+ 147
 * fix
 
-	146
+ 146
 * fixes
 * dairy now only increases breasts in lactating slaves and the stimulators increase cum output
 
 
-	145
+ 145
 * fixes
 * new SJW recruit
 * dairy slaves will only receive lactation implants if they have no dick, have breasts larger than flat, or are already lactating naturally.
@@ -3830,53 +3835,53 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-11-19
 
-	144
+ 144
 * The daughters of liberty now require combatants to pass a physical before deployment (the captures will be in a more reasonable fighting shape)
 
-	143
+ 143
 * SFanon's stuff
 
-	142
+ 142
 * fixes
 
-	141
+ 141
 * completed new vanilla country additions
 * fixes
 
 2017-11-18
 
-	140
+ 140
 * fixes
 * SFanon's stuff
 
-	139
+ 139
 * fixes
 
-	138
+ 138
 * fixes
 * SFanon's stuff
 
 2017-11-17
 
-	137
+ 137
 * fixes
 * began inflation rework stage of pregnancy overhaul (phase 2)
 
 2017-11-16
 
-	136
+ 136
 * fixes
 * RESSTR cleaning completed
 
-	135
+ 135
 * fix to RA drug reduction targets not subtracting implants
 
-	134
+ 134
 * major revisions to how temporarily removed slaves are handled
 
 2017-11-15
 
-	133
+ 133
 * major fixes to temporarily removed slaves
 * fixes
 * removed restrictions on hormone blockers
@@ -3885,33 +3890,33 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-11-14
 
-	132
+ 132
 * fix
 
-	131
+ 131
 * fixes
 * Completed RESS cleanup
 
-	130
+ 130
 * fixed the free range dairy assignment scene
 * SFanon's stuff
 
 2017-11-13
 
-	129.1
+ 129.1
 * more fixes
 
-	129
+ 129
 * fixes
 
-	128
+ 128
 * anon's scalemail bikini
 * fixes
 
-	127
+ 127
 * fixed fFeet
 
-	126
+ 126
 * fixes
 * major oversight corrections
 * added short stories to FCTV
@@ -3919,243 +3924,243 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-11-12
 
-	125
+ 125
 * fixes
 * RESS work
 
-	124
+ 124
 * fixes
 * dairy diet changes
 
-	123
+ 123
 * some fixes
 * more RESS work
 
 2017-11-11
 
-	122
+ 122
 * fixes
 * very bushy pubes
 
-	121
+ 121
 * fixed >>140790 (<> in the DefaultRules widget is missing a $)
 
-	120
+ 120
 * fixed bugs
 * removed deprecated "be your recruiter"
 * more RESS stuff
 
 2017-11-09
 
-	119
+ 119
 * fixes
 
-	118
+ 118
 * fixes
 
 2017-11-08
 
-	117
+ 117
 * fixes
 
-	116
+ 116
 * tweaked supremacist and subjugationist beauty and FResults
 * fixes
 * more RESS work
 
-	115
+ 115
 * fixes
 * more RESS work
 
 2017-11-07
 
-	114.1
+ 114.1
 * fixed >>139762
 
-	114
+ 114
 * fixed bugs
 * capped devotion gained from max trust to prevent unruly slaves from suddenly loving you
 * more RESS work
 
 2017-11-06
 
-	113
+ 113
 * fixes
 * added isItemAccessible() to handle those obnoxious checks for FS and purchased items
 
 2017-11-05
 
-	112
+ 112
 * fixed bugs
 * tweaked choosing own clothes a little
 
 2017-11-04
 
-	111
+ 111
 * fixes
 
 2017-11-03
 
-	110
-	--fixes
+ 110
+ --fixes
 * vanilla cleanings
 * continued RESS work
 
 2017-11-01
 
-	109
+ 109
 * fixed >>137381 (mutinery attempt - Cannot read property 'nationality of undefined)
 
-	108
+ 108
 * fixed self pregnancy confusing childgen
 
-	107
+ 107
 * fixed reported bugs and family quirks
 
 2017-10-31
 
-	106
+ 106
 * RESS work
 * hormone blockers now block erections
 
-	105
+ 105
 * converted the applicable .hormone calls to use .hormoneBalance
 * added hormone blockers to restrict hormone effects and speed normalization while used
 
 2017-10-30
 
-	104
+ 104
 * fixes
 
-	103
+ 103
 * hormones rework
 * fixes
 
 2017-10-28
 
-	102
+ 102
 * fixes
 
-	101
+ 101
 * fixes
 * Milkanon's channel is live in FCTV
 
-	100
+ 100
 * fixes
 * fFeet overhaul
 * fFeet moved out of cheatmode
 
 2017-10-27
-	99
+ 99
 * fixed various bugs
 
-	98
+ 98
 * fixes
 
 2017-10-26
 
-	97
+ 97
 * fixes
 
-	96
+ 96
 * stuffedanon's fixes
 
 2017-10-25
 
-	95
+ 95
 * added masturbation only release rule
 * fixes
 
 2017-10-24
 
-	94
+ 94
 * fixes
 * vanilla tweaks
 * nationality presets now use weighted arrays (except the big one, haven't gotten it done yet)
 * eugenics bad end rework
 
-	93
+ 93
 * fixes
 
 2017-10-23
 
-	92
+ 92
 * bunch of vanilla stuff since I raided the waiting vanilla pull requests
 * fixes
 
-	91
+ 91
 * fixes
 * user submitted QoL improvements
 
 2017-10-22
 
-	90
+ 90
 * added >>135219 (Economy widget/spreadsheet fix for case when variables are somehow not initialized but the sheet is being displayed anyway)
 
-	89
+ 89
 * fixed reAWOL
 
-	88
+ 88
 * SFanon's work
 
-	87
+ 87
 * minor fixes
 
-	86
+ 86
 * minor fixes
 
-	85
+ 85
 * SFanon's stuff
 
 2017-10-21
 
-	84
+ 84
 * number of bugfixes
 
 
 2017-10-20
 
-	83
+ 83
 * fixed bugs
 
 2017-10-19
 
-	82
+ 82
 * anon's economy reports
 * continued RESS work
 
-	81
+ 81
 * SFanon's fix
 * minor fixes
 
 2017-10-17
 
-	80
+ 80
 * fixed "desperate birth" more
 
-	79.1
+ 79.1
 * more grammar fixes to reRecruit that failed to slip into v79
 
-	79
+ 79
 * fixes (sans multi organ implant quirks)
 * SFanon's stuff
 * attempted to extend custom tattoos
 
-	78
+ 78
 * fixes
 * anon's multiple organ growth and implantation
 
 2017-10-16
 
-	77
+ 77
 * fixed reported bugs
 
 2017-10-15
 
-	76
+ 76
 * fixed puberty setting with implanted organs
 
-	75
+ 75
 * SFanon's stuff
 * anon's organ farm support for the incubation facility
 * more RESS work
@@ -4163,1178 +4168,1178 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-10-14
 
-	74
+ 74
 * fixes
 
 2017-10-13
 
-	73
+ 73
 * SFanon's stuff
 
-	72
+ 72
 * fixes
 
 2017-10-10
 
-	71
+ 71
 * fixes
 * more RESS work
 * added oversized sex toys to the list of accessories the RA can manage
 
-	70
+ 70
 * fixed reported bugs
 
-	69
+ 69
 * SFanon's fixes
 
-	68
+ 68
 * fixed the giant robot upgrade prompt occurring prematurely
 
-	67
+ 67
 * fixed reported bugs
 
-	66
+ 66
 * fixes
 * dispensary prettying by SecurityExpansion anon
 * Massively cleaned up SFMBarracks
 
 2017-10-09
 
-	65
+ 65
 * fixed my passage fuckup
 
-	64
+ 64
 * fixed bug?
 
-	63
+ 63
 * fixed bugs?
 
-	62
+ 62
 * fixed reported bugs
 * SFanon's continued work
 * more RESS work
 
 2017-10-08
 
-	61
+ 61
 * added "anti-aging cream", "growth stimulants", "sag-B-gone", "male hormone injections", and "female hormone injections" to drugs the RA can manage
 
-	60
+ 60
 * SFanon's SF stuff
 
 2017-10-07
 
-	59
+ 59
 * fixes
 
 2017-10-06
 
-	58
+ 58
 * fixed >>131078
 
 2017-10-05
 
-	57
+ 57
 * fixed >>130781 >>130783
 
-	56
+ 56
 * tweaked childgen intelligence loss and facial beauty loss due to inbreeding (lessened chances for both, degree for beauty)
 * SFanon's corporation fixes
 
-	55
+ 55
 * SFanon's BC fixes
 
 2017-10-04
 
-	54
+ 54
 * SFanon's stuff
 
 2017-10-02
 
-	53
+ 53
 * assorted fixes
 * continued RESS work
 
 2017-10-01
 
-	52
+ 52
 * fixed reported problems
 * arcade will no longer convert slaves sentenced to it into Fuckdolls
 
-	51
+ 51
 * added SFanon's merge request
 
 2017-09-30
 
-	50
+ 50
 * fixed creating SF event
 
-	49
+ 49
 * fixed, MILF tourist event and decline politely.
 * pregmodfan's continued RA tweaking
 
 2017-09-29
 
-	48
+ 48
 * fixed, SFMBarracks.tw has two extra closing ifs, Lines 328 and 374.
 
-	47
+ 47
 * fixed bugs
 * SFanon's continued SF work
 
 2017-09-28
 
-	46
+ 46
 * pregmodfan's RA tweaking
 
-	45
+ 45
 * fixes
 * RESS work
 
-	44
+ 44
 * fixes
 
-	43
+ 43
 * fixes
 * pregmodfan's continued RA tweaking
 
 2017-09-27
 
-	42
+ 42
 * various fixes
 
 2017-09-26
 
-	41
+ 41
 * small fixes
 
-	40
+ 40
 * fixes for everything but the RA quirks
 
-	39
+ 39
 * fixed reported bugs
 
 2017-09-25
 
-	38
+ 38
 * Pregmodfan's RA tweaks
 * Removed maximum rules counter (replaced with warning if more then 10 rules used).
 * Rules now can be selected randomly from list, not only chain go to for next/previous
 * belly size condition (for .belly ).
 * Groups of links controls for growth drugs now working without page reload after any click - so it's much more comfortable to use now.
 
-	37
+ 37
 * catches for (a slave been born mindbroken if their mother is) and (anal virgin enjoying anal)
 
-	36
+ 36
 * fixes the pussy option during the cellbock's sleep deprivation event.
 
 2017-09-24
 
-	35
+ 35
 * fixes
 * all RESS intros cleaned up and added to
 
-	34
+ 34
 * fixed bugs
 * added spats to the RA
 * enabled "frightening dick" event
 
 2017-09-23
 
-	33
+ 33
 * fixes
 * typos corrections
 
-	32
+ 32
 * fixed bugs
 
-	31
+ 31
 * fixes
 
-	30
+ 30
 * fixes
 * SFanon's stuff
 
-	29
+ 29
 * fixes
 * slaves can now lisp the word "access"
 
 2017-09-22
 
-	28
+ 28
 * SFanon's stuff
 * fixes
 
-	27
+ 27
 * minor fixes
 * tweaks to bed reporting
 
-	26
+ 26
 * fixed price not showing up in the airlift in slavery option
 
 2017-09-21
 
-	25
+ 25
 * SFanon's stuff
 * minor fixes
 
-	24
+ 24
 * fixed bellyAdjective()
 * fixed some typos
 
-	22/2023
+ 22/2023
 * SFanon's stuff
 
-	21
+ 21
 * user submitted stuff
 
 2017-09-20
 
-	20
+ 20
 * fixes
 
-	19
+ 19
 * fixed bugs
 
 2017-09-19
 
-	18
+ 18
 * fixed >>125249
 
-	17
+ 17
 * fixed the slave shelter bug
 
-	16
+ 16
 * fixes
 * cleanup and added clit rape into fSlaveSlavedick
 
 2017-09-18
-	15
+ 15
 * added a catch to prevent >>124979
 * added custom lenses to add custom description
 
 2017-09-17
 
-	14
+ 14
 * fixed bugs
 
-	13
+ 13
 * fixed SFBarracks
 * the second half of anon's spats
 
-	12
+ 12
 * fixes
 * SFanon's SFBarracks stuff
 * vanilla title changes
 
 2017-09-16
 
-	11
+ 11
 * fixes
 * anon's spats and t-shirt clothing
 
-	10
+ 10
 * fixes
 
 2017-09-15
 
-	9
+ 9
 * fixed >>124399
 * added anon's option to buy both the princess and queen
 
 2017-09-14
 
-	8
+ 8
 * minor fixes
 
-	7
+ 7
 * fixed >>124177
 
-	6
+ 6
 * fixes
 
-	5
+ 5
 * RETS overhaul
 
-	4
+ 4
 * vanilla fixes
 * bug fixes
 
 2017-09-13
 
-	3
+ 3
 * added details for some of the new vanilla nationalities
 * tweaked .need generation
 
-	2
+ 2
 * fixed >>123773
 
-	0.10.7.0
+ 0.10.7.0
 * vanilla stuff
 * bugfixes
 
 2017-09-12
 
-	118
+ 118
 * fixed reported bugs
 
-	117
+ 117
 * fixed >>123580
 
-	116
+ 116
 * backwards compatibility now properly sets .birthWeek
 
-	115
+ 115
 * pregmodfan's RA fixes
 
-	114
+ 114
 * vanilla update
-	To sum it up: You can now influence neighbors with your recruiter and your slaves now have sexual needs that must be handled or they'll get moody. Also changes to starting girls prices to smack those who try to stack good things by offsetting them with bad things.
+ To sum it up: You can now influence neighbors with your recruiter and your slaves now have sexual needs that must be handled or they'll get moody. Also changes to starting girls prices to smack those who try to stack good things by offsetting them with bad things.
 
-	113
+ 113
 * fixes
 * anon's height focused growth drugs and other related things
 
 2017-09-11
 
-	112
+ 112
 * various bug fixes
 
 2017-09-09
 
-	111
+ 111
 * bugfixes
 
-	110
+ 110
 * possible backwards compat fix
 * fixed weight stuff in artWidgets
 
-	109
+ 109
 * heavy conversion of the flesh descriptions to the new pregnancy system
 * bugfixes
 * clean up of remnant "GenderRadicalistLaw"
 
 2017-09-07
 
-	108
+ 108
 * fixed >>122211 (119980)
 
 2017-09-05
 
-	107
+ 107
 * fixed >>122158 again
 
-	106
+ 106
 * fixed >>122158 ?
 
-	105
+ 105
 * hopefully fixed the bodymod studio
 
-	104
+ 104
 * hopefully fixed drugs not working in MS
 
-	103
+ 103
 * vanilla content
-	Mostly stuff related to piercings, HGs getting to pierce slaves, some new rivalry causes and a nerf to attraction gain.Also FCdev failed to realize he had 'SlaveFullName' and didn't need to make 'FullName', so I set it up to yell at you to yell at me to remove it.
+ Mostly stuff related to piercings, HGs getting to pierce slaves, some new rivalry causes and a nerf to attraction gain.Also FCdev failed to realize he had 'SlaveFullName' and didn't need to make 'FullName', so I set it up to yell at you to yell at me to remove it.
 
-	102
+ 102
 * bug fixes
 * now in .7z
 
 2017-09-04
 
-	101
+ 101
 * fixed bugs
 
-	100
+ 100
 * fixed bugs
 
-	99
+ 99
 * fixes
 * anon's starting girl quirks
 * continued overhauling
 
 2017-09-02
 
-	98
+ 98
 * fixed bugs
 * added an override to 'KnockMeUp' to suppress text
 
-	97
+ 97
 * fixes
 
-	96
+ 96
 * bugfixes
 
-	95
+ 95
 * fixes
 
 2017-09-01
 
-	94
+ 94
 * fixed >>120653
 
-	93
+ 93
 * fixes
 
-	92.1
-	$injectionUpgrade changed for testicles
+ 92.1
+ $injectionUpgrade changed for testicles
 
-	92
+ 92
 * tweaked intensive drugs more as directed
 * added "mongolian" to the name flipper
 
-	91
+ 91
 * fixed >>120436 maybe?
 * tweaked breast based beauty to accommodate the size increase
 * altered dairy breast growth
 
-	90
+ 90
 * fixed bugs
 * messed with rival-hostage events
 
 2017-08-31
 
-	89
+ 89
 * fixed reRoyalBlood
 * fixed other bugs
 
-	88
+ 88
 * fixed hedonism's shops
 
-	87
+ 87
 * fixes
 * anon's RA stuff
 * anon's ability to buy the entire royal court
 
-	86
+ 86
 * fixed >>120006
-	Turned out to be oversized breasts having one too many 'if's.
+ Turned out to be oversized breasts having one too many 'if's.
 
 2017-08-29
 
-	83
+ 83
 * more overhauling
-	All slavegen should be accounted for under the new system now.
+ All slavegen should be accounted for under the new system now.
 
-	82/2081
+ 82/2081
 * bug fixes
-	It helps to run the sanityCheck before posting the patch.
+ It helps to run the sanityCheck before posting the patch.
 
-	80
+ 80
 * tried to handle >>119556
 
 2017-08-30
 
-	85
+ 85
 * vanilla changes
 * fixes
-	Biggest thing to report is definitely the breast size cap being raised to 50kcc. A slightly smaller thing to say; balls now go to 10.
-	Still working on getting the RA changes in.
+ Biggest thing to report is definitely the breast size cap being raised to 50kcc. A slightly smaller thing to say; balls now go to 10.
+ Still working on getting the RA changes in.
 
-	84
+ 84
 * fixed bugs
 
 2017-08-28
 
-	79
+ 79
 * maybe fixed >>119513
-	Keep in mind the slave must have arms and legs.
+ Keep in mind the slave must have arms and legs.
 
-	78
+ 78
 * core pregnancy system swapped
 * fixed some bugs
-	Run backwards compatibility. No exceptions.
-	I think everything is in place that needs to be in place. Very little beyond behind the scenes type code. If everything went right, there should be nothing really noticeable yet.
-	The most obvious change will be the alterations to menopause. It is no longer hard set at 47, instead it drifts slightly year by year. This means that over a slave's lifetime, you will see a variance of when they go through menopause.
+ Run backwards compatibility. No exceptions.
+ I think everything is in place that needs to be in place. Very little beyond behind the scenes type code. If everything went right, there should be nothing really noticeable yet.
+ The most obvious change will be the alterations to menopause. It is no longer hard set at 47, instead it drifts slightly year by year. This means that over a slave's lifetime, you will see a variance of when they go through menopause.
 
 2017-08-27
 
-	77
+ 77
 * fixed >>119185
-	A prime example of a temp variable running rogue.
+ A prime example of a temp variable running rogue.
 
-	76
+ 76
 * removeActiveSlave should now dump their growing organs
 * typo fixes
-	Some other minor things here and there too.
+ Some other minor things here and there too.
 
 2017-08-26
 
-	75
+ 75
 * fixed >>119084
 * a submitted addition of the cleansing diet to the RA
 
-	74
+ 74
 * fixed bugs
 
-	73
+ 73
 * fixes
 
-	72
+ 72
 * fixed bugs
-	I may have broken slave facility assignment. Or maybe I fixed >>118907
-	I don't know.
-	Also if your rules are broken, run either backwards compatibility or the rules resetter under options. Both should fix it.
+ I may have broken slave facility assignment. Or maybe I fixed >>118907
+ I don't know.
+ Also if your rules are broken, run either backwards compatibility or the rules resetter under options. Both should fix it.
 
-	71
+ 71
 * rest of the vanilla RA changes
-	It honestly looks like it didn't break anything. Do run backwards compatibility though.
+ It honestly looks like it didn't break anything. Do run backwards compatibility though.
 
-	70
+ 70
 * vanilla stuff
-	Mostly intense growth drugs. Due to our RA changes, I couldn't hook them into it so it will remove them for now. Still have to handle the massive RA changes, which will likely break everything.
+ Mostly intense growth drugs. Due to our RA changes, I couldn't hook them into it so it will remove them for now. Still have to handle the massive RA changes, which will likely break everything.
 
 2017-08-25
 
-	69
+ 69
 * fixed bugs, including a mislink to the slavegirl school
-	Beginning vanilla update merge now.
+ Beginning vanilla update merge now.
 
-	68
+ 68
 * quick addition of something I overlooked
 
-	67
+ 67
 * fixed bugs
 
-	66
+ 66
 * fixed reAwol harder
 
-	65
+ 65
 * fixed bugs
 
 2017-08-24
 
-	64
+ 64
 * fixed a bunch of bugs
 * added a new slave school that seeks to breed the perfect cowgirl
-	It's slaves still need a little work, as they currently lack certain intended reactions to things like milking, etc.
+ It's slaves still need a little work, as they currently lack certain intended reactions to things like milking, etc.
 
-	63
+ 63
 * bug fixes
 * some of anon's submissions
 
 2017-08-22
 
-	62
+ 62
 * fixes
 
-	61
+ 61
 * fixed bugs
-	Except for the PC breast feeding report, that is based off of a player choice at game start linked to advanced pregnancy and thus working as intended.
+ Except for the PC breast feeding report, that is based off of a player choice at game start linked to advanced pregnancy and thus working as intended.
 
-	60
+ 60
 * anon's expanded smuggling personal attention
 
-	59
+ 59
 * fixed backwards compatibility
 * bug fixes
-	Backwards compatibility should actually work now. It was misspelled.
+ Backwards compatibility should actually work now. It was misspelled.
 
 2017-08-21
 
-	58
+ 58
 
-	57
+ 57
 * fixed a couple bugs
 
-	56
+ 56
 * fixed the HG not properly handling flaws
 * fixed other bugs
 * fixed typos
 
-	55
+ 55
 * fixed self-impreg
 
-	54
+ 54
 * fixed >>117021
 
-	53
+ 53
 * fixed >>117003
 
-	52
+ 52
 * readded lost artWidgets code
 * fixed your rude PA
 
-	51
+ 51
 * fixed >>116926
 * you can now seed a freshly implanted broodmother to have her bear your children. You need a penis to do this.
 
 2017-08-20
 
-	50
+ 50
 * fixed bugs
 * hopefully fixed the hole in walk past
 * added a clear condition for contraceptives if the slave lacks ovaries
 
-	49.1
+ 49.1
 * added a fix to the gender FS laws contributed to the git
 
-	49
+ 49
 * fixed bugs
 * added hair length maintenance to the salon
 
-	48
+ 48
 * vanilla part 2
 
 2017-08-19
 
-	47.1
-	Fixed [SetupVars] <<set>> bad evaluation Unexpected string
+ 47.1
+ Fixed [SetupVars] <<set>> bad evaluation Unexpected string
 
-	47
+ 47
 * vanilla content part 1
 
-	46
+ 46
 * anon's gang leader personal attention option
 * bug fixes
 
 2017-08-18
 
-	45
+ 45
 * fixes
 
-	44
+ 44
 * possible fix for slaves getting denied by every slave they seek a relationship with
 
-	43
+ 43
 * fixes
 * tweaks to $enduringRep and whoring/devastating rumors
 
 2017-08-17
 
-	42
+ 42
 * fixes
 * age penalties off now applies to HG like it should
 
-	41
+ 41
 * fixed bugs
 * added some paraphilia vignettes
 * added in anon's mutiny attempt
 
-	40
+ 40
 * fixed >>115783
 
-	39
+ 39
 * minor fixes
 
-	38
+ 38
 * anon's spelling corrections
 
-	37
+ 37
 * fixed >>115701
 
 2017-08-16
 
-	36
+ 36
 * now with less broken newSlaveIntro
 
-	35
+ 35
 * fixed reported bugs
 * HG will now try to break her assigned girl if she is unbroken before dressing her up nicely
 
-	34
+ 34
 * fixes
 
-	33
+ 33
 * vanilla stuff
-	Mostly bugfixes, a new recruiter target and some changes to vector breasts.
+ Mostly bugfixes, a new recruiter target and some changes to vector breasts.
 
 2017-08-15
 
-	32
+ 32
 * fixed bugs
-	Fixed the counter for the number of a slave's children you've had and hopefully added clears to the remote surgery to prevent chastity devices getting stuck on in the first place.
+ Fixed the counter for the number of a slave's children you've had and hopefully added clears to the remote surgery to prevent chastity devices getting stuck on in the first place.
 
-	31
+ 31
 * added catches to clear chastity devices from slaves that can't wear them.
 
-	30
+ 30
 * fixed bugs.
 
-	29
+ 29
 * fixed >>115265
 
-	28
+ 28
 * fixes
 
-	27
+ 27
 * fixes
 
-	26
+ 26
 * fixed physical development
 
 2017-08-14
 
-	25
+ 25
 * small tweaks to saLiveWithHG
-	HG will fatten up her slave if hedonistic decadence is in play and will make use of hyper drugs if you have them researched. Also cumsluts will now expand their slave's balls to get more cum.
+ HG will fatten up her slave if hedonistic decadence is in play and will make use of hyper drugs if you have them researched. Also cumsluts will now expand their slave's balls to get more cum.
 
-	24
+ 24
 * fixed a critical bug with the menopause reversal
-	It helps to actually link player age with it at game start, you know?
+ It helps to actually link player age with it at game start, you know?
 
-	23
+ 23
 * added player surgeries to rid yourself of a postpartum belly without the wait and a second to temporarily restore your fertility post-menopause.
 * fixed bugs
 
 2017-08-13
 
-	22
+ 22
 * player pregnancy overhauled
 * some typos fixed
 
-	21
+ 21
 * fixed butts getting too big for their descriptions
 
-	20
+ 20
 * fixes and description corrections
 
-	19
+ 19
 * little fixes
 
 2017-08-12
 
-	18
+ 18
 * fixed elective surgery bugs
 
-	17
+ 17
 * I don't remember if I did anything.
 
-	16
+ 16
 * fixed >>114360
 
-	15
+ 15
 * fixed facial quirks
 * maybe fixed vector art troubles?
 
-	14
+ 14
 * fixed sePlayerBirth
 
-	13
+ 13
 * fixed bugs
 
-	12
+ 12
 * fixed bugs
 * player abortion should be working right again
 
 2017-08-11
 
-	11
+ 11
 * fixed bugs
 
-	10
-	Does backwards compatibility work now?
+ 10
+ Does backwards compatibility work now?
 
-	9
+ 9
 * hopefully fixed backwards compatibility
 
-	8
+ 8
 * ra fixes
 * partial conversion to the new pregnancy system for the player
 
 2017-08-08
 
-	7
+ 7
 * unfucked sales descriptions, maybe
 * fixed some bugs
 
-	6
+ 6
 * added vasectomies
 * anon's RA fixings
 
-	5.1
-	Still poking at the RA.
+ 5.1
+ Still poking at the RA.
 
-	5
-	Trying something here. I commented out the offending drug removal code in the RA, tell me if anything changed. I expect you will have to manually unset the drugs once all growth targets are hit though, but we'll be on the right track.
+ 5
+ Trying something here. I commented out the offending drug removal code in the RA, tell me if anything changed. I expect you will have to manually unset the drugs once all growth targets are hit though, but we'll be on the right track.
 
-	4
+ 4
 * anon's gender rad law has been added
 * the vector art is now on the git
 
-	3
+ 3
 * vanilla updating
 * bugfixes
 
-	2
+ 2
 * fixed reported bugs
 
-	1
+ 1
 * now with passages in the right place
 
-	0.10.6.0
+ 0.10.6.0
 
 2017-08-07
 
-	84
+ 84
 * fixed bugs
 * food stuffing is now available
 
-	83
+ 83
 * fixed bugs
 
-	82
+ 82
 * fixed a possible costs report bug
 
-	81
+ 81
 * bugfixes
 * some oversight corrections
 
 2017-08-06
 
-	80
+ 80
 * fixed a $$
 
-	79
+ 79
 * fixed bugs
 
-	78
+ 78
 * nobr'd a bunch of passages
 * fixed some bugs
 * corrected some oddities
 
 2017-08-05
 
-	77
+ 77
 * fixed bugs
 
-	76
+ 76
 * placeholders removed
 * food stuffing now has effects
 
 2017-08-04
 
-	75
+ 75
 * fixed bugs
 * corrected some oversights
 
-	74
+ 74
 * lowercase-donkey fuckery
 
-	73
+ 73
 * Fixed some bugs
 
 2017-08-03
 
-	72
+ 72
 * fixed bugs
 
-	71
+ 71
 * fixed >>111042
 
-	70
+ 70
 * minor fixes
 * pointless changes to the encyclopedia
 
-	69
+ 69
 * bug fixes
 
 2017-08-02
 
-	68
+ 68
 * fixed >>110899
 
-	67
+ 67
 * added beauty policies for physical idealist and hedonistic decadence for strongfat slaves. These are mutually exclusive with the other beauty standard for them, but not with those outside of it.
 * fixed bugs and oversights
 * hit the sanityCheck more to remove false positives, though I still can not get rid of the ones it still shows
 
-	66
+ 66
 * fixed bugs
 
-	65
+ 65
 * vanilla changes
 * bugfixes
 
 2017-08-01
 
-	64
+ 64
 * bugs fixed
 
-	63
+ 63
 * fixed misplaced 'enunciate' in reRelativeRecruiter
 
-	62
+ 62
 * various reported things fixed
 
-	61
+ 61
 * surgically removing dicks and vaginas will now remove accessories that require them.
 
-	60
+ 60
 * fixed bugs
 
-	59
+ 59
 * fixed reported bugs, sans the mystery NaN
 
 2017-07-31
 
-	58
+ 58
 * fixed bad 'PoliteRudeTitle argument
 
-	57
+ 57
 * fixed >>110176
 * added a catch to prevent hostages from inheriting amputation or clipped heels from starting girls.
 
-	56
+ 56
 * tossed in a catch to correct amps having clipped tendons
 
-	55
+ 55
 * vagina removal surgery no longer requires a penis
 
-	54
+ 54
 * just a catcher for a potential ndef foreskin bug
 
-	53
+ 53
 * fixes
 
-	52
+ 52
 * cellblock will kick out mindbroken slaves
 
-	51
+ 51
 * added fat grafting surgery
 
 2017-07-30
 
-	50
+ 50
 * fixed the rest of the bugs
 * also fixed some quirks involving vanilla changes to slave naming overriding your children's surnames
 
-	49
+ 49
 * fixed bugs and oversight
 
-	48
+ 48
 * fixed bugs
 
 2017-07-29
 
-	47
+ 47
 * fixed bugs
 
-	46
+ 46
 * added universal rule to strip all slaves of their surnames and auto strip any future slaves while it is active. You can still give back particular slaves their surnames, should you so choose.
 
 2017-07-28
 
-	45
+ 45
 * added in the missing belly implant resetting passage
 * minor tweaks
 
-	44
+ 44
 * vanilla patches
 
-	43
+ 43
 * fixed bugs
 * altered that bonus for 18 year old slaves to apply to minimum slave age instead
 * likely broke the RA more
 
-	42
+ 42
 * fixed bugs
 
 2017-07-27
 
-	41
+ 41
 * altered core belly implant rules
 * changed how weight affects assets in slavegen
 
-	40
+ 40
 * FCGudder's span fixing and other cleaning
 * altered how nipple color is set
 
-	39
+ 39
 * fixed hg suite issues
 
-	38
+ 38
 * fixed bugs.
 
 2017-07-26
 
-	37.1
+ 37.1
 * now with NaN checks that actually check for NaNs
 
-	37
+ 37
 * fixed pregnancy inconsistencies
 * added a NaN catch for the slave sex counts
 
-	35
+ 35
 * fixed >>108923
 
-	34
+ 34
 * fixed bad costs cases
 
-	33
+ 33
 * fixed missed $policyCost
 
-	32
+ 32
 * fixed some oversights in costs
 * costs now runs entirely in JS
 
-	31
+ 31
 * bugfixes
 
-	30
+ 30
 * fixed >>108865
 
-	29
+ 29
 * bugfixes
 * vanilla stuff
 
 2017-07-25
 
-	28
+ 28
 * bugfixes
 
-	27
+ 27
 * FCGudder's improved slaveSummary
 
-	26
+ 26
 * anon's ra fixes
 * minor tweaks
 
-	25
+ 25
 * bug fixes
 
 2017-07-24
 
-	24
+ 24
 * vanilla stuff
 
-	23
+ 23
 * fixes
 * code improvements
 
-	22
+ 22
 * added anon's tiered brothel aphrodisiacs
 
-	21
+ 21
 * fixed >>108360
 
-	20
+ 20
 * anon's facility filter functions
 * couple fixes here and there
 
 2017-07-23
 
-	19
+ 19
 * fixed slave summary
 
-	18
+ 18
 * anon's assignment filter stuff
 
-	17
+ 17
 * various fixes and optimizations
 
 2017-07-22
 
-	16
+ 16
 * bugfixes
 * oversight corrections
 
-	15
+ 15
 * fixed bugs
 
-	14
+ 14
 * fixed many bugs
 
 2017-07-21
 
-	13
+ 13
 * bugfixes
 
-	12
+ 12
 * fixes
 * vanilla patches
 
 2017-07-20
 
-	11
+ 11
 * bugfixes
 * added FCGudder's new shelter slaves
 
-	10
+ 10
 * typo fixes
 * minor bugfixes
 * oversight corrections
 
-	9
+ 9
 * vanilla fixes
 
-	8
+ 8
 * fixed seBirth
 
 2017-07-19
 
-	7
+ 7
 * fixed phantom dicks in fVagina
 * added FCGudder's vector stuff
 
-	6
+ 6
 * fixed bugs and oversights
 
-	5
+ 5
 * fixes
 
-	4
+ 4
 * fixed >>107062
 
-	3
+ 3
 * maybe fixed seRaiding
 
-	2
+ 2
 * fixed bugs
 
-	1
+ 1
 * vanilla bugfixes
 
-	0.10.5.0/2
+ 0.10.5.0/2
 
-	41
+ 41
 * vanilla fixes
 * RA fixes, thanks to anon
 
 2017-07-18
 
-	40
+ 40
 * initialized new variables
 * further extended family mode optimizations
 
-	39
+ 39
 * vanilla updates
 * FCGudder's guddering
 
 2017-07-17
 
-	38
+ 38
 * fixed >>106706
 
-	37
+ 37
 * FCGudder's image corrections to salon/remote surgery/etc
 * fixed >>106562
 
-	36
+ 36
 * remote surgery and salon less wordy
 * further optimizations to extended family mode
 
 2017-07-16
 
-	35
+ 35
 * fixed bad descWidgets paste
 
-	34
+ 34
 * fixed bugs
 
-	33
+ 33
 * fixes
 * continued optimizing
 
-	32
+ 32
 * fixed bugs
 * further extended family mode optimization
 
 2017-07-15
 
-	31
+ 31
 * vanilla bug fixes
 * pointless vanilla code moving
 * FCGudder's better than vanilla slave summary caching
@@ -5343,176 +5348,176 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-07-14
 
-	30
+ 30
 * fixed bugs
 
-	29
+ 29
 * fixed bugs
 
 2017-07-13
 
-	28
+ 28
 * fixed "0 is not her original surname;"?
 
-	27
+ 27
 * fixed bugs
 * FCGudder's fix
 
-	26
+ 26
 * fixed fake belly bugs
 
-	25
+ 25
 * fixed the policy stuff
 
-	24
+ 24
 * vanilla patches
 * bug fixes
 
 2017-07-12
 
-	23
+ 23
 * vanilla content
 * bugfixes
 
-	22
+ 22
 * vanilla patching
 * fixed some bugs
 * you can now stop carrying children for the SE after you've carried at least one
 
 2017-07-11
 
-	21
+ 21
 * hopefully fixed seDeath
 * finished vanilla's lisping wave
 
-	20
+ 20
 * lots of little vanilla things
 * anon's Physical Idealist beauty standard
 * pregmodfan's ra additions
 * bugfixes
 
-	19
+ 19
 * fixed seBirth
 * anon's physical idealist law is functional, but lacks the beauty component for the moment
 
-	18
+ 18
 * fixed names correctly this time
 * started adding anon's physical idealist law
 
-	17
+ 17
 * fixed name nonsense
 
 2017-07-10
 
-	16
+ 16
 * this >>104926
 * added another pair of height SMRs to limit heights
 
-	15
+ 15
 * resynced matchmaking
 * little bug fixes
 
 2017-07-09
 
-	14
+ 14
 * altered policies into a single policy
 * anon's better RA fixes
 
-	13
+ 13
 * fixed RA applying drugs to slaves it shouldn't
 * fixed DJs and Madams fixing paraphilias
 * added a pair of basic height related SMRs
 * fixed this >>104691
 
-	12
+ 12
 * added player skin tone changing
 * Societal Elite no longer accept children of the wrong race in sup and sub societies for marking
 
 2017-07-08
 
-	11
+ 11
 * changed dye naming scheme
 
-	10
+ 10
 * fixed bugs
 * added fairyanon's descriptions
 
-	9
+ 9
 * fixed extra <</if>> in longSlaveDescription.tw, line 726 and extra periods
 
-	8
+ 8
 * finished vanilla update
 
-	7
+ 7
 * vanilla patches
 * new fathered variables now report their contents
-	-.origSkin added
+ -.origSkin added
 
 2017-07-07
 
-	6
+ 6
 * fixed barracks? (It's showing up, at least)
 * added FCGudder's anaphrodisiacs
 * added a number of father tracking
 * added some canWalk() and canTalk() checks to sePlayerBirth
 
-	5
+ 5
 * now with proper functionality
 * also you can now use strings in custom RA rules
 
-	4
+ 4
 * vanilla patches
 
 2017-07-06
 
-	3
+ 3
 * your headgirl now has a very low chance of accidentally knocking up her slave
 * your headgirl can now abort her slave's early pregnancy if she is permitted to use drugs on her
 * fixed bugs
 * accidentally pushed the WIP slaveSacrifice.tw to the git
 
-	2
+ 2
 * maybe fixed lips resetting to 35 in ng+
 
 2017-07-05
 
-	1
+ 1
 * seRaiding is now hooked up and good to go
 
-	1018a?-0
+ 1018a?-0
 * preventatives now combat some of the negatives of obesity
 * added the ability to set .birthTotal in more customization options in starting girls
 * tons of vanilla stuff
 
-	0.10.5.0a
+ 0.10.5.0a
 
-	53
+ 53
 * End of week report for the penthouse fixed.
 
 2017-07-04
 
-	52
+ 52
 * fixed some stuff
 * cleaned up saLiveWithHG to respect chastity and countless other things
 
-	51
+ 51
 * fixed bugs
 * slaves can now be too fat to wear an empathy belly
 
 2017-07-03
 
-	50
+ 50
 * neighbors will now not develop conflicting FS
 
-	49
+ 49
 * fixed FCTV never airing my infomercial
 
-	48
+ 48
 * added a weight control SMR
 * restricted weights for generated coursing slaves
 * more fat belly descriptions
 
-	47
+ 47
 * fixed bugs
 * split .bellySag into the current version and a pregnant version for descriptions to use
 * liposuction on extremely fat slaves will result in a lot of excess skin
@@ -5520,45 +5525,45 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-07-02
 
-	46
+ 46
 * cleaned out the complaints with salon and body mod studio.
 
-	45
+ 45
 * fixed bugged nationality setting in childgen
 
-	44
+ 44
 * fixed >>103129
 
-	43
+ 43
 * fixed reported bugs
 
-	42
+ 42
 * fixed >>103082
 
-	41
+ 41
 * added a missing "Shoes"
 
 2017-07-01
 
-	40
+ 40
 * more of new RA anon's RA tweaking
 
-	39
+ 39
 * bug fixes and oversight corrections
 * some new encyclopedia entries
 * children that would be "Stateless" will now take up revivalist nationalities if you have one.
 * redid the alpha version of bodyswapping. It should now not break your slaves
 
-	38
+ 38
 * fixed conception widget.
 
-	37
+ 37
 * finished respecting chastity in slave on slave force-feeding
 * more improvements to new conception widget
 
 2017-06-30
 
-	36
+ 36
 * enabled Hedonistic Decadence's research
 * fixed some anal chastity oversights
 * fixed some slave count related inconsistencies (still lots to do with saRules)
@@ -5566,34 +5571,34 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-06-29
 
-	35
+ 35
 * FCGudder's gudder height gen
 * removed innocence buff
 
-	34
+ 34
 * added a totally legit antisag cream infomercial to FCTV
 * more beauty tweaking (buffs to edo revivalist, chinese revivalist, body purist, youth/mature preferentialist)
 * bugfixes
 
 2017-06-28
 
-	33
+ 33
 * added an RA rule resetter to game options
 
-	32
+ 32
 * fixed pit decommission into "market" instead of "markets"
 
-	31
+ 31
 * anon's RA tweaks
 * FCGudder's basic sacrifices
 * hairlessness due to age now acts like shaved and the like for beauty calcs
 
 2017-06-27
 
-	30
+ 30
 * fix for vanilla dairy bug
 
-	29
+ 29
 * vanilla content
 * player freckles
 * inheritable freckles
@@ -5601,26 +5606,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-06-26
 
-	28
+ 28
 * couple .pregMood new child intros
 * bit of cleanup on the supportive mesh
 * clothing should now affect slaves in facilities
 * corrected some oversights involving sex counts in the slave intros
 
-	27
+ 27
 * fixed >>101675
 
-	26
+ 26
 * new breast shape preserving implant, comes from implant manufactory upgraded dispensary. See encyclopedia for more details
 * couple new slave intros involving $PC.pregMood
 * bug fixes, hopefully including >>101672
 
 2017-06-25
 
-	25
+ 25
 * fixed >>101533
 
-	24
+ 24
 * hedonistic neighbors now always sell slaves with fetishes and occasionally paraphilias
 * nerfed broodmother's beauty in repop societies (a constant raw 100 is too high)
 * fixed bugs and oversights
@@ -5629,36 +5634,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-06-23
 
-	23
+ 23
 * bugfixes
 * more beauty tampering. (more nerfs to physical idealist, rework of hedonism's weight based beauty, buffs to most beauty standards, buffs to body purist)
 
-	22
+ 22
 * fixed reported bugs
 
-	21
+ 21
 * bugfixes
-	Fixed the wardrobe bug and the sweatshop bug.
+ Fixed the wardrobe bug and the sweatshop bug.
 
 2017-06-22
 
-	20
+ 20
 * fixed and added more age sorting options
 
-	19
+ 19
 * completed hedonistic decadence's clothing
 * added anon's cheatmode overhaul
 * bugfixes
 
 2017-06-21
 
-	18
+ 18
 * Activated Hedonistic Decadence FS
 * fixed bugs
 
 2017-06-20
 
-	17
+ 17
 * extended weight range from -100-100 to -100-200
 * added some more mental effects on slaves to the nonlethal pit, thanks to anon
 * added a new title set up for slaves to use when being rude to you but aren't being adamant.
@@ -5666,731 +5671,731 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-06-19
 
-	16
+ 16
 * fixes matchmaking bug
 
 2017-06-18
 
-	15
+ 15
 * fixes
 
-	14
+ 14
 * fixes
 * reduced costs for arcade and industrial dairy components
 
-	13
+ 13
 * pregmodfan's RA reworks
 * fixes and tweaks
 
 2017-06-17
 
-	12
+ 12
 * bug fixes
 
-	11
+ 11
 * vanilla fixes
 
-	10
+ 10
 * fixes
 
-	9
+ 9
 * added liposuction to the remote surgery to make slaves not fat
 * fixed bugs
 * disabled nationality restricting in corporate slavegen due to an inability to fix it
 
 2017-06-16
 
-	8
+ 8
 * fixes
 
-	7
+ 7
 * fixes
 
 2017-06-15
 
-	6
+ 6
 * bugfixes
 
-	5
+ 5
 * fixes
 * moved FCTV options to manage personal affairs
 * fixed issue with name flipping and your title
 * cleaned up player surgery some
 
-	4
+ 4
 * quick fix for the occasional error flash during end week events
 
-	3
+ 3
 * fixed bugs
 * cleaned up some of the FCTV intro code.
 
-	2
+ 2
 * bugfixes
 * FCTV can now slowly influence FS gain rates
 
-	0.10.4.0.
+ 0.10.4.0.
 * bugfixes
 
 2017-06-14
 
-	116
+ 116
 * fixes
 * less scotts
 
-	115
+ 115
 * fixed bugs
 * spread new name flipper widget around some
 * added more Scotts
 
-	114
+ 114
 * first deployment of FCTV
 * altered how name flipping is handled
 
-	113
+ 113
 * fixes misplaced passages
 
-	112
+ 112
 * more vanilla surname stuff
 * bugfixes?
 
-	111
+ 111
 * attempted to handle >>99083
 
-	110
+ 110
 * fixes missing head girl,concubine and bodyguard
 
-	109
+ 109
 * quick fix to keep the princess and prince sharing a surname
 
-	108
+ 108
 * vanilla content (including surnames)
 * bugfixes
 
 2017-06-13
 
-	107
+ 107
 * vanilla content (not surnames)
 * fixes
 
 2017-06-12
 
-	106
+ 106
 * fixed bugs
 
 2017-06-11
 
-	105
+ 105
 * more beauty tweaking (buffs to repop/eugenics, nerf to transformation+bellyimplant)
 * bugfixes (not clinic oversight)
 * added frailty dependence
 
-	104
+ 104
 * fixes
 
-	103
+ 103
 * added a universal rule to keep immobile slaves from losing muscles
 * fixed some bugs
 
-	102
+ 102
 * tweaked with muscle/slimming diets
 * added muscular atrophy if slaves can not move
 
 2017-06-10
 
-	101
+ 101
 * vanilla patches
 
-	100
+ 100
 * more fixes
 
-	99
+ 99
 * fixed bugged FS values
 
-	98
+ 98
 * fixed bugs
 
-	97
+ 97
 * fixed bugs
 
-	96
+ 96
 * readded repeat hip and shoulder surgery.
 
 2017-06-09
 
-	95
+ 95
 * fixes
 
-	94
+ 94
 * Beware the White Scare
 * added Hedonistic Decadence's assay code, bugs might show up, you'll know if they do.
 
-	93
+ 93
 * fixed a bug, not sure if it was the right one.
 
-	92
+ 92
 * bugfixes
 * neighbors may start using the new FS
 
 2017-06-08
 
-	91
+ 91
 * fixes
 
-	90
+ 90
 * fixed bugs
 * some prettying up by FCGudder
 
-	89
+ 89
 * now with more schoolroomReport
 
-	88
+ 88
 * fixes
 * slaves with huge clits can now use them to rape in the pit
 
-	87
+ 87
 * vanilla updates
 * bugfixes
 
-	86
+ 86
 * minor fixes
 
 2017-06-07
 
-	85
+ 85
 * fcanon's fixes and safeguards
 
-	84
+ 84
 * fixes that I forget I should be posting
 
-	83
+ 83
 * you can no longer fuck a slave's ass pregnant through her fake vagina
 
-	82
+ 82
 * fcanon's changes to arrays and bugfixes, optimizations and tweaks
 * altered breeder paraphilia satisfaction via vaginal/anal sex to only occur if she has a chance of getting pregnant from the action
 
-	81
+ 81
 * more vanilla patches
 * new slave intro text unfuckery
 
 2017-06-05
 
-	80
+ 80
 * bug fixes
 
-	79
+ 79
 * vanilla patches
 * bug fixes
 * possible new bugs
 
-	78
+ 78
 * comments in comments break everything.
 
-	77
+ 77
 * reverted seRetirement, it's better for the retired slave to leave than her lover
 * fixed some bugs
 
-	76
+ 76
 * sanityChecker fixes
 
-	74
+ 74
 * might have fixed >>96580
 
-	73
+ 73
 * fixed >>96563
 
-	72
+ 72
 * fixed bugs
 
-	71
+ 71
 * fixed some bugs
 * likely added bugs
 
-	0.10.3.4
+ 0.10.3.4
 * fixed reported bugs
 * incubated slaves will no longer face devotion caps and trust caps
 * updated backwards compatibility
 
 2017-06-04
 
-	70
+ 70
 * fixed bugs
 
-	69
-	Fixed >>96323 .
+ 69
+ Fixed >>96323 .
 
-	68
+ 68
 * fixed bugs
 * likely added bugs
 
 2017-06-03
 
-	67
+ 67
 * added a panic button under options to reset all extended family mode limiters
 
-	66
+ 66
 * fixed reported bugs
 
-	65
+ 65
 * you can now replace ocular implants with freshly cloned eyes
 * clumped cheat edit skills together
 
-	64
+ 64
 * resynced the incubator seBirth fork with the regular version
 * finished tweaking RESS
 
-	63
+ 63
 * bug fixes
 
-	62
+ 62
 * vanilla patches
 * tweaks, mostly to seBirth and frailty
 
 2017-06-02
 
-	61
+ 61
 * fixed bugs
 * fixed typos and culled redundant text
 * tweaked PC pregnancy to not stray so far past the average due date.
 
-	60
+ 60
 * bugfixes
 * salon and body modification got sorted, because
 * FCdev nuked .gitattributes
 
 2017-06-01
 
-	59
+ 59
 * fixed bad canSee($eventSlave)
 
-	58
+ 58
 * fixes and tweaks
 
-	57
+ 57
 * bugfixes
 * some tweaks to RESS
 
-	56
+ 56
 * tweaked shops to allow you to change them
 * added a bunch of important $PC variables to backwards compatibility
 
-	55
+ 55
 * standardizations of .pregType
 
-	54
+ 54
 * fixes
 * extended some of the new slave intros to work with extended family mode
 
-	53
+ 53
 * vanilla fixes
 
-	52
+ 52
 * pregmodfan's fixes
 
 2017-05-31
 
-	51
+ 51
 * anon's bigger player balls and self-impregnation mod
 * bugfixes
 
-	50
+ 50
 * added a new diet to combat genome damage
 * fixed some inconsistencies
 * fixed bugs
 
 2017-05-30
 
-	49
+ 49
 * fixes for reported problems
 * vanilla updates
 
-	48
+ 48
 * fixed custom slave race
 
-	47
+ 47
 * fixes
 * more chastity checks
 
-	46
+ 46
 * fixes
 
-	45.2
+ 45.2
 * readded saLongTermEffects (how did no one notice this?)
 
-	45.1
+ 45.1
 * quick removal of lingering .lrgImg
 
-	45
+ 45
 * lots of vanilla fixes
 
-	44.1
+ 44.1
 * should fix >>94669
 
-	44
+ 44
 * vanilla things
 * bug fixes
 
-	43
+ 43
 * fcanon's changes
 
 2017-05-29
 
-	42
+ 42
 * fixed lolimode slave gen
 
-	41
+ 41
 * you may now force slaves to marry you
 * couple bug fixes
 
-	40
+ 40
 * fixed reFullBed
 * gagged pointless error reports
 
-	39
+ 39
 * fixes and tweaks
 * attached milf tourist event
 
 2017-05-28
 
-	38
+ 38
 * tons of fixes and a few tweaks
 
-	37
+ 37
 * added gags
 * fixed bugs
 
 2017-05-27
 
-	36
+ 36
 * fixed bugs
 
-	35
+ 35
 * fixes
 * traitor might now not clear daughters and sons.
 
-	34
+ 34
 * fixed bugs
 
 2017-05-26
 
-	33
+ 33
 * fixes, mostly spelling
 * vanilla fixes
 * vanilla AWOL merc event
 * forced marriage is beginning to seep into active content, it may affect certain marriage related content now.
 
-	32
+ 32
 * vanilla tweaks and fixes.
 
-	31
+ 31
 * added some color to personal training
 * fcanon's master suite fix.
 
-	30
+ 30
 * fixed backwards compatibility
 
 2017-05-25
 
-	29
+ 29
 * spelling corrections
 * fixed >>93327
 
-	28
+ 28
 * lots of fixes from fcanon and pregmodfan
 
-	27.1
+ 27.1
 * slight revisement to the bug fixed in >>93184
 
-	27
+ 27
 * fixed >>93182
 
-	26.2
+ 26.2
 * fixed >>93142
 
-	26.1
+ 26.1
 * fixed >>93122
 
-	26
+ 26
 * more fixes
 
-	25
+ 25
 * vanilla bugfixes and tweaks.
 
 2017-05-24
 
-	24
+ 24
 * fixed some bugs
 * optimized and corrected some errors in new child intro
 
-	23
+ 23
 * added a new drug research to the dispensary to remove physical side effects from aphrodisiacs.
 
-	22
+ 22
 * bug fixes
 
 2017-05-22
 
-	20/2021
+ 20/2021
 * tossed in a compatibility catch for >>92203
 
-	19
+ 19
 * fixes
 
 2017-05-21
 
-	18
+ 18
 * maybe added/reactivated some more conditions for the RA?
 
-	17
+ 17
 * heavily altered how physical development works when active. Now balances hormones over the year to decide which bonus to give.
 * fixed bugs, maybe
 
 2017-05-20
 
-	16
+ 16
 * fixed bugs (mindbroken HG slaves and research lab BS)
 
-	15
+ 15
 * fixed minor bugs
 
-	14
+ 14
 * fixed, hopefully, slaves sneaking off into non-existent master suites
 
-	13
+ 13
 * fixed missing slaves in certain starting arcologies
 
-	12
+ 12
 * readded lost dairy pipelines, milk and cum should flow through the pipeline properly again
 
-	11
+ 11
 * fixed root issue with now shop system and my FS
 * FSdevelopments shops setting should now function?
 * fixed a bug involving slaves not ceasing calling you names when they are no longer fearful
 
 2017-05-19
 
-	10
+ 10
 * various bugfixes
 * more rude names
 * you can now successfully buy the prince and princess and they will definitely be different people
 
-	9
+ 9
 * several bugfixes
 * hateful slaves may now voice their opinions of you more clearly
 
-	8
+ 8
 * bugfixes
 
-	7
+ 7
 * fixed lost incubator report, fcanon!
 
-	6
+ 6
 * fixed bugs
 * added anon's recruit event
 * likely broke ng+ extended family mode harder
 
 2017-05-18
 
-	5
+ 5
 * fixed shops?
 
-	3
+ 3
 * resynced with vanilla after missing a certain gingering related commit
 
 2017-05-17
 
-	2
+ 2
 * disabled FS related shop content until it gets completed. Setting it from shops may still be safe, but won't have any notable effects.
 * fixed saChoosesOwnJob error
 
-	1
+ 1
 * now working?
 
 2017-05-16
 
-	Pregmod 0.10.3.0
+ Pregmod 0.10.3.0
 
 2017-05-15
 
-	32
+ 32
 * fixed bugs
 * added large and small chest sizes to PC set up
 * added an option to buy both the prince and princess from the royalty event
 
-	31
+ 31
 * bugfixes
 
-	30
+ 30
 * added a new purchasable PA pack
 * ra tweaks
 
 2017-05-14
 
-	29
+ 29
 * fixes and spelling fixes
 
 2017-05-13
 
-	28
+ 28
 * pregmodfan's pc renaming
 * fixes
 * backwards compatibility additions
 
-	27
+ 27
 * bugfixes
 * tweaks
 
-	26
+ 26
 * fixed miscopied passages
 
-	25
+ 25
 * vanilla bulk slave purchasing
 * fixed bugs
 
-	24
+ 24
 * partial vanilla update
 
 2017-05-12
 
-	23
+ 23
 * fixed bad breasts and bad curatives events
 
-	22
+ 22
 * fix for >>87869
 
-	21
+ 21
 * fixed bugs
 
-	20
+ 20
 * vanilla fixes and tweaks
 
 2017-05-11
 
-	19
+ 19
 * vanilla bugfixes and tweaks
 
-	18
+ 18
 * fixed JS
 * added a new event from vanilla
 
-	17
+ 17
 * all the RA work from the git
 
-	16
+ 16
 * added some backwards compatibility for pregmod variables
 * fixed >>87285
 
-	15
+ 15
 * more RA fixes from fcanon
 
-	14
+ 14
 * fcanon and stuffedanon's fixes
 
-	13
+ 13
 * fcanon's fixes and tweaks
 * stuffedanon's fixes
 * vanilla fixes
 
-	12
+ 12
 * fixes
 
-	11
+ 11
 * added more feedback for transformation fetishists and if implanted assets are suitably implanted
 * lessened thresholds for % implant bonus and malus
 
-	10
+ 10
 * fixed bugs
 * added a percent implant report to longSlaveDescription for transformation fetishist societies
 * added lips to lip implants beauty calcs for transformation fetishist
 
-	9
+ 9
 * vanilla fixes
 
 2017-05-10
 
-	8
+ 8
 * lots of fixes and spell checking
 
-	7
+ 7
 * spelling corrections
 
-	6
+ 6
 * massive beauty overhaul
 
-	5
+ 5
 * ra is likely more broken than ever
 * fixed some bugs
 * vanilla code cleanup
 
-	4
+ 4
 * vanilla fixes
 
 2017-05-09
 
-	3
+ 3
 * bugfixes
 
-	1
+ 1
 * now with more 0.10.2.0 content
 
-	Pregmod 0.10.2.0a v0.
+ Pregmod 0.10.2.0a v0.
 
 2017-05-08
 
-	30
+ 30
 * fixed >>85316
 
 2017-05-07
 
-	29
+ 29
 * put a check on dick immobilization so that a slave must have a dick for it
 
-	28
+ 28
 * fixed a number of bugs
 
-	27
+ 27
 * possible JS fix
 
-	26
+ 26
 * fixes bad puberty age setting on new reproductive organs
 
-	25
+ 25
 * bugfixes
 
 2017-05-06
 
-	24
+ 24
 * bugfixes from stuffedanon
 
-	23
+ 23
 * added custom titles for slaves to call you
 * family members referring to you with a family title now optional
 
-	22
+ 22
 * fixed PA appearances not appearing
 
-	21
+ 21
 * fixed pHackerSupport </nobr> error
 
-	20
+ 20
 * lots of sanityCheck fixes
 
 2017-05-05
 
-	19
+ 19
 * fcanon's fixes
 
-	18
+ 18
 * added fcanon's pending assignwidgets changes from vanilla
 
-	17
+ 17
 * fcanon's fixes
 
-	16
+ 16
 * cleaned up the new hood surgery to read a little better
 * fixed a bug with setting hood size on a newly grafted hood
 
-	15
+ 15
 * bugfixes
 * vanilla fixes
 * vanilla added clit hoods
@@ -6398,353 +6403,353 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-05-04
 
-	14
+ 14
 * tons of bug fixes from everyone
 
 2017-05-03
 
-	13
+ 13
 * massive changes to sister and daughter setting
 
-	12
+ 12
 * fixed bugs
 * reverted changes to breeding proposal
 * continuing without making a choice will likely result in your proposal being rejected, so make a choice
 
-	11
+ 11
 * fixed apartments issue
 
-	10
+ 10
 * fixed JS
 
-	9
+ 9
 * vanilla changes to penthouse UI
 * revised incubator pregnant slave listing
 * added family trees to slave interact and manage personal affairs
 
-	8
+ 8
 * fixed bugs
 
-	7
+ 7
 * fixed new ui
 
-	6
+ 6
 * fixed bugs
 
-	5
+ 5
 * fixed up slave-slave dick and vag scenes
 
-	4
+ 4
 * lots of vanilla changes, most notably to the ui
-	-4 new vanilla potential recruits
+ -4 new vanilla potential recruits
 
 2017-05-02
 
-	3
+ 3
 * removed restriction on slave on slave scenes
 * removed lingering $cum and $milk from the force-feeding workaround
 
-	2
+ 2
 * tons of bugfixes, dairy inflation still under review
 * forgot to remove the cheatmode restriction on anon's slave interact scenes, will get on next pass
 
-	1
+ 1
 * actually outputted from twine this time
 
-	1010a-1
+ 1010a-1
 * fixed bugs
 * added anon's new refreshment types
 
-	Pregmod updated to alpha 0.10.0.0.
+ Pregmod updated to alpha 0.10.0.0.
 * good luck
 
 2017-05-01
 
-	110
+ 110
 * fixed bugs that aren't related to the RA
 
-	109
+ 109
 * the [$] that caused it all has been fixed
 
-	108
+ 108
 * fixes from stuffedanon
 
-	107
+ 107
 * lots of submitted changes and fixes
 
-	106
+ 106
 * removed some leftover debug scripts
 * fixed poorly reported custom slave balls
 
 2017-04-30
 
-	105
+ 105
 * integrated >>82360
 * fixed >>82371
 
-	104
+ 104
 * fixes >>82338
 
-	103
+ 103
 * minor bug fixes
 
-	102
+ 102
 * added >>82004
 
 2017-04-29
 
-	101
+ 101
 * fixed misspelled variable names.
 
-	100
+ 100
 * vanilla fixes
 
-	99
+ 99
 * lots of bugfixes
 * fcanon's content changes from last night
 
-	98
+ 98
 * fcanon's changes
 * bugfixes
 * revised ascension to arcology owner career (1 year of owning the arcology or all player skills maxed)
 
-	97
+ 97
 * vanilla stuff
 
 2017-04-28
 
-	96
+ 96
 * fixed bugs
 * added an old footjob scene I found to cheatmode for some testing
 
-	95
+ 95
 * tweaked slave passive impregnation
 * fixed bugs
 * that includes artWidgets
 
-	94
+ 94
 * added >>81072
 * added another bandaid to this version's CSS
 
-	93
+ 93
 * more vanilla fixes
 * family tree now works in this version
 
-	92
+ 92
 * fcanon's changes
 * vanilla changes
 
 2017-04-27
 
-	91
+ 91
 * vanilla fixes
 
-	90
+ 90
 * even more fcanon fixes
 * changes to slave on slave dickriding
 
-	89
+ 89
 * random very minor vanilla stuff
 
-	88
+ 88
 * lots of little fixes by fcanon
 * git version will have the initial family tree system working when it gets accepted
 
 2017-04-26
 
-	87
-	fixed misc widgets .FSSSubjugationist bug
+ 87
+ fixed misc widgets .FSSSubjugationist bug
 
-	86
+ 86
 * possibly fixed pUndergroundRailroad
 
-	85
+ 85
 * lots of vanilla additions
 * fcanon's additions
 * stuffedgame's additions
 
 2017-04-25
 
-	84
+ 84
 * fcanon's fixes
 * tweaked family widgets to report accurately
 
-	83
+ 83
 * fixed bugs
 * tweaked relative reporting to not report a slave as both a twin and a sibling.
 
-	82
+ 82
 * fixed bugs
 * added ability to view pregnant slave descriptions in the incubator screen
 
-	81
+ 81
 * bug fixes
 
-	80
+ 80
 * vanilla content
 
 2017-04-24
 
-	79
+ 79
 * fixed bugs
 * altered chooses own clothes for mindbroken slaves
 
-	78
+ 78
 * fixed bugs
 
-	77
+ 77
 * bugfixes
 * got that code block working so now you know everything that is immobilizing a slave
 
-	76
+ 76
 * massive vanilla color css changes
 
-	75
+ 75
 * fixed starting girls applying things it shouldn't be.
 
-	74
+ 74
 * fixed the aforementioned phantom dick bug
 * slaves with ages of 0 now count age in weeks
 * fixed bugs
 
 2017-04-23
 
-	73
+ 73
 * bug fixes
 
-	72
+ 72
 * integrated extended-extended family mod widgets fixes and cleanup
 
-	71
+ 71
 * whole lot of fixes
 
-	70
+ 70
 * fixed >>79119
 * fixed some wonky $possessives in saLongTermEffects
 
 2017-04-22
 
-	69.1
+ 69.1
 * Fixed version. Accidentally copied longSlaveDescription into descWidgets.
 
-	69
+ 69
 * vanilla pulls
 * bug fixes
 
-	68
+ 68
 * altered accent diminishing (not reflected in slave summary)
 * fixed bugs
 
-	67.1
+ 67.1
 * fixed the .html version only bug >>78902
 
-	67
+ 67
 * fixed bugs
 * sided with the old vanilla code and added canTalk() to the DJ assignment check.
 
-	66
+ 66
 * fixed bellies sagging that shouldn't be sagging, hopefully once and for all
 
-	65
+ 65
 * overhauled extended-extended family mode widgets
 
-	64
+ 64
 * bugfixes
 
-	63
+ 63
 * fixes HG alt formatting bug
 
-	62
+ 62
 * fixed everything in >>78748
 
-	61
+ 61
 * fixed RESS issues
 * possibly fixed >>78736 (it looks vanilla)
 * normal corsets no longer reduce waists on inflated slaves or slaves with large belly implants
 
 2017-04-21
 
-	60
+ 60
 * reworked birthday event to account for chastity
 * schoolroom can now raise anal and vaginal skill to 30 with the skills upgrade
 * take classes can teach anal and vaginal skills to virgins
 * fixed some revealed oversights
 
-	59
+ 59
 * fixed wip fuck scene >>78525
 * possibly fixed the slave is own niece thing
 
-	58
+ 58
 * incestual relationships extended to player's mother, father and sisters
 
-	57
+ 57
 * bugfixes
 
 2017-04-20
 
-	56
+ 56
 * altered hormone face change calcs to reflect .face changes
 
-	55
+ 55
 * more vanilla fixes
 
-	54
-	- Fixed >>78168
+ 54
+ - Fixed >>78168
 
-	53
+ 53
 * vanilla fixes
 * nulls can now maybe be made in starting girls?
 * bugfixes
 
-	52
+ 52
 * vanilla fixes
 
 2017-04-19
 
-	51
+ 51
 * fixed bugs
 
-	50
+ 50
 * very minor fixes
 * changed how rival victory into initiation works
 
 2017-04-18
 
-	49
+ 49
 * possibly fixed undefined error in removeJob
 
-	48
+ 48
 * tons of vanilla changes
 * hopefully few vanilla bugs
 
 2017-04-17
 
-	47
+ 47
 * fixed bugged childgen for players carrying a slave's child
 
-	46
+ 46
 * couple bug fixes, mostly the rival setting bug
 
-	45
+ 45
 * fixed and limited madam and dj involvement in facility sex
 
-	44
+ 44
 * seDeath should no longer get stuck on
 
 2017-04-16
 
-	43
+ 43
 * integrated pregmodfan's RA work
 
-	42
+ 42
 * tweaked rate of arcade slave decay
 
-	41
+ 41
 * altered slave death
 * fixed bugs
 * added vanilla bug fixes
 
-	40
+ 40
 * fixed bugs
 * altered beauty standard laws to better mesh with other FS
 * added a "bald" hair description
@@ -6752,68 +6757,68 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-04-15
 
-	39
+ 39
 * bugfixes
 
-	38
+ 38
 * now functional
 * lot of vanilla additions, hope they work right
 * completely forgot what I did last night, hope that I didn't break anything
 
 2017-04-14
 
-	37
+ 37
 * breaking raWidgets even more.
 
-	36
+ 36
 * fixed first error reported in raWidgets.
 
-	35
+ 35
 * fixes
 
-	34
+ 34
 * fixed bugs
 * added some extra nicknames
 
-	33
+ 33
 * fixed longSlaveDescription (<div class="imageRef lrgImg"<div class="mask">&nbsp;</div>> to <div class="imageRef lrgImg"><div class="mask">&nbsp;</div>)
 
-	32
+ 32
 * added a trio of medicinal enemas (curative, tightening, and aphrodisiac)
 * contains vanilla 0.10.0.0 alpha changes
 
-	31
+ 31
 * vanilla changes, mostly to RA
 * added anon's image css stuff
 * bugfixes?
 
 2017-04-13
 
-	30
+ 30
 * lots of little bug fixes, nothing major
 * bodyswapping moved to testing but currently untested, suggesting not touching it
 
 2017-04-12
 
-	29
+ 29
 * fixed opening error (Absentmindedly closing widgets with <</if>> will do that.)
 
-	28
+ 28
 * hammered FS unsetting, it should properly unset everything now when abandoned or failed out of
 
 2017-04-11
 
-	27
+ 27
 * fixed enemas and force-feeding
 * hairless is now an inheritable trait
 
-	26
+ 26
 * unfucked walkpast
 
-	25
-	Emergency fix. Accidentally deleted misc widgets.
+ 25
+ Emergency fix. Accidentally deleted misc widgets.
 
-	24
+ 24
 * completed citizen hookup event variant
 * introduced baldness to males over 50 in slavegen
 * hooked up hair removal surgery
@@ -6821,7 +6826,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-04-10
 
-	23
+ 23
 * reworked saChoosesOwnJob to not be potentially broken
 * limited saChoosesOwnJob to prevent slaves from locking themselves in industrial dairies and overfull facilities
 * added a new universal rule to permit or deny slaves choosing their own jobs from joining facilities, off by default
@@ -6829,74 +6834,74 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-04-09
 
-	22
-	Smart piercing improvements
-	Removed the default smart piercing function, which was nonfunctional for almost all settings of the current implementation of the rules assistant.
-	The existing rules for smart piercings have been broken down into four new rules, for fetishes, sexual appetite, and XY and XX attraction.
-	The all sex smart piercing setting no longer automatically targets XY and XX attraction in addition to libido, as these can be done individually.
-	Gave smart piercings new settings to suppress XY and XX attraction, which will have minor secondary libido suppressing effects.
-	Heavily buffed smart piercing efficiency when improving XY and XX attraction and added minor secondary libido enhancing effects to these settings.
-	WIP descriptions for nulls.
+ 22
+ Smart piercing improvements
+ Removed the default smart piercing function, which was nonfunctional for almost all settings of the current implementation of the rules assistant.
+ The existing rules for smart piercings have been broken down into four new rules, for fetishes, sexual appetite, and XY and XX attraction.
+ The all sex smart piercing setting no longer automatically targets XY and XX attraction in addition to libido, as these can be done individually.
+ Gave smart piercings new settings to suppress XY and XX attraction, which will have minor secondary libido suppressing effects.
+ Heavily buffed smart piercing efficiency when improving XY and XX attraction and added minor secondary libido enhancing effects to these settings.
+ WIP descriptions for nulls.
 
-	21
+ 21
 * fixes
 
-	20
+ 20
 * now with less forgotten passage copies
 
-	19
+ 19
 * fixed starting girls attraction controls
 
-	18
+ 18
 * fixed bugs
 * added prostates to starting girls
 
 2017-04-08
 
-	17
+ 17
 * hooked up body hair removal surgery
 
-	16
+ 16
 * fixes?
 * handled code duplication in salon
 
-	15
+ 15
 * fixed superfluous <</if>> in L40 in researchLab.tw (likely)
 
-	14
+ 14
 * fixed >>74516
 
-	13
+ 13
 * fixes
 
-	12
+ 12
 * applied fixes to lab report, hopefully it works now
 
-	11
+ 11
 * minor descriptive tweaks
 * bugfixes
 * added new JS calls hugeBelly(), hugeBellyPreg(), hyperBellyOne(), hyperPregBellyOne(), hyperBellyTwo(), and hyperPregBellyTwo() for easier size checks
 
 2017-04-07
 
-	10
+ 10
 * fixes
 
-	9
+ 9
 * fixes
 * neighboring slimness enthusiast arcologies now have access to its research
 
-	8
+ 8
 * bugfixes, not including array issues
 
-	7
+ 7
 * added hair dyes and contact lenses to manage personal affairs
 * small fixes
 
-	6
+ 6
 * mostly fixes
 
-	5
+ 5
 * added prostates and genes to male hero slaves where appropriate.
 * possibly enabled selfcest twins
 * fixed cybermod bugs
@@ -6904,52 +6909,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-04-06
 
-	4
+ 4
 * fixed player surgery widget
 
-	3
+ 3
 * enabled prosthetics
 
-	2
+ 2
 * fixed age reduction surgery for the pc
 
-	0.10.0.0a v1.
+ 0.10.0.0a v1.
 * fixes
 
 2017-03-31
 
-	42
+ 42
 * fixed bugs
 
 2017-03-30
 
-	Pregmod updated to proto-0.9.10.4.
+ Pregmod updated to proto-0.9.10.4.
 * spa bug fixed
 
-	40
+ 40
 * updated to array based facilities
 
 2017-03-29
 
-	38.1
+ 38.1
 * compatibility catch for the new law (Slimness Enthusiast (Flat is beauty)) to work.
 
-	38
+ 38
 * added Slimness Enthusiast Research (asset shrinking drugs)
 * added Slimness Enthusiast Law (Flat is beauty)
 * fixed custom slave skin nonsense
 * fixed bugs
 
-	37
+ 37
 * fixed bugs
 
-	36
+ 36
 * fixed bugs
 * tweaked descWidgets to flow a little better
 
 2017-03-28
 
-	35
+ 35
 * updated corp overhaul mod
 * tracked down missing accordion mod pulls and added them
 * fixed bugs and other issues
@@ -6957,30 +6962,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-03-27
 
-	34
+ 34
 * tweaked personal training
 * tweaked concubine rules; she may now be blind or immobile, but must have limbs. Events involving her had their conditions adjusted in accordance.
 * fixed bugs
 
 2017-03-26
 
-	33
+ 33
 * integrated filter by assignment fixes
 * added more flat
 * bugfixes
 
-	32
+ 32
 * disabled sort by assignment until it can be fixed
 * fixed a couple bugs
 
-	31
+ 31
 * fixed servants' quarters
 * fixed bugs and typos
 * added preg biometrics collar to RA
 
 2017-03-25
 
-	30
+ 30
 * added anon's filter by assignment option
 * added paternity information to long slave description
 * redid assigning children to the incubator, see the incubator for more details
@@ -6989,207 +6994,207 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-03-24
 
-	29
+ 29
 * applied economy mod fixes
 
-	28
+ 28
 * fixed? saChoosesOwnJob
 * assigned a default eyewear to custom slaves
 
-	27
+ 27
 * applies incubator bugfix
 
-	26
+ 26
 * added economic report mod
 
 2017-03-23
 
-	25
+ 25
 * fixed starting fs issues, hopefully
 
-	24
+ 24
 * bugfixes
 * added smaller breast sizes to PC surgery
 
 2017-03-22
 
-	23
+ 23
 * bugfixes
 * some tweaks to things changed from single instance to week long instances
 * minor FS reactions to certain player appearances
 
-	22
+ 22
 * fixed bugs
 * added numerous vanilla optimizations
 
 2017-03-21
 
-	21
+ 21
 * various bugfixes accumulated today
 
-	20
+ 20
 * couple fixes and tweaks
 
 2017-03-20
 
-	19
+ 19
 * fixed surgery cooldown
 
-	18
+ 18
 * fixed player surgery trapping you in manage personal affairs
 
-	17
+ 17
 * added player surgeries (incomplete)
 * updated anon's nationality weighting mod
 * added pregmodfan's fixes and RA improvements
 
 2017-03-19
 
-	16
+ 16
 * fixed bugs
 * added a catch to arcology acquisition that will hopefully prevent the extra FS bug
 
-	15
+ 15
 * fixed clinic issues
 
 2017-03-18
 
-	14
+ 14
 * bugfixes
 
-	13
+ 13
 * added anon's corp overhaul
 * upped max incubator age to 42
 * updated accordion mod
 
 2017-03-17
 
-	Pregmod updated to 0.9.10.2.
+ Pregmod updated to 0.9.10.2.
 * Restricted nationalities got fixed, nationality percentage anon, please look into the changes, though most of them where just indenting.
 
 2017-03-16
 
-	7
+ 7
 * bugfixes
 * initialization of player surgery variables
 
-	6
+ 6
 * added metallic makeup options
 * fixed bugs
 
-	4
+ 4
 * fixed RESS, "<if" got me again
 
-	Tweaked 4 with some fixes
-	1. Tweak: can change slave drugs and other settings while they are on assignment
-	2. Tweak: when devotion/trust are maxed for a slave, some of the weekly report summary text showing devotion/trust gains will be hidden.
-	3. Tweak: when the arcology has been fully decorated for a future society, weekly summary text showing society approval related to that future society will be suppressed.
-	4. Bug fix: when assigning an ID to a new slave, make sure it isn't already in use
-	5. Bug fix: egyptian preferentialist slave twins acquisition used incorrect relationship ID offset for second slave (-1000) ... because it is coded differently from all other multi-slave acquisition events
-	6. Bug fix: Several $pronounCap tokens changed to $possessiveCap where appropriate.
-	7. Bug fix (?): When buying arcology ownership with reputation, increase value of ownership share same as when buying with cash
-	8. Misc. smaller fixes (typos, missing $'s)
-
-	Pregmod updated to 0.9.10.1.
+ Tweaked 4 with some fixes
+ 1. Tweak: can change slave drugs and other settings while they are on assignment
+ 2. Tweak: when devotion/trust are maxed for a slave, some of the weekly report summary text showing devotion/trust gains will be hidden.
+ 3. Tweak: when the arcology has been fully decorated for a future society, weekly summary text showing society approval related to that future society will be suppressed.
+ 4. Bug fix: when assigning an ID to a new slave, make sure it isn't already in use
+ 5. Bug fix: egyptian preferentialist slave twins acquisition used incorrect relationship ID offset for second slave (-1000) ... because it is coded differently from all other multi-slave acquisition events
+ 6. Bug fix: Several $pronounCap tokens changed to $possessiveCap where appropriate.
+ 7. Bug fix (?): When buying arcology ownership with reputation, increase value of ownership share same as when buying with cash
+ 8. Misc. smaller fixes (typos, missing $'s)
+
+ Pregmod updated to 0.9.10.1.
 * fixed reported bugs and typos
 
 2017-03-15
 
-	4
+ 4
 * many more vanilla updates
 * possibly broke clinic report
 
-	3
+ 3
 * fixed bugs
 * merged anon's brazil mod
 * lowered min player age to 14
 
-	2
+ 2
 * fixed .html version's accordion mod, thanks twine
 
-	Updated to 0.9.10.0
+ Updated to 0.9.10.0
 
 2017-03-14
 
-	3
+ 3
 * some new event tweaks pushed out for testing
 
-	2
-	- >>67338, >>67339 Fixed, though two of the policy bugs are more of just a guess at how they might be handled. Unfinished content and all that.
+ 2
+ - >>67338, >>67339 Fixed, though two of the policy bugs are more of just a guess at how they might be handled. Unfinished content and all that.
 
-	1
-	- >>67334 This should fix it.
+ 1
+ - >>67334 This should fix it.
 
-	0.9.10.0a
+ 0.9.10.0a
 
 2017-03-13
 
-	38
+ 38
 * merged pregmodfan's pregnancy speed mod
 * merged anon's swappable prosthetics and face mod
 
 2017-03-12
 
-	37
+ 37
 * added descriptive elements reflecting player age
 * fixed $PC.birthWeek
 * bugfixes
 
-	36
+ 36
 * tweaked $PC variable compatibility
 
-	35
+ 35
 * revamped player age and aging
 * fixed some bugs
 
-	34
+ 34
 * fixed bugs and typos
 * added an upgrade to the clinic to quickly cleanse slaves of genome damage at the cost of health for the duration
 
-	33
+ 33
 * some little tweaks to incubator content
 * hopefully fixed frailty rendering some slaves immobilized by their imaginary penises
 
 2017-03-11
 
-	32
+ 32
 * fixed starting girls bug
 * tossed in some vanilla bugfixes
 
-	31
+ 31
 * fixed bugs
 * added a, hopefully functional, override to handle starting girls custom origins
 * added gender settings constraints to extended family mode family recruiting
 
-	30
+ 30
 * fixed bugs
 * incubator slaves now start with lower language skills
 
-	29
+ 29
 * touched genetics more and possibly rebroke everything
 * added more naming options, though the PA will still select FS names if available with that naming option
 * fixed custom starting slave descriptions and the add custom descriptions
 * added a toggle for inbreeding
 
-	28
+ 28
 * fixed >>66378
 
-	27
+ 27
 * fixed saRelationships
 * lost temper at saRelationships
 
-	26
+ 26
 * bugfixes
 * more vanilla changes to saRelationships, hope family mode takes it well
 
 2017-03-10
 
-	25
+ 25
 * fixed childgen
 * vanilla bug fixes
 * repop law can now apply to player
 
-	24
+ 24
 * completed new child intro
 * spread frailty around
 * fixed bugs
@@ -7197,451 +7202,451 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-03-09
 
-	22
+ 22
 * fixed a number of bugs and oversights
 
-	20
+ 20
 * child naming looks fully functional
 * small tweaks from vanilla
 
 2017-03-08
 
-	0.9.9.5.
+ 0.9.9.5.
 
-	18
+ 18
 * incubator bug fixes
 * naming closer to finalization
 
-	17
+ 17
 * fixed saRelationships harder
 
-	16
+ 16
 * unrolled back saRelationships
 
-	15
+ 15
 * rolled back saRelationships
 
-	13
+ 13
 * quick fix for slave careers, will only affect children generated after this patch. Mostly just effects and descriptions, nothing huge.
 
 2017-03-07
 
-	12
+ 12
 * incubator moved to beta, no longer restricted by cheatmode
 
 2017-03-06
 
-	11
+ 11
 * many bug fixes and tweaks
 * added ability to buy additional transfer slots for ng+
 
 2017-03-05
 
-	10
+ 10
 * slight improvements to assistant events, nothing major and fully compatible with saves
 
 2017-03-04
 
-	9
+ 9
 * fixed bugs
 * tweaked some RESS events
 
 2017-03-03
 
-	0.9.9.4
+ 0.9.9.4
 * added some more options for a slave to choose from when selecting her own clothes
 * made a toggle for eugenics society devoted slaves to choose their own level of chastity, since that did need work. Also removed it from normal clothes selection.
 * fixed bugs
 * updated some slavegen
 * fixed >>64439
 
-	0.9.9.3
+ 0.9.9.3
 
-	7
+ 7
 
-	0.9.9.2
+ 0.9.9.2
 
-	6
+ 6
 * fixed >>64194
 
-	5
+ 5
 * small improvements
 
 2017-03-02
 
-	4
+ 4
 * fixed, extended families
 
-	3
+ 3
 * fixed >>63968
 
-	0.9.9.1
+ 0.9.9.1
 
-	0.9.9.0
+ 0.9.9.0
 * many changes to ng+ and how the pc is handled
 * adjusted 6 & 7 FS unlock values
 
 2017-02-26
 
-	27
+ 27
 * fixed many bugs
 * however >>63027 and >>63096 are still at large
 
 2017-02-25
 
-	26
+ 26
 * fixed, "DairyRestraintsSetting(2)" should not be visible in front of the description of my dairy.
 
-	25
+ 25
 * experimental fix for >>62727
 
 2017-02-24
 
-	24
+ 24
 * fixed slaveInteract.tw
-		@@ -620,6 +620,7 @@ Contraception: <span id="fertility"><strong><<if $activeSlave.preg is -1>><<
-		<</if>>
-		<</if>>
-		<</if>>
-		+<</if>>
-		</span>
-		<<if $propOutcome == 1>>
+  @@ -620,6 +620,7 @@ Contraception: <span id="fertility"><strong><<if $activeSlave.preg is -1>><<
+  <</if>>
+  <</if>>
+  <</if>>
+  +<</if>>
+  </span>
+  <<if $propOutcome == 1>>
 * fixed, all my slaves. it says "She is not fertile with Error: cannot find a closing tag for macro <<if>> in <<if $incubator > 0 >>
 
-	23
+ 23
 * fixed reported bugs except for >>62509
 
 2017-02-20
 
-	19
+ 19
 * commenting is hard
 
-	18
+ 18
 * temporarily disabled brother checks to prevent duplication
 
-	17
+ 17
 * fixed introduced extended-extended family mode bugs
 * moved said descriptions from long slave description to pregmod widgets to prevent issues with vanilla updates.
 
 2017-02-19
 
-	16
+ 16
 * fixes parental id's
 
-	15
+ 15
 * added some compatibility hooks
 * fixed some bugs
 * added extended-extended family mod
 * added vanilla bug fixes
 
-	14
+ 14
 * fixed bugs, but need to look at relative recruiters still
 
-	13
+ 13
 * fixed, can't impregnate a slave with another. Just a wall of Red text "Error: <<if>>: bad conditional expression in <<if>> clause: slave is not defined"
 
-	12
+ 12
 * fixed erroneous $familyTest fixing slave interact issues and enabling two dSlaveDatabase additions
 * felt stupid
 * fixed new bug in fRelation
 
-	11
+ 11
 * bugfixes
 * implemented new javascript to hopefully fix existing issues
 
 2017-02-18
 
-	10
+ 10
 * tweaked saRecruitGirls more
 
 2017-02-17
 
-	9
+ 9
 * fixed recruiting harder
 
-	8
+ 8
 * fixed bugs
 * implemented genetics tracking system
 
-	7
+ 7
 * fixed contraceptive bug
 
-	6
+ 6
 * various bugfixes
 
 2017-02-16
 
-	5
+ 5
 * fixed some bugs
 * more compatibility for vanilla to pregmod ng+
 
 2017-02-15
 
-	4
+ 4
 * possibly fixed $rep bug
 
-	3
+ 3
 * fixed >>60110
 
-	0.9.8.1
+ 0.9.8.1
 * preliminary integration of anon's animal pregnancy mod, not functional yet
 
 2017-02-14
 
-	0.9.8.0
+ 0.9.8.0
 
 2014-02-13
 
-	9
+ 9
 * added incubation facility
 * integrated anon's HG impregnation exclusion toggle
 * fixed bugs including >>59683 and >>59598
 
 2017-02-12
 
-	8
+ 8
 * fixed many reported bugs, save for the walkpast bug that is still eluding me
 * added several vanilla bugfixes
 * added >>59368
 
 2017-02-11
 
-	7
+ 7
 * fixed relative recruits cloning over their recruiter
 * fixed that futa starting girls bug again, and this time it's synced I swear
 
-	4
+ 4
 * added >>59138
 
-	6
+ 6
 * Fixed >>59174 ( missing a $ when setting headgirl to soften).
 
-	0.9.7.2
-	0.9.7.1
+ 0.9.7.2
+ 0.9.7.1
 
 2017-02-10
 
-	6
+ 6
 * updated to vanilla github
 * fixed more bugs
 
-	2
+ 2
 * fixed bugs
 * Fuckdolls can now use pregmod added diets
 
-	1
+ 1
 * fixed >>58858
 
-	0.9.7.0
+ 0.9.7.0
 * vanilla content only
 
 2017-02-09
 
-	5
+ 5
 * updated with vanilla bugfixes
 
-	4
+ 4
 * fixed bugs
 * did extra fixing to fAbuse
 
-	3
+ 3
 * added new two slave recruitment events
 * fixed bugs
 
-	2
+ 2
 * fixed randomize attraction widget bug
 
-	1
+ 1
 * updated to vanilla github
 * fixed bugs
 
 2017-02-07
 
-	13
+ 13
 * completed and enabled relative recruiter events for extended family mode
 * made extended family mode ng+ compatible
 * bugfixes
 
 2017-02-06
 
-	12
+ 12
 * fixed bugs
 * included starting herm fertility fix
 
 2017-02-05
 
-	11
+ 11
 * added organ farm upgrades to decrease time it takes to grow organs
 
-	10
+ 10
 * tweaked butt beauty values
 * hopefully fixed egyptian revivalist issues
 
 2017-02-04
 
-	9
-	0.9.6.5
+ 9
+ 0.9.6.5
 
 2017-02-03
 
-	8
+ 8
 * couple bugfixes
 * added the new pube style to the RA
 
 2017-02-02
 
-	7
+ 7
 * fixed bugs
 
-	6
+ 6
 * fixed typos and bugs
 * reenabled self impregnation
 
 2017-02-01
 
-	5
+ 5
 * waged war against starting girls and managed to make a button to resync height with age
 * added origins for all careers if the slave is your child
 * and had to bar players from being both their father and mother
 * added lolimode toggle to game start summary
 * fixed a bunch of improper slave name calls in the recruiter content
 
-	0.9.6.2
+ 0.9.6.2
 * added a pair of hero slaves under extended family mode that I found tucked away in a passage. Odds are they were never implemented due to an inability to make sibling hero slaves.
 * completely forgot to make lolimode a start menu toggle
 
 2017-01-31
 
-	9
+ 9
 * extended family mode now allows for full control of starting slaves mother ID and father ID.
 * bug fixes
 
-	3
+ 3
 * added a bushy in the front, clean in the back pubic hair style
 * fixed bugs
 
-	0.9.6.1
+ 0.9.6.1
 * updated matchmaking to pregmod's content
 
-	0.9.6.0
+ 0.9.6.0
 
 2017-01-30
 
-	8 - family test
+ 8 - family test
 * beta version of the new family system
 
 2017-01-28
 
-	7
+ 7
 * bugfixes, including anon's fixes
 
-	0.9.5.4
+ 0.9.5.4
 * integrated >>56001
 * more work on relations, not ready for play yet
 
 2017-01-27
 
-	0.9.5.3
+ 0.9.5.3
 * fixes $rep issues,
 * added, able to play matchmaker and take two emotionally bonded slaves to you and put them in a relationship with each other.
 
 2017-01-26
 
-	4
+ 4
 * updated milk quantity calcs
 * nerfed flesh heap
 * kidnappers market now requires 500 rep to access
 
-	3
+ 3
 * fixed reported bugs
 
 2017-01-25
 
-	2
+ 2
 * most new 0.9.5.0 changes are now accounted for
-	-20% chance of white girls coming out of zimbabwe
+ -20% chance of white girls coming out of zimbabwe
 
-	0.9.5.2
+ 0.9.5.2
 * integrated anon's japan start mod
 
 2017-01-23
 
-	17
+ 17
 * fixed bugs
 
-	16
+ 16
 * fixed missing RA defaults
 
-	15
+ 15
 * fixed bugs
 * applied youth pref research to neighbor youth pref societies
 
 2017-01-19
 
-	14
+ 14
 * fixed age related issues in some hero slaves
 * autosurgery now correctly lowers visual age when applying an age lift
 * reduced visual on event slaves that have age lifts, all two of them.
 
 2017-01-18
 
-	13
+ 13
 * restricted minimum retirement age at game start to 25
 
 2017-01-17
 
-	12
+ 12
 * quick bugfixes
 
-	11
+ 11
 * implanted reproductive organs now work immediately if precocious puberty is off, otherwise the slave will go through the appropriate puberty within a year if relevant.
 
-	10
+ 10
 * tweaked libidos and nymphomania
 
 2017-01-16
 
-	9
+ 9
 * added starting option to set initial retirement age
 
 2017-01-15
 
-	8
+ 8
 * added a new slave market
 * removed age limiters on other slave markets
 * added a new partially subterranean arcology location
 
 2017-01-14
 
-	7
+ 7
 * more event/desc tweaks
 
-	0.9.4.3
+ 0.9.4.3
 * various little tweaks and fixes
 
 2017-01-13
 
-	4
+ 4
 * fixed SE Birth and slavemarkets
 
-	0.9.4.2
+ 0.9.4.2
 * fixed $cash bug
 
 2017-01-12
 
-	0.9.4.1
-	0.9.4.0
+ 0.9.4.1
+ 0.9.4.0
 * integrated >>53201
 * added first half of the youth pref research (anti-aging cream)
 
 2017-01-09
 
-	14
+ 14
 * bugfixes
 
 2017-01-07
 
-	13
+ 13
 * finished new age descriptions
 * added a new physical age retirement
 * increased upper bounds on age/birth retirements
@@ -7649,184 +7654,184 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2017-01-06
 
-	12
+ 12
 * various age bugfixes
 
 2017-01-05
 
-	Pregmod beta 2
+ Pregmod beta 2
 * fixed hero slaves
 
 2017-01-02
 
-	10
+ 10
 * fixed bad conditional expression in <<if>> clause Unexpected token with a slave who has P-Limbs/
 
 2017-01-01
 
-	9
+ 9
 * fixed bugs, oversights and typos
 
 2016-12-31
 
-	8
+ 8
 * fixed, which anal addicts won't be satisfied with long, huge butt plugs, only huge plugs.
 * fixed, Error: <<CorsetPiercingDescription>>: errors within widget contents (Error: cannot find a closing tag for macro <<if>>; Error: child tag <<else>> was found outside of a call to its parent macro <<if>>)
 
-	7
+ 7
 * some event tweaks
 
 2016-12-30
 
-	6
+ 6
 * fixed bugs
 * more efforts to wrangle "Long Slave Description"
 
 2016-12-29
 
-	0.9.3.1
+ 0.9.3.1
 * added prostate implant to increase load size
 * implemented phase one of cleaning "Long Slave Description"
 
 2016-12-28
 
-	4
+ 4
 * tweaks to some slave intro scenes to accommodate amp slaves
 * bugfixes
 
-	3
+ 3
 * fixed bugs
 
 2016-12-27
 
-	2
+ 2
 * connected new corp changes with Repop and Eugenics neighbors
 
-	0.9.3.0
+ 0.9.3.0
 
 2016-12-26
 
-	17
+ 17
 * added more player customization for future additions
 * fixed bugs and typos
 * corrected amp armpit hair descriptions
 
-	16
+ 16
 * fixed eugenics bugs and oversights
 * added underarm hair
 
 2016-12-25
 
-	15
+ 15
 * bugfixes
 
-	14
+ 14
 * added a couple more slave acquisition event loli variants
 * fixed bugs
 
-	13
+ 13
 * small tweaks
 * fixed the RA diets that got lost between updates
 
 2016-12-24
 
-	12
+ 12
 * added puberty controls to starting girls
 * expanded refreshments
 * fixed oversights, bugs, etc
 
 2016-12-23
 
-	11
+ 11
 * fixed, >>49934
 
-	10
+ 10
 * fixed reported bugs
 
-	9
+ 9
 * completed Eugenics Breeding Proposal
 * added femPC involvement in eugenics
 * fixed some bugs and typos
 
 2016-12-22
 
-	8
+ 8
 * fixed >>49650
 
 2016-12-21
 
-	7
+ 7
 * integrated bugfix patch into main branch
 * fixed some more bugs
 
-	5
+ 5
 * added basic scar framework
 * added some of Qotsafan's improvements
 
-	4
+ 4
 * fixed bugs
 
-	0.9.2.1
+ 0.9.2.1
 * added anon's gang leader start
 
 2016-12-20
 
-	2
+ 2
 * finished adding missing content
 
-	0.9.2.0
+ 0.9.2.0
 
 2016-12-18
 
-	11
+ 11
 * fixed market assistant event
 
-	10
+ 10
 * integrated supplied changes
 * tweaked hips surgery
 
 2016-12-19
 
-	13
+ 13
 * fixed, increased the costs when the policy is implemented, but kept the original costs in the reductions. That means that in the event that someone cancels one of these policies, they'll end up with a permanent increase in prices.
-	e.g. Activating Quality Beauty increases costs by 10,000, but canceling it drops the cost by only 2,000.
+ e.g. Activating Quality Beauty increases costs by 10,000, but canceling it drops the cost by only 2,000.
 
-	12
+ 12
 * integrated new policies
 * added seven new accessories of rather long sizes
 * tweaked several things
 
 2016-12-16
 
-	8
+ 8
 * fixed some bugs, including twins purchasing bug
 
-	0.9.1.3
+ 0.9.1.3
 * completed player birth
 
-	0.9.1.4
+ 0.9.1.4
 
 2016-12-15
 
-	6
+ 6
 * integrated >>48519
 * tweaked pregmod related $seeDicks calls to be in line with new system
 
-	5
+ 5
 * added additional security to prevent $traitor.slaveName from getting you (fixed the bug)
 * fixed >>48449
 
-	4
+ 4
 * fixed, >>48436 and >>48438 - Both should be fixed now. Though snatch and grab needs to be updated a bit.
 
-	3
+ 3
 * bugfixes
 
-	0.9.1.2
+ 0.9.1.2
 
 2016-12-14
 
-	0.9.1.1
+ 0.9.1.1
 * added player pregnancy
 * merged >>48171
 * merged the FAbuse bodyguard changes provided earlier
@@ -7834,18 +7839,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2016-12-11
 
-	20
+ 20
 * possibly fixed >>47447
 * added >>47416 >>47417 's flavor text with some tweaking.
 
 2016-12-10
 
-	19
+ 19
 * fixed the horribly broken glossary
 * fixed a bug with transformation fetishist FS that has been around since the teeth changes
 * fixed a few grammar things and missing descriptions.
 
-	18
+ 18
 * added abdominal implants
 * refactored belly sag gain/loss
 * optimized "Surgery Degradation"
@@ -7855,107 +7860,107 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2016-12-07
 
-	17
+ 17
 * added breast lifts for fixing saggy tits
 * added breast reconstruction for making them more attractive
 
-	16
+ 16
 * added new belly descriptions for fatties
 * added XX, XY, and XXY diets to RA
 * fixed bugs
 
 2016-12-01
 
-	4
+ 4
 * fixed >>45601
 
-	3
+ 3
 * fixed bugs
 * finished recruiter FS things
 
-	0.9.0.0
+ 0.9.0.0
 * added slave puberty
 * added several new rival types
 
 2016-11-25
 
-	33
+ 33
 * integrated >>44195
 * fixed bugs
 
 2016-11-24
 
-	32
+ 32
 * fixed some bugs
 * fixed >>44069
 
-	31
+ 31
 * fixed a potentially dire bug with baby number generation
 
-	30
+ 30
 * fixed advertisements
 
-	29
+ 29
 * added conception condition for your concubine, she will only randomly conceive your children, if appropriate
 * fixed bugs
 
 2016-11-23
 
-	28
+ 28
 * hopefully fixed overaged slaves once and for all
 * forgot to mention that several patches ago added hyper drug compatibility to dairy growth if they are available
 
-	27
+ 27
 * added compatibility for saves from versions below v24, should default the FS max to 4.
 
-	26
+ 26
 * fixed reported bugs
 * fixed multiple issues with dairy cum inflation
 
-	24
+ 24
 * added dairy restrictions for slaves with pregnancy blocking/causing implants
 * added starting option to choose between a final count of 4-7 future societies
 
 2016-11-22
 
-	23
+ 23
 * added hyper drug support to industrial dairy
 * fixed bugs
 
-	22
+ 22
 * added hyperpreg settings for industrial dairy
 * added to the options menu the ability to change your custom title
 * fixed many little bugs
 
 2016-11-20
 
-	21
+ 21
 * added spa options to forbid an Attendant from trying to fix mindbroken and/or flaws
 * fixed bugs
 
-	20
+ 20
 * fixed more reported bugs and oddities
 * fixed some of the "hero slaves"
 * found more places to implement new birth counting variable
 
-	19
+ 19
 * fixed reported bugs
 
-	18
+ 18
 * reworked slave births tracking, though it might not work with starting slaves.
 * fixed some minor bugs
 
 2016-11-18
 
-	17
+ 17
 * slaves no longer give birth to the end of days
 * also fixed male lactation bugs that have been a thing for who knows how long
 
-	16
+ 16
 * fixes
 * now doesn't require a new save
 
-	15
+ 15
 * more inflation catches
 * fixed loli advertising bug
 * added pregnancy advertisement options to the club/brothel, I think they work
@@ -7963,371 +7968,371 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 2016-11-16
 
-	14
+ 14
 * tweaked some breast descriptions and belly descriptions for consistency
 * patched oversights and other things with the inflation framework
 
 2016-11-15
 
-	13
+ 13
 * fixed more bugs
 
-	12
+ 12
 * fixed inflation oversights
 * expanded age ranges for club/brothel advertisements
 * added player aging
 
 2016-11-14
 
-	11
+ 11
 * fixed inconsistent recruitment events >>42249
 * replaced all overlooked calls for the removed "Clothing Birth"
 * several other small fixes
 
 2016-11-13
 
-	10
+ 10
 * fixed bugs
 * force-feeding scene is half done, only works for milk right now
 
 2016-11-12
 
-	9
+ 9
 * bugfixes
-	- >>42010 Integrated this.
+ - >>42010 Integrated this.
 
-	7
+ 7
 * overhauled fertility checks (major change)
 * added more variety to slave careers, especially younger
 * changed how $agePenalty works, instead of just removing the age check from headgirls, it now allows educated careers to generate at slightly lower ages as opposed to 24+ only.
 * more clothing descriptions for larger busts, also fixed inconsistencies with some pregnancy descriptions
 * slaves can now become recognized for starring in porn while pregnant
 
-	0.8.12.5
+ 0.8.12.5
 
 2016-11-11
 
-	0.8.12.4
+ 0.8.12.4
 * expanded potential gifts from that gift event as well as altered how it selects shape
 * RESS preg + blind work completed
 * breeders now get pissy about wearing fake bellies
 
 2016-11-10
 
-	0.8.12.3
+ 0.8.12.3
 * fixed bugs and more typos
 * made sure to cover slave graves in cement to prevent slaves that died in childbirth from roaming your penthouse
 
-	0.8.12.2
+ 0.8.12.2
 * just bugfixes
 
 2016-11-09
 
-	3
+ 3
 * recalculated cum quantities needed for slave on slave inflation
 * fixed more bugs and typos
 
-	2
+ 2
 * paraphilias hooked up to pregmod content
 * servant background's upkeep reduction now functional
 * fixed some bugs and typos
 
-	0.8.12.1
+ 0.8.12.1
 * framework for using another slave as the inflation source implemented, scene is still WIP
 
 2016-11-07
 
-	7
+ 7
 * added some flavor text to concubines in the end week report if they won a legendary slave event.
 * attached the recently added custom title lisping feature to the starting options because what is the point of having it scattered throughout the entire game without hooking it up?
 
 2016-11-06
 
-	6
+ 6
 * added force-feeding scene in place of WIP
 * began laying foundation for using another slave as inflation source
 * made induce clear that is doing something.
 
 2016-10-28
 
-	6
+ 6
 * Integrated anon's new nationalities and nicknames
 * repop law now does something other than cost you money
 * eugenics now increases prosperity gains
 * implemented a brothel assignment scene that I found in the code
 * fixed bugs
 
-	0.8.10.3
+ 0.8.10.3
 
 2016-10-27
 
-	4
+ 4
 * fixed aging bug, also fixed a short blurb about it being her birthday that never procs.
 * fixed rogue slave interact $slaves[$i] that were causing trouble.
 
-	0.8.10.2
+ 0.8.10.2
 * fixed bugs and got annoyed by the sheer lack of custom title support.
 
 2016-10-26
 
-	2
+ 2
 * fixed prosthetics and hostage event.
 
-	0.8.10.1
+ 0.8.10.1
 * extended FS research to neighboring arcologies, they can now develop said research and begin selling slaves using it.
 * added another new PC career choice
 * added other things that I completely forgot about after losing roughly 15 passages in the update and having to sort out the desync that caused.
 
 2016-10-23
 
-	12
+ 12
 * fixed >>37626 .
 
-	11
+ 11
 * fixed overlooked slave interact conditions for testicle enhancement and impregnation
 
-	10
+ 10
 * you should now be able to preemptively craft artificial limbs
 * your nurse can now prevent pregnancy generator removal from breaking pregnancy fetishists
 * testicle and hyper testicle enhancement can now be left on to enhance cum production
 
 2016-10-22
 
-	9
+ 9
 * integrated anon's clit surgeries
 * completed and allowed gender radicalist research (implantable anal womb)
 
-	8
+ 8
 * fixes >>37147 .
 
-	0.8.9.3
+ 0.8.9.3
 * added anon's fairy assistant
 
 2016-10-20
 
-	5
+ 5
 * readded semi-aging option from old options mod; if your slaves experience multiple birthdays in a row, it's a vanilla bug I think.
 
-	0.8.9.2
+ 0.8.9.2
 * separated male and female fertility
 * SE birth is broken in vanilla so expect 0.8.9.3 tomorrow.
 * may have added some femdom scenes for femPCs
 
 2016-10-19
 
-	3.1
+ 3.1
 * less testing labels.
 
-	3
+ 3
 * SE birth doesn't need to loop back into scheduled events anymore since it is now combining all the births into a single event, thus I can just attach AS Dump to $nextLink and pretend SE birth hasn't become something beyond understanding.
 * Though that still doesn't explain how $activeSlave can hold more than one slave, but hey, at least random events shouldn't possibly be able to interfere with its changes maybe.
 
-	0.8.9.1
+ 0.8.9.1
 
 2016-10-18
 
-	0.8.9.0
+ 0.8.9.0
 * biggest change will be a rough draft of the loli aging code
 
 2016-10-16
 
-	11
+ 11
 * fixed reported bugs
 
-	10
+ 10
 * Fixed broodmother bug and removed impregnation devotion exploit.
 * Fixing the limbs is going to be a piece of work, for what ever their weeks to completion won't move so I'm going to have to track what isn't updating right.
 
-	9
+ 9
 * fixed >>35509 (bowties and Egyptian necklaces too).
 
-	8
+ 8
 * SE Birth v4
 
 2016-10-15
 
-	7
+ 7
 * yet more bug fixes including >>35400 and >>35291
 
-	0.8.8.2
+ 0.8.8.2
 * A lot of rollbacks in 0.8.8.2 and as such some of the content added with 0.8.8.0 got lost. Also tons of conditional expressions changed back that I have a feeling are going to get swapped right back.
 * Almost feels like all the content modders aren't on the same page.
 
 2016-10-14
 
-	5
+ 5
 * mostly just bug fixes again, though good work finding them
 * also updated the documentation I use for slaves
 
-	4
+ 4
 * more bug fixes
 
-	3
+ 3
 * added some more birth scenes
 * spellchecked things, boy they needed it
 * added physical/mental birth/pregnancy effects
 * bug fixes
 
-	2
+ 2
 * Mostly just bug fixes.
 
 2016-10-13
 
-	0.8.8.1
+ 0.8.8.1
 * added new nicknames
 * cleaned up SE birth some more
 * changed around 20000 conditional expressions when I could have just left them as is.
 
 2016-10-10
 
-	Pregmod WIP.
+ Pregmod WIP.
 * reenabled immobilization after getting it working right
 * SE birth v2, note there are now birth complications
 * added a new player origin, currently undergoing balancing as the rep loss may be too high
 
 2016-10-07
 
-	5
+ 5
 * Added more to hostage corruption
 * rebalanced the war again (more favorable to you)
 * fixed retirement collars
 * fixed dispensary bugs
 * fixed spa, clinic, and cellblock not swapping to bought in manage arcology
 
-	4
+ 4
 * Hopefully this one fixes things, though it can not undo the age issue.
 * Also learned that I should never use variables in random(), ever.
 
 2016-10-06
 
-	3
+ 3
 * Hostage corruption should now work correctly.
 
-	2
+ 2
 * Fixed forgotten age description code.
 
-	0.8.7.1
+ 0.8.7.1
 * You know it's a slow week when your biggest patch note is XY slaves now have scrotum generation.
 
 2016-10-03
 
-	Pregmod WIP
+ Pregmod WIP
 * Reworked rival-hostage event to center around corruption, the hostage will become more degenerate/broken as the war drags on.
 * fixed eugenics ball bug
 * fixed doubled surgery
 
 2016-09-30
 
-	0.8.6.7
+ 0.8.6.7
 * hopefully fixed rival age bug
 
 2016-09-28
 
-	0.8.6.5
+ 0.8.6.5
 * added hyper butt drugs
 * added additional immobile conditions, which may cause trouble for now
 * added more content to "Eugenics" FS
 
 2016-09-25
 
-	9
+ 9
 * Fixed dairy and an infinite loop in slave impregnation.
 
-	7
+ 7
 * fixed "new slave intro", removed accidentally added canSee(), and added summary exceptions for slaves younger than fertility age.
 
 2016-09-24
 
-	6
+ 6
 * fixed, selling a slave causes every event to trigger.
 
-	5
+ 5
 * birth should now, hopefully, work right.
 
-	0.8.6.3
+ 0.8.6.3
 * Biggest change is most likely just birth tinkering so immobile slaves don't pop the amp birth scenes.
 
 2016-09-23
 
-	0.8.6.2
+ 0.8.6.2
 * added a new FS focused on eugenics and society's top citizens.
 * added the random father impregnation code, your slaves will now randomly impregnate each other when appropriate.
 
 2016-09-19
 
-	Pregmod + lolimod 0.8.5.3 WIP
+ Pregmod + lolimod 0.8.5.3 WIP
 * support for blind slaves
 * support for larger tits in fondle boobs and fuck boobs
 
 2016-09-17
 
-	4
+ 4
 * fixed more bugs
 
 2016-09-15
 
-	3
+ 3
 * fixed shit
 
-	0.8.5.3
+ 0.8.5.3
 
 2016-09-14
 
-	0.8.5.2
+ 0.8.5.2
 * added full broodmother support to the new birth system, complete with their own variants
 * added missing PA appearances in some events
 * other things I forgot after the update failed last week
 
 2016-09-03
 
-	0.8.3.4
+ 0.8.3.4
 
-	2
+ 2
 * fixed missing <</nobr>> in new birth code
 * fixed potential conflicts with dairy births
 
 2016-08-28
 
-	6
+ 6
 * All forms of impregnation now adhere to fertility effects.
 
 2016-08-27
 
-	5
+ 5
 * Birth count tattoo and FS recruitment event fixed.
 
-	4
+ 4
 * now with less PA appearance being replaced with events.
 
 2016-08-25
 
-	0.8.2.2
+ 0.8.2.2
 * a new type of breast implant.
 * disabled the penitent nun's habit in the walk past code as it refused to not throw errors, traced it to <<case>> not tolerating '.
 
 2016-08-21
 
-	0.8.1.4
+ 0.8.1.4
 * rules assistant should be able to handle any degree of fertility
 * laid framework for pregnancy accessibility
 
-	2
+ 2
 * fixed pregnancy libido spam
 * added pregnancy accessibility improvement akin to the huge breast accessibility
 
 
 2016-08-11
 
-	0.8.0.2
+ 0.8.0.2
 * Personal assistant will now take after a supremacist FS's chosen race.
 * Added libido gain/loss during pregnancy.
 
-	3
+ 3
 * fixed pregnancy libido.
 
 2016-08-04
 
-	0.7.11.2
+ 0.7.11.2
 * FS assistant appearances now selectable via assistant appearance options
 * implemented provided rules assistant fix
 * fixed concubine not receiving master suite drug settings
@@ -8342,32 +8347,32 @@ Experimental build
 
 2016-07-28
 
-	0.7.10.3
+ 0.7.10.3
 
 2016-07-21
 
-	0.7.9.4
+ 0.7.9.4
 * Added interactions between facility heads and relatives/relations/rivals/legendary slaves
 * fixed several bugs and more typos
 
 2016-07-20
 
-	0.7.9.3
+ 0.7.9.3
 * fixed some bugs and typos while updating
-	Slave Documentation:
+ Slave Documentation:
 * added new hair and eye colors from 0.7.9.0
 
 
 2016-07-18
 
-	Pregmod first release!
+ Pregmod first release!
 * pregnancy clothing descriptions
 * hyperpregnancy (avoidable)(extreme content)
 * future society focused on pregnancy
-	-2 new clothing options
-	-1 new accessory
-	-3 new assistant appearances
-	-2 new brothel upgrades for expansionist societies
+ -2 new clothing options
+ -1 new accessory
+ -3 new assistant appearances
+ -2 new brothel upgrades for expansionist societies
 * new slave descriptions (optional)
 * reworked master suite to report on your harem (optional)
 * Added a means to buy FS exclusive clothes and accessories
@@ -8382,59 +8387,59 @@ Security Expansion (Officially integrated into Pregmod since 0.10.7.1 v153, 11/2
 PregmodBase v139
 2017-11-20
 
-	14.2
+ 14.2
 * fixes
 * balance
 * very satisfying version number.
 
 2017-11-18
 
-	14.1
+ 14.1
 * fixes
 
-	14
+ 14
 * fixes
 * spell checked attack report. My god was is bad.
 
 PregmodBase v137
 
-	13.9
+ 13.9
 * fixes (couple of)
 
-	13.8
-	-(maybe) fixed >>142732
+ 13.8
+ -(maybe) fixed >>142732
 
-	13.7
+ 13.7
 * balance
-	-(maybe) fix for battle terrain not showing up.
+ -(maybe) fix for battle terrain not showing up.
 
 2017-11-17
 
 PregmodBase v136
-	13.6
+ 13.6
 * fixes
 
 PregmodBase v135
-	13.4
+ 13.4
 * fixes
 * balance
 * difficulty settings
 
 2017-11-16
 
-	13.4
+ 13.4
 * fixed >>142293 (Attack value NaN during major battle)
 
-	13.3
+ 13.3
 * fixes
 
-	13.1
+ 13.1
 * fixes
 * balance
 
 2017-11-15
 
-	13
+ 13
 * fixes
 * balance
 
@@ -8442,20 +8447,20 @@ PregmodBase v135
 
 PregmodBase v132
 
-	12.9
+ 12.9
 * fixes
 
-	12.8
+ 12.8
 * fixes
 * balance
 
-	12.6
+ 12.6
 * fixes
 * anon's stuff
 
 PregmodBase v130
 
-	12.5
+ 12.5
 * fixes
 * SFanon stuff
 * balance
@@ -8464,29 +8469,29 @@ PregmodBase v130
 
 PregmodBase v126
 
-	12.4
+ 12.4
 
 PregmodBase v125
 
-	12.3
+ 12.3
 * fixes
 * SFanon additions
 * balance
 
 2017-11-12
 
-	12
+ 12
 * fixes
 * transport hub and trade
 * balance
 
 PregmodBase v124
 
-	11.6
+ 11.6
 * fixed reported issues
 * balance
 
-	11.5
+ 11.5
 * fixes
 * balance
 
@@ -8494,25 +8499,25 @@ PregmodBase v124
 
 PregmodBase v122
 
-	11.2
+ 11.2
 * fixes
 * extra options
 
-	11.1
+ 11.1
 
-	11
+ 11
 * fixes
 * proclamations
 * balance
 
 PregmodBase v121
 
-	10.2
+ 10.2
 * fixes
 
 2017-11-10
 
-	10
+ 10
 * fixes
 * weapons manufacturing
 * balance
@@ -8521,77 +8526,77 @@ PregmodBase v121
 
 PregmodBase v119
 
-	9.6
+ 9.6
 * small fixes
 
 2017-11-07
 
 PregmodBase v115
 
-	9.6
+ 9.6
 * fixes
 * loyalty work
 
 PregmodBase v114/Pregmod v114.1
 
-	9.2
+ 9.2
 * small fixes
 * new edicts
 * new units upgrade
 * new barracks upgrade
 
-	8.8
+ 8.8
 * fixes
 
 2017-11-06
 
 PregmodBase v113
 
-	8.7
+ 8.7
 * fixed reported issue maybe pretty please?
 
-	8.6
+ 8.6
 * fixes
 
 2017-11-05
 
-	8.5
+ 8.5
 * fixes
 * rebellions
 
 2017-11-03
 
-	8
+ 8
 * various fixes
 * balance
 * rebellions
 
 2017-11-01
 
-	7.7
+ 7.7
 
-	7.6
+ 7.6
 * fixed reported issue
 * balance adjustments (run backward compatibility to apply them)
 
-	7.5
+ 7.5
 
 2017-10-29
 
-	7.1
+ 7.1
 * fixes
 * couple of balance adjustments.
 
 2017-10-28
 
-	7
+ 7
 * SFanon additions
 * fixes
 * balance
 
 2017-10-24
 
-	6
+ 6
 * balance adjustments
 * fixed improper name assignment
 * added renaming of units
@@ -8601,12 +8606,12 @@ PregmodBase v113
 
 2017-10-22
 
-	5
+ 5
 
 2017-10-18
 
-	3
-	1
+ 3
+ 1
 
 
 Lolimod (may have some pregmod and optionsmod stuff mixed with it)
@@ -8614,145 +8619,145 @@ Lolimod (may have some pregmod and optionsmod stuff mixed with it)
 New Lolimod - not incorporated
 
 2016-10-06
-	0.8.7.1
+ 0.8.7.1
 
 2016-10-03
-	0.8.6.7
-	In this update, loli nicknames are back, retirement age can be set lower in policies, and you can now pursue up to 6 FS directions!
+ 0.8.6.7
+ In this update, loli nicknames are back, retirement age can be set lower in policies, and you can now pursue up to 6 FS directions!
 
 2016-09-21
 
-	2
-	With the 2 bugfixes applied
+ 2
+ With the 2 bugfixes applied
 
-	0.8.6.1
+ 0.8.6.1
 
 2016-09-18
-	0.8.5.3
+ 0.8.5.3
 
 last known lolimod merge - 2016-08-30
-	0.8.3.1
+ 0.8.3.1
 
 2016-08-23
-	0.8.2.1
-	0.8.2.0
+ 0.8.2.1
+ 0.8.2.0
 
 2016-08-19
-	0.8.1.4
+ 0.8.1.4
 
 2016-08-16
-	0.8.1.3
-	- The "disable age penalties for jobs" submod now has a mechanical effect rather than just changing messages.
-	- The long-standing change that allows slaves without balls but with artificial male hormone injections to experience erections has been added in some places where it was missing. In the process a vanilla bug in "SA serve your other slaves" where the wrong slave's attributes were being checked was corrected.
-	- Fixed the "flaws her mouth" silliness that somehow snuck back in from the base game. (It should be "quirks her mouth" so it was probably the victim of Replace All.)
-	- Incorporates a fix posted on halfchan for the "force her to rape herself" option for new slaves not appearing.
-	- Fixed one place in the game where a slave could refer to young slave as a "teenager" although she might be preteen.
-
-	0.8.1.3.1
+ 0.8.1.3
+ - The "disable age penalties for jobs" submod now has a mechanical effect rather than just changing messages.
+ - The long-standing change that allows slaves without balls but with artificial male hormone injections to experience erections has been added in some places where it was missing. In the process a vanilla bug in "SA serve your other slaves" where the wrong slave's attributes were being checked was corrected.
+ - Fixed the "flaws her mouth" silliness that somehow snuck back in from the base game. (It should be "quirks her mouth" so it was probably the victim of Replace All.)
+ - Incorporates a fix posted on halfchan for the "force her to rape herself" option for new slaves not appearing.
+ - Fixed one place in the game where a slave could refer to young slave as a "teenager" although she might be preteen.
+
+ 0.8.1.3.1
 * Fix for a variable name in "ask her about her feelings."
 
 2016-08-09
-	0.8.0.2
+ 0.8.0.2
 * with correct high adjustments.
 
 2016-08-03
-	0.7.11.2
+ 0.7.11.2
 
 2016-07-28
-	0.7.10.2
+ 0.7.10.2
 * Also includes a temporary fix for a bug that I expect will be corrected in the next hot fix
 
 2016-07-27
-	0.7.10.1
+ 0.7.10.1
 * Redesigned buying other FS clothing, it is now found under a new subsection of Manage Arcology.
 * fixed bugs and typos
 
-		- >>20506, >>20508 Okay, this bug should finally be fixed. Also tweaked loli nicknames a bit.
+  - >>20506, >>20508 Okay, this bug should finally be fixed. Also tweaked loli nicknames a bit.
 
-	0.7.10.0
+ 0.7.10.0
 * making the new recruitment events use the age settings.
 
 2016-07-21
-	0.7.9.4
+ 0.7.9.4
 
 2016-07-19
-	0.7.9.3
-	0.7.9.2
-	0.7.9.1
+ 0.7.9.3
+ 0.7.9.2
+ 0.7.9.1
 
 2016-07-13
-	0.7.8.1
+ 0.7.8.1
 
 2016-07-12
-	0.7.8.0
+ 0.7.8.0
 
 2016-07-07
-	0.7.7.3
-	0.7.7.2
+ 0.7.7.3
+ 0.7.7.2
 
 2016-07-05
-	0.7.7.0
+ 0.7.7.0
 
 2016-07-04
-	0.7.6.2
+ 0.7.6.2
 
 2016-06-28
-	0.7.5.1
-	0.7.5.0
+ 0.7.5.1
+ 0.7.5.0
 
 2016-06-22
-	0.7.4.1
+ 0.7.4.1
 
 2016-06-14
-	0.7.3.1
+ 0.7.3.1
 
 2016-06-09
-	0.7.2.3
+ 0.7.2.3
 
 2016-06-07
-	0.7.2.2
+ 0.7.2.2
 
 2016-05-24
-	0.7.1.1
-	0.7.1.0
+ 0.7.1.1
+ 0.7.1.0
 
 2016-05-11
-	0.6.12.2
+ 0.6.12.2
 
 2016-05-18
-	0.7.0.2
+ 0.7.0.2
 
 2016-04-28
-	0.6.10.1
+ 0.6.10.1
 
 2016-04-19
-	0.6.9.4
-	0.6.9.0
+ 0.6.9.4
+ 0.6.9.0
 
 2016-04-17
-	0.6.8.1
+ 0.6.8.1
 
 2016-04-12
-	0.6.7.0
+ 0.6.7.0
 
-	0.6.7.2
+ 0.6.7.2
 
 2016-03-31
-	0.6.5.1
-	0.6.5.2
+ 0.6.5.1
+ 0.6.5.2
 
 2016-03-30
-	0.6.5.0
+ 0.6.5.0
 
 2016-03-18
-	0.6.3.2
+ 0.6.3.2
 
 2016-03-17
-	0.6.3.0
+ 0.6.3.0
 
 2016-03-12
-	0.6.2.3
+ 0.6.2.3
 
 2016-02-20
-	0.6.1.0
+ 0.6.1.0
 ```
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/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 ac7eb1e90a3a22c2bfabef8730f28138a5421b19..69ea41addb1bd05cd805fdedb7f37cb601a3479d 100644
--- a/devTools/types/FC/facilities.d.ts
+++ b/devTools/types/FC/facilities.d.ts
@@ -11,15 +11,19 @@ declare namespace FC {
 	}
 
 	interface IUpgradeTier {
-		/** The value to set `property` to upon purchase. */
+		/** The value `property` must be set to in order to display this tier. */
 		value: any;
+		/** The value to set `property` to upon purchase of the upgrade, if any. */
+		upgraded?: any;
 		/** The link text. */
 		link?: string;
-		/** The text to display when the upgrade is available to purchase. */
-		base?: string;
-		/** The text to display when the upgrade has been purchased and no additional upgrades are available. */
-		upgraded?: string;
-		/** How much the upgrade costs. */
+		/** The text to display for the current tier of the upgrade. */
+		text: string;
+		/**
+		 * How much the upgrade costs.
+		 *
+		 * If one is not provided, the upgrade will be free.
+		 */
 		cost?: number;
 		/** Any handler to run upon purchase. */
 		handler?: () => void;
@@ -86,9 +90,9 @@ declare namespace FC {
 			 * Defaults to `"${facilityName} can support ${possible} slaves. It currently has ${current} slaves."`.
 			 */
 			desc?: string;
-			/**
-			 * Any link to remove all slaves from the facility, if not the default.
-			 */
+			/** The maximum number of times the facility can be expanded, if any. */
+			maximum?: number;
+			/** Any link to remove all slaves from the facility, if not the default. */
 			removeAll?: HTMLDivElement;
 			/**
 			 * The assignment to assign the facility's manager to upon decommission.
diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index f32b02b508f5100a6cdddc7dddc5bc2ea7c68c40..4037fdb6bf69ae510f614a2dd30413eba51910dd 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -93,6 +93,7 @@ declare namespace FC {
 		enunciate?: Enunciation;
 		sortQuickList?: string;
 		slaveAfterRA?: SlaveState;
+		/** @deprecated */
 		returnTo: string;
 
 		slavesToImportMax?: number;
diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index b4565ff0d7a35f68058b3219f4a8b8115c5130d8..b7fdcf8e73f9e11ae975c6761a44f4350c5a167d 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -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/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 9c4d6c78d5e78c8d5f63397e19ca4cbe352a8b18..853920433c6ae6399d8f64c0be3e5236b06eee6b 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -185,7 +185,6 @@ App.Data.defaultGameStateVariables = {
 	universalRulesImmobileSlavesMaintainMuscles: 0,
 	universalRulesImpregnation: "none",
 	universalRulesNewSlavesRA: 1,
-	universalRulesRest: 0,
 	useAccordion: 1,
 	useFSNames: 1,
 	useSlaveListInPageJSNavigation: 0,
@@ -616,7 +615,7 @@ App.Data.resetOnNGPlus = {
 	masterSuite: 0,
 	masterSuiteName: "the Master Suite",
 
-	// Nursery Subsection
+	// Nursery
 	/** Counts the number of children the nursery can support */
 	nursery: 0,
 	/** Counts the number of nannies the nursery can support */
@@ -636,6 +635,8 @@ App.Data.resetOnNGPlus = {
 	nurseryMusclesSetting: 0,
 	nurseryHormonesSetting: 0,
 	nurseryName: "the Nursery",
+	nurserySex: false,
+	MatronIgnoresFlaws: false,
 	/** Array of children in the Nursery */
 	cribs: [],
 	cribsIndices: {},
@@ -984,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,
@@ -1211,7 +1245,8 @@ App.Data.resetOnNGPlus = {
 		animalOvaries: 0,
 		dinnerParty: 0,
 		reportMissingClothing: 0,
-		raGrowthExpr: 0
+		raGrowthExpr: 0,
+		sexOverhaul: 0,
 	},
 	NaNArray: [],
 
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 cfbbae7aa30625280b94e44859a778a05648e7f8..b255e1bb88839119e7b5ec15b31b9e41fbc3d858 100644
--- a/js/medicine/surgery/face/face.js
+++ b/js/medicine/surgery/face/face.js
@@ -1,18 +1,10 @@
 App.Medicine.Surgery.Reactions.Face = class extends App.Medicine.Surgery.SimpleReaction {
-	/**
-	 * @param {number} oldFace
-	 */
-	constructor(oldFace) {
-		super();
-		this.oldFace = oldFace;
-	}
-
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him, himself} = getPronouns(slave);
 		const r = [];
 
-		r.push(faceIncreaseDesc(slave, this.oldFace));
+		r.push(faceIncreaseDesc(slave, diff.face));
 		if (slave.fetish === "mindbroken") {
 			r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 		} else if (slave.devotion > 50) {
@@ -61,7 +53,7 @@ App.Medicine.Surgery.Procedures.FaceShape = class extends App.Medicine.Surgery.P
 	}
 
 	get name() {
-		if (this.targetShape === "androgynous" && this.slave.faceShape === "masculine") {
+		if (this.targetShape === "androgynous" && this._slave.faceShape === "masculine") {
 			return `Soften to androgynous`;
 		} else if (this.targetShape === "normal") {
 			return `Make conventionally feminine`;
@@ -73,11 +65,11 @@ App.Medicine.Surgery.Procedures.FaceShape = class extends App.Medicine.Surgery.P
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		const oldFace = this.slave.face;
-		this.slave.faceShape = this.targetShape;
-		faceIncreaseAction(this.slave, 20);
-		this.slave.faceImplant = Math.clamp(this.slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
-		return new App.Medicine.Surgery.Reactions.Face(oldFace);
+		this._slave.faceShape = this.targetShape;
+		faceIncreaseAction(this._slave, 20);
+		this._slave.faceImplant = Math.clamp(this._slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
+		return this._assemble(new App.Medicine.Surgery.Reactions.Face());
+
 	}
 };
 
@@ -87,9 +79,8 @@ App.Medicine.Surgery.Procedures.FaceAttractiveness = class extends App.Medicine.
 	get healthCost() { return 10; }
 
 	apply(cheat) {
-		const oldFace = this.slave.face;
-		faceIncreaseAction(this.slave, 20);
-		this.slave.faceImplant = Math.clamp(this.slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
-		return new App.Medicine.Surgery.Reactions.Face(oldFace);
+		faceIncreaseAction(this._slave, 20);
+		this._slave.faceImplant = Math.clamp(this._slave.faceImplant + faceSurgeryArtificiality(), 0, 100);
+		return this._assemble(new App.Medicine.Surgery.Reactions.Face());
 	}
 };
diff --git a/js/medicine/surgery/hair/bodyHairRemoval.js b/js/medicine/surgery/hair/bodyHairRemoval.js
index f61c65dbaffaae0eb7ad5f4af8cbf56021489bc0..f752c63b7e066d628ecac618c80deb0b81a83960 100644
--- a/js/medicine/surgery/hair/bodyHairRemoval.js
+++ b/js/medicine/surgery/hair/bodyHairRemoval.js
@@ -1,9 +1,8 @@
 App.Medicine.Surgery.Reactions.BodyHairRemoval = class extends App.Medicine.Surgery.SimpleReaction {
-
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -48,19 +47,19 @@ App.Medicine.Surgery.Reactions.BodyHairRemoval = class extends App.Medicine.Surg
 
 App.Medicine.Surgery.Procedures.BodyHairRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow body hair`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		if (this.slave.underArmHStyle !== "hairless") {
-			this.slave.underArmHStyle = "bald";
+		if (this._slave.underArmHStyle !== "hairless") {
+			this._slave.underArmHStyle = "bald";
 		}
-		if (this.slave.pubicHStyle !== "hairless") {
-			this.slave.pubicHStyle = "bald";
+		if (this._slave.pubicHStyle !== "hairless") {
+			this._slave.pubicHStyle = "bald";
 		}
-		return new App.Medicine.Surgery.Reactions.BodyHairRemoval();
+		return this._assemble(new App.Medicine.Surgery.Reactions.BodyHairRemoval());
 	}
 };
diff --git a/js/medicine/surgery/hair/eyebrowRemoval.js b/js/medicine/surgery/hair/eyebrowRemoval.js
index 0bc21f7e570521089ba294581c846cee491136a6..30e98125c06fb607616eb1b47194cad5eb3483cb 100644
--- a/js/medicine/surgery/hair/eyebrowRemoval.js
+++ b/js/medicine/surgery/hair/eyebrowRemoval.js
@@ -1,9 +1,8 @@
 App.Medicine.Surgery.Reactions.EyebrowRemoval = class extends App.Medicine.Surgery.SimpleReaction {
-
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, His, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -44,15 +43,15 @@ App.Medicine.Surgery.Reactions.EyebrowRemoval = class extends App.Medicine.Surge
 
 App.Medicine.Surgery.Procedures.EyebrowRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow eyebrows`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		this.slave.eyebrowHStyle = "bald";
-		return new App.Medicine.Surgery.Reactions.EyebrowRemoval();
+		this._slave.eyebrowHStyle = "bald";
+		return this._assemble(new App.Medicine.Surgery.Reactions.EyebrowRemoval());
 	}
 };
 
diff --git a/js/medicine/surgery/hair/hairRemoval.js b/js/medicine/surgery/hair/hairRemoval.js
index e53a6719db61c9b5f704f239e824a0b7a058aef7..316ba4e633871d0a5601a4048d3900a2936073b9 100644
--- a/js/medicine/surgery/hair/hairRemoval.js
+++ b/js/medicine/surgery/hair/hairRemoval.js
@@ -1,8 +1,8 @@
 App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.SimpleReaction {
 	get invasive() { return false; }
 
-	reaction(slave) {
-		const reaction = super.reaction(slave);
+	reaction(slave, diff) {
+		const reaction = super.reaction(slave, diff);
 		const {He, he, his, him} = getPronouns(slave);
 		let r = [];
 
@@ -53,16 +53,16 @@ App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.
 
 App.Medicine.Surgery.Procedures.HairRemoval = class extends App.Medicine.Surgery.Procedure {
 	get name() {
-		const {his} = getPronouns(this.slave);
+		const {his} = getPronouns(this._slave);
 		return `Surgically remove ${his} ability to grow hair`;
 	}
 
 	get healthCost() { return 0; }
 
 	apply(cheat) {
-		this.slave.bald = 1;
-		this.slave.hStyle = "bald";
-		this.slave.eyebrowHStyle = "bald";
-		return new App.Medicine.Surgery.Reactions.HairRemoval();
+		this._slave.bald = 1;
+		this._slave.hStyle = "bald";
+		this._slave.eyebrowHStyle = "bald";
+		return this._assemble(new App.Medicine.Surgery.Reactions.HairRemoval());
 	}
 };
diff --git a/js/medicine/surgery/reaction/addAnimalBalls.js b/js/medicine/surgery/reaction/addAnimalBalls.js
index 2299fd284f27a454b13083640592162606a908d0..31267edc883870861ebe84fee72ce39f61a1f40a 100644
--- a/js/medicine/surgery/reaction/addAnimalBalls.js
+++ b/js/medicine/surgery/reaction/addAnimalBalls.js
@@ -2,8 +2,8 @@
 	class AddAnimalBalls extends App.Medicine.Surgery.Reaction {
 		get key() { return "addAnimalBalls"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addAnimalOvaries.js b/js/medicine/surgery/reaction/addAnimalOvaries.js
index ed4563ea5be43120cae2071c9ae2943c6e92d852..01d38eab7e326bc61a14bc81ffe880af8ecd0e39 100644
--- a/js/medicine/surgery/reaction/addAnimalOvaries.js
+++ b/js/medicine/surgery/reaction/addAnimalOvaries.js
@@ -2,8 +2,8 @@
 	class AddAnimalOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "addAnimalOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addBalls.js b/js/medicine/surgery/reaction/addBalls.js
index 4fe6d0339c678922f266f90e9ecd433a79ffa5f0..df5f74a6f39f15accfe04b6b58c54491c75cf95b 100644
--- a/js/medicine/surgery/reaction/addBalls.js
+++ b/js/medicine/surgery/reaction/addBalls.js
@@ -2,8 +2,8 @@
 	class AddBalls extends App.Medicine.Surgery.Reaction {
 		get key() { return "addBalls"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addDick.js b/js/medicine/surgery/reaction/addDick.js
index b09f5315eaee53ada0ddbf6e06593fec00b0ca5b..33ca8ad74537ea0bd444520220c7e043d85fef79 100644
--- a/js/medicine/surgery/reaction/addDick.js
+++ b/js/medicine/surgery/reaction/addDick.js
@@ -2,8 +2,8 @@
 	class AddDick extends App.Medicine.Surgery.Reaction {
 		get key() { return "addDick"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addForeskin.js b/js/medicine/surgery/reaction/addForeskin.js
index 359bd6bd4e9c7677a7bd81c775197be4c1ef16e1..ed2275e3936791c53019f913f26fe3cacf56c798 100644
--- a/js/medicine/surgery/reaction/addForeskin.js
+++ b/js/medicine/surgery/reaction/addForeskin.js
@@ -2,8 +2,8 @@
 	class AddForeskin extends App.Medicine.Surgery.Reaction {
 		get key() { return "addForeskin"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addOvaries.js b/js/medicine/surgery/reaction/addOvaries.js
index a899fe3060dc903d0fb34bf9ff8ff88c5c15bb30..1898640f95cdc7ab9a35e44cd6763dec705847b1 100644
--- a/js/medicine/surgery/reaction/addOvaries.js
+++ b/js/medicine/surgery/reaction/addOvaries.js
@@ -2,8 +2,8 @@
 	class AddOvaries extends App.Medicine.Surgery.Reaction {
 		get key() { return "addOvaries"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/addProstate.js b/js/medicine/surgery/reaction/addProstate.js
index 6a2bdcc91db3f37622190ee41f4ad37e1e3eb02a..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 = [];
 
@@ -25,7 +25,7 @@
 					}
 					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 {
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 475ac751248a1475aa2e3a820578570c5ba5ab86..3d7bbb1430323bfb1b6487cfb92ecb9607572f78 100644
--- a/js/medicine/surgery/reaction/pLimbInterface3.js
+++ b/js/medicine/surgery/reaction/pLimbInterface3.js
@@ -2,8 +2,8 @@
 	class PLimbInterface3 extends App.Medicine.Surgery.Reaction {
 		get key() { return "PLimb interface3"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, hers, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/precum.js b/js/medicine/surgery/reaction/precum.js
index 07f4a0464b603ea6833464371299d7ccba7db6bc..8c330a430f73f3af0e013f890dad0f585a7a6b26 100644
--- a/js/medicine/surgery/reaction/precum.js
+++ b/js/medicine/surgery/reaction/precum.js
@@ -2,8 +2,8 @@
 	class Precum extends App.Medicine.Surgery.Reaction {
 		get key() { return "precum"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, His, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/preg.js b/js/medicine/surgery/reaction/preg.js
index 3ff922700a1d6f8a324c7967d205a2329b29071f..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 25a58e095776d71e97cff7922322393bdb288f1e..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) {
@@ -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) {
@@ -191,7 +191,7 @@
 						r.push(`also`);
 					}
 					r.push(`${sense} that ${his} body has some physical changes, it seems to ${him} that ${toSentence(physicalChanges)}`);
-					const reaction = either('comes as a bit of a surprise', 'comes as quite a shock', `confirms ${his} suspicions`, `doesn't seem to phase ${him}`, `${he} finds interesting`, `${he} can't get over`) + '.';
+					const reaction = ['comes as a bit of a surprise', 'comes as quite a shock', `confirms ${his} suspicions`, `doesn't seem to phase ${him}`, `${he} finds interesting`, `${he} can't get over`].random() + '.';
 					r.push(`which ${reaction}`);
 				}
 				if (statusChanges.length > 0) {
diff --git a/js/medicine/surgery/reaction/ribs.js b/js/medicine/surgery/reaction/ribs.js
index 397c64cf0fada24cee9d889fea539b8e4848c9db..bc4aaabbbcd03bdd6f30f624edd5ad0fe4e89b31 100644
--- a/js/medicine/surgery/reaction/ribs.js
+++ b/js/medicine/surgery/reaction/ribs.js
@@ -2,8 +2,8 @@
 	class Ribs extends App.Medicine.Surgery.Reaction {
 		get key() { return "ribs"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/scrotalTuck.js b/js/medicine/surgery/reaction/scrotalTuck.js
index c108746d120afd1a9b01bd4657a81886b56ebf66..c6dd71d3de6518c1c1514da40eb623d186c51138 100644
--- a/js/medicine/surgery/reaction/scrotalTuck.js
+++ b/js/medicine/surgery/reaction/scrotalTuck.js
@@ -2,8 +2,8 @@
 	class ScrotalTuck extends App.Medicine.Surgery.Reaction {
 		get key() { return "scrotalTuck"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/sharp.js b/js/medicine/surgery/reaction/sharp.js
index 6e4cf8a167fa6633435b7f5057159de4867f5219..213349656ada96660049199b08a7da16b30b00ad 100644
--- a/js/medicine/surgery/reaction/sharp.js
+++ b/js/medicine/surgery/reaction/sharp.js
@@ -2,8 +2,8 @@
 	class Sharp extends App.Medicine.Surgery.Reaction {
 		get key() { return "sharp"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/sterilize.js b/js/medicine/surgery/reaction/sterilize.js
index e5c089faac52c98bb3637402f774f01abc9a9d79..475c43a3e84153353233e2971a42ded0e519689d 100644
--- a/js/medicine/surgery/reaction/sterilize.js
+++ b/js/medicine/surgery/reaction/sterilize.js
@@ -2,8 +2,8 @@
 	class Sterilize extends App.Medicine.Surgery.Reaction {
 		get key() { return "ster"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/tailInterface.js b/js/medicine/surgery/reaction/tailInterface.js
index 42a5c303c1bae1a8152694b7502da99b07b326fe..591047ec685946624caf4d43f3ad33c79679c9fb 100644
--- a/js/medicine/surgery/reaction/tailInterface.js
+++ b/js/medicine/surgery/reaction/tailInterface.js
@@ -2,8 +2,8 @@
 	class TailInterface extends App.Medicine.Surgery.Reaction {
 		get key() { return "tailInterface"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/teeth.js b/js/medicine/surgery/reaction/teeth.js
index 0e89280c6363f521880b1dd2448ae172143f7e02..40d1c81b5a9eb14a1c8b1a27718ee2d5cd2bf50f 100644
--- a/js/medicine/surgery/reaction/teeth.js
+++ b/js/medicine/surgery/reaction/teeth.js
@@ -2,8 +2,8 @@
 	class Teeth extends App.Medicine.Surgery.Reaction {
 		get key() { return "teeth"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him, himself} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/treatment.js b/js/medicine/surgery/reaction/treatment.js
index a169bf8f17629755e0848b0f9d9dc5b25227142c..fac094c49e32c7e5211458ffe57119cbbbc08699 100644
--- a/js/medicine/surgery/reaction/treatment.js
+++ b/js/medicine/surgery/reaction/treatment.js
@@ -3,8 +3,8 @@
 		// unifies "elasticity treatment", "immortality treatment" and "gene treatment"
 		get key() { return "gene treatment"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/tummyTuck.js b/js/medicine/surgery/reaction/tummyTuck.js
index fe658950dec84b9bbca8d0735ec863370aa2f906..3ea39e57162b278a90e9ed8563a95dd0870d5a85 100644
--- a/js/medicine/surgery/reaction/tummyTuck.js
+++ b/js/medicine/surgery/reaction/tummyTuck.js
@@ -2,8 +2,8 @@
 	class TummyTuck extends App.Medicine.Surgery.Reaction {
 		get key() { return "tummyTuck"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his} = getPronouns(slave);
 			const r = [];
 
diff --git a/js/medicine/surgery/reaction/unblind.js b/js/medicine/surgery/reaction/unblind.js
index 4ef399825c45ede7821ea337ea4d0f45a3924606..b4d911f4adf72349a5b379302bf4c275d5afc064 100644
--- a/js/medicine/surgery/reaction/unblind.js
+++ b/js/medicine/surgery/reaction/unblind.js
@@ -2,8 +2,8 @@
 	class Unblind extends App.Medicine.Surgery.Reaction {
 		get key() { return "unblind"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 			r.push(`The eye surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} new vision. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`);
diff --git a/js/medicine/surgery/reaction/undeafen.js b/js/medicine/surgery/reaction/undeafen.js
index 842aa16cf3e3e860ad2bdc99ee32ab5e3fefd209..9ace8a302d59230cd856843d756d4065af4a6705 100644
--- a/js/medicine/surgery/reaction/undeafen.js
+++ b/js/medicine/surgery/reaction/undeafen.js
@@ -2,8 +2,8 @@
 	class Undeafen extends App.Medicine.Surgery.Reaction {
 		get key() { return "undeafen"; }
 
-		reaction(slave) {
-			const reaction = super.reaction(slave);
+		reaction(slave, diff) {
+			const reaction = super.reaction(slave, diff);
 			const {He, he, his, him} = getPronouns(slave);
 			const r = [];
 			r.push(`The inner ear surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes ${his} new hearing. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`);
diff --git a/js/medicine/surgery/reaction/vagina.js b/js/medicine/surgery/reaction/vagina.js
index cd5087e75255f40870bc0410f189c6c3df769e14..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 6024049777f2448dfa37e6899251292ba47c431b..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,6 +62,7 @@ function jsRandom(min, max, count = 1) {
  * @param {number} count
  * @returns {Array<T>}
  */
+/* exported jsRandomMany */
 function jsRandomMany(arr, count) {
 	let result = [];
 	let tmp = arr.slice();
@@ -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/src/002-config/fc-version.js b/src/002-config/fc-version.js
index d158b67ed64fa99cedf4be8582f43cd002dd8cb6..83c909c9ff99161768a05ed8c2bee3b46c546ba0 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: 1136 // 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/facilityFramework.js b/src/004-base/facilityFramework.js
index 88bfdfd9995aec1a24f071f8a298b5ae6194e67d..4d4fab16b7f6352b3f9d702dca597dab06c619b4 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -13,11 +13,11 @@ App.Facilities.Facility = class {
 
 		/** @private */
 		this._div = document.createElement("div");
-		/** @protected @type {Array<function():HTMLDivElement>} */
+		/** @private @type {Array<function():HTMLDivElement>} */
 		this._sections = [];
-		/** @protected @type {FC.IUpgrade[]} */
+		/** @private @type {FC.IUpgrade[]} */
 		this._upgrades = [];
-		/** @protected @type {FC.Facilities.Rule[]} */
+		/** @private @type {FC.Facilities.Rule[]} */
 		this._rules = [];
 
 		this._addUpgrades(...this.upgrades);
@@ -135,22 +135,35 @@ App.Facilities.Facility = class {
 	_makeExpand() {
 		const div = document.createElement("div");
 
+		const capacity = typeof V[this.facility.desc.baseName] === 'object'
+			? V[this.facility.desc.baseName].capacity
+			: V[this.facility.desc.baseName];
+		const maximum = this.expand.maximum || Number.MAX_SAFE_INTEGER;
 		const amount = this.expand.amount || 5;
-		const cost = this.expand.cost
-			|| V[this.facility.desc.baseName] * 1000 * V.upgradeMultiplierArcology;
+		const cost = this.expand.cost || capacity * 1000 * V.upgradeMultiplierArcology;
 		const desc = this.expand.desc
 			|| `${this.facility.nameCaps} can support ${this.facility.capacity} slaves. There ${this.facility.hostedSlaves === 1 ? `is` : `are`} currently ${numberWithPluralOne(this.facility.hostedSlaves, "slave")} here.`;
 
 		div.append(desc);
 
 		if (!this.expand.unexpandable) {
-			App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(`Expand ${this.facility.name}`, () => {
-				cashX(forceNeg(cost), "capEx");
-				V[this.facility.desc.baseName] += amount;	// TODO: this will likely need to be changed in the future
-				V.PC.skill.engineering += .1;
-
-				this.refresh();
-			}, [], '', `Costs ${cashFormat(cost)} and increases the capacity of ${this.facility.name} by ${amount}.`), ['indent']);
+			if (capacity < maximum) {
+				App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(`Expand ${this.facility.name}`, () => {
+					cashX(forceNeg(cost), "capEx");
+					if (typeof V[this.facility.desc.baseName] === 'object') {		// TODO: change this once all facilities are objects
+						V[this.facility.desc.baseName].capacity += amount;
+					} else {
+						V[this.facility.desc.baseName] += amount;
+					}
+					V.PC.skill.engineering += .1;
+
+					this.refresh();
+				}, [], '', `Costs ${cashFormat(cost)} and increases the capacity of ${this.facility.name} by ${amount}.`), ['indent']);
+			} else {
+				App.UI.DOM.appendNewElement("div", div, App.UI.DOM.disabledLink(`Expand ${this.facility.name}`, [
+					`${this.facility.nameCaps} can support a maximum of ${maximum} slaves.`,
+				]), ['indent']);
+			}
 		}
 
 		if (this.facility.totalEmployeesCount > 0) {
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/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js
index b1c4b98ffde82548da3cac954676f31aba769042..6ca2594cf215ac78064ab6f466697032ce866f1d 100644
--- a/src/005-passages/facilitiesPassages.js
+++ b/src/005-passages/facilitiesPassages.js
@@ -17,6 +17,8 @@ new App.DomPassage("Incubator", () => { return App.UI.incubator(); }, ["jump-to-
 
 new App.DomPassage("Master Suite", () => { return new App.Facilities.MasterSuite.masterSuite().render(); }, ["jump-to-safe", "jump-from-safe"]);
 
+new App.DomPassage("Nursery", () => { return new App.Facilities.Nursery.nursery().render(); }, ["jump-to-safe", "jump-from-safe"]);
+
 new App.DomPassage("Pit", () => { return new App.Facilities.Pit.pit().render(); }, ["jump-to-safe", "jump-from-safe"]);
 
 new App.DomPassage("Schoolroom", () => { return new App.Facilities.Schoolroom.schoolroom().render(); }, ["jump-to-safe", "jump-from-safe"]);
diff --git a/src/005-passages/interactPassages.js b/src/005-passages/interactPassages.js
index ee72969f078b63f03c434747cda6d1ad9f07e991..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",
 	() => {
diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js
index 4b1f337a91da65339e6f1caec9157be6e9f748e2..792935a945503b942219428951fcf8c35d3fe107 100644
--- a/src/005-passages/managePassages.js
+++ b/src/005-passages/managePassages.js
@@ -61,6 +61,12 @@ new App.DomPassage("Manage Corporation",
 	}, ["jump-to-safe", "jump-from-safe"]
 );
 
+new App.DomPassage("Manage Arcology",
+	() => {
+		return App.UI.manageArcology();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
+
 
 new App.DomPassage("Policies",
 	() => {
@@ -203,3 +209,11 @@ new App.DomPassage("editSF",
 		return App.UI.editSF();
 	}
 );
+
+new App.DomPassage("edicts",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Main";
+		return App.SecExp.edicts();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
diff --git a/src/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 c18d9f886c475bcd4d04c1c918cf5b4cc069a942..1d300d2ff0110aad5c747754b39aa8ef99b4768c 100644
--- a/src/Corporation/manageCorporation.js
+++ b/src/Corporation/manageCorporation.js
@@ -108,24 +108,25 @@ App.Corporate.manage = function() {
 		const el = new DocumentFragment();
 		App.UI.DOM.appendNewElement("h1", el, "Division Management");
 
+		const tabBar = new App.UI.Tabs.TabBar("ManageDivisions");
+
 		for (let division of App.Corporate.divisionList) {
 			if (!division.founded) {
 				continue;
 			}
-
-			App.UI.DOM.appendNewElement("h2", el, `${division.name} Division`);
+			const frag = new DocumentFragment();
 			if (division.foundedDate !== 0) {
-				App.UI.DOM.appendNewElement("div", el, `Founded on ${asDateString(division.foundedDate)}.`, "founding");
+				App.UI.DOM.appendNewElement("div", frag, `Founded on ${asDateString(division.foundedDate)}.`, "founding");
 			}
 
-			App.UI.DOM.appendNewElement("div", el, `This division focuses on ${division.focusDescription}.`);
+			App.UI.DOM.appendNewElement("div", frag, `This division focuses on ${division.focusDescription}.`);
 
 			let div = document.createElement("div");
 			$(div).append(division.messageSlaveCount());
-			el.append(div);
+			frag.append(div);
 
 			let divMaint = division.getDisplayMaintenanceCost();
-			addDiv(el, "It costs ",
+			addDiv(frag, "It costs ",
 				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"]),
@@ -133,18 +134,18 @@ App.Corporate.manage = function() {
 
 			div = document.createElement("div");
 			$(div).append(division.messageSlaveOutput());
-			el.append(div);
+			frag.append(div);
 
 			let divSentenceStart = ["Currently the division", "It also"];
-			App.UI.DOM.appendNewElement("h3", el, "Direct Control");
+			App.UI.DOM.appendNewElement("h3", frag, "Direct Control");
 
 			if (division.fromMarket) {
-				addDiv(el, `${divSentenceStart.shift()} is ${division.slaveAction.present} `,
+				addDiv(frag, `${divSentenceStart.shift()} is ${division.slaveAction.present} `,
 					App.UI.DOM.makeElement("span", numberWithPlural(division.activeSlaves, "slave"), "green"));
 
 				if (division.activeSlaves < division.developmentCount) {
 					let fillSlaveCount = division.availableRoom;
-					addDiv(el, `There is room to ${division.slaveAction.future} ${numberWithPluralOne(fillSlaveCount, "more slave")}.`);
+					addDiv(frag, `There is room to ${division.slaveAction.future} ${numberWithPluralOne(fillSlaveCount, "more slave")}.`);
 
 					let buySlaveArray = [
 						{'name': 'Buy Slave', 'count': 1},
@@ -156,7 +157,7 @@ App.Corporate.manage = function() {
 					}
 					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 `,
+						addDiv(frag, `The corporation can purchase slaves directly from the market for about `,
 							cashFormatColor(singleSlaveCost), ".");
 
 						const links = [];
@@ -171,25 +172,25 @@ App.Corporate.manage = function() {
 								refresh();
 							}));
 						}
-						el.append(App.UI.DOM.generateLinksStrip(links));
+						frag.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 ",
+						addDiv(frag, 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(division.slaveAction.market)}.`);
 					}
 				} else {
-					addDiv(el, "There is ", App.UI.DOM.makeElement("em", "no room"), ` to ${division.slaveAction.future} more slaves.`);
+					addDiv(frag, "There is ", App.UI.DOM.makeElement("em", "no room"), ` to ${division.slaveAction.future} more slaves.`);
 				}
 			}
 			if (division.toMarket) {
 				let finishedSlaveNoun = division.nounFinishedSlave;
 				if (division.heldSlaves > 0) {
-					addDiv(el, `${divSentenceStart.shift()} holds `,
+					addDiv(frag, `${divSentenceStart.shift()} holds `,
 						App.UI.DOM.makeElement("span", numberWithPlural(division.heldSlaves, finishedSlaveNoun), "green"),
 						".");
 					for (const nextDiv of division.relatedDivisions.to
 						.filter(div => div.availableRoom > 0
 							&& !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"), ".");
+						addDiv(frag, `The ${nextDiv.name} Division can accept up to `, App.UI.DOM.makeElement("span", numberWithPlural(nextDiv.availableRoom, "slave"), "green"), ".");
 
 						let sendSlaveArray = [
 							{'name': 'Send Slave', 'count': 1},
@@ -210,10 +211,10 @@ App.Corporate.manage = function() {
 								refresh();
 							}));
 						}
-						el.append(App.UI.DOM.generateLinksStrip(links));
+						frag.append(App.UI.DOM.generateLinksStrip(links));
 					}
 
-					App.UI.DOM.appendNewElement("div", el, "The corporation can sell these slaves to the market.");
+					App.UI.DOM.appendNewElement("div", frag, "The corporation can sell these slaves to the market.");
 
 					let sellSlaveArray = [
 						{'name': 'Sell Slave', 'count': 1},
@@ -229,9 +230,9 @@ App.Corporate.manage = function() {
 							refresh();
 						}));
 					}
-					el.append(App.UI.DOM.generateLinksStrip(links));
+					frag.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", frag, `The division is not holding any ${asPlural(finishedSlaveNoun)}.`);
 				}
 			}
 
@@ -240,7 +241,7 @@ App.Corporate.manage = function() {
 
 			/* Expanding the division*/
 			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.");
+			addDiv(frag, "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 = [
 				{'name': 'Expand Division', 'count': 1},
@@ -267,9 +268,9 @@ App.Corporate.manage = function() {
 				}));
 			}
 
-			el.append(App.UI.DOM.generateLinksStrip(links));
+			frag.append(App.UI.DOM.generateLinksStrip(links));
 
-			App.UI.DOM.appendNewElement("h3", el, "Rules");
+			App.UI.DOM.appendNewElement("h3", frag, "Rules");
 
 			const options = new App.UI.OptionsGroup().customRefresh(refresh);
 			for (const nextDiv of division.relatedDivisions.to
@@ -312,11 +313,11 @@ App.Corporate.manage = function() {
 						refresh();
 					}).off();
 			}
-			el.append(options.render());
+			frag.append(options.render());
 
 			if (App.Corporate.numDivisions > 1) {
 				// Cannot dissolve the last division
-				addDiv(el,
+				addDiv(frag,
 					App.UI.DOM.link("Dissolve Division", () => {
 						if (Dialog.isOpen()) {
 							Dialog.close();
@@ -336,7 +337,9 @@ App.Corporate.manage = function() {
 					})
 				);
 			}
+			tabBar.addTab(division.name, division.name.replace(/\s/g, ''), frag);
 		}
+		el.append(tabBar.render());
 		return el;
 	}
 
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/catLove.js b/src/Mods/Catmod/events/CMRESS/catLove.js
index 5ad3a57c21527b7b6ce1ec961c129017f029e795..b7b80e50b04ccd24431019645b2d304a4c9af565 100644
--- a/src/Mods/Catmod/events/CMRESS/catLove.js
+++ b/src/Mods/Catmod/events/CMRESS/catLove.js
@@ -37,7 +37,7 @@ 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.`);
+			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}..."`),
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 4fe94cf7424666f77cc80c36a1f80c85cd6ac611..2add5b05d388a526fcfd9155691402b639e9331d 100644
--- a/src/Mods/Catmod/events/CMRESS/lazyCat.js
+++ b/src/Mods/Catmod/events/CMRESS/lazyCat.js
@@ -149,7 +149,7 @@ App.Events.CMRESSLazyCat = class CMRESSLazyCat extends App.Events.BaseEvent {
 				}
 				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/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/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/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 aee61d018d6528c14911b7a0713445e90f23c85c..01c1e544e722001aa3ae8a50110ed4d7411a823e 100644
--- a/src/Mods/SecExp/events/attackOptions.js
+++ b/src/Mods/SecExp/events/attackOptions.js
@@ -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 1a69bfaa256623919dee1597eb903cd0e9ce22cb..091171aaf0f2ef69539ec68c2cf6085a59606a46 100644
--- a/src/Mods/SecExp/events/conflictHandler.js
+++ b/src/Mods/SecExp/events/conflictHandler.js
@@ -109,7 +109,7 @@ App.Events.conflictHandler = function() {
 				}
 			}
 			showProgress(`${V.SecExp.war.result === 0 ? 'Failed' : 'Successful'}!`, "span");
-			atEnd("attackReport");
+			atEnd("conflictReport");
 			return node;
 		}
 	}
@@ -544,7 +544,7 @@ App.Events.conflictHandler = function() {
 		V.gameover = `${isMajorBattle ? "major battle" : "Rebellion"} defeat`;
 		atEnd("Gameover");
 	} else {
-		atEnd(inBattle ? "attackReport" : "rebellionReport");
+		atEnd("conflictReport");
 	}
 	return node;
 };
diff --git a/src/Mods/SecExp/events/conflictReport.js b/src/Mods/SecExp/events/conflictReport.js
new file mode 100644
index 0000000000000000000000000000000000000000..70f4f6547dbe63ef19b2fa9e42850a848f1b006f
--- /dev/null
+++ b/src/Mods/SecExp/events/conflictReport.js
@@ -0,0 +1,1468 @@
+App.Events.conflictReport = function() {
+	/**
+	 * @param {string} [type]
+	 * @param {number} [loss]
+	 * @param {Object} [squad=null]
+	 * @returns {string}
+	 */
+	 const casualtiesReport = function(type, loss, squad=null) {
+		const isSpecial = squad && App.SecExp.unit.list().slice(1).includes(type);
+		let r = [];
+		if (loss <= 0) {
+			r.push(`No`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.2) : 10)) {
+			r.push(`Light`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.4) : 30)) {
+			r.push(`Moderate`);
+		} else if (loss <= (isSpecial ? (squad.troops * 0.6) : 60)) {
+			r.push(`Heavy`);
+		} else {
+			r.push(`Catastrophic`);
+		}
+		r.push(`casualties suffered.`);
+		if (App.SecExp.unit.list().includes(type)) {
+			if (squad.troops <= 0) {
+				squad.active = 0;
+				r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit.`);
+				if (type === "bots") {
+					r.push(`It will take quite the investment to rebuild them.`);
+				} else {
+					r.push(`The remnants will be sent home honored as veterans or reorganized in a new unit.`);
+				}
+			} else if (squad.troops <= 10) {
+				r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`);
+			}
+		}
+		return r.join(" ");
+	};
+	let r = [];
+	const allKilled = V.SecExp.war.attacker.losses === V.SecExp.war.attacker.troops;
+	const result = V.SecExp.war.result;
+	const hasLosses = V.SecExp.war.losses > 0;
+
+	const inBattle = V.SecExp.war.type.includes("Attack");
+	const isMajorBattle = inBattle && V.SecExp.war.type.includes("Major");
+	const majorBattleMod = !isMajorBattle ? 1 : 2;
+
+	const inRebellion = V.SecExp.war.type.includes("Rebellion");
+	const slaveRebellion = V.SecExp.war.type.includes("Slave");
+	const type = inBattle ? "battles" : "rebellions";
+
+	// Battles
+	let loot = 0;
+	let captives;
+	const end = (V.SecExp.battles.victoryStreak >= 2 || V.SecExp.battles.lossStreak >= 2) ? `,` : `.`;
+	/**
+	 * Does the target become wounded?
+	 * @param {string} [target]
+	 * @returns {string}
+	 */
+	 const checkWoundStatus = function(target) {
+		let conditions;
+		let slave;
+		let woundChance = 0;
+		const r = [];
+		if (target === "PC") {
+			if (V.PC.career === "mercenary" || V.PC.career === "gang") {
+				woundChance -= 5;
+			} else if (V.PC.skill.warfare >= 75) {
+				woundChance -= 3;
+			}
+			if (V.personalArms >= 1) {
+				woundChance -= 5;
+			}
+			if (V.PC.balls >= 20) {
+				woundChance += random(5, 10);
+			} else if (V.PC.balls >= 9) {
+				woundChance += random(1, 5);
+			}
+			conditions = [
+				V.PC.physicalAge >= 60,
+				V.PC.belly > 5000,
+				V.PC.boobs >= 1000,
+				V.PC.butt >= 4,
+				V.PC.preg >= 30
+			];
+		} else {
+			if (target === "Concubine") {
+				slave = S.Concubine;
+			} else if (target === "Bodyguard") {
+				slave = S.Bodyguard;
+			}
+
+			if (!slave) {
+				return ``;
+			}
+
+			if (slave.skill.combat === 1) {
+				woundChance -= 2;
+			}
+			woundChance -= 0.25 * (getLimbCount(slave, 105));
+			if (slave.health.condition >= 50) {
+				woundChance -= 1;
+			}
+			conditions = [
+				slave.weight > 130,
+				slave.muscles < -30,
+				getBestVision(slave) === 0,
+				slave.heels === 1,
+				slave.boobs >= 1400,
+				slave.butt >= 6,
+				slave.belly >= 10000,
+				slave.dick >= 8,
+				slave.balls >= 8,
+				slave.intelligence + slave.intelligenceImplant < -95
+			];
+		}
+		for (const cond of conditions) {
+			if (cond) {
+				woundChance += (target === "PC" ? random(1, 5) : 1);
+			}
+		}
+		woundChance *= (target === "PC" ? random(1, 2) : random(2, 4));
+
+		if (random(1, 100) <= woundChance) {
+			if (target === "PC") {
+				healthDamage(V.PC, 60);
+				r.push(`A lucky shot managed to find its way to you, leaving a painful, but thankfully not lethal, wound.`);
+			} else {
+				const woundType = App.SecExp.inflictBattleWound(slave);
+				const {his, him} = getPronouns(slave);
+				if (target === "Concubine") {
+					r.push(`Your Concubine was unfortunately caught in the crossfire.`);
+				} else {
+					r.push(`During one of the assaults your Bodyguard was hit.`);
+				}
+				if (woundType === "voice") {
+					r.push(`A splinter pierced ${his} throat, severing ${his} vocal cords.`);
+				} else if (woundType === "eyes") {
+					r.push(`A splinter hit ${his} face, severely damaging ${his} eyes.`);
+				} else if (woundType === "legs") {
+					r.push(`An explosion near ${him} caused the loss of both of ${his} legs.`);
+				} else if (woundType === "arm") {
+					r.push(`An explosion near ${him} caused the loss of one of ${his} arms.`);
+				} else if (woundType === "flesh") {
+					r.push(`A stray shot severely wounded ${him}.`);
+				}
+			}
+		} else if (target === "PC") {
+			r.push(`Fortunately you managed to avoid injury.`);
+		}
+		return r.join(" ");
+	};
+
+	// Rebellions
+	let lostSlaves;
+	/**
+	 * @param {string} [target]
+	 * @param {number} [value]
+	 * @param {number} [cost=2000]
+	 */
+	const setRepairTime = function(target, value, cost=2000) {
+		V.SecExp.rebellions.repairTime[target] = 3 + random(1) - value;
+		cashX(-cost, "war");
+		return IncreasePCSkills('engineering', 0.1);
+	};
+
+	/**
+	 * @param {number} [lowerClass]
+	 * @param {number} [slaves]
+	 * @param {number} [prosperity]
+	 * @returns {void}
+	 */
+	const arcologyEffects = function(lowerClass, slaves, prosperity) {
+		V.lowerClass -= random(lowerClass);
+		App.SecExp.slavesDamaged(random(slaves));
+		V.arcologies[0].prosperity -= random(prosperity);
+	};
+	
+	/**
+	 * @param {FC.SecExp.PlayerHumanUnitType} [unit]
+	 * @param {number} [averageLosses]
+	 */
+	const rebellingUnitsFate = function(unit, averageLosses) {
+		let manpower = 0;
+		const node = new DocumentFragment();
+		const r = [];
+		const rebels = {ID: [], names: []};
+
+		const Dissolve = function() {
+			App.SecExp.unit.unitFree(unit).add(manpower);
+			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+				u.loyalty = Math.clamp(u.loyalty - random(10, 40), 0, 100);
+			}
+			return `Units dissolved.`;
+		};
+		const Purge = function() {
+			App.SecExp.unit.unitFree(unit).add(manpower * 0.5);
+			return `Dissidents purged and units dissolved.`;
+		};
+		const Execute = function() {
+			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+				u.loyalty = Math.clamp(u.loyalty + random(10, 40), 0, 100);
+			}
+			return `Units executed. Dissent will not be tolerated.`;
+		};
+
+		App.UI.DOM.appendNewElement("div", node);
+		for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
+			if (V.SecExp.war.rebellingID.contains(u.ID)) {
+				rebels.names.push(u.platoonName);
+				rebels.ID.push(u.ID);
+				manpower += Math.clamp(u.troops - random(averageLosses), 0, u.troops);
+			}
+		}
+
+		if (rebels.ID.length > 0) {
+			V.SecExp.units[unit].squads.deleteWith((u) => rebels.ID.contains(u.ID));
+			V.SecExp.battles.lastSelection.deleteWith((u) => rebels.ID.contains(u.ID));
+			if (unit === "slaves") {
+				r.push(`${toSentence(rebels.names)} decided in their blind arrogance to betray you.`);
+			} else if (unit === "militia") {
+				r.push(`${toSentence(rebels.names)} had the gall to betray you and join your enemies.`);
+			} else if (unit === "mercs") {
+				r.push(`${toSentence(rebels.names)} made the grave mistake of betraying you.`);
+			}
+			if (V.SecExp.war.result < 2) { // rebellion loss
+				r.push(`They participated in the looting following the battle, then vanished in the wastes.`);
+				cashX(forceNeg(1000 * rebels.ID.length), "war");
+			} else { // rebellion win
+				App.Events.addResponses(node, [
+					new App.Events.Result(
+						`Dissolve the units`,
+						Dissolve,
+						`Manpower will be refunded, but will negatively influence the loyalty of the other units`
+					),
+					new App.Events.Result(
+						`Purge the dissidents and dissolve the units`,
+						Purge,
+						`Will not influence the loyalty of the other units, but half the manpower will be refunded.`
+					),
+					new App.Events.Result(
+						`Execute them all`,
+						Execute,
+						`Will positively influence the loyalty of the other units, but manpower will not be refunded.`
+					),
+				]);
+			}
+			App.Events.addNode(node, r, "div");
+		}
+		return node;
+	};
+
+	V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses);
+	if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) {
+		V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops;
+	}
+	V.SecExp.core.totalKills += V.SecExp.war.attacker.losses;
+	V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses);
+	if (isMajorBattle) {
+		V.SecExp.battles.major++;
+	}
+
+	const node = new DocumentFragment();
+	if (result === 3 || result === 2) {
+		App.UI.DOM.appendNewElement("h1", node, `${result === 2 ? 'Partial ' : ''}Victory!`, "strong");
+		V.SecExp[type].victories++;
+		if (inBattle && result === 3) {
+			V.SecExp.battles.lossStreak = 0;
+			V.SecExp.battles.victoryStreak++;
+		}
+	} else if (result === -3 || result === -2) {
+		App.UI.DOM.appendNewElement("h1", node, `${result === -2 ? 'Partial ' : ''}Defeat!`, "strong");
+		V.SecExp[type].losses++;
+		if (inBattle && result === -3) {
+			V.SecExp.battles.lossStreak++;
+			V.SecExp.battles.victoryStreak = 0;
+		}
+	} else if (result === -1) {
+		App.UI.DOM.appendNewElement("h1", node, `We surrendered`, "strong");
+		V.SecExp[type].losses++;
+	} else if (V.SecExp.war.result === 0) { // Battles only
+		App.UI.DOM.makeElement("h1", `Failed bribery!`, "strong");
+		V.SecExp.battles.losses++;
+	} else if (V.SecExp.war.result === 1) { // Battles only
+		App.UI.DOM.makeElement("h1", `Successful bribery!`, "strong");
+		V.SecExp.battles.victories++;
+	}
+	App.UI.DOM.appendNewElement("hr", node);
+
+	r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was`);
+	if (inBattle) {
+		r.push(`attacked by`);
+		if (V.SecExp.war.attacker.type === "raiders") {
+			r.push(`a band of wild raiders,`);
+		} else if (V.SecExp.war.attacker.type === "free city") {
+			r.push(`a contingent of mercenaries hired by a competing free city,`);
+		} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+			r.push(`a group of freedom fighters bent on the destruction of the institution of slavery,`);
+		} else if (V.SecExp.war.attacker.type === "old world") {
+			r.push(`an old world nation boasting a misplaced sense of superiority,`);
+		}
+		r.push(`${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`);
+	} else {
+		r.push(`inflamed by the fires of rebellion. ${num(Math.trunc(V.SecExp.war.attacker.troops))} rebels from all over the structure dared rise up`);
+		if (slaveRebellion) {
+			r.push(`against their owners and conquer their freedom through blood.`);
+		} else {
+			r.push(`to dethrone their arcology owner.`);
+		}
+	}
+
+	if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) {
+		r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong,`);
+		if (inBattle) {
+			r.push(`clashed with them`);
+			if (V.SecExp.war.terrain === "urban") {
+				r.push(`in the streets of the old world city surrounding the arcology,`);
+			} else if (V.SecExp.war.terrain === "rural") {
+				r.push(`in the rural land surrounding the free city,`);
+			} else if (V.SecExp.war.terrain === "hills") {
+				r.push(`on the hills around the free city,`);
+			} else if (V.SecExp.war.terrain === "coast") {
+				r.push(`along the coast just outside the free city,`);
+			} else if (V.SecExp.war.terrain === "outskirts") {
+				r.push(`just against the walls of the arcology,`);
+			} else if (V.SecExp.war.terrain === "mountains") {
+				r.push(`in the mountains overlooking the arcology,`);
+			} else if (V.SecExp.war.terrain === "wasteland") {
+				r.push(`in the wastelands outside the free city territory,`);
+			} else if (V.SecExp.war.terrain === "international waters") {
+				r.push(`in the water surrounding the free city,`);
+			} else if (["a sunken ship", "an underwater cave"].includes(V.SecExp.war.terrain)) {
+				r.push(`in <strong>${V.SecExp.war.terrain}</strong> near the free city`);
+			}
+		} else {
+			r.push(`fought with them street by street`);
+		}
+
+		if (allKilled) {
+			r.push(`completely annihilating their troops, while sustaining`);
+		} else {
+			r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`);
+		}
+		if (V.SecExp.war.losses > 1) {
+			r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`);
+		} else if (V.SecExp.war.losses > 0) {
+			r.push(`a casualty`);
+		} else {
+			r.push(`zero casualties`);
+		}
+		r.push(`${allKilled ? '' : 'themselves'}.`);
+		if (inRebellion) {
+			App.SecExp.slavesDamaged(V.SecExp.war.attacker.losses);
+		}
+
+		if (V.SecExp.war.result === 3) {
+			if (V.SecExp.war.turns <= 5) {
+				r.push(`The fight was quick and one sided, our men easily stopped the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`disorganized horde's futile attempt at raiding your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`mercenaries dead in their tracks${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters dead in their tracks${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world soldiers dead in their tracks${end}`);
+					}
+				} else {
+					r.push(`disorganized revolt in a few well aimed assaults.`);
+				}
+			} else if (V.SecExp.war.turns <= 7) {
+				r.push(`The fight was hard, but in the end our men stopped the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`disorganized horde attempt at raiding your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`slavers attempt at weakening your arcology${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`fighters attack${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`soldiers of the old world${end}`);
+					}
+				} else {
+					r.push(`disorganized revolt with several well aimed assaults.`);
+				}
+			} else {
+				r.push(`The fight was long and hard, but our men managed to stop the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`horde raiding party${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`free city mercenaries${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world soldiers${end}`);
+					}
+				} else {
+					r.push(`revolt before it could accumulate momentum.`);
+				}
+			}
+			if (inBattle && V.SecExp.battles.victoryStreak >= 2) {
+				r.push(`adding another victory to the growing list of our military's successes.`);
+			} else if (inBattle && V.SecExp.battles.lossStreak >= 2) {
+				r.push(`finally putting an end to a series of unfortunate defeats.`);
+			}
+		} else if (V.SecExp.war.result === -3) {
+			if (V.SecExp.war.turns <= 5) {
+				r.push(`The fight was quick and one sided, our men were easily crushed by the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`barbaric horde of raiders${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`consumed mercenary veterans sent against us${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`fanatical fury of the freedom fighters${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`discipline of the old world armies${end}`);
+					}
+				} else {
+					r.push(`furious charge of the rebels.`);
+				}
+			} else if (V.SecExp.war.turns <= 7) {
+				r.push(`The fight was hard and in the end the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`bandits proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`slavers proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters proved too much to handle for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world proved too much to handle for our men${end}`);
+					}
+				} else {
+					r.push(`rebels proved too much to handle for our men.`);
+				}
+			} else {
+				r.push(`The fight was long and hard, but despite their bravery the`);
+				if (inBattle) {
+					if (V.SecExp.war.attacker.type === "raiders") {
+						r.push(`horde proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "free city") {
+						r.push(`mercenary slavers proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+						r.push(`freedom fighters fury proved too much for our men${end}`);
+					} else if (V.SecExp.war.attacker.type === "old world") {
+						r.push(`old world troops proved too much for our men${end}`);
+					}
+				} else {
+					r.push(`rebels proved too much for our men.`);
+				}
+			}
+			if (inBattle && V.SecExp.battles.victoryStreak >= 2) {
+				r.push(`so interrupting a long series of military successes.`);
+			} else if (inBattle && V.SecExp.battles.lossStreak >= 2) {
+				r.push(`confirming the long list of recent failures our armed forces collected.`);
+			}
+		} else if (V.SecExp.war.result === 2) {
+			r.push(`The fight was long and hard, but in the end our men managed to`);
+			if (inBattle) {
+				r.push(`repel the`);
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`raiders, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`mercenaries, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`freedom fighters, though not without difficulty.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`old world soldiers, though not without difficulty.`);
+				}
+			} else {
+				r.push(`stop the revolt, though not without difficulty.`);
+			}
+		} else if (V.SecExp.war.result === -2) {
+			r.push(`The fight was long and hard. Our men in the end had to yield to the`);
+			if (inBattle) {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`horde of raiders, which was fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`slavers, which were fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`freedom fighters, which were fortunately unable to capitalize on their victory.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`old world soldiers, which were fortunately unable to capitalize on their victory.`);
+				}
+			} else {
+				r.push(`rebels, which were fortunately unable to capitalize on their victory.`);
+			}
+		}
+
+		if (inRebellion && V.SecExp.rebellions.sfArmor) {
+			r.push(`More units were able to survive thanks to wearing ${V.SF.Lower}'s combat armor suits.`);
+		}
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		// Effects
+		if (result === 3 || result === 2) {
+			r.push(` Thanks to your victory, your `, App.UI.DOM.makeElement("span", `reputation`, "green"), ` and `, App.UI.DOM.makeElement("span", `authority`, "darkviolet"), `${result === 2 ? 'slightly' : ''} increased.`);
+			if (inRebellion) {
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `Many of the rebelling slaves were recaptured and punished.`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `Many of the rebelling citizens were captured and punished, many others enslaved.`);
+				}
+				App.UI.DOM.appendNewElement("div", node, `The instigators were executed one after another in a public trial that lasted for almost three days.`);
+				if (slaveRebellion) {
+					V.NPCSlaves -= random(10, 30);
+				} else {
+					V.lowerClass -= random(10, 30);
+				}
+				repX((result === 3 ? random(800, 1000) : random(600, 180)), "war");
+				V.SecExp.core.authority += (result === 3 ? random(800, 1000) : random(600, 800));
+			} else {
+				if (result === 3) {
+					r.push("You were also able to capture");
+					if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 50) {
+						r.push(`a small amount of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 100) {
+						r.push(`an healthy group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 150) {
+						r.push(`a big group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 200) {
+						r.push(`a huge group of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					} else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses > 200) {
+						r.push(`a great amount of attackers,`);
+						captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3);
+					}
+					r.push(`and some of their equipment,`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, " Our men were not able to capture any combatants, however some equipment was seized during the enemy's hasty retreat,");
+				}
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX((result === 3 ? 4000 : 1000) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 800 : 200) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX((result === 3 ? 6000 : 1500) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1200 : 300) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX((result === 3 ? 7500 : 2000) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1500 : 450) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX((result === 3 ? 8000 : 2100) * majorBattleMod, "war");
+					V.SecExp.core.authority += (result === 3 ? 1600 : 500) * majorBattleMod;
+				}
+				r.push(`which once sold produced`);
+				if (V.SecExp.war.attacker.equip === 0) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'small amount' : 'bit'} of cash.</span>`);
+					loot += (result === 3 ? 1000 : 500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 1) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'moderate' : 'small'} amount of cash.</span>`);
+					loot += (result === 3 ? 5000 : 2500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 2) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'good' : 'moderate'} amount of cash.</span>`);
+					loot += (result === 3 ? 10000 : 5000) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 3) {
+					r.push(`<span class="yellowgreen">a ${result === 3 ? 'great' : 'good'} amount of cash.</span>`);
+					loot += (result === 3 ? 15000 : 7500) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.equip === 4) {
+					r.push(`<span class="yellowgreen">${result === 3 ? 'wealth worthy of the mightiest warlord' : 'a great amount of cash'}.</span>`);
+					loot += (result === 3 ? 20000 : 10000) * majorBattleMod;
+				}
+				if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) {
+					r.push(`Part of the loot is distributed to your mercenaries.`);
+					if (result === 3) {
+						captives = Math.trunc(captives * 0.6);
+					}
+					loot = Math.trunc(loot * 0.6);
+				}
+				cashX(loot, "war");
+				App.Events.addParagraph(node, r);
+				r = [];
+				if (result === 3) {
+					r.push(`Damage to the city was <span class="red">limited,</span> it won't take much to rebuild. Very few citizens or slaves were involved in the fight and even fewer met their end, safeguarding the prosperity of the arcology.`);
+				} else {
+					r.push(`Damage to the infrastructure was <span class="yellow">virtually non-existent,</span> costing only pocket cash to bring the structure back to normal. The inhabitants as well reported little to no injuries, because of this the prosperity of the arcology did not suffer.`);
+				}
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				cashX(forceNeg((result === 3 ? 1000 : 2000) * majorBattleMod), "war");
+				if (result === 3) {
+					if (V.SecExp.battles.victoryStreak >= 3) {
+						r.push(`It seems your victories over the constant threats directed your way is having <span class="green">a positive effect on the prosperity of the arcology,</span> due to the security your leadership affords.`);
+						V.arcologies[0].prosperity += 5 * majorBattleMod;
+					}
+				} else {
+					V.lowerClass -= random(10) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(20) * majorBattleMod);
+				}
+				App.Events.addParagraph(node, r);
+				r = [];
+			}
+		} else if (result === -3 || result === -2) {
+			r.push(` Thanks to your defeat, your `, App.UI.DOM.makeElement("span", `reputation`, "red"), ` and `, App.UI.DOM.makeElement("span", `authority`, "red"), ` decreased.`);
+			if (inRebellion) {
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
+					V.lowerClass -= (result === -3 ? random(50, 100) : random(40, 80));
+					lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
+					App.SecExp.slavesDamaged(lostSlaves);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
+					V.lowerClass -= Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.6);
+				}
+				repX((result === -3 ? random(-800, -1000) : random(-600, -800)), "war");
+				V.SecExp.core.authority -= (result === -3 ? random(800, 1000) : random(600, 800));
+			} else {
+				if (result === -3) {
+					App.UI.DOM.appendNewElement("div", node, " Obviously your troops were not able to capture anyone or anything.");
+
+					r = [];
+					r.push(`In the raiding following the battle <span class="red">the arcology sustained heavy damage,</span> which will cost quite the amount of cash to fix. Reports of <span class="red">citizens or slaves killed or missing</span> flood your office for a few days following the defeat.`);
+					if (V.SecExp.battles.lossStreak >= 3) {
+						r.push(`This only confirms the fears of many, <span class="red">your arcology is not safe</span> and it is clear their business will be better somewhere else.`);
+						V.arcologies[0].prosperity -= 5 * majorBattleMod;
+					}
+				} else {
+					r.push(`It was a close defeat, but nonetheless your <span class="red">reputation</span> and <span class="red">authority</span> slightly decreased.`);
+					r.push("Your troops were not able to capture anyone or anything.");
+					r = [];
+					r.push(`The enemy did not have the strength to raid the arcology for long, still <span class="red">the arcology sustained some damage,</span> which will cost a moderate amount of cash to fix. Some citizens and slaves found themselves on the wrong end of a gun and met their demise.`);
+					r.push(`Some business sustained heavy damage, slightly impacting the arcology's prosperity.`);
+				}
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				App.Events.addParagraph(node, r);
+				r = [];
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX(forceNeg((result === -3 ? 400 : 40) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 400 : 40) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX(forceNeg((result === -3 ? 600 : 60) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 600 : 60) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX(forceNeg((result === -3 ? 750 : 75) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 750 : 75) * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX(forceNeg((result === -3 ? 800 : 80) * majorBattleMod), "war");
+					V.SecExp.core.authority -= (result === -3 ? 800 : 80) * majorBattleMod;
+				}
+				
+				cashX(forceNeg((result === -3 ? 5000 : 3000) * majorBattleMod), "war");
+				if (V.week <= 30) {
+					V.lowerClass -= random(result === -3 ? 100 : 50) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 150 : 75) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 5 : 2) * majorBattleMod;
+				} else if (V.week <= 60) {
+					V.lowerClass -= random(result === -3 ? 120 : 60) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 170 : 85) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 10 : 5) * majorBattleMod;
+				} else if (V.week <= 90) {
+					V.lowerClass -= random(result === -3 ? 140 : 70) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 190 : 95) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 15 : 7) * majorBattleMod;
+				} else if (V.week <= 120) {
+					V.lowerClass -= random(result === -3 ? 160 : 80) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 210 : 105) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 20 : 10) * majorBattleMod;
+				} else {
+					V.lowerClass -= random(result === -3 ? 180 : 90) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(result === -3 ? 230 : 115) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(result === -3 ? 25 : 12) * majorBattleMod;
+				}
+			}
+		}
+
+		if (inRebellion) {
+			V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
+			if (V.SecExp.war.engageRule === 0) {
+				r.push(`Since you ordered your troops to limit their weaponry to low caliber or nonlethal, the arcology reported only`);
+				r.push(`<span class="red">minor damage.</span>`);
+				r.push(`Most citizens and non involved slaves remained unharmed, though some casualties between the civilians were inevitable.`);
+				r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
+				r.push(setRepairTime("arc", 3, 1500));
+				if (V.week <= 30) {
+					arcologyEffects(40, 65, 2);
+				} else if (V.week <= 60) {
+					arcologyEffects(50, 75, 5);
+				} else if (V.week <= 90) {
+					arcologyEffects(60, 85, 7);
+				} else if (V.week <= 120) {
+					arcologyEffects(70, 95, 10);
+				} else {
+					arcologyEffects(80, 105, 12);
+				}
+			} else if (V.SecExp.war.engageRule === 1) {
+				r.push(`You ordered your troops to limit their weaponry to non-heavy, non-explosive, because of this the arcology reported`);
+				r.push(`<span class="red">moderate damage.</span>`);
+				r.push(`Most citizens and non involved slaves remained unharmed or only lightly wounded, but many others did not make it. Unfortunately casualties between the civilians were inevitable.`);
+				r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
+				r.push(setRepairTime("arc", 5, 2000));
+				if (V.week <= 30) {
+					arcologyEffects(60, 85, 4);
+				} else if (V.week <= 60) {
+					arcologyEffects(70, 95, 7);
+				} else if (V.week <= 90) {
+					arcologyEffects(80, 105, 9);
+				} else if (V.week <= 120) {
+					arcologyEffects(90, 115, 12);
+				} else {
+					arcologyEffects(100, 125, 14);
+				}
+			} else if (V.SecExp.war.engageRule === 2) {
+				r.push(`Since you did not apply any restriction on the weapons your forces should use, the arcology reported`);
+				r.push(`<span class="red">heavy damage.</span>`);
+				r.push(`Many citizens and uninvolved slaves are reported killed or missing. Casualties between the civilians were inevitable.`);
+				r.push(`Many businesses were damaged during the battle either by the fight itself, by fires which spread unchecked for hours or by looters.`);
+				r.push(setRepairTime("arc", 7, 3000));
+				if (V.week <= 30) {
+					arcologyEffects(100, 150, 5);
+				} else if (V.week <= 60) {
+					arcologyEffects(120, 170, 10);
+				} else if (V.week <= 90) {
+					arcologyEffects(140, 190, 15);
+				} else if (V.week <= 120) {
+					arcologyEffects(160, 210, 20);
+				} else {
+					arcologyEffects(180, 230, 25);
+				}
+			} else {
+				r.push(`Thanks to the advance riot control weaponry developed by your experts, the rebels were mostly subdued or killed with`);
+				r.push(`<span class="yellow">little to no collateral damage to the arcology</span> and its inhabitants.`);
+				r.push(`A few businesses were looted, but the damage was very limited.`);
+				r.push(setRepairTime("arc", 2, 1000));
+				if (V.week <= 30) {
+					arcologyEffects(20, 45, 2);
+				} else if (V.week <= 60) {
+					arcologyEffects(30, 55, 4);
+				} else if (V.week <= 90) {
+					arcologyEffects(40, 65, 6);
+				} else if (V.week <= 120) {
+					arcologyEffects(50, 75, 8);
+				} else {
+					arcologyEffects(60, 85, 10);
+				}
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			if (!V.SecExp.war.reactorDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the reactor complex and sabotaged it, causing massive power fluctuations and blackouts.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("reactor", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0)));
+				} else {
+					r.push(`While the reactor was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the reactor protected it from the multiple sabotage attempts carried out by the rebels.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (!V.SecExp.war.waterwayDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the water management complex and sabotaged it, causing huge water leaks throughout the arcology and severely limiting the water supply.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("waterway", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0)));
+				} else {
+					r.push(`While the water management complex was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the water management complex protected it from the sabotage attempt of the rebels.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (!V.SecExp.war.assistantDefense) {
+				if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0) * 25))) {
+					r.push(`Unfortunately during the fighting a group of slaves infiltrated the facility housing ${V.assistant.name}'s mainframe and sabotaged it. Without its AI, the arcology will be next to impossible to manage.`);
+					r.push(`<span class="red">time and money to repair the damage.</span>`);
+					r.push(setRepairTime("assistant", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0)));
+				} else {
+					r.push(`While the ${V.assistant.name}'s mainframe was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
+				}
+			} else {
+				r.push(`The garrison assigned to the facility housing ${V.assistant.name}'s mainframe prevented any sabotage attempt.`);
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+
+			if (V.SecExp.war.penthouseDefense && V.BodyguardID !== 0) {
+				r.push(`The garrison assigned to the penthouse together with your loyal Bodyguard stopped all assaults against your penthouse with ease.`);
+			} else {
+				if (random(1, 100) <= 75) {
+					r.push(`During the fighting a group of slaves assaulted the penthouse.`);
+					if (S.Bodyguard) {
+						r.push(`Your Bodyguard, ${S.Bodyguard.slaveName}, stood strong against the furious attack.`);
+					} else if (V.SecExp.war.penthouseDefense) {
+						r.push(`The garrison stood strong against the furious attack.`);
+					} else {
+						r.push(`Isolated and alone, you stood strong against the furious attack.`);
+					}
+					["PC", "Concubine", "Bodyguard"].forEach(c => r.push(checkWoundStatus(c)));
+					r.push(`<span class="red">The damage to the structure will be</span> costly to repair.`);
+					r.push(IncreasePCSkills('engineering', 0.1));
+					cashX(-2000, "war");
+				} else {
+					if (!V.SecExp.war.penthouseDefense) {
+						r.push(`While the penthouse was left without a sizable garrison, there was no dangerous assault against it. Let's hope we'll always be this lucky.`);
+					} else {
+						r.push(`There was no sizable assault against the penthouse. Let's hope we'll always be this lucky.`);
+					}
+				}
+			}
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			r = [];
+		}
+		V.lowerClass = Math.max(V.lowerClass, 0);
+		V.NPCSlaves = Math.max(V.NPCSlaves, 0);
+
+		if (inBattle) { // tactics
+			App.Events.addParagraph(node, App.SecExp.commanderEffectiveness("report"));
+			r = [];
+
+			r.push(`${V.SecExp.war.commander === "PC" ? 'You' : 'Your commander'}`);
+			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+				r.push(`chose to employ "bait and bleed" tactics or relying on quick attacks and harassment to tire and wound the enemy until their surrender.`);
+			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+				r.push(`chose to employ "guerrilla" tactics or relying on stealth, terrain knowledge and subterfuge to undermine and ultimately destroy the enemy.`);
+			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+				r.push(`chose to employ "choke points" tactics or the extensive use of fortified or highly defensive positions to slow down and eventually stop the enemy.`);
+			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+				r.push(`chose to employ "interior lines" tactics or exploiting the defender's shorter front to quickly disengage and concentrate troops when and where needed.`);
+			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+				r.push(`chose to employ "pincer maneuver" tactics or attempting to encircle the enemy by faking a collapsing center front.`);
+			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+				r.push(`chose to employ "defense in depth" tactics or relying on mobility to disengage and exploit overextended enemy troops by attacking their freshly exposed flanks.`);
+			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+				r.push(`chose to employ "blitzkrieg" tactics or shattering the enemy's front-line with a violent, concentrated armored assault.`);
+			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+				r.push(`chose to employ "human wave" tactics or overwhelming the enemy's army with a massive infantry assault.`);
+			}
+			if (V.SecExp.war.terrain === "urban") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The urban terrain synergized well with bait and bleed tactics, slowly chipping away at the enemy's forces from the safety of the narrow streets and empty buildings.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The urban terrain synergized well with guerrilla tactics, eroding your enemy's determination from the safety of the narrow streets and empty buildings.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The urban environment offers many opportunities to hunker down and stop the momentum of the enemy's assault while keeping your soldiers in relative safety.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the urban environment offers many highly defensive position, it does restrict movement and with it the advantages of exploiting interior lines.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The urban terrain does not allow for wide maneuvers, the attempts of your forces to encircle the attackers are mostly unsuccessful.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`While the urban environment offers many defensive positions, it limits mobility, limiting the advantages of using a defense in depth tactic.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The urban terrain is difficult to traverse, making your troops attempt at a lightning strike unsuccessful.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The urban terrain offers great advantages to the defender, your men find themselves in great disadvantage while mass assaulting the enemy's position.`);
+				}
+			} else if (V.SecExp.war.terrain === "rural") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The open terrain of rural lands does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The open terrain of rural lands does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The open terrain of rural lands does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "hills") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the hills offer some protection, they also make it harder to maneuver; bait and bleed tactics will not be 100% effective here.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The hills offer protection to both your troops and your enemy's, making it harder for your men to accomplish guerrilla attacks effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`While not as defensible as mountains, hills offer numerous opportunities to funnel the enemy towards highly defensible choke points.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to exploit the defender's greater mobility afforded by interior lines.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`Limited mobility due to the hills is a double edged sword, affording your men a decent shot at encirclement.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to use elastic defense tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The limited mobility on hills hampers the capability of your troops to organize lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The defensibility of hills makes it harder to accomplish victory through mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "coast") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`On the coast there's little space and protection to effectively employ bait and bleed tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`On the coast there's little space and protection to effectively employ guerrilla tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`Amphibious attacks are difficult in the best of situations; the defender has a very easy time funneling the enemy towards their key defensive positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While in an amphibious landing mobility is not the defender's best weapon, exploiting interior lines still affords your troops some advantages.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`Attempting to encircle a landing party is not the best course of action, but not the worst either.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`In an amphibious assault it's very easy for the enemy to overextend, making defense in depth tactics quite effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The rough, restricted terrain does not lend itself well to lightning strikes, but the precarious position of the enemy still gives your mobile troops tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The rough, restricted terrain does not lend itself well to mass assaults, but the precarious position of the enemy still gives your troops tactical superiority.`);
+				}
+			} else if (V.SecExp.war.terrain === "outskirts") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops bait and bleed tactics would require.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops guerrilla tactics would require.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The imposing structure of the arcology itself provides plenty of opportunities to create fortified choke points from which to shatter the enemy assault.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering overall effectiveness of interior lines tactics.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering the chances of making an effective encirclement.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`Having the arcology near the battlefield means there are limited available maneuvers to your troops, who still needs to defend the structure, making defense in depth tactics not as effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`While an assault may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the lightning strike.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`While an attack may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the mass assault.`);
+				}
+			} else if (V.SecExp.war.terrain === "mountains") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the mountains offer great protection, they also limit maneuverability; bait and bleed tactics will not be quite as effective here.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The mountains offer many excellent hiding spots and defensive positions, making guerrilla tactics very effective.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The mountains offer plenty of opportunity to build strong defensive positions from which to shatter the enemy's assault.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`While the rough terrain complicates maneuvers, the defensive advantages offered by the mountains offsets its negative impact.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective encirclement in this environment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`While mobility is limited, defensive positions are plentiful; your men are not able to fully exploit overextended assaults, but are able to better resist them.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective lightning strike in this environment.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective mass assault in this environment.`);
+				}
+			} else if (V.SecExp.war.terrain === "wasteland") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make bait and bleed tactics work well enough.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make guerrilla tactics work well enough.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The wastelands are mostly open terrain; your men have a difficult time setting up effective fortified positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men can exploit to the maximum the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The wastelands, while rough, are mostly open terrain; your men can set up an effective encirclement here.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The wastelands, while rough, are mostly open terrain, allowing your men to liberally maneuver to exploit overextended enemies.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "international waters") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The open terrain of international waters does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The open terrain of international waters does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The open terrain of international waters does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "an underwater cave") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The tight terrain of an underwater cave does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The tight terrain of an underwater cave does offers many hiding spots, making it easier for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The tight terrain of an underwater cave offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The tight terrain makes it hard for your men to easily exploit the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The tight terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The tight terrain hinders the mobility of your army, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The tight terrain hinders the mobility of your army, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The tight terrain hinders the mobility of your army, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			} else if (V.SecExp.war.terrain === "a sunken ship") {
+				if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+					r.push(`The tight terrain of a sunken ship lends itself well to bait and bleed tactics, making it easier for your men to achieve tactical superiority.`);
+				} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+					r.push(`The tight terrain of a sunken ship offers many hiding spots, making it easy for your men to perform guerrilla actions effectively.`);
+				} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+					r.push(`The tight terrain of a sunken ship offers many natural choke points, making it easy for your troops to funnel the enemy towards highly defended positions.`);
+				} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+					r.push(`The tight terrain does not allow your men to easily exploit the superior mobility of the defender.`);
+				} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+					r.push(`The open terrain hinders the mobility of your army, allowing them to easily position themselves for envelopment.`);
+				} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+					r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`);
+				} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+					r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`);
+				} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+					r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`);
+				}
+			}
+
+			if (V.SecExp.war.chosenTactic === "Bait and Bleed") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, bait and bleed tactics are not effective against them.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The modern armies hired by Free Cities are decently mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Guerrilla") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, guerrilla tactics are not effective against them.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The modern armies hired by Free Cities are highly mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Choke Points") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`Raiders lack heavy weaponry or armor, so making use of fortified positions is an excellent way to dissipate the otherwise powerful momentum of their assault.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The high tech equipment Free Cities can afford to give their guns for hire means there's no defensive position strong enough to stop them, still the relatively low numbers means they will have to take a careful approach, slowing them down.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Old world armies have both the manpower and the equipment to conquer any defensive position, making use of strong fortifications will only bring you this far against them.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`The lack of specialized weaponry means freedom fighters have a rather hard time overcoming tough defensive positions, unfortunately they have also a lot of experience in avoiding them.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Interior Lines") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`The highly mobile horde of raiders will not give much room for your troops to maneuver, lowering their tactical superiority.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`While decently mobile, Free Cities forces are not in high enough numbers to risk maintaining prolonged contact, allowing your troops to quickly disengage and redeploy where it hurts.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Old world armies are not famous for the mobility, which makes them highly susceptible to any tactic that exploits maneuverability and speed.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not the best equipped army, the experience and mobility typical of freedom fighters groups make them tough targets for an army that relies itself on mobility.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`While numerous, the undisciplined masses of raiders are easy prey for encirclements.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`While decently mobile, the low number of Free Cities expedition forces make them good candidates for encirclements.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`The discipline and numbers of old world armies make them quite difficult to encircle.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not particularly mobile, freedom fighters are used to fight against overwhelming odds, diminishing the effectiveness of the encirclement.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Defense In Depth") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`While their low discipline makes them prime candidates for an elastic defense type of strategy, their high numbers limit your troops maneuverability.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`With their low numbers Free Cities mercenaries are quite susceptible to this type of tactic, despite their mobility.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`With their low mobility old world armies are very susceptible to this type of strategy.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`Low mobility and not particularly high numbers mean freedom fighters can be defeated by employing elastic defense tactics.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Blitzkrieg") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`With their low discipline and lack of heavy equipment, lightning strikes are very effective against raider hordes.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`Having good equipment and discipline on their side, Free Cities expeditions are capable of responding to even strong lightning strikes.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`While disciplined, old world armies low mobility makes them highly susceptible to lightning strikes.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`While not well equipped, freedom fighters have plenty of experience fighting small, mobile attacks, making them difficult to defeat with lightning strikes.`);
+				}
+			} else if (V.SecExp.war.chosenTactic === "Human Wave") {
+				if (V.SecExp.war.attacker.type === "raiders") {
+					r.push(`The hordes of raiders are much more experienced than your soldiers in executing mass assaults and they also have a lot more bodies to throw in the grinder.`);
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					r.push(`The good equipment and mobility of Free Cities mercenaries cannot save them from an organized mass assault.`);
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					r.push(`Unfortunately the discipline and good equipment of old world armies allow them to respond well against a mass assault.`);
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					r.push(`The relative low numbers and not great equipment typical of freedom fighters make them susceptible to being overwhelmed by an organized mass assault.`);
+				}
+			}
+			r.push(`In the end`);
+			if (V.SecExp.war.commander === "PC") {
+				r.push(`you were`);
+			} else {
+				r.push(`your commander was`);
+			}
+			if (V.SecExp.war.tacticsSuccessful) {
+				r.push(`<span class="green">able to successfully employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly enhancing`);
+			} else {
+				r.push(`<span class="red">not able to effectively employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly affecting`);
+			}
+			r.push(`the efficiency of your army.`);
+			App.Events.addParagraph(node, r);
+			r = [];
+		}
+
+		let rand;
+		let count = 0;
+		let averageLosses = 0;
+		let loss = 0;
+		const lossesList = [];
+		if (hasLosses || V.SecExp.war.losses === 0) {
+			if (hasLosses) { // Generates a list of randomized losses, from which each unit picks one at random
+				averageLosses = Math.trunc(V.SecExp.war.losses / App.SecExp.battle.deployedUnits());
+				for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) {
+					let assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100));
+					if (assignedLosses > V.SecExp.war.losses) {
+						assignedLosses = V.SecExp.war.losses;
+						V.SecExp.war.losses = 0;
+					} else {
+						V.SecExp.war.losses -= assignedLosses;
+					}
+					lossesList.push(assignedLosses);
+				}
+				if (V.SecExp.war.losses > 0) {
+					lossesList[random(lossesList.length - 1)] += V.SecExp.war.losses;
+				}
+				lossesList.shuffle();
+
+				// Sanity check for losses
+				for (let l of lossesList) {
+					if (!Number.isInteger(l)) {
+						l = 0;
+					}
+					count += l;
+				}
+				if (count < V.SecExp.war.losses) {
+					rand = random(lossesList.length - 1);
+					lossesList[rand] += V.SecExp.war.losses - count;
+				} else if (count > V.SecExp.war.losses) {
+					const diff = count - V.SecExp.war.losses;
+					rand = random(lossesList.length - 1);
+					lossesList[rand] = Math.clamp(lossesList[rand]-diff, 0, 100);
+				}
+			}
+		} else {
+			throw Error(`Losses are ${V.SecExp.war.losses}.`);
+		}
+
+		if (inRebellion && V.SecExp.war.irregulars > 0) {
+			if (hasLosses) {
+				loss = lossesList.pluck();
+				if (loss > V.ACitizens * 0.95) { // This is unlikely to happen, but might as well be safe
+					loss = Math.trunc(V.ACitizens * 0.95);
+				}
+			}
+			App.UI.DOM.appendNewElement("div", node, `The volunteering citizens were quickly organized into an irregular militia unit and deployed in the arcology: ${casualtiesReport('irregulars', loss)}`);
+			if (hasLosses) {
+				if (loss > V.lowerClass * 0.95) { // I suspect only lower class ever get to fight/die, but being safe
+					V.lowerClass = Math.trunc(V.lowerClass * 0.05);
+					loss -= Math.trunc(V.lowerClass * 0.95);
+					if (loss > V.middleClass * 0.95) {
+						V.middleClass = Math.trunc(V.middleClass * 0.05);
+						loss -= Math.trunc(V.middleClass *0.95);
+						if (loss > V.upperClass * 0.95) {
+							V.upperClass = Math.trunc(V.upperClass * 0.05);
+							loss -= Math.trunc(V.upperClass * 0.95);
+							if (loss > V.topClass * 0.95) {
+								V.topClass = Math.trunc(V.topClass * 0.05);
+							} else {
+								V.topClass -= loss;
+							}
+						} else {
+							V.upperClass -= loss;
+						}
+					} else {
+						V.middleClass -= loss;
+					}
+				} else {
+					V.lowerClass -= loss;
+				}
+			}
+		}
+		if (V.SF.Toggle && V.SF.Active >= 1 && (inRebellion || inBattle && V.SecExp.war.deploySF)) {
+			if (hasLosses) {
+				loss = lossesList.pluck();
+				loss = Math.clamp(loss, 0, V.SF.ArmySize);
+				V.SF.ArmySize -= loss;
+			}
+			App.UI.DOM.appendNewElement("div", node, `${capFirstChar(V.SF.Lower)}, ${num(V.SF.ArmySize)} strong, is called to arms: ${casualtiesReport('SF', loss)}`);
+		}
+		for (const type of App.SecExp.unit.list()) {
+			if (App.SecExp.battle.deployedUnits(type) >= 1) {
+				let units;
+				if (type !== 'bots') {
+					units = V.SecExp.units[type].squads;
+				} else {
+					units = [V.SecExp.units.bots];
+				}
+				for (const unit of units) {
+					if (App.SecExp.unit.isDeployed(unit)) {
+						let r = [];
+						if (hasLosses) {
+							loss = lossesList.pluck();
+							loss = Math.clamp(loss, 0, unit.troops);
+						}
+
+						if (inRebellion) {
+							if (type === "bots") {
+								r.push(`Security drones: ${casualtiesReport(type, loss, unit)}`);
+							} else {
+								r.push(`${unit.platoonName} participated in the battle. They remained loyal to you. ${casualtiesReport(type, loss, unit)}`);
+							}
+						} else {
+							r.push(`${type !== "bots" ? `${unit.platoonName}` : "Security drones"}: ${casualtiesReport(type, loss, unit)}`);
+						}
+						if (type !== "bots") {
+							unit.battlesFought++;
+							if (loss > 0) {
+								const med = Math.round(Math.clamp(loss * unit.medics * 0.25, 1, loss));
+								if (unit.medics === 1) {
+									r.push(`Some men were saved by their medics.`);
+								}
+								unit.troops -= Math.trunc(Math.clamp(loss - med, 0, unit.maxTroops));
+								V.SecExp.units[type].dead += Math.trunc(loss - med);
+							}
+							if (unit.training < 100 && random(1, 100) > 60) {
+								r.push(`Experience has increased.`);
+								unit.training += random(5, 15) + (isMajorBattle ? 1 : 0) * random(5, 15);
+							}
+						} else if (type === "bots" && loss > 0) {
+							unit.troops -= loss;
+						}
+						App.Events.addNode(node, r, "div");
+					}
+				}
+			}
+		}
+
+		if (inRebellion) {
+			for (const unit of App.SecExp.unit.list().slice(1)) {
+				App.UI.DOM.appendNewElement("p", node, rebellingUnitsFate(unit, averageLosses));
+			}
+		} else {
+			if (
+				V.SF.Toggle && V.SF.Active >= 1 &&
+				(V.SF.Squad.Firebase >= 7 || V.SF.Squad.GunS >= 1 || V.SF.Squad.Satellite >= 5 || V.SF.Squad.GiantRobot >= 6 || V.SF.Squad.MissileSilo >= 1)
+			) {
+				// SF upgrades effects
+				r = [];
+				if (V.SF.Squad.Firebase >= 7) {
+					r.push(`The artillery pieces installed around ${V.SF.Lower}'s firebase provided vital fire support to the troops in the field.`);
+				}
+				if (V.SF.Squad.GunS >= 1) {
+					r.push(`The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support.`);
+				}
+				if (V.SF.Squad.Satellite >= 5 && V.SF.SatLaunched > 0) {
+					r.push(`The devastating power of ${V.SF.Lower}'s satellite was employed with great efficiency against the enemy.`);
+				}
+				if (V.SF.Squad.GiantRobot >= 6) {
+					r.push(`The giant robot of ${V.SF.Lower} proved to be a great boon to our troops, shielding many from the worst the enemy had to offer.`);
+				}
+				if (V.SF.Squad.MissileSilo >= 1) {
+					r.push(`The missile silo exterminated many enemy soldiers even before the battle would begin.`);
+				}
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			let menialPrice = Math.trunc((V.slaveCostFactor * 1000) / 100) * 100;
+			menialPrice = Math.clamp(menialPrice, 500, 1500);
+			captives = Math.trunc(captives);
+			if (captives > 0) {
+				let candidates = 0;
+				r.push(`During the battle ${captives} attackers were captured.`);
+				if (random(1, 100) <= 25) {
+					candidates = Math.min(captives, random(1, 3));
+					r.push(`${capFirstChar(num(candidates, true))} of them have the potential to be sex slaves.`);
+				}
+
+				const sell = function() {
+					cashX((menialPrice * captives), "menialTransfer");
+					return `Captives sold`;
+				};
+				const keep = function() {
+					V.menials += (captives - candidates);
+					for (let i = 0; i < candidates; i++) {
+						const generateFemale = random(0, 99) < V.seeDicks;
+						let slave = GenerateNewSlave((generateFemale ? "XY" : "XX"), {minAge: 16, maxAge: 32, disableDisability: 1});
+						slave.weight = (generateFemale ? random(-20, 30) : random(0, 30));
+						slave.muscles = (generateFemale ? random(15, 80) : random(25, 80));
+						slave.waist = (generateFemale ? random(10, 80) : random(-20, 20));
+						slave.skill.combat = 1;
+						slave.origin = `$He is an enslaved ${V.SecExp.war.attacker.type} soldier captured during a battle.`;
+						newSlave(slave); // skip New Slave Intro
+					}
+					return `Captives primarily added as menial slaves.`;
+				};
+
+				App.Events.addResponses(node, [
+					new App.Events.Result(`sell them all immediately`, sell),
+					new App.Events.Result(`keep them as primarily menial slaves`, keep),
+				]);
+			}
+		}
+	} else {
+		if (result === -1) {
+			if (inRebellion) {
+				r.push(`Rather than waste the lives of your men you decided to surrender, hoping the rebels will cause less damage if you indulge them, this is however a big hit to your status.`);
+				r.push(`Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
+				r.push(`The surrender allows the arcology to survive <span class="yellow">mostly intact</span>`);
+				r.push(`however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+				App.Events.addParagraph(node, r);
+				r = [];
+
+				if (slaveRebellion) {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
+				} else {
+					App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
+				}
+				cashX(-1000, "war");
+				repX(random(-1000, -1200), "war");
+				V.SecExp.core.authority -= random(1000, 1200);
+				if (V.week <= 30) {
+					arcologyEffects(100, 150, 5);
+				} else if (V.week <= 60) {
+					arcologyEffects(120, 170, 10);
+				} else if (V.week <= 90) {
+					arcologyEffects(140, 190, 15);
+				} else if (V.week <= 120) {
+					arcologyEffects(160, 210, 20);
+				} else {
+					arcologyEffects(180, 230, 25);
+				}
+				V.lowerClass -= random(50, 100);
+				lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
+				App.SecExp.slavesDamaged(lostSlaves);
+			} else {
+				r.push(`Rather than waste the lives of your men you decided to surrender, hoping your enemy will cause less damage if you indulge them, this is however a big hit to your status. Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
+				if (V.SecExp.war.attacker.type === "raiders") {
+					repX(forceNeg(600 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 600 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "free city") {
+					repX(forceNeg(800 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 800 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+					repX(forceNeg(1000 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 1000 * majorBattleMod;
+				} else if (V.SecExp.war.attacker.type === "old world") {
+					repX(forceNeg(1200 * majorBattleMod), "war");
+					V.SecExp.core.authority -= 1200 * majorBattleMod;
+				}
+				App.Events.addParagraph(node, r);
+				r = [];
+				r.push(`The surrender allows the arcology to survive <span class="red">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+				r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+				cashX(forceNeg(1000 * majorBattleMod), "war");
+				if (V.week <= 30) {
+					V.lowerClass -= random(80) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(120) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(5) * majorBattleMod;
+				} else if (V.week <= 60) {
+					V.lowerClass -= random(100) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(140) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(10) * majorBattleMod;
+				} else if (V.week <= 90) {
+					V.lowerClass -= random(120) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(160) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(15) * majorBattleMod;
+				} else if (V.week <= 120) {
+					V.lowerClass -= random(140) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(180) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(20) * majorBattleMod;
+				} else {
+					V.lowerClass -= random(160) * majorBattleMod;
+					App.SecExp.slavesDamaged(random(200) * majorBattleMod);
+					V.arcologies[0].prosperity -= random(25) * majorBattleMod;
+				}
+			}
+		} else if (result === 0) { // Battles only
+			r.push(`Unfortunately your adversary did not accept your money.`);
+			if (V.SecExp.war.attacker.type === "freedom fighters") {
+				r.push(`Their ideological crusade would not allow such thing.`);
+			} else {
+				r.push(`They saw your attempt as nothing more than admission of weakness.`);
+			}
+			r.push(`There was no time to organize a defense and so the enemy walked into the arcology as it was his. Your reputation and authority suffer a hit.`);
+			if (V.SecExp.war.attacker.type === "raiders") {
+				repX(forceNeg(400 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 400 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "free city") {
+				repX(forceNeg(600 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 600 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+				repX(forceNeg(750 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 750 * majorBattleMod;
+			} else if (V.SecExp.war.attacker.type === "old world") {
+				repX(forceNeg(800 * majorBattleMod), "war");
+				V.SecExp.core.authority -= 800 * majorBattleMod;
+			}
+			V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`Fortunately the arcology survives <span class="yellow">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
+			r.push(`${IncreasePCSkills('engineering', 0.1)}`);
+			cashX(-1000, "war");
+			if (V.week <= 30) {
+				V.lowerClass -= random(80) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(120) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(5) * majorBattleMod;
+			} else if (V.week <= 60) {
+				V.lowerClass -= random(100) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(140) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(10) * majorBattleMod;
+			} else if (V.week <= 90) {
+				V.lowerClass -= random(120) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(160) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(15) * majorBattleMod;
+			} else if (V.week <= 120) {
+				V.lowerClass -= random(140) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(180) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(20) * majorBattleMod;
+			} else {
+				V.lowerClass -= random(160) * majorBattleMod;
+				App.SecExp.slavesDamaged(random(200) * majorBattleMod);
+				V.arcologies[0].prosperity -= random(25) * majorBattleMod;
+			}
+		} else if (result === 1) { // Battles only
+			r.push(`The attackers wisely take the money offered them to leave your territory without further issues. The strength of the Free Cities was never in their guns but in their dollars, and today's events are the perfect demonstration of such strength.`);
+			r.push(`Your <span class="green">reputation slightly increases.</span>`);
+			if (V.SecExp.war.attacker.type === "raiders") {
+				repX(500 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "free city") {
+				repX(750 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "freedom fighters") {
+				repX(1000 * majorBattleMod, "war");
+			} else if (V.SecExp.war.attacker.type === "old world") {
+				repX(1250 * majorBattleMod, "war");
+			}
+			cashX(forceNeg(App.SecExp.battle.bribeCost()), "war");
+		}
+	}
+
+	App.Events.addParagraph(node, r);
+	if (inBattle) {
+		V.SecExp.units.bots.isDeployed = 0;
+		App.SecExp.unit.humanSquads().forEach(s => s.isDeployed = 0);
+	} else {
+		V.SecExp.rebellions[V.SecExp.war.type.toLowerCase().replace(' rebellion', '') + 'Progress'] = 0;
+		V.SecExp.rebellions.tension = Math.clamp(V.SecExp.rebellions.tension - random(50, 100), 0, 100);
+		if (slaveRebellion) {
+			V.SecExp.rebellions.citizenProgress = Math.clamp(V.SecExp.rebellions.citizenProgress - random(50, 100), 0, 100);
+		} else {
+			V.SecExp.rebellions.slaveProgress = Math.clamp(V.SecExp.rebellions.slaveProgress - random(50, 100), 0, 100);
+		}
+	}
+	return node;
+};
diff --git a/src/Mods/SecExp/events/rebellionOptions.js b/src/Mods/SecExp/events/rebellionOptions.js
index fc99eb6d960a450d68903ef683477607748e5b27..785332836056a32dbb869895cdca049d2d656ff4 100644
--- a/src/Mods/SecExp/events/rebellionOptions.js
+++ b/src/Mods/SecExp/events/rebellionOptions.js
@@ -138,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 32d940507acc4a118479eaa512fcc173d408a05c..0000000000000000000000000000000000000000
--- a/src/Mods/SecExp/events/rebellionReport.js
+++ /dev/null
@@ -1,683 +0,0 @@
-App.Events.rebellionReport = function() {
-	V.nextButton = "Continue";
-	V.nextLink = "Scheduled Event";
-	V.encyclopedia = "Battles";
-
-	let lostSlaves;
-	let r = [];
-	const node = new DocumentFragment();
-	const slaveRebellion = V.SecExp.war.type.includes("Slave");
-	const allKilled = V.SecExp.war.attacker.losses === V.SecExp.war.attacker.troops;
-	const result = V.SecExp.war.result;
-
-	/**
-	 * @param {string} [target]
-	 * @param {number} [value]
-	 */
-	const setRepairTime = function(target, value, cost=2000) {
-		V.SecExp.rebellions.repairTime[target] = 3 + random(1) - value;
-		cashX(-cost, "war");
-		return IncreasePCSkills('engineering', 0.1);
-	};
-
-	/**
-	 * @param {string} [type]
-	 * @param {number} [loss]
-	 */
-	const casualtiesReport = function(type, loss, squad=null) {
-		const isSpecial = squad && App.SecExp.unit.list().slice(1).includes(type);
-		let r = [];
-		if (loss <= 0) {
-			r.push(`No`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.2) : 10)) {
-			r.push(`Light`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.4) : 30)) {
-			r.push(`Moderate`);
-		} else if (loss <= (isSpecial ? (squad.troops * 0.6) : 60)) {
-			r.push(`Heavy`);
-		} else {
-			r.push(`Catastrophic`);
-		}
-		r.push(`casualties suffered.`);
-		if (App.SecExp.unit.list().includes(type)) {
-			if (squad.troops <= 0) {
-				squad.active = 0;
-				r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit.`);
-				if (type === "bots") {
-					r.push(`It will take quite the investment to rebuild them.`);
-				} else {
-					r.push(`The remnants will be sent home honored as veterans or reorganized in a new unit.`);
-				}
-			} else if (squad.troops <= 10) {
-				r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`);
-			}
-		}
-		return r.join(" ");
-	};
-
-	/**
-	 * @param {number} [lowerClass]
-	 * @param {number} [slaves]
-	 * @param {number} [prosperity]
-	 */
-	const arcologyEffects = function(lowerClass, slaves, prosperity) {
-		V.lowerClass -= random(lowerClass);
-		App.SecExp.slavesDamaged(random(slaves));
-		V.arcologies[0].prosperity -= random(prosperity);
-	};
-
-	/**
-	 * Does the target become wounded?
-	 * @param {string} [target]
-	 * @returns {string}
-	 */
-	const checkWoundStatus = function(target) {
-		let slave;
-		let woundChance = 0;
-		const r = [];
-		if (target === "PC") {
-			if (V.PC.career === "mercenary" || V.PC.career === "gang") {
-				woundChance -= 5;
-			} else if (V.PC.skill.warfare >= 75) {
-				woundChance -= 3;
-			}
-			if (V.personalArms >= 1) {
-				woundChance -= 5;
-			}
-			if (V.PC.physicalAge >= 60) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.belly > 5000) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.boobs >= 1000) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.butt >= 4) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.preg >= 30) {
-				woundChance += random(1, 5);
-			}
-			if (V.PC.balls >= 20) {
-				woundChance += random(5, 10);
-			}
-			if (V.PC.balls >= 9) {
-				woundChance += random(1, 5);
-			}
-			woundChance *= random(1, 2);
-		} else {
-			if (target === "Concubine") {
-				slave = S.Concubine;
-			} else if (target === "Bodyguard") {
-				slave = S.Bodyguard;
-			}
-
-			if (!slave) {
-				return ``;
-			}
-
-			if (slave.skill.combat === 1) {
-				woundChance -= 2;
-			}
-			woundChance -= 0.25 * (getLimbCount(slave, 105));
-			if (slave.health.condition >= 50) {
-				woundChance -= 1;
-			}
-			if (slave.weight > 130) {
-				woundChance += 1;
-			}
-			if (slave.muscles < -30) {
-				woundChance += 1;
-			}
-			if (getBestVision(slave) === 0) {
-				woundChance += 1;
-			}
-			if (slave.heels === 1) {
-				woundChance += 1;
-			}
-			if (slave.boobs >= 1400) {
-				woundChance += 1;
-			}
-			if (slave.butt >= 6) {
-				woundChance += 1;
-			}
-			if (slave.belly >= 10000) {
-				woundChance += 1;
-			}
-			if (slave.dick >= 8) {
-				woundChance += 1;
-			}
-			if (slave.balls >= 8) {
-				woundChance += 1;
-			}
-			if (slave.intelligence + slave.intelligenceImplant < -95) {
-				woundChance += 1;
-			}
-			woundChance *= random(2, 4);
-		}
-
-		if (random(1, 100) <= woundChance) {
-			if (target === "PC") {
-				healthDamage(V.PC, 60);
-				r.push(`A lucky shot managed to find its way to you, leaving a painful, but thankfully not lethal, wound.`);
-			} else {
-				const woundType = App.SecExp.inflictBattleWound(slave);
-				const {his, him} = getPronouns(slave);
-				if (target === "Concubine") {
-					r.push(`Your Concubine was unfortunately caught in the crossfire.`);
-				} else {
-					r.push(`During one of the assaults your Bodyguard was hit.`);
-				}
-				if (woundType === "voice") {
-					r.push(`A splinter pierced ${his} throat, severing ${his} vocal cords.`);
-				} else if (woundType === "eyes") {
-					r.push(`A splinter hit ${his} face, severely damaging ${his} eyes.`);
-				} else if (woundType === "legs") {
-					r.push(`An explosion near ${him} caused the loss of both of ${his} legs.`);
-				} else if (woundType === "arm") {
-					r.push(`An explosion near ${him} caused the loss of one of ${his} arms.`);
-				} else if (woundType === "flesh") {
-					r.push(`A stray shot severely wounded ${him}.`);
-				}
-			}
-		} else if (target === "PC") {
-			r.push(`Fortunately you managed to avoid injury.`);
-		}
-		return r.join(" ");
-	};
-
-	/**
-	 * @param {FC.SecExp.PlayerHumanUnitType} [unit]
-	 * @param {number} [averageLosses]
-	 */
-	const rebellingUnitsFate = function(unit, averageLosses) {
-		let manpower = 0;
-		const node = new DocumentFragment();
-		const r = [];
-		const rebels = {ID: [], names: []};
-
-		const Dissolve = function() {
-			App.SecExp.unit.unitFree(unit).add(manpower);
-			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-				u.loyalty = Math.clamp(u.loyalty - random(10, 40), 0, 100);
-			}
-			return `Units dissolved.`;
-		};
-		const Purge = function() {
-			App.SecExp.unit.unitFree(unit).add(manpower * 0.5);
-			return `Dissidents purged and units dissolved.`;
-		};
-		const Execute = function() {
-			for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-				u.loyalty = Math.clamp(u.loyalty + random(10, 40), 0, 100);
-			}
-			return `Units executed. Dissent will not be tolerated.`;
-		};
-
-		App.UI.DOM.appendNewElement("div", node);
-		for (const u of V.SecExp.units[unit].squads.filter(s => s.active === 1)) {
-			if (V.SecExp.war.rebellingID.contains(u.ID)) {
-				rebels.names.push(`${u.platoonName}`);
-				rebels.ID.push(u.ID);
-				manpower += Math.clamp(u.troops - random(averageLosses), 0, u.troops);
-			}
-		}
-
-		if (rebels.ID.length > 0) {
-			V.SecExp.units[unit].squads.deleteWith((u) => rebels.ID.contains(u.ID));
-			V.SecExp.battles.lastSelection.deleteWith((u) => rebels.ID.contains(u.ID));
-			if (unit === "slaves") {
-				r.push(`${toSentence(rebels.names)} decided in their blind arrogance to betray you.`);
-			} else if (unit === "militia") {
-				r.push(`${toSentence(rebels.names)} had the gall to betray you and join your enemies.`);
-			} else if (unit === "mercs") {
-				r.push(`${toSentence(rebels.names)} made the grave mistake of betraying you.`);
-			}
-			if (V.SecExp.war.result < 2) { // rebellion loss
-				r.push(`They participated in the looting following the battle, then vanished in the wastes.`);
-				cashX(forceNeg(1000 * rebels.ID.length), "war");
-			} else { // rebellion win
-				App.Events.addResponses(node, [
-					new App.Events.Result(
-						`Dissolve the units`,
-						Dissolve,
-						`Manpower will be refunded, but will negatively influence the loyalty of the other units`
-					),
-					new App.Events.Result(
-						`Purge the dissidents and dissolve the units`,
-						Purge,
-						`Will not influence the loyalty of the other units, but half the manpower will be refunded.`
-					),
-					new App.Events.Result(
-						`Execute them all`,
-						Execute,
-						`Will positively influence the loyalty of the other units, but manpower will not be refunded.`
-					),
-				]);
-			}
-			App.Events.addNode(node, r, "div");
-		}
-		return node;
-	};
-
-	V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses);
-	if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) {
-		V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops;
-	}
-	V.SecExp.core.totalKills += V.SecExp.war.attacker.losses;
-	V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses);
-
-	if (result === 3 || result === 2) {
-		App.UI.DOM.appendNewElement("h1", node, `${result === 2 ? 'Partial ' : ''}Victory!`, "strong");
-		V.SecExp.rebellions.victories++;
-	} else if (result === -3 || result === -2) {
-		App.UI.DOM.appendNewElement("h1", node, `${result === -2 ? 'Partial ' : ''}Defeat!`, "strong");
-		V.SecExp.rebellions.losses++;
-	} else if (result === -1) {
-		App.UI.DOM.appendNewElement("h1", node, `We surrendered`, "strong");
-		V.SecExp.rebellions.losses++;
-	}
-	App.UI.DOM.appendNewElement("hr", node);
-
-	r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was inflamed by the fires of rebellion. ${num(Math.trunc(V.SecExp.war.attacker.troops))} rebels from all over the structure dared rise up`);
-	if (slaveRebellion) {
-		r.push(`against their owners and conquer their freedom through blood.`);
-	} else {
-		r.push(`to dethrone their arcology owner.`);
-	}
-	r.push(`Our defense force, ${num(App.SecExp.battle.troopCount())} strong, fought with them street by street`);
-	if (allKilled) {
-		r.push(`completely annihilating their troops, while sustaining`);
-	} else {
-		r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`);
-	}
-	if (V.SecExp.war.losses > 1) {
-		r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`);
-	} else if (V.SecExp.war.losses > 0) {
-		r.push(`a casualty`);
-	} else {
-		r.push(`zero casualties`);
-	}
-	r.push(`${allKilled ? '' : 'themselves'}.`);
-	if (V.SecExp.rebellions.sfArmor) {
-		r.push(`More units were able to survive thanks to wearing ${V.SF.Lower}'s combat armor suits.`);
-	}
-	App.Events.addNode(node, r);
-	r = [];
-
-	App.SecExp.slavesDamaged(V.SecExp.war.attacker.losses);
-	if (result === 3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided: our men easily stopped the disorganized revolt in a few well aimed assaults.`);
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard, but in the end our men stopped the disorganized revolt with several well aimed assaults.`);
-		} else {
-			r.push(`The fight was long and hard, but in the end our men stopped the revolt before it could accumulate momentum.`);
-		}
-	} else if (result === -3) {
-		if (V.SecExp.war.turns <= 5) {
-			r.push(`The fight was quick and one sided: our men were easily crushed by the furious charge of the rebels.`);
-		} else if (V.SecExp.war.turns <= 7) {
-			r.push(`The fight was hard and in the end the rebels proved too much to handle for our men.`);
-		} else {
-			r.push(`The fight was long and hard, but despite their bravery the rebels proved too much for our men.`);
-		}
-	} else if (result === 2) {
-		r.push(`The fight was long and hard, but in the end our men managed to stop the revolt, though not without difficulty.`);
-	} else if (result === -2) {
-		r.push(`The fight was long and hard. In the end, our men had to yield to the rebelling slaves, which were fortunately unable to capitalize on their victory.`);
-	} else if (result === -1) {
-		r.push(`You gave your troops the order to surrender; they obediently stand down.`);
-	}
-	App.Events.addNode(node, r);
-	r = [];
-
-	// Effects
-	if (result === 3 || result === 2) {
-		node.append(` Thanks to your victory, your `, App.UI.DOM.makeElement("span", `reputation`, "green"), ` and `, App.UI.DOM.makeElement("span", `authority`, "darkviolet"), ` increased.`);
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `Many of the rebelling slaves were recaptured and punished.`);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `Many of the rebelling citizens were captured and punished, many others enslaved.`);
-		}
-		App.UI.DOM.appendNewElement("div", node, `The instigators were executed one after another in a public trial that lasted for almost three days.`);
-		if (slaveRebellion) {
-			V.NPCSlaves -= random(10, 30);
-		} else {
-			V.lowerClass -= random(10, 30);
-		}
-		repX((result === 3 ? random(800, 1000) : random(600, 180)), "war");
-		V.SecExp.core.authority += (result === 3 ? random(800, 1000) : random(600, 800));
-	} else if (result === -3 || result === -2) {
-		node.append(` Thanks to your defeat, your `, App.UI.DOM.makeElement("span", `reputation`, "red"), ` and `, App.UI.DOM.makeElement("span", `authority`, "red"), ` increased.`);
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
-			V.lowerClass -= (result === -3 ? random(50, 100) : random(40, 80));
-			lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
-			App.SecExp.slavesDamaged(lostSlaves);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
-			V.lowerClass -= Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.6);
-		}
-		repX((result === -3 ? random(-800, -1000) : random(-600, -800)), "war");
-		V.SecExp.core.authority -= (result === -3 ? random(800, 1000) : random(600, 800));
-	} else if (result === -1) {
-		r.push(`Rather than waste the lives of your men you decided to surrender, hoping the rebels will cause less damage if you indulge them, this is however a big hit to your status.`);
-		r.push(`Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`);
-		r.push(`The surrender allows the arcology to survive <span class="yellow">mostly intact</span>`);
-		r.push(`however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`);
-		App.Events.addParagraph(node, r);
-		r = [];
-
-		if (slaveRebellion) {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling slaves managed to escape, while others remained in the arcology for days looting and hunting their former masters. The arcology will bear the scars of this day for a long time.`);
-		} else {
-			App.UI.DOM.appendNewElement("div", node, `After the battle most of the rebelling citizens remained in the arcology for days looting and hunting their former arcology. We will bear the scars of this day for a long time.`);
-		}
-		cashX(-1000, "war");
-		repX(random(-1000, -1200), "war");
-		V.SecExp.core.authority -= random(1000, 1200);
-		if (V.week <= 30) {
-			arcologyEffects(100, 150, 5);
-		} else if (V.week <= 60) {
-			arcologyEffects(120, 170, 10);
-		} else if (V.week <= 90) {
-			arcologyEffects(140, 190, 15);
-		} else if (V.week <= 120) {
-			arcologyEffects(160, 210, 20);
-		} else {
-			arcologyEffects(180, 230, 25);
-		}
-		V.lowerClass -= random(50, 100);
-		lostSlaves = Math.trunc((V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.8);
-		App.SecExp.slavesDamaged(lostSlaves);
-	}
-	V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
-
-	if (result !== -1) {
-		if (V.SecExp.war.engageRule === 0) {
-			r.push(`Since you ordered your troops to limit their weaponry to low caliber or nonlethal, the arcology reported only`);
-			r.push(`<span class="red">minor damage.</span>`);
-			r.push(`Most citizens and non involved slaves remained unharmed, though some casualties between the civilians were inevitable.`);
-			r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
-			r.push(setRepairTime("arc", 3, 1500));
-			if (V.week <= 30) {
-				arcologyEffects(40, 65, 2);
-			} else if (V.week <= 60) {
-				arcologyEffects(50, 75, 5);
-			} else if (V.week <= 90) {
-				arcologyEffects(60, 85, 7);
-			} else if (V.week <= 120) {
-				arcologyEffects(70, 95, 10);
-			} else {
-				arcologyEffects(80, 105, 12);
-			}
-		} else if (V.SecExp.war.engageRule === 1) {
-			r.push(`You ordered your troops to limit their weaponry to non-heavy, non-explosive, because of this the arcology reported`);
-			r.push(`<span class="red">moderate damage.</span>`);
-			r.push(`Most citizens and non involved slaves remained unharmed or only lightly wounded, but many others did not make it. Unfortunately casualties between the civilians were inevitable.`);
-			r.push(`A few businesses were looted and burned, but the damage was pretty limited.`);
-			r.push(setRepairTime("arc", 5, 2000));
-			if (V.week <= 30) {
-				arcologyEffects(60, 85, 4);
-			} else if (V.week <= 60) {
-				arcologyEffects(70, 95, 7);
-			} else if (V.week <= 90) {
-				arcologyEffects(80, 105, 9);
-			} else if (V.week <= 120) {
-				arcologyEffects(90, 115, 12);
-			} else {
-				arcologyEffects(100, 125, 14);
-			}
-		} else if (V.SecExp.war.engageRule === 2) {
-			r.push(`Since you did not apply any restriction on the weapons your forces should use, the arcology reported`);
-			r.push(`<span class="red">heavy damage.</span>`);
-			r.push(`Many citizens and uninvolved slaves are reported killed or missing. Casualties between the civilians were inevitable.`);
-			r.push(`Many businesses were damaged during the battle either by the fight itself, by fires which spread unchecked for hours or by looters.`);
-			r.push(setRepairTime("arc", 7, 3000));
-			if (V.week <= 30) {
-				arcologyEffects(100, 150, 5);
-			} else if (V.week <= 60) {
-				arcologyEffects(120, 170, 10);
-			} else if (V.week <= 90) {
-				arcologyEffects(140, 190, 15);
-			} else if (V.week <= 120) {
-				arcologyEffects(160, 210, 20);
-			} else {
-				arcologyEffects(180, 230, 25);
-			}
-		} else {
-			r.push(`Thanks to the advance riot control weaponry developed by your experts, the rebels were mostly subdued or killed with`);
-			r.push(`<span class="yellow">little to no collateral damage to the arcology</span> and its inhabitants.`);
-			r.push(`A few businesses were looted, but the damage was very limited.`);
-			r.push(setRepairTime("arc", 2, 1000));
-			if (V.week <= 30) {
-				arcologyEffects(20, 45, 2);
-			} else if (V.week <= 60) {
-				arcologyEffects(30, 55, 4);
-			} else if (V.week <= 90) {
-				arcologyEffects(40, 65, 6);
-			} else if (V.week <= 120) {
-				arcologyEffects(50, 75, 8);
-			} else {
-				arcologyEffects(60, 85, 10);
-			}
-		}
-	}
-	V.lowerClass = Math.max(V.lowerClass, 0);
-	V.NPCSlaves = Math.max(V.NPCSlaves, 0);
-	App.Events.addParagraph(node, r);
-	r = [];
-
-	// Garrisons
-	if (!V.SecExp.war.reactorDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the reactor complex and sabotaged it, causing massive power fluctuations and blackouts.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("reactor", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.reactor : 0)));
-		} else {
-			r.push(`While the reactor was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the reactor protected it from the multiple sabotage attempts carried out by the rebels.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (!V.SecExp.war.waterwayDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the water management complex and sabotaged it, causing huge water leaks throughout the arcology and severely limiting the water supply.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("waterway", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.waterway : 0)));
-		} else {
-			r.push(`While the water management complex was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the water management complex protected it from the sabotage attempt of the rebels.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (!V.SecExp.war.assistantDefense) {
-		if (random(1, 100) <= (75 - ((V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0) * 25))) {
-			r.push(`Unfortunately during the fighting a group of slaves infiltrated the facility housing ${V.assistant.name}'s mainframe and sabotaged it. Without its AI, the arcology will be next to impossible to manage.`);
-			r.push(`<span class="red">time and money to repair the damage.</span>`);
-			r.push(setRepairTime("assistant", (V.SecExp.buildings.riotCenter ? V.SecExp.buildings.riotCenter.fort.assistant : 0)));
-		} else {
-			r.push(`While the ${V.assistant.name}'s mainframe was left defenseless without a garrison, there was no attempt at sabotage. Let's hope we'll always be this lucky.`);
-		}
-	} else {
-		r.push(`The garrison assigned to the facility housing ${V.assistant.name}'s mainframe prevented any sabotage attempt.`);
-	}
-	App.Events.addNode(node, r, "div");
-	r = [];
-
-	if (V.SecExp.war.penthouseDefense && V.BodyguardID !== 0) {
-		r.push(`The garrison assigned to the penthouse together with your loyal Bodyguard stopped all assaults against your penthouse with ease.`);
-	} else {
-		if (random(1, 100) <= 75) {
-			r.push(`During the fighting a group of slaves assaulted the penthouse.`);
-			if (S.Bodyguard) {
-				r.push(`Your Bodyguard, ${S.Bodyguard.slaveName}, stood strong against the furious attack.`);
-			} else if (V.SecExp.war.penthouseDefense) {
-				r.push(`The garrison stood strong against the furious attack.`);
-			} else {
-				r.push(`Isolated and alone, you stood strong against the furious attack.`);
-			}
-			["PC", "Concubine", "Bodyguard"].forEach(c => r.push(checkWoundStatus(c)));
-			r.push(`<span class="red">The damage to the structure will be</span> costly to repair.`);
-			r.push(IncreasePCSkills('engineering', 0.1));
-			cashX(-2000, "war");
-		} else {
-			if (!V.SecExp.war.penthouseDefense) {
-				r.push(`While the penthouse was left without a sizable garrison, there was no dangerous assault against it. Let's hope we'll always be this lucky.`);
-			} else {
-				r.push(`There was no sizable assault against the penthouse. Let's hope we'll always be this lucky.`);
-			}
-		}
-	}
-	App.Events.addNode(node, r);
-
-	App.UI.DOM.appendNewElement("p", node, unitsRebellionReport());
-	V.SecExp.rebellions[V.SecExp.war.type.toLowerCase().replace(' rebellion', '') + 'Progress'] = 0;
-	V.SecExp.rebellions.tension = Math.clamp(V.SecExp.rebellions.tension - random(50, 100), 0, 100);
-	if (slaveRebellion) {
-		V.SecExp.rebellions.citizenProgress = Math.clamp(V.SecExp.rebellions.citizenProgress - random(50, 100), 0, 100);
-	} else {
-		V.SecExp.rebellions.slaveProgress = Math.clamp(V.SecExp.rebellions.slaveProgress - random(50, 100), 0, 100);
-	}
-	return node;
-
-	function unitsRebellionReport() {
-		let rand;
-		let r = [];
-		let count = 0;
-		let averageLosses = 0;
-		let loss = 0;
-		const node = new DocumentFragment();
-		const lossesList = [];
-		const hasLosses = V.SecExp.war.losses > 0;
-
-		if (hasLosses || V.SecExp.war.losses === 0) {
-			if (hasLosses) { // Generates a list of randomized losses, from which each unit picks one at random
-				averageLosses = Math.trunc(V.SecExp.war.losses / App.SecExp.battle.deployedUnits());
-				for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) {
-					let assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100));
-					if (assignedLosses > V.SecExp.war.losses) {
-						assignedLosses = V.SecExp.war.losses;
-						V.SecExp.war.losses = 0;
-					} else {
-						V.SecExp.war.losses -= assignedLosses;
-					}
-					lossesList.push(assignedLosses);
-				}
-				if (V.SecExp.war.losses > 0) {
-					lossesList[random(lossesList.length - 1)] += V.SecExp.war.losses;
-				}
-				lossesList.shuffle();
-
-				// Sanity check for losses
-				for (let l of lossesList) {
-					if (!Number.isInteger(l)) {
-						l = 0;
-					}
-					count += l;
-				}
-				if (count < V.SecExp.war.losses) {
-					rand = random(lossesList.length - 1);
-					lossesList[rand] += V.SecExp.war.losses - count;
-				} else if (count > V.SecExp.war.losses) {
-					const diff = count - V.SecExp.war.losses;
-					rand = random(lossesList.length - 1);
-					lossesList[rand] = Math.clamp(lossesList[rand]-diff, 0, 100);
-				}
-			}
-		} else {
-			throw(`Losses are ${V.SecExp.war.losses}.`);
-		}
-
-		if (V.SecExp.war.irregulars > 0) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				if (loss > V.ACitizens * 0.95) { // This is unlikely to happen, but might as well be safe
-					loss = Math.trunc(V.ACitizens * 0.95);
-				}
-			}
-			App.UI.DOM.appendNewElement("div", node, `The volunteering citizens were quickly organized into an irregular militia unit and deployed in the arcology: ${casualtiesReport('irregulars', loss)}`);
-			if (hasLosses) {
-				if (loss > V.lowerClass * 0.95) { // I suspect only lower class ever get to fight/die, but being safe
-					V.lowerClass = Math.trunc(V.lowerClass * 0.05);
-					loss -= Math.trunc(V.lowerClass * 0.95);
-					if (loss > V.middleClass * 0.95) {
-						V.middleClass = Math.trunc(V.middleClass * 0.05);
-						loss -= Math.trunc(V.middleClass *0.95);
-						if (loss > V.upperClass * 0.95) {
-							V.upperClass = Math.trunc(V.upperClass * 0.05);
-							loss -= Math.trunc(V.upperClass * 0.95);
-							if (loss > V.topClass * 0.95) {
-								V.topClass = Math.trunc(V.topClass * 0.05);
-							} else {
-								V.topClass -= loss;
-							}
-						} else {
-							V.upperClass -= loss;
-						}
-					} else {
-						V.middleClass -= loss;
-					}
-				} else {
-					V.lowerClass -= loss;
-				}
-			}
-		}
-		if (App.SecExp.battle.deployedUnits('bots')) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				loss = Math.clamp(loss, 0, V.SecExp.units.bots.troops);
-				V.SecExp.units.bots.troops -= loss;
-			}
-			App.UI.DOM.appendNewElement("div", node, `Security drones: ${casualtiesReport('bots', loss, V.SecExp.units.bots)} `);
-		}
-		if (V.SF.Toggle && V.SF.Active >= 1) {
-			if (hasLosses) {
-				loss = lossesList.pluck();
-				loss = Math.clamp(loss, 0, V.SF.ArmySize);
-				V.SF.ArmySize -= loss;
-			}
-			App.UI.DOM.appendNewElement("div", node, `${capFirstChar(V.SF.Lower)}, ${num(V.SF.ArmySize)} strong, is called to join the battle: ${casualtiesReport('SF', loss)}`);
-		}
-		for (const u of App.SecExp.unit.list().slice(1)) {
-			if (App.SecExp.battle.deployedUnits(u) >= 1) {
-				let med = 0;
-				for (const s of V.SecExp.units[u].squads.filter(t => App.SecExp.unit.isDeployed(t))) {
-					r = [];
-					s.battlesFought++;
-					if (hasLosses) {
-						loss = lossesList.pluck();
-						loss = Math.clamp(loss, 0, s.troops);
-					}
-					r.push(`${s.platoonName} participated in the battle. They remained loyal to you. ${casualtiesReport(u, loss, s)}`);
-					if (hasLosses) {
-						med = Math.round(Math.clamp(loss * s.medics * 0.25, 1, loss));
-						if (s.medics === 1 && loss > 0) {
-							r.push(`Some men were saved by their medics.`);
-						}
-						s.troops -= Math.trunc(Math.clamp(loss - med, 0, s.maxTroops));
-						V.SecExp.units[u].dead += Math.trunc(loss - med);
-					}
-					if (s.training < 100 && random(1, 100) > 60) {
-						r.push(`Experience has increased.`);
-						s.training += random(5, 15);
-					}
-					App.Events.addNode(node, r, "div");
-				}
-			}
-		}
-
-		for (const unit of App.SecExp.unit.list().slice(1)) {
-			App.UI.DOM.appendNewElement("p", node, rebellingUnitsFate(unit, averageLosses));
-		}
-		return node;
-	}
-};
diff --git a/src/Mods/SecExp/js/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/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 6a629077790361e4bdf0c90622a8ff6372136de2..db99b63fffa4513aeda3d1c8c4a50b5592155239 100644
--- a/src/Mods/SpecialForce/FirebaseTour.js
+++ b/src/Mods/SpecialForce/FirebaseTour.js
@@ -177,31 +177,29 @@ App.UI.firebaseTour = function() {
 		App.UI.DOM.appendNewElement("h3", node, `Launch Bay`);
 		if (V.SF.Squad.Satellite > 0) {
 			r.push(App.SF.UnitText('sat'));
-			if (V.SF.SatLaunched < 1) {
-				r.push("div", node, App.UI.DOM.link(
-					"Launch it into geostationary orbit.",
+			const t = new DocumentFragment();
+			t.append("You ", App.UI.DOM.makeElement("span", `cannot`, "red"), " upgrade the satellite once it has been launched.");
+			const inOrbit = V.SF.SatLaunched < 1;
+			const link = App.UI.DOM.makeElement("div", 
+				App.UI.DOM.link(
+					(inOrbit ? "Recall the satellite." : "Launch it into geostationary orbit."),
 					() => {
-						V.SF.SatLaunched = 1;
+						V.SF.SatLaunched = (inOrbit ? 1 : 0);
 						App.UI.reload();
 					},
 					[],
 					"",
-					`You <span class='red'>cannot</span> upgrade the satellite once it has been launched.`
-				));
-			} else {
-				r.push("div", node, App.UI.DOM.link(
-					"Recall the satellite.",
-					() => {
-						V.SF.SatLaunched = 0;
-						App.UI.reload();
-					}
-				));
-			}
+					(inOrbit ? t : ``)
+				)
+			);
+			r.push(link);
 		}
 		r.push(
 			App.SF.UnitText('GR'),
 			App.SF.UnitText('ms')
 		);
+		App.Events.addParagraph(node, r);
+		r = [];
 	}
 
 	if (App.SF.unlocked.navalYard()) {
diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js
index c79e4080ed8a800982d04b27a33f8d89a28bc8e8..dec0588b4e56f2f5783b16984504f59eb3a38aed 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':
@@ -1299,11 +1313,11 @@ App.SF.AAR = function(endWeekCall = 1) {
 				Multiplier.unit += 12 * S.GunS + 3 * Math.pow(S.GunS, 2) * cost.a;
 				upkeep += (70 * S.GunS) * cost.b;
 			}
-			if (S.Satellite.lv > 0 && S.Satellite.InOrbit > 0) {
-				FNG += S.Satellite.lv;
-				Trade += 0.25 * S.Satellite.lv;
-				Multiplier.unit += 15 * S.Satellite.lv + 5 * Math.pow(S.Satellite.lv, 2) * cost.a;
-				upkeep += (85 * S.Satellite.lv) * cost.b;
+			if (S.Satellite > 0 && S.SatLaunched > 0) {
+				FNG += S.Satellite;
+				Trade += 0.25 * S.Satellite;
+				Multiplier.unit += 15 * S.Satellite + 5 * Math.pow(S.Satellite, 2) * cost.a;
+				upkeep += (85 * S.Satellite) * cost.b;
 			}
 			if (S.GiantRobot > 0) {
 				FNG += S.GiantRobot;
@@ -1556,7 +1570,7 @@ App.SF.UpgradeCost = function(cost, unit) {
 	"use strict";
 	const S = V.SF.Squad;
 	let value = cost * App.SF.env() * Math.pow(1.15, unit + 1);
-	if ([S.AircraftCarrier, S.Drones, S.GiantRobot, S.GunS, S.MissileSilo, S.Satellite.lv, S.SpacePlane, S.Sub].includes(unit)) {
+	if ([S.AircraftCarrier, S.Drones, S.GiantRobot, S.GunS, S.MissileSilo, S.Satellite, S.SpacePlane, S.Sub].includes(unit)) {
 		value *= V.HackingSkillMultiplier;
 	}
 	return Math.ceil(value);
@@ -2306,9 +2320,9 @@ App.SF.UnitText = function(input) {
 			}
 			return text;
 		case 'sat':
-			if (S.Satellite.lv >= 1) {
+			if (S.Satellite >= 1) {
 				const text12 = `<br>&nbsp;<b>Satellite:</b>`;
-				if (S.Satellite.lv >= 2) {
+				if (S.Satellite >= 2) {
 					if (V.SF.SatLaunched === 0) {
 						loc1 = `The satellite is being worked on in the Launch Bay.`;
 					} else {
@@ -2316,30 +2330,30 @@ App.SF.UnitText = function(input) {
 					}
 					gyro = `A suite of sensors have been installed to ensure the satellite can detect attitude and orbital altitude.`;
 				}
-				if (S.Satellite.lv >= 3) {
+				if (S.Satellite >= 3) {
 					telemetry = `Telemetry systems have been installed to communicate with the satellite in orbit, with strong encryption measures.`;
 				}
-				if (S.Satellite.lv >= 4) {
+				if (S.Satellite >= 4) {
 					thrusters = `Thrusters have been installed to control satellite attitude and orbit.`;
 				}
-				if (S.Satellite.lv >= 5) {
+				if (S.Satellite >= 5) {
 					solar = `A massive folding solar panel array, combined with the latest in battery technology allow the satellite to store an enormous amount of energy relatively quickly.`;
 					surviv = `Enough of the satellite has been finished that it can expect to survive for a significant period of time in space.`;
 				}
-				if (S.Satellite.lv >= 6) {
+				if (S.Satellite >= 6) {
 					laser1 = `A laser cannon has been mounted facing the earth, capable of cutting through steel in seconds`;
 					heat = ` while generating a large amount of heat.`;
 				}
-				if (S.Satellite.lv >= 7) {
+				if (S.Satellite >= 7) {
 					heat = `. The installed heatsink allows the laser cannon to fire more frequently without damaging the satellite.`;
 				}
-				if (S.Satellite.lv >= 8) {
+				if (S.Satellite >= 8) {
 					reactor = `A small, efficient nuclear reactor has been installed to continue generating energy while in the Earth's shadow.`;
 				}
-				if (S.Satellite.lv >= 9) {
+				if (S.Satellite >= 9) {
 					lens = `A higher quality and adjustable lens has been installed on the laser, allowing scalpel precision on armor or wide-area blasts on unarmored targets.`;
 				}
-				if (S.Satellite.lv >= 10) {
+				if (S.Satellite >= 10) {
 					kin = `A magazine of directable tungsten rods have been mounted to the exterior of the satellite, allowing for kinetic bombardment roughly equal to a series of nuclear blasts.`;
 				}
 				text += `${text12} ${loc1} ${gyro} ${thrusters} ${telemetry} ${solar} ${reactor} ${surviv} ${laser1} ${heat} ${lens} ${kin}`;
diff --git a/src/arcologyBuilding/ManageArcology.js b/src/arcologyBuilding/ManageArcology.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c6927b8ad1c0cd42c7b7aac5885eaf46de98675
--- /dev/null
+++ b/src/arcologyBuilding/ManageArcology.js
@@ -0,0 +1,472 @@
+App.UI.manageArcology = function() {
+	V.nextButton = "Back";
+	V.nextLink = "Main";
+	V.encyclopedia = "The X-Series Arcology";
+	let arcName = V.arcologies[0].name;
+	let r;
+
+	const asPercentage = (v) => Math.trunc((v / (V.ACitizens + V.ASlaves)) * 1000) / 10;
+	function arcUpgradeCost(basePrice, modifier = "") {
+		let cost = Math.trunc(basePrice * V.upgradeMultiplierArcology);
+		return cost * (["no subsidy", "light subsidy", "Heavy subsidy", "receiver subsidy", "propHub", "secHub"].includes(modifier) ? V.HackingSkillMultiplier : 1);
+	}
+	function applyArcUpgrade(text, upgrade, basePrice, choice = "") {
+		return App.UI.DOM.link(text, () => {
+			if (["drones", "hydro", "apron", "grid"].includes(upgrade)) {
+				V.arcologyUpgrade[upgrade] = 1;
+				if (upgrade === "drones" && V.secExpEnabled > 0) {
+					V.SecExp.units.bots = App.SecExp.unit.gen("bots");
+				}
+			} else if (["weatherCladding", "antiWeatherFreeze", "disasterResponse"].includes(upgrade)) {
+				V[upgrade]++;
+			} else if (upgrade === "receiver") {
+				V.FCTV.receiver = 1;
+				V.FCTV.weekEnabled = V.week;
+				FCTV.initChannels();
+				if (["no subsidy", "heavy subsidy"].includes(choice)) {
+					repX((choice === "no subsidy" ? 500 : -1500), "capEx");
+				}
+			} else if (upgrade === "SecExp") {
+				App.SecExp[choice].Init();
+			}
+
+			V.PC.skill.engineering++;
+			if (upgrade === "receiver" || ["propHub", "secHub"].includes(choice)) {
+				V.PC.skill.hacking++;
+			}
+			cashX(forceNeg(arcUpgradeCost(basePrice, choice)), "capEx");
+			App.UI.reload();
+		});
+	}
+
+	function societalView(s, type) {
+		const classType = s === "top" ? "Millionaires" : `${capFirstChar(s)} Class`;
+		const calRent = (v) => Math.trunc(V.rent[v] * (1 + (5 - V.baseDifficulty) / 20) / 0.25) / 100;
+		const classStr = s + "Class";
+		function link(text, type, value, value2 = 0, value3 = 0) {
+			return App.UI.DOM.link(`${text}`, () => {
+				if (type !== "rent") {
+					V[type][classStr] = value;
+					if (type === "sexSupplyBarriers") {
+						repX(-1000, "subsidiesAndBarriers");
+					}
+				} else {
+					V.rent[classStr] = V.rentDefaults[classStr] * value;
+					if (s === "lower") {
+						V.rentEffectL = value2;
+					} else if (s === "middle") {
+						V.rentEffectM = value2;
+					} else if (s === "upper") {
+						V.rentEffectU = value2;
+					} else if (s === "top") {
+						V.rentEffectT = value2;
+					}
+					V.whoreBudget[classStr] *= value3;
+				}
+				App.UI.reload();
+			});
+		}
+
+		let choices = [];
+		const node = new DocumentFragment();
+		if (type === "policies") {
+			if (V.sexSubsidies[classStr] === 0) {
+				node.append(`You can provide a minor subsidy for those selling sexual services to the ${classType}. `);
+				choices.push(link("Minor Subsidy", "sexSubsidies", 1));
+			} else if (V.sexSubsidies[classStr] === 1) {
+				node.append(`You are providing a minor subsidy for those selling sexual services to the ${classType}. `);
+				choices.push(link("Cancel Subsidy", "sexSubsidies", 0));
+				choices.push(link("Moderate Subsidy", "sexSubsidies", 2));
+			} else if (V.sexSubsidies[classStr] === 2) {
+				node.append(`You are providing a moderate subsidy for those selling sexual services to the ${classType}. `);
+				choices.push(link("Minor Subsidy", "sexSubsidies", 1));
+				choices.push(link("Substantial Subsidy", "sexSubsidies", 3));
+			} else if (V.sexSubsidies[classStr] === 3) {
+				node.append(`You are providing a substantial subsidy for those selling sexual services to the ${classType}. `);
+				choices.push(link("Moderate Subsidy", "sexSubsidies", 2));
+				choices.push(link("Gratuitous Subsidy", "sexSubsidies", 4));
+			} else {
+				node.append(`You are providing a gratuitous subsidy for those selling sexual services to the ${classType}. `);
+				choices.push(link("Substantial Subsidy", "sexSubsidies", 3));
+			}
+			App.UI.DOM.appendNewElement("span", node, "Upkeep is relative to the amount provided by other parties. ", "note");
+			App.UI.DOM.appendNewElement("span", node, App.UI.DOM.generateLinksStrip(choices));
+			App.UI.DOM.appendNewElement("div", node);
+
+			choices = [];
+			if (V.sexSupplyBarriers[classStr] === 0) {
+				node.append(
+					`Alternatively administrative "accidents" can happen if you are willing to spend ${num(1000)} reputation and pay a flat upkeep of`,
+					App.UI.DOM.makeElement("span", ` ${cashFormat(1000)}. `, "cash")
+				);
+				choices.push(link("Create Bureaucracy", "sexSupplyBarriers", 1));
+			} else if (V.sexSupplyBarriers[classStr] === 1) {
+				node.append(
+					`You have forced some unneeded bureaucracy, making things a little more difficult. 
+					If you are willing to spend ${num(1000)} reputation you can change this policy. 
+					Increasing the bureaucracy further will cost a flat upkeep of`,
+					App.UI.DOM.makeElement("span", ` ${cashFormat(5000)}. `, "cash")
+				);
+				choices.push(link("Abolish Bureaucracy", "sexSupplyBarriers", 0));
+				choices.push(link("Increase Bureaucracy", "sexSupplyBarriers", 2));
+			} else if (V.sexSupplyBarriers[classStr] === 2) {
+				node.append(
+					`You have forced considerable bureaucracy, making things a little more difficult. 
+					If you are willing to spend ${num(1000)} reputation you can change this policy. 
+					Increasing the bureaucracy further will cost a flat upkeep of`,
+					App.UI.DOM.makeElement("span", ` ${cashFormat(20000)}. `, "cash")
+				);
+				choices.push(link("Reduce Bureaucracy", "sexSupplyBarriers", 1));
+				choices.push(link("Increase Bureaucracy", "sexSupplyBarriers", 3));
+			} else if (V.sexSupplyBarriers[classStr] === 3) {
+				node.append(
+					`You have forced stifling bureaucracy, making things a little more difficult. 
+					If you are willing to spend ${num(1000)} reputation you can change this policy. 
+					Increasing the bureaucracy further will cost a flat upkeep of`,
+					App.UI.DOM.makeElement("span", ` ${cashFormat(60000)}. `, "cash")
+				);
+				choices.push(link("Reduce Bureaucracy", "sexSupplyBarriers", 2));
+				choices.push(link("Increase Bureaucracy", "sexSupplyBarriers", 4));
+			} else {
+				node.append(
+					`You have forced suffocating bureaucracy, making things a little more difficult. 
+					If you are willing to spend ${num(1000)} reputation you can change this policy.`
+				);
+				choices.push(link("Reduce Bureaucracy", "sexSupplyBarriers", 3));
+			}
+		} else if (type === "rent") {
+			node.append(
+				`${classType} | ${num(V[classStr])} | ${asPercentage(V[classStr])}% | Rent: `,
+				App.UI.DOM.makeElement("span", `${cashFormat(calRent(classStr))} `, "cash")
+			);
+
+			if (V.rent[classStr] > V.rentDefaults[classStr] * 1.5) {
+				node.append("Very High. ");
+				choices.push(link("Decrease", "rent", 1.5, 0.94, 9 / 8));
+			} else if (V.rent[classStr] > V.rentDefaults[classStr]) {
+				node.append("High. ");
+				choices.push(link("Increase", "rent", 2, 0.85, 8 / 9));
+				choices.push(link("Decrease", "rent", 1, 1, 10 / 9));
+			} else if (V.rent[classStr] > V.rentDefaults[classStr] * 0.5) {
+				node.append("Average. ");
+				choices.push(link("Increase", "rent", 1.5, 0.94, 9 / 8));
+				choices.push(link("Decrease", "rent", 0.5, 1.04, 11 / 10));
+			} else if (V.rent[classStr] > 0) {
+				node.append("Low. ");
+				choices.push(link("Increase", "rent", 1, 1, 10 / 11));
+				choices.push(link("Free Rent", "rent", 0, 1.1, 12 / 11));
+			} else {
+				node.append("Free. ");
+				choices.push(link("Increase", "rent", 0.5, 1.04, 11 / 12));
+			}
+		}
+		if (type === "policies" && V.rep > 1000 || type === "rent") {
+			App.UI.DOM.appendNewElement("span", node, App.UI.DOM.generateLinksStrip(choices));
+		} else {
+			App.UI.DOM.appendNewElement("div", node, "You are not reputable enough.");
+		}
+		return node;
+	}
+
+	const node = new DocumentFragment();
+	App.UI.DOM.appendNewElement("h1", node,
+		App.UI.DOM.link(`${arcName}`, () => {
+			if (Dialog.isOpen()) {
+				Dialog.close();
+			}
+			Dialog.setup("Rename");
+			const frag = new DocumentFragment();
+			frag.append(App.UI.DOM.makeTextBox(V.arcologies[0].name, str => { V.arcologies[0].name = str; App.UI.reload(); }));
+			$(Dialog.body()).empty().append(frag);
+			Dialog.open();
+		})
+		, ["white", "center"]
+	);
+	if (V.cheatMode === 1) {
+		App.UI.DOM.appendNewElement("p", node, App.UI.DOM.passageLink("Cheat Edit Arcology", "MOD_Edit Arcology Cheat"), ["cheat-menu", "white", "center"]);
+	}
+	App.UI.DOM.appendNewElement("div", node, V.building.render());
+	if (V.seeArcology === 1) {
+		node.append(App.Desc.playerArcology(
+			App.UI.DOM.link("Hide", () => {
+				V.seeArcology = 0;
+				App.UI.reload();
+			})
+		));
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Arcology Ownership");
+	App.Arcology.updateOwnership();
+	node.append(ownershipReport(false));
+	if (FutureSocieties.availCredits() > 0) {
+		App.UI.DOM.appendNewElement("span", node, ` Society is ready to begin accepting a new societal direction.`, "noteworthy");
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Construction");
+	if (V.arcologyUpgrade.drones !== 1) {
+		App.UI.DOM.appendNewElement("div", node, `The first major upgrade needed is the installation of a drone security system so higher-class citizens will feel safe and protected should they choose to immigrate. This upgrade will cost ${cashFormat(arcUpgradeCost(5000))}.`, "note");
+		node.append(applyArcUpgrade("Install drone security system", "drones", 5000));
+	} else if (V.arcologyUpgrade.hydro !== 1) {
+		App.UI.DOM.appendNewElement("div", node, `The next major upgrade needed is the installation of a better water reclamation system so your residents will have access to cheaper water and hydroponically grown food. This upgrade will cost ${cashFormat(arcUpgradeCost(10000))}.`, "note");
+		node.append(applyArcUpgrade("Upgrade water reclamation system", "hydro", 10000));
+	} else if (V.arcologyUpgrade.apron !== 1) {
+		App.UI.DOM.appendNewElement("div", node, `The next major upgrade needed is the installation of a broader apron at the bottom of the arcology to increase its surface area and gather more solar energy. Right now, tenants that use a lot of power have to import it from outside. This upgrade will cost ${cashFormat(arcUpgradeCost(20000))}.`, "note");
+		node.append(applyArcUpgrade("Install solar apron", "apron", 20000));
+	} else if (V.arcologyUpgrade.grid !== 1) {
+		App.UI.DOM.appendNewElement("div", node, `The next major upgrade needed is an improvement of the arcology's electrical transmission lines to make efficient use of the additional power from the solar apron. This upgrade will cost ${cashFormat(arcUpgradeCost(50000))}.`, "note");
+		node.append(applyArcUpgrade("Upgrade transmission lines", "grid", 50000));
+	} else {
+		App.UI.DOM.appendNewElement("div", node, "The arcology's public areas are fully upgraded.", ["note", "indent"]);
+		App.UI.DOM.appendNewElement("div", node, App.Arcology.upgrades(V.building), "indent");
+	}
+
+	r = [];
+	if (V.weatherCladding === 0) {
+		r.push(`Extreme weather is becoming common worldwide. The arcology's exterior can be hardened to reduce damage in case of heavy weather, but this will reduce its beauty somewhat and will cost ${cashFormat(arcUpgradeCost(50000))}. Your citizens are`);
+		if (V.weatherAwareness === 0) {
+			r.push("likely to disapprove of this measure as alarmism.");
+		} else {
+			r.push(App.UI.DOM.makeElement("span", `concerned that this measure has not been taken already.`, "noteworthy"));
+		}
+		App.UI.DOM.appendNewElement("div", node, r.join(" "));
+		App.UI.DOM.appendNewElement("span", node, applyArcUpgrade("Apply weather cladding", "weatherCladding", 50000));
+	} else {
+		r.push(`The arcology's exterior is jacketed with ${V.weatherCladding === 1 ? "unsightly but sturdy" : "gorgeously sculpted and fully functional"} weather cladding.`);
+		if (V.weatherCladding === 1 && V.building.sections.length > 0) {
+			r.push(`Your arcology is so prosperous that remodeling the cladding into something beautiful is within the realm of possibility. This massive project will cost ${cashFormat(arcUpgradeCost(3500000))} and without a doubt render your arcology one of the wonders of the world.`);
+			App.UI.DOM.appendNewElement("div", node, r.join(" "));
+			App.UI.DOM.appendNewElement("span", node, applyArcUpgrade("Remodel weather cladding", "weatherCladding", 3500000));
+		}
+	}
+	App.UI.DOM.appendNewElement("div", node, "");
+
+	if (V.FCTV.receiver > -1 && !V.FCTV.weekEnabled) {
+		App.UI.DOM.appendNewElement("div", node, "You have not installed an FCTV receiver.");
+		node.append("Installing this receiver ", applyArcUpgrade("yourself", "receiver", 25000, "no subsidy"), ` will cost ${cashFormat(arcUpgradeCost(25000, "receiver subsidy"))}.`);
+		App.UI.DOM.appendNewElement("div", node, "");
+		node.append("You can have your ", applyArcUpgrade("citizens pay", "receiver", 20000, "light subsidy"), ` for the fiber optic upgrades, reducing the cost to ${cashFormat(arcUpgradeCost(20000, "receiver subsidy"))}.`);
+		App.UI.DOM.appendNewElement("div", node, "");
+		node.append("You can also have them ", applyArcUpgrade("heavily subsidize", "receiver", 10000, "Heavy subsidy"), ` installation, they will be upset about it, but it will only cost ${cashFormat(arcUpgradeCost(10000, "receiver subsidy"))}.`);
+	} else {
+		r = [];
+		r.push("You have installed the FCTV receiver and have access to the full range of FCTV's programs.");
+		if (V.FCTV.receiver === 3) {
+			r.push("High viewership rates amongst your citizens makes it easier to pursue your societal goals.");
+		} else if (V.FCTV.receiver === 2) {
+			r.push("Decent viewership rates amongst your citizens makes it somewhat easier to pursue your societal goals.");
+		} else if (V.FCTV.receiver === 1) {
+			r.push("Low viewership rates amongst your citizens limits the impact of FCTV on your societal goals.");
+		}
+		App.UI.DOM.appendNewElement("div", node, r.join(" "), "indent");
+	}
+	if (V.PC.skill.engineering >= 100 || V.PC.career === "arcology owner") {
+		node.append("Arcology upgrades are less expensive due to your ",
+			App.UI.DOM.makeElement("span", `${V.PC.career === "arcology owner" ? "experience in the Free Cities" : "arcology engineering training"}.`, ["player", "skill"])
+		);
+	}
+
+	if (V.secExpEnabled === 0) {
+		r = [];
+		if (V.weatherAwareness > 0) {
+			if (V.antiWeatherFreeze === 0) {
+				node.append("The extreme weather hurts your arcology's ability to function. Reinforcing your passenger terminals increase the weather range at which they can operate.");
+				App.UI.DOM.appendNewElement("div", node, "");
+				node.append(
+					applyArcUpgrade("Reinforcing", "antiWeatherFreeze", 50000),
+					` passenger terminals costs ${cashFormat(arcUpgradeCost(50000))} and increases upkeep.`
+				);
+			} else if (V.antiWeatherFreeze === 1) {
+				node.append("You have reinforced your passenger terminals to function even during bad weather. You can invest into all-weather transportation to remain functional no matter what.");
+				App.UI.DOM.appendNewElement("div", node, "");
+				node.append(
+					applyArcUpgrade("Investing", "antiWeatherFreeze", 100000),
+					` in all-weather transportation costs ${cashFormat(arcUpgradeCost(100000))} and increases upkeep.`
+				);
+			} else if (V.antiWeatherFreeze === 2) {
+				App.UI.DOM.appendNewElement("div", node, "Your arcology's passenger terminals remain fully operational even during the most extreme weather.");
+			}
+		}
+	} else {
+		App.UI.DOM.appendNewElement("h2", node, "Security");
+		if (!V.SecExp.buildings.propHub) {
+			node.append(applyArcUpgrade("Set up the propaganda Hub", "SecExp", 5000, "propHub"));
+			App.UI.DOM.appendNewElement("div", node, `Costs ${cashFormat(arcUpgradeCost(5000, "propHub"))}. Building specialized in the management of authority.`, ["detail", "indent"]);
+		} else {
+			node.append("The ", App.UI.DOM.passageLink("Propaganda Hub", "propagandaHub"), " is ready to manipulate reality on your command.");
+		}
+		App.UI.DOM.appendNewElement("div", node, "");
+
+		if (!V.SecExp.buildings.secHub) {
+			node.append(applyArcUpgrade("Set up the security headquarters", "SecExp", 5000, "secHub"));
+			App.UI.DOM.appendNewElement("div", node, `Costs ${cashFormat(arcUpgradeCost(5000, "secHub"))}. Building specialized in the management of security and crime.`, ["detail", "indent"]);
+		} else {
+			node.append("The ", App.UI.DOM.passageLink("security HQ", "securityHQ"), " is constantly working to protect your arcology.");
+		}
+		App.UI.DOM.appendNewElement("div", node);
+
+		if (!V.SecExp.buildings.barracks) {
+			node.append(applyArcUpgrade("Set up the barracks", "SecExp", 5000, "barracks"));
+			App.UI.DOM.appendNewElement("div", node, `Costs ${cashFormat(arcUpgradeCost(5000))}. Building specialized in the management of armed forces.`, ["detail", "indent"]);
+		} else {
+			node.append("The ", App.UI.DOM.passageLink("barracks", "secBarracks"), " patiently await your orders.");
+		}
+		App.UI.DOM.appendNewElement("div", node);
+
+		if (!V.SecExp.buildings.riotCenter && V.SecExp.settings.rebellion.enabled === 1) {
+			node.append(applyArcUpgrade("Set up the control center", "SecExp", 5000, "riotCenter"));
+			App.UI.DOM.appendNewElement("div", node, `Costs ${cashFormat(arcUpgradeCost(5000))}. Building specialized in the management and suppression of rebellions.`, ["detail", "indent"]);
+		} else if (V.SecExp.settings.rebellion.enabled === 1) {
+			node.append("The ", App.UI.DOM.passageLink("Riot Control Center", "riotControlCenter"), " stands ready for action.");
+		}
+	}
+
+	if (V.difficultySwitch === 1 && (V.econWeatherDamage > 0 || V.disasterResponse > 0)) {
+		App.UI.DOM.appendNewElement("h2", node, "Disaster Response");
+		if (V.econWeatherDamage > 0) {
+			node.append(
+				"The recent terrible weather has damaged the local infrastructure. It is ",
+				App.UI.DOM.makeElement("span", `reducing the local economy score by ${num(V.econWeatherDamage)}.`, "warning")
+			);
+			if (V.disasterResponse === 0) {
+				node.append(" Locals will do their best to repair the damage on their own, but setting up a disaster response unit will improve the recovery of infrastructure critical for keeping goods, people and information flowing smoothly in and out of your arcology.");
+				App.UI.DOM.appendNewElement("div", node);
+				node.append(
+					applyArcUpgrade(" Creating the unit", "disasterResponse", 50000),
+					` will cost ${cashFormat(arcUpgradeCost(50000))} and incur upkeep.`
+				);
+			} else if (V.disasterResponse === 1) {
+				node.append(" You are sending your disaster response unit to repair critical infrastructure. They are doing what they can.");
+				App.UI.DOM.appendNewElement("div", node);
+				node.append(
+					`The unit can be made more effective with an additional investment of ${cashFormat(arcUpgradeCost(100000))}. This will also increase upkeep.`,
+					applyArcUpgrade(" Improve the Disaster Response Unit", "disasterResponse", 100000),
+				);
+			} else {
+				App.UI.DOM.appendNewElement("div", node, "Your highly capable disaster response unit is rapidly repairing the weather damage.");
+			}
+		} else if (V.disasterResponse > 0) {
+			App.UI.DOM.appendNewElement("div", node, "Your disaster response unit is idle. It will not cost you any upkeep this week.");
+		}
+	}
+	if (V.foodMarket > 0) {
+		App.UI.DOM.appendNewElement("h2", node, "Food Management");
+		node.append(App.UI.foodMarket());
+	}
+	const SocietyClasses = ["lower", "middle", "upper", "top"];
+	App.UI.DOM.appendNewElement("h2", node, "Sexual Service Policies");
+	App.UI.DOM.appendNewElement("div", node, "If so desired, your assistant can help you manipulate the business environment within your arcology.");
+	App.UI.DOM.appendNewElement("div", node, "Breakdown of sexual services supplied by outside parties per societal class.");
+	for (const s of SocietyClasses) {
+		const classType = s === "top" ? "millionaires" : `${s} class`;
+		App.UI.DOM.appendNewElement("div", node, `${capFirstChar(classType)}: ${V.NPCMarketShare[s + "Class"]/10}%`);
+	}
+	App.UI.DOM.appendNewElement("p", node);
+	for (const s of SocietyClasses) {
+		App.UI.DOM.appendNewElement("p", node, societalView(s, "policies"));
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Population and Rent");
+	App.UI.DOM.appendNewElement("div", node, `${arcName} is home to the following:`);
+	for (const s of SocietyClasses) {
+		App.UI.DOM.appendNewElement("div", node, societalView(s, "rent"));
+	}
+	App.UI.DOM.appendNewElement("div", node, `Slaves | ${num(V.ASlaves)} | ${asPercentage(V.ASlaves)}%`);
+
+	App.UI.DOM.appendNewElement("h2", node, "Language");
+	node.append("The lingua franca of the arcology is ", App.UI.DOM.makeElement("span", `${V.language}`, "strong"), ". ");
+	node.append(
+		App.UI.DOM.link("Language options", () => {
+			V.seed = V.language;
+		}, [], "Change Language")
+	);
+
+	App.UI.DOM.appendNewElement("h2", node, "Special Arcology Upgrades");
+	if (V.personalArms === 0 && V.mercenaries === 0 && V.assistant.personality <= 0) {
+		App.UI.DOM.makeElement("div", `${arcName} has no special upgrades.`, "note");
+	} else {
+		r = [];
+		if (V.personalArms > 0) {
+			r.push(`You own a prototype powered exoskeleton that mounts armor and a smart mortar system, and has rifles mounted into its forearms.`);
+			if (V.personalArms > 1) {
+				r.push(`Furthermore, your security drones can rearm with small-caliber guns if necessary.`);
+			}
+		}
+		App.UI.DOM.appendNewElement("div", node, r.join(" "), "indent");
+
+		r = [];
+		if (V.mercenaries.isBetween(1, 5)) {
+			r.push(`A ${V.mercenaries === 1 ? "squad" : "full platoon"} of mercenaries is permanently quartered in ${arcName}.`);
+		} else if (V.mercenaries >= 5) {
+			r.push(`You have permanently settled a full company of mercenaries in ${arcName} as your ${V.mercenariesTitle}.`);
+		}
+		r.push(`They are grim men and women${V.mercenaries < 5 ? ", heavily armed and armored" : " who appreciate their luxurious life here and train hard to keep their skills with their prototype armor sharp"}.`);
+		App.UI.DOM.appendNewElement("div", node, r.join(" "), "indent");
+
+		r = [];
+		if (V.assistant.personality > 0) {
+			const {hisA, heA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+			r.push(`${capFirstChar(V.assistant.name)} is using an alternative personality setting, speaking in a sultry, sexual voice, and talking as though the penthouse's sex toys are ${hisA} body.`);
+			if (V.assistant.personality > 1) {
+				r.push(`${heA} also has charge of all smart piercings in the arcology, and is using ${hisA} adaptations to sexual duties to improve their effectiveness.`);
+			}
+		}
+		App.UI.DOM.appendNewElement("div", node, r.join(" "), "indent");
+	}
+
+	App.UI.DOM.appendNewElement("h2", node, "Slaves");
+	r = [];
+	r.push(`Your slaves have participated in approximately ${num(V.oralTotal + V.vaginalTotal+ V.analTotal)} sexual encounters: ${num(V.oralTotal)} primarily oral, ${num(V.vaginalTotal)} vanilla, ${num(V.mammaryTotal)} mammary, ${num(V.analTotal)} anal, and ${num(V.penetrativeTotal)} with the slave penetrating another. They have produced about ${num(V.milkTotal)} liters of marketable milk,`);
+	r.push(`${V.seeDicks !== 0 ? `about ${num(V.cumTotal)} deciliters of marketable cum,` : ``}`);
+	r.push(`and have given birth ${num(V.birthsTotal)} times.`);
+	if (V.abortionsTotal > 0 && V.miscarriagesTotal > 0) {
+		r.push(`They have had a total of ${num(V.abortionsTotal)} abortions and ${num(V.miscarriagesTotal)} miscarriages.`);
+	} else if (V.abortionsTotal > 0) {
+		r.push(`They have had a total of ${num(V.abortionsTotal)} abortions.`);
+	} else if (V.miscarriagesTotal > 0) {
+		r.push(`They have had a total of ${num(V.miscarriagesTotal)} miscarriages.`);
+	}
+	if (V.fuckdollsSold > 0) {
+		r.push(`${V.fuckdollsSold} mindbroken arcade slaves have been converted into Fuckdolls and sold.`);
+	}
+	App.UI.DOM.appendNewElement("p", node, r.join(" "), "indent");
+
+	if (V.pitFightsTotal > 0 && V.pitKillsTotal > 0) {
+		App.UI.DOM.appendNewElement("p", node, `${arcName} has hosted ${num (V.pitFightsTotal)} pit fights, and ${num(V.pitKillsTotal)} slaves have died in your pit.`, "indent");
+	} else if (V.pitFightsTotal > 0) {
+		App.UI.DOM.appendNewElement("p", node, `${arcName} has hosted ${num (V.pitFightsTotal)} pit fights.`, "indent");
+	}
+
+	if (V.secExpEnabled > 0) {
+		const victories = (x) => V.SecExp[x].victories;
+		const losses = (x) => V.SecExp[x].losses;
+		const count = (x) => victories(x) + losses(x);
+		const SF = V.SF.Toggle && V.SF.Active >= 1 ? V.SF.ArmySize : 0;
+		App.UI.DOM.appendNewElement("h2", node, "Military");
+		r = [];
+
+		r.push(`Your army counts ${num(App.SecExp.Manpower.employedOverall + SF)} total soldiers`);
+		if (V.SF.Toggle && V.SF.Active >= 1) {
+			r.push(`of which ${num(V.SF.ArmySize)} under the special force command and the rest under your direct control`);
+		}
+		r.push(r.pop() + ".");
+		if (V.SecExp.settings.battle.enabled === 1 && count('battles') > 0) {
+			r.push(`Your troops were involved in ${num(count('battles'))} battles of which ${num(V.SecExp.battles.major)} were major engagements.`);
+			r.push("You won");
+			if (count('battles') === (losses('battles') || victories('battles'))) {
+				r.push(`${count('battles') === victories('battles') ? "all" : "none"} all of them.`);
+			} else {
+				r.push(`${num(victories('battles'))} of them, while the enemy managed to gain the upper hand in the other ${num(losses('battles'))}.`);
+			}
+			r.push(`You lost a total of ${num(App.SecExp.unit.list().slice(1).reduce((acc, cur) => acc + V.SecExp.units[cur].dead, 0))} men, while scoring a total of ${num(V.SecExp.core.totalKills)} kills.`);
+		}
+		if (V.SecExp.settings.rebellion.enabled === 1 && count('rebellions') > 0) {
+			r.push(`Your arcology was involved in ${num(count('rebellions'))} rebellions. You won ${num(victories('rebellions'))} of them, while the rebels defeated your forces in ${num(losses('rebellions'))}.`);
+		}
+		App.UI.DOM.appendNewElement("p", node, r.join(" "), "indent");
+	}
+
+	if (V.experimental.dinnerParty === 1 && V.seeExtreme === 1) {
+		App.UI.DOM.appendNewElement("p", node, App.UI.DOM.passageLink("Host Dinner Party", "Dinner Party Preparations"), "indent");
+	}
+	return node;
+};
diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js
index 8d29158c477c01ac70742cf7d7f368f9a7ce9578..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
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/budget/costsBudget.js b/src/budget/costsBudget.js
index 3a44531d671c0555394ad8eb8110f7dac17ce7e6..fa8da4a259a24b68ddc36e433e78944234ba0cf4 100644
--- a/src/budget/costsBudget.js
+++ b/src/budget/costsBudget.js
@@ -5,7 +5,6 @@
 App.Budget.costs = function() {
 	const f = new DocumentFragment();
 
-	App.UI.DOM.appendNewElement("h1", f, "Costs Budget");
 	f.append(intro());
 	if (V.difficultySwitch === 1) {
 		f.append(economy());
@@ -26,7 +25,7 @@ App.Budget.costs = function() {
 	 * @returns {HTMLParagraphElement}
 	 */
 	function intro() {
-		return App.UI.DOM.makeElement("p", `Here you can view many of the financial details of your arcology, ${properTitle()}. The detailed list of slaves and their costs (food, hormones) that you may remember can now be found at slave maintenance. Other links will allow you to directly control areas of your arcology to adjust spending to suit your tastes.`, "scene-intro");
+		return App.UI.DOM.makeElement("p", `Here you can view many of the financial details of your arcology, ${properTitle()}. Proper cash flow is critical to the success of your long term goals. Find expensive waste here and you can change the right policies or sell off slackers. Find your next profit center and invest in new equipment, advertising, or flesh to maximize your assets.`, "scene-intro");
 	}
 
 	/**
diff --git a/src/budget/repBudget.js b/src/budget/repBudget.js
index 5cbad0d806633f704e6b387965a0688422160165..f899c07f51504e82a4f334a1082eba622c2858c0 100644
--- a/src/budget/repBudget.js
+++ b/src/budget/repBudget.js
@@ -21,7 +21,7 @@ App.Budget.rep = function() {
 	 * @returns {HTMLParagraphElement}
 	 */
 	function intro() {
-		return App.UI.DOM.makeElement("p", `Reputation is a difficult thing to quantify, ${properTitle()}. Here you see an overview of topics that interest people in the arcology, and in turn, reflect on your own reputation. The more symbols you see in a category, the more impact that category is having on your reputation lately.`, "scene-intro");
+		return App.UI.DOM.makeElement("p", `Reputation is a difficult thing to quantify, ${properTitle()}. Here you see an overview of topics that interest people in the arcology, and in turn, reflect on your own reputation. Much like a finance report, you can see here how your choices last week moved you closer to or further from your goals, and head any issues off before they get worse.`, "scene-intro");
 	}
 
 	/**
diff --git a/src/cheats/cheatEditArcology.js b/src/cheats/cheatEditArcology.js
index f9400ed5992992014ff73c478d47f46973429306..9f2c6640eabfc41ce47ba93c87060d45511440b3 100644
--- a/src/cheats/cheatEditArcology.js
+++ b/src/cheats/cheatEditArcology.js
@@ -3,6 +3,7 @@
  * @returns {DocumentFragment}
  */
 App.UI.Cheat.arcology = function(num) {
+	V.cheater = 1;
 	const el = new DocumentFragment();
 	const arc = V.arcologies[num];
 	if (arc.rival) {
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 8ad295203cc975b9bf62a36845150606129e3306..6c33dc2bad1a0f1b4388e0dba9409b4b087bb80e 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();
 
@@ -1266,6 +1258,7 @@ App.Update.globalVariables = function(node) {
 
 	V.experimental.raGrowthExpr = V.experimental.raGrowthExpr || 0;
 	V.experimental.reportMissingClothing = V.experimental.reportMissingClothing || 0;
+	V.experimental.sexOverhaul = V.experimental.sexOverhaul || 0;
 
 	// Budget
 	V.showAllEntries.costsBudget = V.showAllEntries.costsBudget || 0;
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/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/personalNotes.js b/src/endWeek/economics/personalNotes.js
index c6c90c2090955ae10183eeccc5bec6e6307c94ac..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) {
diff --git a/src/endWeek/events/retire.js b/src/endWeek/events/retire.js
index c9330bd3d4dad84e1091fd95c7505f8c14d9e7e1..41b32b55a352db6041f66dde671404c02a0142e6 100644
--- a/src/endWeek/events/retire.js
+++ b/src/endWeek/events/retire.js
@@ -45,7 +45,11 @@ globalThis.retireScene = function(originalSlave, artRenderer) {
 		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) {
 		({
diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js
index 2101e8e2011a64bfb21f2fdc673d89430edd5268..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 || {};
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/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/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/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js
index feb00e02e41b645151712978d739fbbe219b2f41..73effdd3ebbdd2c5188ad7fb2f5cfcf238640bca 100644
--- a/src/endWeek/saChoosesOwnClothes.js
+++ b/src/endWeek/saChoosesOwnClothes.js
@@ -997,9 +997,10 @@ App.SlaveAssignment.choosesOwnClothes = (function() {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 * @returns {{text:string, shoes:string}}
+	 * @returns {{text:string, shoes:FC.WithNone<FC.Shoes>}}
 	 */
 	function todaysShoes(slave) {
+		/** @type {{text:string, shoes:FC.WithNone<FC.Shoes>}[]} */
 		const shoes = [];
 
 		if (slave.fetish === "mindbroken") {
diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js
index abdbd4002001649bb838180e17a41f6300c5593f..7d6027a8b5a29372315201b5a28cd022d4a6afba 100644
--- a/src/endWeek/saLongTermMentalEffects.js
+++ b/src/endWeek/saLongTermMentalEffects.js
@@ -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/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/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/PE/peHeadgirlConcubine.js b/src/events/PE/peHeadgirlConcubine.js
index d67e5a1be3689e971237a2f5c0cb71a2a536c9cd..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) {
diff --git a/src/events/PESS/pessMadamStrategy.js b/src/events/PESS/pessMadamStrategy.js
index dc7335a11c488ec6a815415d64ce06b582b64782..9e2575e66ba9969fba3478810777ec667ec70b7b 100644
--- a/src/events/PESS/pessMadamStrategy.js
+++ b/src/events/PESS/pessMadamStrategy.js
@@ -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/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/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/reShelterInspection.js b/src/events/RE/reShelterInspection.js
index 07a0675eab01dbb1dac8fab874349dc9d1f583f7..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;
 
@@ -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;
 				}
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/reSiblingPlease.js b/src/events/RE/reSiblingPlease.js
new file mode 100644
index 0000000000000000000000000000000000000000..ccbbba305159ac9e82e571d229bb43b23653f1d8
--- /dev/null
+++ b/src/events/RE/reSiblingPlease.js
@@ -0,0 +1,383 @@
+App.Events.RESiblingPlease = class RESiblingPlease extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seePreg !== 0,
+			() => V.seeIncest !== 0, // daughter participates in sex scenes
+			() => isFullyPotent(V.PC), // natural impregnation of slave's mother by potent PC; other paths are potentially possible but not written
+			() => V.arcologies[0].FSRestart === "unset" // in a Eugenics arcology this event would require extra checks and special dialog that hasn't been written
+		];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // requesting slave (daughter) is devoted, trusting, and relatively independent
+				canTalk,
+				canHear,
+				canMove,
+				s => s.fetish !== "mindbroken",
+				s => s.devotion > 50,
+				s => s.trust > 50,
+				hasAnyEyes, // for winking
+			],
+			[ // and her mother, who has only the one child, but is capable of bearing another for the PC
+				s => s.ID === getSlave(this.actors[0]).mother,
+				s => s.daughters === 1, // note that the requesting slave CAN have half-sisters on her *father's* side, so a male PC's children are eligible to ask for a full sibling
+				this.impregCheck,
+				s => s.womb.length === 0 // and not already expecting another child...no begging for superfet babies in this event
+			]
+		];
+	}
+
+	/** @param {App.Entity.SlaveState} slave */
+	impregCheck(slave) {
+		// we can't just ask for canGetPregnant here, because of contraceptives and chastity devices, which the PC can remove
+		return isFertile(slave) && ((slave.ovaries === 1 && slave.vagina >= 0) || slave.mpreg === 1) && canBreed(slave, V.PC);
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		const [dau, mom] = this.actors.map(a => getSlave(a));
+
+		const {He, His, he, him, his, himself, daughter} = getPronouns(dau);
+		const {He2, he2, him2, his2, himself2} = getPronouns(mom).appendSuffix('2');
+		const {title: Master} = getEnunciation(dau);
+
+		V.nextButton = "Continue";
+		V.nextLink = "RIE Eligibility Check";
+
+		App.Events.drawEventArt(node, [dau, mom]);
+
+		const t = new SpacedTextAccumulator(node);
+		t.push(`After you complete your weekly inspection of`);
+		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, dau, "DOM"), `, your instincts tell you that the ${SlaveTitle(dau)} has something more on ${his} mind.`));
+		t.push(`You take a moment to look at ${him}, standing there in front of your desk. ${He}'s devoted to you, willing to please you for the sake of pleasing you, rather than to avoid punishment or to make ${his} own life easier, and ${he} trusts you implicitly. With that in mind, you ask what's bothering ${him}.`);
+		t.toParagraph();
+
+		t.push(Spoken(dau, `"I...I was thinking about family, and mom. Can...can I have a little sister, ${Master}? We could do all sorts of things together!"`));
+		t.push(`${He} winks seductively at you, and suddenly you're thinking about all the fun things you could do with them. And with a bit of patience it's definitely workable;`, contextualIntro(dau, mom, "DOM"), `could bear ${mom.counter.births > 0 ? `another` : `a`} child for you, without a doubt.`);
+		t.toParagraph();
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Bring ${mom.slaveName} up and impregnate ${him2} now`, impregMom, virginityCheck(mom)),
+			this.impregCheck(dau) ? new App.Events.Result(`Give ${him} a daughter, instead of a sister`, impregDau, virginityCheck(dau)) : new App.Events.Result(),
+			this.impregCheck(dau) ? new App.Events.Result(`Get them both pregnant, for extra family fun`, impregBoth, virginityCheck(mom, dau)) : new App.Events.Result(),
+			new App.Events.Result(`${He}'s fine as an only child`, decline)
+		]);
+
+		/** @param {App.Entity.SlaveState[]} slaves */
+		function virginityCheck(...slaves) {
+			const vir = [];
+			for (const slave of slaves) {
+				if (canDoVaginal(slave) && slave.vagina === 0) {
+					vir.push(`${slave.slaveName}'s virginity`);
+				} else if (slave.mpreg === 1 && canDoAnal(slave) && slave.anus === 0) {
+					vir.push(`${slave.slaveName}'s anal virginity`);
+				}
+			}
+			if (vir.length > 0) {
+				return `This option will take ${toSentence(vir)}.`;
+			}
+		}
+
+		/** Prepare and actually fuck the mom
+		 * @param {SpacedTextAccumulator} t
+		 * @param {boolean} disobedient
+		 */
+		function fuckMom(t, disobedient) {
+			const mobile = canMove(mom);
+			if (!mobile) {
+				t.push(`You have ${mom.slaveName} brought up to your office, stripped, and placed on the couch.`);
+			} else {
+				t.push(`You order ${mom.slaveName} to come up to your office immediately. ${He2} presents ${himself2} in a suitably short time, and strips when ordered, perhaps expecting a surprise inspection.`);
+			}
+			t.push(`You explain the situation briefly; upon`);
+			if (canHear(mom)) {
+				t.push(`hearing`);
+			} else {
+				t.push(`learning`);
+			}
+			t.push(`that you intend to impregnate ${him2}, ${he2}`);
+			if (disobedient) {
+				t.push(`starts to struggle.`);
+				if (mobile) {
+					t.push(`You throw ${him2} down on the couch, and at`);
+				} else {
+					 t.push(`At`);
+				}
+				t.push(`your word, ${dau.slaveName} holds ${him2} down so you can rape ${him2}. ${mom.slaveName}'s face registers shock at ${his2} ${daughter}'s betrayal, and replaces ${his2} struggling with sobbing.`);
+			} else if (mom.fetish === "pregnancy") {
+				t.push(`smiles broadly and begins to shed tears of joy as ${dau.slaveName} embraces ${him2}`);
+				if (mobile) {
+					t.push(`before guiding ${him2} to lay down on the couch`);
+				}
+				t.addToLast('.');
+			} else if (mom.devotion > 50) {
+				t.push(`seems eager to use ${his2} body to make you another slave, and ${dau.slaveName} a new sibling.`);
+				if (mobile) {
+					t.push(`${He2} lays on the couch, presenting ${his2} ${mom.mpreg ? 'ass' : 'vagina'} to you.`);
+				}
+			} else {
+				if (mobile) {
+					t.push(`compliantly lays on the couch awaiting the inevitable.`);
+				} else {
+					t.push(`indicates ${his2} compliance.`);
+				}
+			}
+
+			t.toParagraph();
+
+			if ((!mom.mpreg && mom.chastityVagina) || (mom.mpreg && mom.chastityAnus)) {
+				t.push(`You remove ${mom.slaveName}'s chastity belt and set it aside; it won't do to have it in the way right now.`);
+			}
+
+			if (mom.vaginaLube === 2 && !mom.mpreg) {
+				t.push(`Even though ${mom.slaveName}'s sopping cunt is already dripping on the couch, you order ${dau.slaveName} to use ${his} mouth to get ${him2} ready for you, and ${he} dives in eagerly.`);
+				seX(dau, "oral", mom, "vaginal", 1);
+			} else if (mom.mpreg) {
+				t.push(`As you briefed ${him}, ${dau.slaveName} uses ${his} mouth and tongue to clean and lubricate the entrance to ${his} mother's anal womb as preparation.`);
+				seX(dau, "oral", mom, "anal", 1);
+			} else {
+				t.push(`As you briefed ${him}, ${dau.slaveName} eagerly goes down on ${his} mother's cunt, to get ${him2} good and ready for your cock.`);
+				seX(dau, "oral", mom, "vaginal", 1);
+			}
+			if (mom.devotion > 50) {
+				t.push(`Knowing just how receptive ${his} mother is, ${dau.slaveName} straddles ${mom.slaveName}'s face and allows ${him2} to return the favor.`);
+			}
+			t.toParagraph();
+
+			t.push(`You move over to the couch to do your part of the work knocking up ${mom.slaveName}.`);
+			if (!mom.mpreg) {
+				const vcheckText = VCheck.Vaginal(mom, 7);
+				if (vcheckText) {
+					t.push(vcheckText);
+				} else {
+					t.push(`You push yourself into ${his}`);
+					if (mom.vagina > 2) {
+						t.push("gaping");
+					} else if (mom.vagina === 1) {
+						t.push("tight");
+					}
+					t.push(`pussy, working away at ${him} vigorously.`);
+				}
+				knockMeUp(mom, 100, 0, -1);
+			} else { // mpreg
+				const vcheckText = VCheck.Anal(mom, 7);
+				if (vcheckText) {
+					t.push(vcheckText);
+				} else {
+					t.push(`You push yourself into ${his}`);
+					if (mom.anus > 2) {
+						t.push("gaping");
+					} else if (mom.anus === 1) {
+						t.push("tight");
+					}
+					t.push(`anus, working away at ${him} vigorously.`);
+				}
+				knockMeUp(mom, 100, 1, -1);
+			}
+			if (disobedient) {
+				t.push(`Meanwhile, ${dau.slaveName} watches transfixed as ${he} holds ${mom.slaveName} in place.`);
+			} else {
+				const helping = [];
+				if (V.PC.scrotum > 1 && V.PC.balls > 1) {
+					helping.push("sucking your balls");
+				}
+				if (V.PC.boobs >= 300) {
+					helping.push("massaging your breasts");
+				}
+				if (mom.dick > 0) {
+					helping.push(`sliding ${his} hand up and down ${mom.slaveName}'s dick`);
+				} else if (mom.clit > 0) {
+					helping.push(`rubbing ${mom.slaveName}'s clit`);
+				}
+				helping.push("licking your nipples");
+				if (helping.length < 2) {
+					helping.push("so on");
+				}
+				t.push(`Meanwhile, ${dau.slaveName} "helps" any way ${he} can...running ${his} hands over both your bodies, ${toSentence(helping)}.`);
+			}
+			t.push(`Eventually, you come deep inside ${him2}, filling ${his2}${mom.mpreg ? ` anal` : ``} womb with your seed.`);
+			t.toParagraph();
+		}
+
+		/** Actually fuck the daughter
+		 * @param {SpacedTextAccumulator} t
+		 */
+		function fuckDau(t) {
+			t.push(`You move over to a convenient leather chair and sit down, signalling to ${dau.slaveName} that ${he} should climb on top`);
+			if ((!dau.mpreg && dau.chastityVagina) || (dau.mpreg && dau.chastityAnus)) {
+				t.push(`after removing ${his} chastity belt, which you've unlocked`);
+			}
+			t.addToLast(`.`);
+			t.push(`${He} rushes to obey, almost jumping on you in ${his} eagerness.`);
+			if (!dau.mpreg) {
+				const vcheckText = VCheck.Vaginal(dau, 7);
+				if (vcheckText) {
+					t.push(vcheckText);
+				} else {
+					t.push(`${He} faces you, sliding ${himself} down over your turgid cock, and gradually building up a rhythm.`);
+				}
+				knockMeUp(dau, 100, 0, -1);
+			} else { // mpreg
+				const vcheckText = VCheck.Anal(dau, 7);
+				if (vcheckText) {
+					t.push(vcheckText);
+				} else {
+					t.push(`${He} faces away from you,`);
+					if (dau.anus > 2) {
+						t.push(`sliding ${his} gaping`);
+					} else if (dau.anus === 1) {
+						t.push(`forcing ${his} tight`);
+					} else {
+						t.push(`pushing ${his} practiced`);
+					}
+					t.push(`butt down over your turgid cock, and gradually building up a rhythm.`);
+				}
+				knockMeUp(dau, 100, 1, -1);
+			}
+			t.push(`It doesn't take long before you explode within ${him}. ${He} kisses you before climbing off, your seed dripping down ${his} leg.`);
+			t.toParagraph();
+		}
+
+		function impregMom() {
+			const t = new SpacedTextAccumulator();
+
+			t.push(`You explain to ${dau.slaveName} that you'll want ${his} help, and ${he} agrees eagerly.`);
+			t.toParagraph();
+
+			const disobedient = (disobedience(mom) > random(0, 100));
+			fuckMom(t, disobedient);
+
+			if (mom.preg === -1) {
+				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his2} contraceptive regimen, and you'll be repeating this ritual all week.  ${He2}'s <span class="pregnant">bound to end up pregnant.</span>`);
+			} else {
+				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week, so ${he2}'s <span class="pregnant">going to end up pregnant.</span>`);
+			}
+			t.toParagraph();
+
+			dau.devotion += 2;
+			dau.trust += 5;
+			t.push(`${dau.slaveName} is <span class="devotion inc">excited</span> to have a sibling on the way and <span class="trust inc">grateful</span> that you fulfilled ${his} request,`);
+			if (disobedient) {
+				mom.devotion -= 4;
+				mom.trust -= 4;
+				t.push(`but ${mom.slaveName} <span class="devotion dec">hates that it's yours</span> and is <span class="trust dec">terrified</span> of your control over ${his2} body.`);
+			} else if (mom.devotion > 50 || mom.fetish === "pregnancy") {
+				mom.devotion += 4;
+				t.push(`and ${mom.slaveName} is <span class="devotion inc">even more excited</span> that ${he2} gets to carry it.`);
+			} else {
+				mom.devotion += 1;
+				mom.trust -= 1;
+				t.push(`and while ${mom.slaveName} <span class="trust dec">fears your arbitrary control of ${his2} body</span>, ${he2} feels <span class="devotion inc">closer to you</span> because ${he2}'s carrying the child that ${dau.slaveName} wanted so badly.`);
+			}
+			t.toParagraph();
+
+			return t.container();
+		}
+
+		function impregDau() {
+			const t = new SpacedTextAccumulator();
+
+			t.push(`You pause for a moment. You could, of course, grant ${his} request, but you have a better idea. You inform ${him} that ${he}'ll soon have a daughter of ${his} own, so ${he} won't be needing a baby sister.`);
+			if (dau.intelligence > 50) {
+				t.push(`${He}'s a sharp slave, and immediately grasps your meaning. ${He}`);
+			} else {
+				t.push(`It takes ${him} a couple of seconds before ${he} grasps your meaning. When ${he} does, ${he}`);
+			}
+			t.push(`grins and clasps ${his} hands in front of ${himself}, bouncing eagerly.`);
+			t.push(Spoken(dau, `"Oh, that's even better, ${Master}! Can we do it now?"`));
+			t.toParagraph();
+
+			fuckDau(t);
+
+			if (dau.preg === -1) {
+				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his} contraceptive regimen, and you'll be repeating this ritual all week.  ${He}'s <span class="pregnant">bound to end up pregnant.</span>`);
+			} else {
+				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week, so ${he}'s <span class="pregnant">going to end up pregnant.</span>`);
+			}
+			t.toParagraph();
+
+			dau.devotion += 5;
+			dau.trust += 5;
+			t.push(`${dau.slaveName} is <span class="devotion inc">overjoyed</span> to be carrying a child, and <span class="trust inc">grateful</span> that you understood the heart of ${his} request, even if you didn't fulfil it exactly the way ${he} was originally hoping.`);
+			if (dau.fetish === "pregnancy") {
+				if (!dau.fetishKnown) {
+					t.push(`In fact, ${he}'s <em>so</em> excited that you've begun to understand ${his} sexuality better; ${he}'s a <span class="fetish gain">pregnancy fetishist!</span>`);
+					dau.fetishKnown = 1;
+					if (dau.fetishStrength < 90) {
+						dau.fetishStrength += 10;
+					}
+				} else if (dau.fetishStrength < 90) {
+					t.push(`${His} pregnancy fetish <span class="fetish inc">has strengthened</span> since you put a new baby in ${him}.`);
+					dau.fetishStrength += 10;
+				}
+			} else if (fetishChangeChance(dau) > jsRandom(0, 100)) {
+				t.push(`This week has a lasting impact on ${dau.slaveName}; ${he} starts to develop an ongoing <span class="fetish gain">pregnancy fetish.</span>`);
+				dau.fetish = "pregnancy";
+				dau.fetishKnown = 1;
+				dau.fetishStrength = 20;
+			}
+			t.toParagraph();
+
+			return t.container();
+		}
+
+		function impregBoth() {
+			const t = new SpacedTextAccumulator();
+
+			/* Por qué no los dos? */
+
+			t.push(`You explain to ${dau.slaveName} that you're more than willing to get ${mom.slaveName} pregnant, but you want ${him} to carry a child for you as well. ${He} grins and clasps ${his} hands in front of ${himself}, bouncing eagerly.`);
+			t.push(Spoken(dau, `"When can we start, ${Master}?"`));
+			t.push(`You spend a few moments letting ${him} know what you expect from ${him} during the upcoming session; ${he} knows what's coming, but ${his} mother doesn't yet.`);
+			t.toParagraph();
+
+			const disobedient = (disobedience(mom) > random(0, 100));
+			fuckMom(t, disobedient);
+
+			if (!disobedient) {
+				t.push(`You decide to let ${mom.slaveName} watch while you impregnate ${his2} ${daughter}.`);
+				if (mom.devotion > 50 || mom.energy > 80) {
+					t.push(`${He2} sits up a bit, beginning to lazily masturbate as you get to work.`);
+				}
+			} else {
+				t.push(`You order ${mom.slaveName} to stay and watch while you impregnate ${his2} ${daughter}.`);
+			}
+			t.toParagraph();
+
+			fuckDau(t);
+
+			if (dau.preg === -1 || mom.preg === -1) {
+				t.push(`You've already ordered ${V.assistant.name} to discontinue their contraceptive regimens, and you're`);
+			} else {
+				t.push(`You won't know if they've taken right away, but you're`);
+			}
+			t.push(`sure that repeating this ritual all week will result in <span class="pregnant">both of them getting pregnant</span> with your children.`);
+			t.toParagraph();
+
+			dau.devotion += 2;
+			dau.trust += 5;
+			t.push(`${dau.slaveName} is <span class="devotion inc">excited</span> to have both a sibling and a child on the way and <span class="trust inc">grateful</span> that you fulfilled ${his} request,`);
+			if (disobedient) {
+				mom.devotion -= 5;
+				mom.trust -= 8;
+				t.push(`but ${mom.slaveName} <span class="devotion dec">hates that you're the father</span> of both children and is <span class="trust dec">terrified</span> of your control over ${his2} and ${his2} ${daughter}'s bodies.`);
+			} else if (mom.devotion > 50 || mom.fetish === "pregnancy") {
+				mom.devotion += 4;
+				mom.trust += 2;
+				t.push(`while ${mom.slaveName} is <span class="devotion inc">just as excited</span> about ${his2} upcoming child and grandchild, and <span class="trust inc">hopes and trusts</span> you'll allow ${him2} to provide good advice for ${his2} pregnant ${daughter}.`);
+			} else {
+				mom.trust -= 4;
+				t.push(`but ${mom.slaveName} <span class="trust dec">fears your arbitrary control</span> of ${his2} and ${his2} ${daughter}'s bodies.`);
+			}
+			t.toParagraph();
+
+			return t.container();
+		}
+
+		function decline() {
+			dau.trust += 2;
+			return [`You tell ${dau.slaveName} that you're satisfied with ${his} service for you as an only child, and you aren't going to knock up ${mom.slaveName}${dau.father === -1 ? " again" : ""} just to make a sibling for ${him}. Like the good slave ${he} is, ${he} accepts your decision and <span class="trust inc">appreciates</span> your attention.`];
+		}
+	}
+};
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/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/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/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/ageImplant.js b/src/events/RESS/review/ageImplant.js
new file mode 100644
index 0000000000000000000000000000000000000000..8063fcd2f95f3dbe191b2ff78ac440786c85874e
--- /dev/null
+++ b/src/events/RESS/review/ageImplant.js
@@ -0,0 +1,387 @@
+App.Events.RESSAgeImplant = class RESSAgeImplant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				canTalk,
+				s => s.assignment !== Job.QUARTER,
+				s => s.physicalAge > 30,
+				s => s.ageImplant > 0,
+				s => s.devotion > 20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+
+		App.Events.addParagraph(node, [
+			`In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each others' youthful energy. At the back of the pack is`,
+			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), `. ${He} looks as young as any of them, but after they're out, ${he} leans against the door frame for a moment and exhales slowly.`)
+		]);
+		let r = [];
+		r.push(`${His} ${App.Desc.eyeColor(eventSlave)}-eyed gaze catches yours for a moment, and you are reminded that ${he} isn't as young as they are, not at all. ${His} face might look youthful, but ${his} eyes don't.`);
+		if (canSee(eventSlave)) {
+			r.push(`${He} sees your consideration, and murmurs,`);
+		} else {
+			r.push(`You make yourself known, and ${he} murmurs,`);
+		}
+		r.push(
+			Spoken(eventSlave, `"Sorry, ${Master}. Just a little slow this morning."`),
+			`${He} hurries after ${his} sisters, ${his}`
+		);
+		if (eventSlave.butt > 12) {
+			r.push(`massive`);
+		} else if (eventSlave.butt > 8) {
+			r.push(`giant`);
+		} else if (eventSlave.butt > 5) {
+			r.push(`huge`);
+		} else if (eventSlave.butt > 2) {
+			r.push(`big`);
+		} else {
+			r.push(`pretty little`);
+		}
+		r.push(`naked ass catching your eye as ${he} goes.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Go out clubbing to make ${him} feel young again`, clubbing),
+			new App.Events.Result(`Attend a sporting event with ${him}`, sporting),
+			new App.Events.Result(`Put the old whore in ${his} place`, old, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null),
+		]);
+
+		function clubbing() {
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} to take the day off and meet you that evening for a trip to ${V.arcologies[0].name}'s most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and ${his} eyes widen a little at the implied compliment and challenge. Right at the proper time, ${he} arrives in your office wearing neon ${eventSlave.hColor} makeup to match ${his} hair, and a tiny iridescent club${girl} outfit of the same color. The hem of the skirt is barely low enough to conceal ${him}`);
+			if (eventSlave.dick > 0) {
+				r.push(`dick,`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`total lack of private parts,`);
+			} else {
+				r.push(`pussy,`);
+			}
+			r.push(`and it's backless. The front is held up by a halter around ${his} pretty neck, and is`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`specially tailored to cover ${his} massive tits`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`strained by ${his} big tits`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`tightly filled by ${his} healthy tits`);
+			} else {
+				r.push(`tight against ${his} flat chest`);
+			}
+			if (eventSlave.belly >= 1500) {
+				r.push(`and ${belly}`);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			}
+			r.push(r.pop() + `. ${He} makes a gaudy and very fashionable spectacle, and in response to your`);
+			if (canSee(eventSlave)) {
+				r.push(`look`);
+			} else if (canHear(eventSlave)) {
+				r.push(`whistle`);
+			} else {
+				r.push(`gentle poke`);
+			}
+			r.push(`${he} raises`);
+			if (!hasAnyArms(eventSlave)) {
+				r.push(`the stumps of ${his} arms ever so slightly`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`both arms`);
+				} else {
+					r.push(`${his} arm`);
+				}
+				r.push(`over ${his} head`);
+			}
+			r.push(
+				`and twirls, shimmying ${his} body deliciously.`,
+				Spoken(eventSlave, `"I hope they let me into the club without checking my I.D., ${Master},"`),
+				`${he} jokes, for which ${he} receives a swat on ${his} rear as you head out. With the full day of rest, ${he} is full of vigor and ready to dance. ${He} eagerly heads out onto the floor with you,`);
+			if (eventSlave.skill.entertainment >= 100) {
+				r.push(`masterfully moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, grabbing the attention of all the men and most of the women in ${V.clubName}.`);
+			} else if (eventSlave.skill.entertainment > 60) {
+				r.push(`expertly moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, mesmerizing ${his} neighbors on the floor.`);
+			} else if (eventSlave.skill.entertainment > 30) {
+				r.push(`skillfully moving ${his}`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`body to the heavy beat, drawing a lustful gaze or two.`);
+			} else {
+				r.push(`clumsily moving`);
+				if (eventSlave.belly >= 1500) {
+					if (eventSlave.bellyPreg >= 1500) {
+						r.push(`gravid`);
+					} else {
+						r.push(`rounded`);
+					}
+				}
+				r.push(`${his} body to the heavy beat, attracting little notice among the press of novices.`);
+			}
+			r.push(`It doesn't take long for ${him} to back ${himself} into you so ${he} can grind; ${he} cranes ${his} neck back to plant an <span class="devotion inc">earnest kiss</span> on your chin.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function sporting() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} ${he}'ll be spending the day with you at a game outside the arcology, and ${he}'s to meet you at your VTOL pad in two hours. ${He} ponders for a moment but clearly understands this is related to ${his} age, somehow. Right at the proper time, ${he} arrives on the pad. ${He}'s clearly spent the whole time getting the right clothing; somehow ${he} used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal ${his}`);
+			if (eventSlave.dick > 0) {
+				r.push(`dick,`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`lack of private parts,`);
+			} else {
+				r.push(`pussy,`);
+			}
+			r.push(`and ${he} bounces a little on ${his} heels for you to show off how ${he}'s going commando underneath it. ${His}`);
+			if (eventSlave.belly >= 100000) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+			} else if (eventSlave.weight > 130) {
+				r.push(`hugely soft`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnant`);
+				}
+			} else if (eventSlave.muscles > 30) {
+				r.push(`ripped`);
+			} else if (eventSlave.weight > 30) {
+				r.push(`fat`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`plush`);
+			} else {
+				r.push(`taut`);
+			}
+			r.push(`midriff is bare. The top`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`somehow contains ${his} tits, with the team's logo at least`);
+				if (V.showInches === 2) {
+					r.push(`three feet`);
+				} else {
+					r.push(`a meter`);
+				}
+				r.push(`wide across ${his} chest.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`is a great location for the team's logo, since ${his} tits allow it to be quite large.`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`is a good location for the team's logo, since ${his} tits allow it to be pretty big.`);
+			} else {
+				r.push(`flatters ${his} flat chest, especially with the team logo over it.`);
+			}
+			r.push(`${He} even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; ${he}'s made up to look even younger.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`You have a front-row seat, of course, and ${he} excitedly takes ${his} place beside you,`);
+			if (eventSlave.butt > 12) {
+				r.push(`thankful that you reserved a seat for both of ${his} massive cheeks.`);
+			} else if (eventSlave.belly >= 300000) {
+				r.push(`thankful that the front row has plenty of room for ${his} ${belly} belly to occupy.`);
+			} else if (eventSlave.butt > 6) {
+				r.push(`carefully fitting ${his} big bottom into the seat.`);
+			} else if (eventSlave.boobs > 4000) {
+				r.push(`${his} absurd boobs rubbing against your arm.`);
+			}
+			r.push(`${He} cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before <span class="reputation inc">recognizing you,</span> putting two and two together, and realizing enviously that ${he}'s your sex slave. Since this is the Free Cities, the big screen gives ${him} more attention rather than cutting away when ${he} intentionally cheers hard enough that ${his} skirt rides up.`);
+			if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and goes into labor on another of ${his} brood; the contractions forcing ${him} to lean forward onto ${his} r.push(belly);stomach and give the players below a clear view of ${his} crowning child.`);
+			} else if (eventSlave.belly < 300000) {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and bending down to show cleavage to the stands in such a way that ${his}`);
+				if (eventSlave.butt > 5) {
+					r.push(`massive ass`);
+				} else if (eventSlave.butt > 2) {
+					r.push(`big butt`);
+				} else {
+					r.push(`nice ass`);
+				}
+				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
+				if (eventSlave.anus > 2) {
+					r.push(`big slit of an asspussy`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`nice asspussy`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`tight asshole`);
+				} else {
+					r.push(`virgin asshole`);
+				}
+				if (eventSlave.vagina > 3) {
+					r.push(`and gaping pussy`);
+				} else if (eventSlave.vagina > 2) {
+					r.push(`and used pussy`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`and lovely pussy`);
+				} else if (eventSlave.vagina > 0) {
+					r.push(`and tight pussy`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`and virgin pussy`);
+				}
+				r.push(r.pop() + `.`);
+			} else {
+				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, cheering while swinging ${his} absurd belly back and forth and accidentally smashes into a concession vendor sending them to the floor. ${His} efforts to help him up forces ${him} to stand in such a way that ${his}`);
+				if (eventSlave.butt > 5) {
+					r.push(`massive ass`);
+				} else if (eventSlave.butt > 2) {
+					r.push(`big butt`);
+				} else {
+					r.push(`nice ass`);
+				}
+				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
+				if (eventSlave.anus > 2) {
+					r.push(`big slit of an asspussy`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`nice asspussy`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`tight asshole`);
+				} else {
+					r.push(`virgin asshole`);
+				}
+				if (eventSlave.vagina > 3) {
+					r.push(`and gaping pussy`);
+				} else if (eventSlave.vagina > 2) {
+					r.push(`and used pussy`);
+				} else if (eventSlave.vagina > 1) {
+					r.push(`and lovely pussy`);
+				} else if (eventSlave.vagina > 0) {
+					r.push(`and tight pussy`);
+				} else if (eventSlave.vagina === 0) {
+					r.push(`and virgin pussy`);
+				}
+				r.push(r.pop() + `.`);
+			}
+			r.push(`A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.`);
+			repX(500, "event", eventSlave);
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function old() {
+			let didVaginal = false;
+			let didAnal = false;
+			r = [];
+			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen. You tell ${him} you're interested to see if ${his} old body can still perform. Something about the way you say 'old' makes ${him} flinch, and ${he}'s right to worry. You tell ${him} to go out and make you ${cashFormat(200)}, and to hurry back if ${he} wants to avoid punishment. ${He} hesitates for an instant before hurrying outside. A few hours later you check on ${him} remotely. The feed shows ${him}`);
+			if (eventSlave.belly >= 10000) {
+				r.push(`waddle`);
+			} else {
+				r.push(`walk`);
+			}
+			r.push(`quickly up to a couple out on the street; you can't hear what's said, but ${he}`);
+			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
+				r.push(`turns around to rub ${his} bare butt against the crotch of the man's pants. He pulls them down and fucks ${him} right there`);
+				if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`<span class="virginity loss">taking ${his} virginity</span>,`);
+					didVaginal = true;
+				} else if (canDoAnal(eventSlave) && eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss">taking ${his} anal virginity</span>,`);
+					didAnal = true;
+				}
+				r.push(`as the woman`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`pulls and abuses`);
+				} else {
+					r.push(`roughly fingers`);
+				}
+				r.push(`${his} poor nipples. Boring of this, he switches to torturing the poor slave's`);
+				if (eventSlave.dick > 0) {
+					r.push(`dick,`);
+				} else if (eventSlave.vagina === -1) {
+					r.push(`butthole,`);
+				} else {
+					r.push(`pussy,`);
+				}
+				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your <span class="cash inc"> ${cashFormat(200)}.</span> You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
+					Spoken(eventSlave, `"I'm OK, ${Master}. Holes are pretty sore though. Kinda loose."`)
+				);
+			} else {
+				r.push(`drops to ${his} ${hasBothLegs(eventSlave) ? "knees" : "knee"} to nuzzle against the man's pants. He pulls them down and facefucks ${him} right there, as the woman`);
+				if (eventSlave.nipples !== "fuckable") {
+					r.push(`pulls and abuses`);
+				} else {
+					r.push(`roughly fingers`);
+				}
+				r.push(`${his} poor nipples. Boring of this, ${he} switches to torturing the poor slave's`);
+				if (eventSlave.dick > 0) {
+					r.push(`dick,`);
+				} else if (eventSlave.vagina === -1) {
+					r.push(`butthole,`);
+				} else {
+					r.push(`pussy,`);
+				}
+				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your <span class="cash inc">${cashFormat(200)}.</span> You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
+					Spoken(eventSlave, `"I'm OK, ${Master}. My jaw kinda hurts and my legs are really sore."`)
+				);
+			}
+			r.push(`You tell ${him} that's of little concern, since ${he} has relatively few years of use left: you may as well extract what value you can from ${him}. ${He}'s too exhausted to hide ${his} response, and collapses, <span class="trust dec">sobbing.</span>`);
+			cashX(200, "event", eventSlave);
+			eventSlave.trust -= 5;
+			if (didAnal) {
+				eventSlave.anus++;
+				seX(eventSlave, "anal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			} else if (didVaginal) {
+				eventSlave.vagina++;
+				seX(eventSlave, "vaginal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 0, -2));
+				}
+			} else if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 0, -2));
+				}
+			} else if (canDoAnal(eventSlave)) {
+				seX(eventSlave, "anal", "public", "penetrative");
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			} else {
+				seX(eventSlave, "oral", "public", "penetrative");
+			}
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/dickWringing.js b/src/events/RESS/review/dickWringing.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e18aca526ce9e1336d8fa5eb4769f6bdc7a2005
--- /dev/null
+++ b/src/events/RESS/review/dickWringing.js
@@ -0,0 +1,364 @@
+App.Events.RESSDickWringing = class RESSDickWringing extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.dick > 8,
+				s => s.balls > 0,
+				s => s.energy > 60,
+				s => s.devotion > 50,
+				s => s.trust > 50,
+				s => canDoAnal(s) || canDoVaginal(s),
+				s => s.belly < 100000,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`You run into`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`in the hallway outside your office. The devoted ${SlaveTitle(eventSlave)} smiles at you as ${he} approaches. You barely notice how awkward ${his} gait is, since ${he} usually walks a little strangely. ${His} third leg tends to have that effect. But on consideration, ${he} does seem especially uncomfortable right now. The poor ${girl}'s`
+		);
+		if (eventSlave.scrotum === 0) {
+			r.push(`internal balls`);
+		} else if (eventSlave.balls < 3) {
+			r.push(`girly balls`);
+		} else if (eventSlave.scrotum < 4) {
+			r.push(`balls, held tightly against ${his} body by ${his} taut scrotum,`);
+		} else {
+			r.push(`swinging balls`);
+		}
+		r.push(`must be in dire need of emptying.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+		r.push(`${He} trusts you, so ${he} approaches you as sensually as ${he} can manage and asks for your help.`);
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} uses quick but submissive gestures to beg you to help ${him} cum, pleading the special difficulties caused by ${his} outlandish member, which ${he} can manage most comfortably if ${he} has both hands free for it.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"${Master}, would you please, please help me cum?"`),
+				`${he} begs submissively.`,
+				Spoken(eventSlave, `"It's nice if I can use both hands on it to, um, manage things."`)
+			);
+		}
+		r.push(`${He}'s referring to the volume issue with ${his} unnaturally massive dick. The thing is so huge and so soft that`);
+		if (eventSlave.balls < 3) {
+			r.push(`one of ${his} (by comparison) pathetically weak ejaculations`);
+		} else if (eventSlave.balls < 6) {
+			r.push(`one of ${his} comparatively normal ejaculations`);
+		} else {
+			r.push(`a single one of even ${his} copious ejaculations`);
+		}
+		r.push(`often fails to make it all the way to the tip of ${his} cock, making it only partway down ${his} urethra without help.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Address ${his} problem together`, together, virginityWarning()),
+			new App.Events.Result(`Use ${his} trouble to dominate ${him}`, dominate, virginityWarning()),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function together() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You step in and give ${him} a quick kiss on the lips, telling ${him} you'd be happy to. ${He} was confident you would, but the tenderness makes ${his} breath catch a little. You take ${him} by ${his}`);
+			if (eventSlave.weight > 130) {
+				r.push(`fat`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`chubby`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`strong`);
+			} else if (eventSlave.shoulders < 0) {
+				r.push(`pretty little`);
+			} else if (eventSlave.shoulders > 1) {
+				r.push(`broad`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`shoulders and keep kissing ${him}, steering ${him} backwards into your office. ${He} gets the idea and cooperates as best ${he} can, giggling`);
+			if (eventSlave.voice === 0) {
+				r.push(`mutely`);
+			} else {
+				r.push(`cutely`);
+			}
+			r.push(`into your mouth as ${his} hot and increasingly horny body bumps against your own.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`When ${his}`);
+			if (eventSlave.butt > 12) {
+				r.push(`monumental ass`);
+			} else if (eventSlave.butt > 7) {
+				r.push(`titanic ass`);
+			} else if (eventSlave.butt > 4) {
+				r.push(`big butt`);
+			} else {
+				r.push(`cute rear`);
+			}
+			r.push(`touches the edge of your desk, the`);
+			if (eventSlave.height > 180) {
+				r.push(`tall ${SlaveTitle(eventSlave)} leans back`);
+			} else if (eventSlave.height > 155) {
+				r.push(`${SlaveTitle(eventSlave)} reclines`);
+			} else {
+				r.push(`short ${SlaveTitle(eventSlave)} hops up`);
+			}
+			r.push(`to lie across it, using a hand to lay ${his} inhumanly big dick`);
+			if (eventSlave.belly > 10000) {
+				r.push(`onto ${his} ${belly}`);
+				if (eventSlave.bellyPreg > 0) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly.`);
+			} else if (eventSlave.weight > 160) {
+				r.push(`across ${his} gut.`);
+			} else if (eventSlave.boobs > 5000) {
+				r.push(`in the warm canyon formed by ${his} inhumanly big boobs.`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`across ${his} soft belly.`);
+			} else if (eventSlave.belly > 1500) {
+				r.push(`over ${his} ${belly}`);
+				if (eventSlave.bellyPreg > 0) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly.`);
+			} else if (eventSlave.muscles > 30) {
+				r.push(`across ${his} ripped abs.`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`across ${his} plush stomach.`);
+			} else {
+				r.push(`up ${his} stomach.`);
+			}
+			r.push(`${He} spreads ${his} legs as wide as they'll go, and reaches down to spread ${his} buttocks even wider, offering you ${his}`);
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`holes.`);
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`pussy.`);
+			} else {
+				r.push(`asshole.`);
+			}
+			r.push(`${He}`);
+			if (eventSlave.voice === 0) {
+				r.push(`tries to groan`);
+			} else {
+				r.push(`groans`);
+			}
+			r.push(`with anticipation of the coming relief as you slide`);
+			if (PC.dick !== 0) {
+				r.push(`your cock`);
+			} else {
+				r.push(`a strap-on`);
+			}
+			r.push(`past ${his}`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`pussylips and inside ${his} womanhood.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(`sphincter and inside ${his} asspussy.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`It doesn't take long. ${His}`);
+			if (eventSlave.scrotum === 0) {
+				r.push(`invisible but overfull balls`);
+			} else {
+				r.push(`balls tighten and`);
+			}
+			r.push(`shoot cum into ${his} soft python of a dick, but not a drop appears at its tip. Gasping at the mixed relief and discomfort, ${he} lets ${his} butt go and wriggles around to grab ${his} dick around its base with both hands. ${He} squeezes it from base to tip to bring out its contents. ${He}'s so huge that ${he}'s able to reach down with ${his} lips and get ${his} cockhead into ${his} mouth, the meat filling it entirely. ${He} sucks industriously, swallowing ${his} own load. ${He} was just trying to relieve the pressure, but the added stimulation brings ${him} to climax again. Silenced by ${his} own dickhead, ${he} shudders deliciously and starts over, wringing more cum into ${his} own mouth. You change angles, bringing the hard head of`);
+			if (PC.dick !== 0) {
+				r.push(`your own penis`);
+			} else {
+				r.push(`your phallus`);
+			}
+			r.push(`against ${his} prostate and forcing an agonizing third climax.`); // FIXME: actually check that slave has a prostate
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`${He}'s so discombobulated by this that ${he} goes limp, offering no resistance as you extract yourself,`);
+			if (PC.dick !== 0) {
+				r.push(`straddle ${his} torso, and press your dick inside ${his} mouth to climax there, adding your own ejaculate`);
+			} else {
+				r.push(`slip out of the harness with the ease of long practice, and straddle ${his} face so that your climax adds a good quantity of your pussyjuice`);
+			}
+			r.push(`to everything ${he}'s already gotten down`);
+			if (PC.vagina !== -1) {
+				if (PC.dick !== 0) {
+					r.push(`and leaving quite a lot of your pussyjuice on ${his} chin`);
+				}
+			}
+			r.push(r.pop() + `. When you finally release ${him}, ${he} slithers down to the floor, utterly spent.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} raises a shaky hand to <span class="trust inc">gesture thanks.</span>`);
+			} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
+				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} lisps weakly.`);
+			} else {
+				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} murmurs in a tiny voice.`);
+			}
+			eventSlave.trust += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+
+		function dominate() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You step in and trace a`);
+			if (PC.title === 1) {
+				r.push(`strong`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`hand across ${his} lips before inserting two fingers into ${his} mouth. ${He} looks puzzled, but obediently begins to suck on your fingers. You use your other hand to explore ${his} body, titillating the heavily aroused ${SlaveTitle(eventSlave)} until ${he}'s on the verge of orgasm. Without warning, you place an elastic band around the slave's dickhead. ${He} writhes with discomfort, but knows better than to protest. It's tight, but not agonizingly so. ${He}'ll be able to cum, but not a drop will get out. Grabbing ${him} by a nipple`);
+			if (eventSlave.nipples === "fuckable") {
+				r.push(`cunt`);
+			}
+			r.push(r.pop() + `, you pull ${him} down to ${his} knees, enjoying the motion of ${his} body as ${he} wriggles with the discomfort of being tugged this way, the uncomfortable thing squeezing the tip of ${his} cock, and the suspicion that this is going to be tough.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`Once ${he}'s in position, you`);
+			if (eventSlave.butt > 12) {
+				r.push(`struggle to wrap your arms around ${his} bountiful buttcheeks,`);
+			} else if (eventSlave.butt > 7) {
+				r.push(`heft ${his} ridiculous buttcheeks possessively,`);
+			} else if (eventSlave.butt > 4) {
+				r.push(`give ${his} huge ass a possessive squeeze,`);
+			} else {
+				r.push(`run your hands across ${his} bottom,`);
+			}
+			r.push(`and then shove`);
+			if (PC.dick !== 0) {
+				r.push(`your cock`);
+			} else {
+				r.push(`a strap-on`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				r.push(`inside ${his} cunt.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(`up ${his} butt.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`${His} cock is so long that it drags along the floor as you pound`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`${him} against ${his} ${belly} dome of a stomach.`);
+			} else if (eventSlave.boobs > 12000) {
+				r.push(`${him}, ${his} enormous tits serving as a cushion for ${his} torso to rest against.`);
+			} else if (eventSlave.boobs > 7000) {
+				r.push(`${him}, accompanied by the nipples that cap ${his} absurd boobs.`);
+			} else {
+				r.push(`${him}.`);
+			}
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`${He}'s so pent up that ${he} reaches ${his} first climax quickly, filling ${his} capped dick with cum. ${He}`);
+			if (eventSlave.voice === 0) {
+				r.push(`tries to moan`);
+			} else {
+				r.push(`moans`);
+			}
+			r.push(`at the combination of relief and pressure inside ${his} dick, and then slumps a little when ${he} feels the`);
+			if (PC.dick !== 0) {
+				r.push(`penis`);
+			} else {
+				r.push(`hard phallus`);
+			}
+			r.push(`inside ${him} fuck ${him} even harder, forcing ${him} towards a second orgasm. And after that one, a third. And a fourth.`);
+			App.Events.addParagraph(frag, r);
+			r = [];
+			r.push(`When you finally climax yourself, you stand, leaving ${him} writhing at your feet with ${his} huge soft cock positively pressurized. Considering the situation, you kneel down at ${his} side, deciding what to do. Stroking ${him} in a mockery of reassurance, you grab ${his} agonized member, producing a`);
+			if (eventSlave.voice === 0) {
+				r.push(`gaping, silent scream.`);
+			} else {
+				r.push(`little shriek.`);
+			}
+			if (eventSlave.toyHole === "dick" && (PC.preg === 0 || PC.vagina === 0)) {
+				r.push(`You maneuver the massive thing into your own`);
+				if (PC.preg === 0 && PC.vagina !== -1) {
+					r.push(`pussy,`);
+				} else {
+					r.push(`asshole,`);
+				}
+				r.push(`slide a finger in alongside the monstrous thing as ${he}`);
+				if (eventSlave.voice === 0) {
+					r.push(`moans with expectation,`);
+				} else {
+					r.push(`begs abjectly to unleash ${his},`);
+				}
+				r.push(`and pop the elastic off. You get to watch ${his} face as ${he} floods your`);
+				if (PC.preg === 0 && PC.vagina !== -1) {
+					r.push(`womanhood`);
+				} else {
+					r.push(`bowels`);
+				}
+				r.push(`with cum, your stomach taking on a distinctive swell as ${his} pent-up load empties into you.`);
+				if (PC.vagina !== -1) {
+					seX(eventSlave, "penetrative", PC, "vaginal");
+				} else {
+					seX(eventSlave, "penetrative", PC, "anal");
+				}
+				if (canImpreg(PC, eventSlave)) {
+					r.push(knockMeUp(PC, 50, 0, eventSlave.ID));
+				}
+			} else {
+				r.push(`You maneuver the massive thing inside the slave's own well-fucked`);
+				if (eventSlave.vagina > -1) {
+					r.push(`pussy,`);
+				} else {
+					r.push(`asshole,`);
+				}
+				r.push(`and then slide fingers in alongside the monstrous thing as ${he}`);
+				if (eventSlave.voice === 0) {
+					r.push(`cries desperately.`);
+				} else {
+					r.push(`begs abjectly for mercy.`);
+				}
+				r.push(`Popping the elastic off, you get to watch ${his} face as ${he} floods ${his} own`);
+				if (eventSlave.vagina > -1) {
+					r.push(`womanhood`);
+				} else {
+					r.push(`bowels`);
+				}
+				r.push(`with cum.`);
+				if (canDoVaginal(eventSlave)) {
+					seX(eventSlave, "vaginal", PC, "penetrative");
+					if (canGetPregnant(eventSlave) && canBreed(eventSlave, eventSlave) && eventSlave.vasectomy !== 1) { // can't miss the opportunity to knock ${himself} up
+						knockMeUp(eventSlave, 20, 0, eventSlave.ID);
+					}
+				} else {
+					seX(eventSlave, "anal", PC, "penetrative");
+				}
+			}
+			r.push(`The cum pressurization brought ${him} almost to half-hardness, and as this effect diminishes, ${his} dick slides out again, releasing a lewd torrent of cum. ${He} cries with overstimulation, relief, pain, and humiliation, <span class="devotion inc">groveling below you</span> in utter subjugation.`);
+			eventSlave.devotion += 4;
+			App.Events.addParagraph(frag, r);
+			return frag;
+		}
+	}
+};
diff --git a/src/events/RESS/review/diet.js b/src/events/RESS/review/diet.js
new file mode 100644
index 0000000000000000000000000000000000000000..22f33381b1704a97be1881593211833dc7310b93
--- /dev/null
+++ b/src/events/RESS/review/diet.js
@@ -0,0 +1,193 @@
+App.Events.RESSDiet = class RESSDiet extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.devotion <= 50,
+				s => s.trust >= -50,
+				s => s.behavioralFlaw === "gluttonous",
+				s => s.diet === "restricted",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`is on a diet, and ${he} needs it. That doesn't make it any easier for ${him}. Your slaves are not permitted time to waste over meals. They enter the simple kitchen, drink their allotted portion of slave food out of a cup, and get on with their duties.`
+		);
+
+
+		if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
+			r.push(`Despite eating for`);
+			if (eventSlave.pregType <= 1) {
+				r.push(`two,`);
+			} else if (eventSlave.pregType >= 10) {
+				r.push(`far too many,`);
+			} else {
+				r.push(num(eventSlave.pregType + 1),);
+			}
+			r.push(`${his} diet is still in full effect.`);
+		}
+		r.push(`${capFirstChar(V.assistant.name)} catches ${eventSlave.slaveName}, whose cup is always filled less than halfway, skulking around in the hope that one of the others will take ${his} eyes off ${his} cup, or even leave leftovers.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Catch ${him} at it and punish ${him}`, punish),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Make ${him} eat in your office and keep ${him} busy while ${he} does`, busy, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			new App.Events.Result(`Fill ${him} up with water as punishment`, water),
+			new App.Events.Result(`Make ${him} eat until ${he} regrets it`, regret),
+			((cumSlaves().length >= 5) && ((eventSlave.fetish !== "cumslut") || (eventSlave.fetishKnown === 0)))
+				? new App.Events.Result(`Restrict ${him} to nothing but fresh cum from the Dairy`, restrict)
+				: new App.Events.Result(),
+		]);
+
+		function punish() {
+			r = [];
+			r.push(`It's childishly easy to catch ${him} at it. You simply call a slave eating ${his} breakfast away over the arcology's audio system, and then enter the kitchen by a different door. ${eventSlave.slaveName} has the departed slave's cup in ${his} hand and halfway to ${his} mouth when ${he}'s caught in the act. You relieve ${him} of ${his} prize, and finding that ${he} has not started ${his} own proper portion, pour it out onto the floor. You tell ${him} to lap it up without using ${his} hands, and begin counting down from ten. ${He} obeys,`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`only to find ${his} ${belly} stomach keeps ${him} from reaching the puddle. When you reach zero you shove ${him} over ${his} middle, face first into the pool of slave food, and administer a stinging slap across ${his} thieving`);
+				if (V.seeRace === 1) {
+					r.push(eventSlave.race);
+				}
+				r.push(`ass.`);
+			} else {
+				r.push(`but slowly and hesitantly. When you reach zero you order ${him} to get`);
+				if (hasAllLimbs(eventSlave)) {
+					r.push(`to all fours`);
+				} else {
+					r.push(`on the ground`);
+				}
+				r.push(`and administer a stinging slap across ${his} thieving`);
+				if (V.seeRace === 1) {
+					r.push(eventSlave.race);
+				}
+				r.push(`ass.`);
+			}
+			r.push(`${He} alternates ten seconds of desperate lapping with being beaten across the buttocks until ${he}'s done, by which time ${he} is <span class="trust dec">desperate to obey and avoid further punishment.</span>`);
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function busy() {
+			r = [];
+			r.push(`${He} knows what it means when ${he}'s informed that ${him} meals will now be available in your office only. You not only supervise ${him} intake strictly, but set up a bowl for ${him} on a little stand so the chubby bitch can lap up ${his} food`);
+			if (hasBothArms(eventSlave)) {
+				r.push(`hands-free`);
+			}
+			r.push(`on`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`${his} ${belly} belly,`);
+			} else if (hasAllLimbs(eventSlave)) {
+				r.push(`all fours,`);
+			} else {
+				r.push(`the ground,`);
+			}
+			r.push(`leaving ${him} open for use from behind.`);
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(VCheck.Both(eventSlave, 3, 3));
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 6));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 6));
+			}
+			r.push(`You're careful to avoid associating pleasure with misbehavior by taking ${his} cruelly every time ${he} eats, pinching ${his} nipples, and slapping ${his}`);
+			if (V.seeRace === 1) {
+				r.push(eventSlave.race);
+			}
+			r.push(`ass as you ride ${him}. This is so effective that <span class="trust dec">${he} learns to obey</span> and <span class="orange">loses weight</span> both.`);
+			eventSlave.trust -= 5;
+			eventSlave.weight -= 10;
+			eventSlave.diet = "healthy";
+			return r;
+		}
+
+		function water() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} can drink as much as ${he} wants from them if ${he}'ll tell you the truth. ${He} confesses, and is horrified to find they're full of water, not food. You add casually that ${he} can choose not to 'eat' the contents... but that ${he}'ll get no real food until ${he} finishes every one. Torn between hunger and reluctance, ${he} spends the next hour struggling with so much water that you have to check ${him} for water intoxication. ${He} finishes with`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more bulbous`);
+			} else {
+				r.push(`a bulging`);
+			}
+			r.push(`stomach and a <span class="trust dec">sincere desire to avoid further punishment.</span>`);
+			eventSlave.trust -= 5;
+			return r;
+		}
+
+		function regret() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} is going to eat the contents of every last one; every day, until ${he} regrets being a glutton. ${He} gulps at the sight, but eagerly digs in. As ${his} stomach steadily distends and the cups rapidly empty, you realize you may have made a mistake. ${He} finishes with`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more bulbous`);
+			} else {
+				r.push(`a hugely bulging`);
+			}
+			r.push(`stomach and a <span class="devotion dec">smirk at your so-called punishment.</span>`);
+			eventSlave.devotion -= 5;
+			eventSlave.inflationType = "food";
+			eventSlave.inflationMethod = 1;
+			if (eventSlave.bellyPreg > 0 || eventSlave.bellyImplant > 0) {
+				eventSlave.inflation = 1;
+			} else {
+				eventSlave.inflation = 3;
+			}
+			SetBellySize(eventSlave);
+			return r;
+		}
+
+		function restrict() {
+			r = [];
+			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You tell ${him} that you understand ${his} need to eat, and that for the rest of the week you'll mercifully be allowing ${him} to try a new diet on which ${he} can eat as much as ${he} wants. ${He}'s overjoyed`);
+			if (canHear(eventSlave)) {
+				r.push(`to hear it,`);
+			} else if (canSee(eventSlave)) {
+				r.push(`when ${he} reads it on a nearby screen display,`);
+			} else {
+				r.push(`when ${he} figures it out,`);
+			}
+			r.push(`though this pleasure is replaced with extreme disgust when ${he} learns that ${his} only culinary options are limited to cum. It's just nutritionally augmented enough to prevent starvation. Disgust is defeated by hunger pangs, and ${he} spends most of the week going around with a <span class="devotion inc">preoccupied</span> look on ${his} face and`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`an even more`);
+			} else {
+				r.push(`a slightly`);
+			}
+			r.push(`distended belly. By the end, ${he}'s starting to <span class="fetish gain">salivate</span> at the mere`);
+			if (canSmell(eventSlave)) {
+				r.push(`scent`);
+			} else {
+				r.push(`thought`);
+			}
+			r.push(`of ejaculate.`);
+			eventSlave.devotion += 4;
+			eventSlave.fetish = "cumslut";
+			eventSlave.fetishKnown = 1;
+			eventSlave.fetishStrength = 65;
+			eventSlave.inflation = 1;
+			eventSlave.inflationType = "cum";
+			eventSlave.inflationMethod = 1;
+			SetBellySize(eventSlave);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/extremeAphrodisiacs.js b/src/events/RESS/review/extremeAphrodisiacs.js
new file mode 100644
index 0000000000000000000000000000000000000000..92426a42154a211af93ef4b028e2c80281366386
--- /dev/null
+++ b/src/events/RESS/review/extremeAphrodisiacs.js
@@ -0,0 +1,123 @@
+App.Events.RESSExtremeAphrodisiacs = class RESSExtremeAphrodisiacs 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.aphrodisiacs > 1 || s.inflationType === "aphrodisiac",
+				s => s.rules.speech === "restrictive",
+				s => s.rules.release.master === 1,
+				s => App.Utils.releaseRestricted(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 belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(
+			`As you are retiring for the night,`,
+			contextualIntro(PC, eventSlave, "DOM")
+		);
+		if (!canWalk(eventSlave)) {
+			r.push(`crawls`);
+		} else if (shoeHeelCategory(eventSlave) > 1) {
+			r.push(`totters`);
+		} else if (eventSlave.belly >= 10000) {
+			r.push(`waddles`);
+		} else {
+			r.push(`walks`);
+		}
+		r.push(`into your bedroom. Since ${he} is not allowed to ask questions, ${he} says nothing, but ${his} reason for being here is obvious enough. ${He}'s on a medically reckless dosage of aphrodisiacs, and ${he}'s panting as ${he}`);
+		if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
+			r.push(`kneels`);
+		} else if (shoeHeelCategory(eventSlave) > 1) {
+			r.push(`teeters`);
+		} else {
+			r.push(`stands`);
+		}
+		r.push(`there. ${His} nipples are`);
+		if (eventSlave.nipples !== "fuckable") {
+			r.push(`hard,`);
+		} else {
+			r.push(`swollen shut,`);
+		}
+		r.push(`and there's visible moisture on ${his}`);
+		if (V.seeRace === 1) {
+			r.push(`${eventSlave.race}`);
+		}
+		if (eventSlave.vagina !== -1) {
+			r.push(`pussylips.`);
+		} else if (eventSlave.dick !== 0) {
+			r.push(`dickhead.`);
+		} else {
+			r.push(`tiny little front hole.`);
+		}
+		r.push(`It's also against the rules for ${him} to masturbate, so ${he} clearly decided to come to you rather than break the rules. There's no way ${he}'ll be able to sleep like this.`);
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Take pity and give ${him} relief`, relief),
+			new App.Events.Result(`See how rough you can be and still get ${him} to cum`, rough),
+			new App.Events.Result(`Send ${him} away`, away)
+		]);
+
+		function relief() {
+			eventSlave.devotion += 4;
+			return `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 <span class="devotion inc">tearfully grateful all the same.</span>`;
+		}
+
+		function rough() {
+			const r = new SpacedTextAccumulator();
+			r.push(`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 (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
+				r.push(`kneel`);
+			} else if (shoeHeelCategory(eventSlave) > 1) {
+				r.push(`totter up`);
+			} else {
+				r.push(`stand`);
+			}
+			if (eventSlave.belly >= 5000) {
+				r.push(`${belly} belly`);
+			}
+			r.push(`against a wall and spread ${his} buttocks. A little saliva and`);
+			if (V.PC.vagina !== -1) {
+				r.push(`a bit of your own pussyjuice, transferred by a couple of fingers, and`);
+			}
+			if (V.PC.dick === 0) {
+				r.push(`your vibrating strap-on`);
+			} else {
+				r.push(`your dick`);
+			}
+			r.push(`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 (eventSlave.belly >= 5000) {
+				r.push(`lies on ${his} side`);
+			} else {
+				r.push(`lies on ${his} stomach`);
+			}
+			r.push(`every chance ${he} gets. ${His} submissiveness <span class="devotion inc">has increased.</span>`);
+			eventSlave.devotion += 4;
+			r.toParagraph();
+			return r.container();
+		}
+
+		function away() {
+			eventSlave.devotion -= 5;
+			return `${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 <span class="devotion dec">has decreased.</span>`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/fearfulBalls.js b/src/events/RESS/review/fearfulBalls.js
new file mode 100644
index 0000000000000000000000000000000000000000..e149f68c0a2e57ad7b05c131a5ba72e441050d48
--- /dev/null
+++ b/src/events/RESS/review/fearfulBalls.js
@@ -0,0 +1,145 @@
+App.Events.RESSFearfulBalls = class RESSFearfulBalls extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seeExtreme === 1
+		]; // 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.balls > 1,
+				s => s.scrotum > 0,
+				s => s.devotion <= 20,
+				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, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const hands = (hasBothArms(eventSlave)) ? `hands` : `hand`;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`is still having obedience problems, particularly with ${his} proper role as a`,
+		);
+		if (girl === "girl") {
+			r.push(`female`);
+		}
+		r.push(`receptacle for cock. Though they're an almost too-obvious explanation, it's hard to avoid ${his} retention of ${his} gonads as a possible explanation for ${his} behavioral issues. They certainly contribute to ${his} less than perfectly feminine hormonal balance.`);
+		r.toParagraph();
+
+		r.push(`It's time for ${his} routine inspection, and ${he}'s standing before you, nude. ${He} certainly doesn't find ${his} sexually vulnerable position arousing; ${he}'s totally flaccid. The physical manifestations of ${his} disobedience are right in front of you, and quite defenseless.`);
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Threaten ${him} with castration`, threaten),
+			new App.Events.Result(`Force obedience using pain`, pain),
+			new App.Events.Result(`Geld ${him} gradually`, geld),
+		]);
+
+		function threaten() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You open a drawer of your desk and extract a razor-sharp ceramic-bladed knife.`);
+			if (canSee(eventSlave)) {
+				r.push(`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 {
+				r.push(`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`);
+			}
+			r.push(`until ${he} gets your meaning, and then collapses to the ground, almost wetting ${himself}.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} frantically uses ${his} ${hands} to promise you perfect obedience if you'll only spare ${him} from emasculation.`);
+			} else {
+				r.push(`${He} begs through tears, "Please no,`);
+				if (eventSlave.rudeTitle === 1) {
+					r.push(PoliteRudeTitle(eventSlave));
+				} else {
+					r.push(Master);
+				}
+				r.addToLast(Spoken(eventSlave, `! Please let me keep them! Please!"`));
+			}
+			r.push(`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 <span class="trust dec">promises of good behavior.</span>`);
+			eventSlave.trust -= 5;
+			r.toParagraph();
+			return r.container();
+		}
+
+		function pain() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You shove ${his} unresisting`);
+			if (eventSlave.belly >= 5000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				} else {
+					r.push(`swollen`);
+				}
+			}
+			r.push(`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 (V.PC.dick === 0) {
+				r.push(`pussy and desperately starts to perform cunnilingus; after a while you get bored and ride ${his} face. You finally climax`);
+			} else {
+				r.push(`dick and starts to desperately suck you off`);
+				if (V.PC.vagina !== -1) {
+					r.push(`and eat you out`);
+				}
+				r.push(`you let ${him} work for a while before getting bored and adding painful slaps to ${his} cheeks. You blow your load down ${his} throat`);
+			}
+			r.push(`and then stand,`);
+			if (canSee(eventSlave)) {
+				r.push(`brandishing the knife.`);
+			} else {
+				r.push(`swishing the knife through the air.`);
+			}
+			if (canSee(eventSlave)) {
+				r.push(`${His} eyes are huge`);
+			} else {
+				r.push(`${He} grimaces`);
+			}
+			r.push(`with terror, but ${he} holds still. ${His} private parts have gone so numb that ${he} has to`);
+			if (canSee(eventSlave)) {
+				r.push(`look down`);
+			} else {
+				r.push(`run ${his} hand across ${his} scrotum`);
+			}
+			r.push(`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 <span class="trust dec">stay out of trouble.</span>`);
+			eventSlave.trust -= 5;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			r.toParagraph();
+			return r.container();
+		}
+
+		function geld() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You shove ${his} unresisting`);
+			if (eventSlave.belly >= 5000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				} else {
+					r.push(`swollen`);
+				}
+			}
+			r.push(`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(V.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} <span class="health dec">slightly injured,</span> <span class="orange">gelded,</span> <span class="flaw gain">thoroughly traumatized,</span> and <span class="trust dec">willing to do anything</span> to avoid any more pain.`);
+			eventSlave.behavioralFlaw = "odd";
+			eventSlave.trust -= 20;
+			eventSlave.balls = 0;
+			eventSlave.scrotum = 0;
+			surgeryDamage(eventSlave, 10);
+			r.toParagraph();
+			return r.container();
+		}
+	}
+};
diff --git a/src/events/RESS/review/hatesOral.js b/src/events/RESS/review/hatesOral.js
new file mode 100644
index 0000000000000000000000000000000000000000..509762cc3533e3742cc80ba4b66f4a0e60caf594
--- /dev/null
+++ b/src/events/RESS/review/hatesOral.js
@@ -0,0 +1,326 @@
+App.Events.RESSHatesOral = class RESSHatesOral extends App.Events.BaseEvent { // Written by anon, coded by Boney M
+	eventPrerequisites() {
+		return [
+			() => V.PC.dick !== 0,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.devotion <= 50,
+				s => s.sexualFlaw === "hates oral",
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. ${He}'s`
+		);
+		if (canSee(eventSlave)) {
+			r.push(`seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves.`);
+		} else if (canHear(eventSlave)) {
+			r.push(`heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more.`);
+		} else {
+			r.push(`felt seminal fluid on ${his} skin and on ${his} lips, always coercively or accidentally.`);
+		}
+		r.push(`It's clear from ${eventSlave.slaveName}'s recent reactions to these acts that ${he}'s quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for ${him} to overcome or a weakness you can exploit.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Let ${him} earn a break for ${his} throat`, earn),
+			new App.Events.Result(`Try to brute-force ${his} oral resistance with a public blowbang`, brute),
+			new App.Events.Result(`Teach ${him} to see cum as a reward`, teach),
+			(eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.belly < 1500 && eventSlave.weight < 130) /* won't work if too pregnant */
+				? new App.Events.Result(`Make ${him} eat ${his} own cum`, own)
+				: new App.Events.Result(),
+		]);
+
+		function earn() {
+			r = [];
+			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to suck dick.`);
+			if (!canTalk(eventSlave) && hasAnyArms(eventSlave)) {
+				r.push(`${He} frantically begs with gestures, pleading`);
+				if (hasBothLegs(eventSlave)) {
+					r.push(`on ${his} knees.`);
+				} else {
+					r.push(`desperately.`);
+				}
+			} else if (!canTalk(eventSlave)) {
+				r.push(`${He} frantically mouths pleas that you leave ${his} throat cock-free.`);
+			} else {
+				r.push(`${He} begs, "Please no, ${Master}, please don't rape my mouth, ${Master}!"`);
+			}
+			r.push(`You make a show of considering, and then tell ${him} that if ${he}'s extra obedient, you might let ${him} earn a break for ${his} throat — for now.`);
+			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
+				r.push(`You tell ${him} to lie back and spread ${his} legs, because you're going to give ${him} a good old fashioned missionary-position pounding. ${He} does so with unusual obedience,`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`${his} legs hanging off the couch to give you a better angle with ${his} ${belly}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`belly`);
+					}
+					r.push(`in the way,`);
+				}
+				r.push(`and as you're giving ${him} a thorough pounding, whether out of relief, gratitude, or a desire to put on a good performance, ${he} certainly seems to be enjoying it more than usual.`);
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
+				r.push(`You tell ${him} to bend over and spread ${his} ass for you, because if ${he} doesn't want you going in one end you're going to go in the other. ${He} does so with unusual obedience, and as you`);
+				if (eventSlave.anus === 1) {
+					r.push(`gently but firmly pound ${his} still-tight ass`);
+				} else if (eventSlave.anus === 2) {
+					r.push(`pound away at ${his} well-used backdoor`);
+				} else {
+					r.push(`mercilessly jackhammer ${his} gaping hole`);
+				}
+				r.push(`${he} actively tries to match the rhythm of your thrusts.`);
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(`You tell ${him} that if ${he}'s going to hesitate to use ${his} mouth when`);
+				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+					r.push(`${he} has no other hole to amuse you`);
+				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`${his} only available hole is still virgin`);
+				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`all ${his} other holes are still virgin`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`${his} girly little butthole is still virgin`);
+				}
+				r.push(`${he}'s going to have to find an amazingly thorough way to please a dick if ${he}'s going to earn ${his} throat a reprieve. ${He} looks`);
+				if (eventSlave.intelligence+eventSlave.intelligenceImplant < -15) {
+					r.push(`uncharacteristically`);
+				}
+				r.push(`thoughtful for a moment before bending over before you, spitting in ${his} hand`);
+				if (eventSlave.vagina === 0) {
+					r.push(`and thoroughly coating ${his} inner thighs with ${his} saliva.`);
+				} else {
+					r.push(`and thoroughly coating the`);
+					if (eventSlave.butt <= 2) {
+						r.push(`crack of ${his} slender`);
+					} else if (eventSlave.butt <= 4) {
+						r.push(`crack of ${his} curvy`);
+					} else if (eventSlave.butt <= 8) {
+						r.push(`crack of ${his} huge`);
+					} else if (eventSlave.butt <= 12) {
+						r.push(`crevice of ${his} expansive`);
+					} else if (eventSlave.butt <= 20) {
+						r.push(`ravine of ${his} endless`);
+					}
+					r.push(`ass.`);
+				}
+				r.push(`The invitation is obvious, but just to be sure ${he} pleads with you to satisfy yourself alongside ${his}`);
+				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
+					r.push(`chastity. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as pilfering an off-limits hole,`);
+					if (eventSlave.vagina > -1) {
+						r.push(`before long ${his}`);
+						if (eventSlave.vagina === 0) {
+							r.push(`virgin`);
+						}
+						r.push(`cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
+					} else {
+						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts slam against ${his} anal chastity is thoroughly entertaining.`);
+					}
+					r.push(`Before long, you plaster ${his} belt with your cum.`);
+				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
+					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts. Before long, you plaster ${his} still-virgin hole with your cum.`);
+				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+					r.push(`virgin holes. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole,`);
+					if (eventSlave.vagina === 0) {
+						r.push(`before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
+					} else {
+						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining.`);
+					}
+					r.push(`Before long, you plaster ${his} still-virgin hole with your cum.`);
+				} else if (eventSlave.anus === 0) {
+					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, ${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining. Before long, you plaster ${his} still-virgin hole with your cum.`);
+				}
+			}
+			r.push(`When you're done, you bend down and whisper in ${his} ear that if ${he} shows any sign of rebelliousness, you'll give every dick in ${V.arcologies[0].name} free access to ${his} throat. <span class="devotion inc">${He} has become more obedient,</span> in the hope this will persuade you to not follow through on your threat.`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function brute() {
+			r = [];
+			r.push(`Simple problems require simple solutions — ${he}'ll get fucked in the mouth until ${he} either gets over ${his} hang-ups about oral or learns to hide them. You drag the protesting ${eventSlave.slaveName} out in public, chain ${him} low so that ${his} mouth is available, and tell ${him} that ${he}'ll suck dicks until ${he} gets through five in a row without grimacing, gagging, or resisting. You have a comfortable chair brought out to you and settle in to watch the show.`);
+			r.push(`${eventSlave.slaveName} tries, ${he} really does. But when word gets out as to the conditions of ${his} enslavement, ${his} users take a perverse enjoyment in being rougher than usual to evoke the exact reactions ${he}'s trying to avoid. By the third failed streak, you've started to grow bored of the spectacle, but luckily you find entertainment in conversation with those who have already been entertained by poor ${eventSlave.slaveName}. Before long more chairs have been brought up and an impromptu salon has been set up alongside the blowbang line. By the sixth failed streak, an enterprising citizen has set up a small bar and is serving drinks. By the ninth, you've delegated watching ${eventSlave.slaveName} to your assistant. You personally break the eleventh streak after ${he} reached four, to general acclaim from your newfound friends and a toast to your virility.`);
+			r.push(`When the fourteenth streak is finally successful, there are serious talks about making these blowbang salons a regular occurrence and some backslapping directed towards you for your innovation in genteel hedonism. While you seriously doubt ${eventSlave.slaveName} enjoys oral sex any more than ${he} did at the start of the day, ${he}'s certainly <span class="skill inc">learned to keep ${his} feelings on the matter to ${himself}.</span> ${He} did, however, <span class="health dec">have quite a rough time</span>`);
+			if (eventSlave.skill.oral <= 30) {
+				r.push(`of it, though ${he} did learn a thing or two about sucking dick.`);
+				slaveSkillIncrease('oral', eventSlave, 10);
+			} else {
+				r.push(`of it.`);
+			}
+			r.push(`And last of all, you and ${eventSlave.slaveName} did make <span class="reputation inc">quite a good impression</span> today, though for widely differing reasons.`);
+			eventSlave.sexualFlaw = "none";
+			seX(eventSlave, "oral", "public", "penetrative", random(65, 80));
+			repX(500, "event", eventSlave);
+			healthDamage(eventSlave, 10);
+			return r;
+		}
+
+		function teach() {
+			r = [];
+			r.push(`You bring ${eventSlave.slaveName} into your office and stand ${him} in front of your leather couch. ${He}`);
+			if (canSee(eventSlave)) {
+				r.push(`eyes you`);
+			} else if (canHear(eventSlave)) {
+				r.push(`listens`);
+			} else {
+				r.push(`waits silently and`);
+			}
+			if (eventSlave.devotion < -20) {
+				r.push(`suspiciously`);
+			} else {
+				r.push(`worriedly`);
+			}
+			r.push(`as you ready a bullet vibrator.`);
+			if (eventSlave.dick > 0) {
+				r.push(`You secure the bullet to ${eventSlave.slaveName}'s frenulum.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`You secure the bullet to ${his} perineum.`);
+			} else {
+				r.push(`You secure the bullet to ${eventSlave.slaveName}'s clit.`);
+			}
+			r.push(`You explain that the arcology continually monitors your vital signs, and will use them to estimate your arousal; the system controls the bullet vibrator, which will emit stimulating vibrations scaled to your pleasure. The more pleasure you feel, the more pleasant the vibrations will be, though they will not bring ${him} to orgasm until you climax. To demonstrate, you give the head of your cock a quick squeeze. ${eventSlave.slaveName} squeals in surprise at the sudden stimulation as the bullets spring to life. You tell ${him} to get to work. Though timid at first, as ${he} proceeds to blow you, ${he} becomes more and more enthusiastic as ${his} own pleasure builds. It isn't long until ${he}'s deepthroating you enthusiastically and begging you to cum in ${his} mouth. You make ${him} hold out a bit longer, and then you complete the training session,`);
+			if (PC.balls >= 30) {
+				r.push(`pumping cum into ${his} stomach until it visibly begins to swell.`);
+			} else if (PC.balls >= 14) {
+				r.push(`pumping cum into ${his} stomach until it threatens to come back up.`);
+			} else if (PC.balls >= 9) {
+				r.push(`cumming into ${his} mouth until it spurts from ${his} nose.`);
+			} else {
+				r.push(`filling ${his} mouth with your cum.`);
+			}
+			r.push(`${He} climaxes in turn, and virtually melts into a quivering mess on your floor.`);
+			if (eventSlave.dick > 0) {
+				r.push(`${eventSlave.slaveName}'s cock oozes cum from ${his} intense orgasm, and you command ${him} to clean it off the floor before ${he} gets back to ${his} duties.`);
+			}
+			if (random(1, 4) === 4) {
+				r.push(`<span class="fatish gain">You've successfully linked cum and pleasure in ${his} mind,</span> guaranteeing ${him} a confusing few days as ${he} tries to reconcile this with ${his} hatred of oral sex.`);
+				eventSlave.fetish = "cumslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 10;
+			} else {
+				r.push(`This has <span class="flaw break">broken ${him} of ${his} bad habits.</span>`);
+				eventSlave.sexualFlaw = "none";
+			}
+			r.push(`This demonstration of your control over ${him} has <span class="devotion inc">worn down ${his} resistance to your commands.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			return r;
+		}
+
+		function own() {
+			r = [];
+			r.push(`Your cum training tactics have two components: Cum should be linked with pleasure, and cum should not be disgusting to ${eventSlave.slaveName}, because even ${eventSlave.slaveName} produces it. To drive home these lessons, you lead ${eventSlave.slaveName} to your office's leather couch, arranging ${his}`);
+			if (eventSlave.height < 150) {
+				r.push(`petite`);
+			} else if (eventSlave.height < 160) {
+				r.push(`short`);
+			} else if (eventSlave.height >= 170) {
+				r.push(`tall`);
+			} else if (eventSlave.height >= 185) {
+				r.push(`very tall`);
+			}
+			r.push(`form upside down with ${his} head on the cushion, ${his} back on the backrest, and ${his}`);
+			if (hasBothLegs(eventSlave)) {
+				r.push(`legs`);
+			} else {
+				r.push(`ass`);
+			}
+			r.push(`in the air. In this position, ${his}`);
+			if (eventSlave.dick > 10) {
+				r.push(`obscene`);
+			} else if (eventSlave.dick > 9) {
+				r.push(`inhuman`);
+			} else if (eventSlave.dick > 8) {
+				r.push(`monstrous`);
+			} else if (eventSlave.dick > 7) {
+				r.push(`imposing`);
+			} else if (eventSlave.dick > 6) {
+				r.push(`massive`);
+			} else if (eventSlave.dick > 5) {
+				r.push(`gigantic`);
+			} else if (eventSlave.dick > 4) {
+				r.push(`huge`);
+			} else if (eventSlave.dick > 3) {
+				r.push(`large`);
+			} else if (eventSlave.dick > 2) {
+				r.push(`average`);
+			} else if (eventSlave.dick > 1) {
+				r.push(`small`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`tiny`);
+			}
+			r.push(`cock`);
+			if (eventSlave.belly >= 100 || eventSlave.weight > 30) {
+				r.push(`rests over ${his}`);
+				if (eventSlave.pregKnown === 1) {
+					r.push(`early pregnancy`);
+				} else {
+					r.push(`belly`);
+				}
+				r.push(`and`);
+			}
+			r.push(`hangs directly over ${his} anxious face.`);
+			if ((eventSlave.aphrodisiacs > 0) || eventSlave.inflationType === "aphrodisiac") {
+				r.push(`The aphrodisiacs in ${his} system already have ${him} so aroused ${he}'s already dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
+			} else if (eventSlave.prostate > 1) {
+				r.push(`${His} overactive prostate has ${him} steadily dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
+			} else {
+				r.push(`You sit next to ${his} vulnerable form on the couch as ${he} looks at you in anticipation.`);
+			}
+			r.push(`You`);
+			if (canDoAnal(eventSlave)) {
+				if (eventSlave.anus > 2) {
+					r.push(`insert a wide vibrating plug into ${his} gaping anus,`);
+				} else if (eventSlave.anus > 1) {
+					r.push(`insert a big vibrating plug into ${his} ass,`);
+				} else if (eventSlave.anus > 0) {
+					r.push(`insert a vibrating plug into ${his} tight ass,`);
+				} else {
+					r.push(`place a bullet vibrator over the pucker of ${his} virgin anus,`);
+				}
+			} else {
+				r.push(`strap a strong vibrator to ${his} anal chastity,`);
+			}
+			r.push(`secure a bullet vibrator ${his} quivering perineum, and another to the base of ${his} dick, and set them all to gradually increase the strength of their vibrations. In no time at all ${he} releases a`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`squirt of ejaculate from ${his} cock cage,`);
+			} else if (eventSlave.balls > 0) {
+				r.push(`torrent of thick, white semen,`);
+			} else if (eventSlave.prostate > 2) {
+				r.push(`torrent of nearly clear, watery ejaculate,`);
+			} else if (eventSlave.prostate === 0) {
+				r.push(`pathetic dribble of semen,`);
+			} else {
+				r.push(`pathetic dribble of watery ejaculate,`);
+			}
+			r.push(`all of which lands right on ${his} outstretched tongue and pools in ${his} throat. You nudge ${his} chin to make ${him} close ${his} mouth and swallow. After a week of such treatment, ${he} <span class="fetish gain">acquires a taste for semen.</span>`);
+			eventSlave.fetish = "cumslut";
+			eventSlave.fetishKnown = 1;
+			eventSlave.fetishStrength = 10;
+			eventSlave.devotion += 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hugeNaturals.js b/src/events/RESS/review/hugeNaturals.js
new file mode 100644
index 0000000000000000000000000000000000000000..f60aa4e2bcabd8a54ebcf4c4e4ee50dabdc8ce82
--- /dev/null
+++ b/src/events/RESS/review/hugeNaturals.js
@@ -0,0 +1,275 @@
+App.Events.RESSHugeNaturals = class RESSHugeNaturals extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.boobs >= 2000,
+				s => s.assignment !== Job.QUARTER,
+				s => s.boobsImplant === 0,
+				s => s.nipples !== "tiny" && s.nipples !== "fuckable",
+				s => s.devotion > 20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`comes before you naked for a routine inspection. You take particular care to examine ${his} massive breasts, since they've grown so large it's necessary to check for unsightly veins, stretch marks, and the like. You note ${his} big nipples with appreciation. Since ${his} breasts are so enormous and completely free of implants, they're quite heavy. When ${he} stands,`
+		);
+		if (eventSlave.boobShape === "saggy" || eventSlave.boobShape === "downward-facing") {
+			r.push(`${his} nipples face out and down.`);
+		} else {
+			r.push(`gravity causes them to hang low.`);
+		}
+		r.push(`As you inspect ${him} with your hands, ${he}`);
+		if (!canTalk(eventSlave)) {
+			r.push(`breathes a little harder and looks like ${he} would speak, were ${he} not mute.`);
+		} else {
+			if (eventSlave.lips > 70) {
+				r.push(`murmurs through ${his} huge lips,`);
+			} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+				r.push(`murmurs through ${his} piercings,`);
+			} else {
+				r.push(`murmurs,`);
+			}
+			r.push(Spoken(eventSlave, `"That feels really nice, ${Master}."`));
+		}
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Give ${him} a nice massage`, massage),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave) && eventSlave.belly < 100000)
+				? new App.Events.Result(`Use ${him} so they swing around`, swing, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Show ${him} off in public`, show, virginityWarning())
+				: new App.Events.Result()
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && eventSlave.anus === 0) {
+				return `This option will take ${his} anal virginity`;
+			}
+			return null;
+		}
+
+		function massage() {
+			r = [];
+			r.push(`You sit on the couch next to your desk and pat your thighs. ${He} smiles and comes over, lowering ${himself}`);
+			if (V.PC.belly >= 10000) {
+				r.push(`beside you and cozying up to your pregnant belly and sliding a hand down to see to your pussy without hesitation. You help ${him} get comfortable and instead of demanding ${he} please you or get down on all fours, you just sit there with ${him},`);
+			} else if (V.PC.dick === 0) {
+				r.push(`into your lap without hesitation. You help ${him} get comfortable and instead of`);
+				if (V.PC.dick === 0) {
+					r.push(`grinding`);
+				} else {
+					r.push(`thrusting`);
+				}
+				r.push(`or telling ${him} to ride, you just sit there with ${him} in your lap,`);
+			} else {
+				r.push(`onto your member`);
+				if (V.PC.vagina !== -1) {
+					r.push(`and sliding a hand down to see to your pussy`);
+				}
+				r.push(`without hesitation. You help ${him} get comfortable and instead of`);
+				if (V.PC.dick === 0) {
+					r.push(`grinding`);
+				} else {
+					r.push(`thrusting`);
+				}
+				r.push(`or telling ${him} to ride, you just sit there with ${him} in your lap,`);
+			}
+			r.push(`gently massaging ${his} massive tits. They get sore from swinging around as ${he} moves, works, and fucks, and soon ${he}'s groaning with pleasure at the attention. You finally manage to bring ${him} to orgasm with almost nothing but delicate stimulation of ${his} nipples. <span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			seX(eventSlave, "mammary", V.PC, "penetrative");
+			if (eventSlave.lactation > 0) {
+				eventSlave.lactationDuration = 2;
+				eventSlave.boobs -= eventSlave.boobsMilk;
+				eventSlave.boobsMilk = 0;
+			} else {
+				r.push(induceLactation(eventSlave, 3));
+			}
+			return r;
+		}
+
+		function swing() {
+			r = [];
+			r.push(`You tell ${him} to kneel on the smooth floor. ${He} knows this means doggy style, so ${he} compliantly arches ${his} back and cocks ${his} hips to offer ${himself} to you. You`);
+			if (V.PC.dick === 0) {
+				r.push(`don a strap-on and`);
+			}
+			r.push(`enter`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`${his} pussy`);
+			} else {
+				r.push(`${his} ass`);
+			}
+			r.push(`without preamble and seize ${his} hips. ${He} braces ${himself}, knowing what's coming, but soon ${he} discovers a new disadvantage to ${his} pendulous breasts: as you pound ${him} hard, ${his} long nipples frequently brush against the floor, causing ${him} to wince and buck.`);
+			if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
+				if (canAchieveErection(eventSlave)) {
+					r.push(`${His} cock doesn't help, either, flopping around half-erect as ${he} vacillates between pain and arousal.`);
+				} else if (eventSlave.dick > 20) {
+					r.push(`${His} cock doesn't help, either, flopping around on the floor as ${he} vacillates between pain and arousal.`);
+				} else {
+					r.push(`${His} cock doesn't help, either, flopping around feebly as ${he} vacillates between pain and arousal.`);
+				}
+			} else if (eventSlave.clit > 2) {
+				r.push(`${His} huge clit doesn't help, either, flopping around half-erect as ${he} vacillates between pain and arousal.`);
+			}
+			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`When you switch to ${his} ass, the shallower strokes give ${his} nipples a bit of respite.`);
+			}
+			r.push(`You finish with a particularly hard thrust`);
+			if (V.PC.dick === 0) {
+				r.push(`and shake with climax,`);
+			} else {
+				r.push(`to spill your seed deep inside ${his}`);
+				if (canDoAnal(eventSlave)) {
+					r.push(`butt, ramming forward hard enough to spill ${him} down onto ${his} bosom. As you rise, ${his} discomfited form is a pretty sight, with ${his} breasts squashed against the floor and ${his} well fucked butt lewdly relaxed.`);
+				} else {
+					r.push(`pussy, ramming forward hard enough to spill ${him} down onto ${his} bosom. As you rise, ${his} discomfited form is a pretty sight, with ${his} breasts squashed against the floor and ${his} well fucked cunt lewdly gaped.`);
+				}
+			}
+			r.push(`<span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			r.push(VCheck.Both(eventSlave, 1));
+			return r;
+		}
+
+		function show() {
+			r = [];
+			r.push(`You bring ${him} out onto the promenade, still nude, ${his} huge bare udders attracting open stares as ${his} every movement sets them in motion.`);
+			if (eventSlave.sexualFlaw === "attention whore") {
+				r.push(`The slut loves being the center of attention and couldn't ask for more.`);
+			} else if (eventSlave.fetishKnown === 1 && eventSlave.fetishStrength > 60 && eventSlave.fetish === "humiliation") {
+				r.push(`The slut loves being embarrassed, and ${he} blushes furiously as ${his} nipples stiffen with arousal.`);
+			} else if (eventSlave.energy > 95) {
+				r.push(`The nympho slut loves being shown off, and ${he} flaunts ${his} boobs shamelessly.`);
+			} else if (eventSlave.counter.anal > 100 && eventSlave.counter.oral > 100) {
+				r.push(`${He}'s such a veteran sex slave that ${he} takes the stares in stride.`);
+			} else {
+				r.push(`${He} blushes a little, but tips ${his} chin up and follows you obediently.`);
+			}
+			r.push(`When you reach a good spot, you grab ${his}`);
+			if (eventSlave.weight > 30) {
+				r.push(`fat ass`);
+			} else if (eventSlave.weight > 10) {
+				r.push(`plush hips`);
+			} else if (eventSlave.weight >= -10) {
+				r.push(`trim hips`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big butt`);
+			} else {
+				r.push(`skinny ass`);
+			}
+			r.push(`and`);
+			if (eventSlave.height >= 185) {
+				r.push(`pull ${his} tall body in`);
+			} else if (eventSlave.height >= 160) {
+				r.push(`pull ${him} up on tiptoe`);
+			} else {
+				r.push(`push ${his} petite form up onto a railing`);
+			}
+			r.push(`for standing sex. ${He} cocks ${his} hips and takes your`);
+			if (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`cock`);
+			}
+			r.push(`compliantly, and after a few thrusts you reach down, seize ${him} behind each knee, and`);
+			if (V.PC.belly >= 5000 && eventSlave.belly >= 100000) {
+				r.push(`collapse against a nearby bunch under the excessive weight between your pregnancy and ${his} ${belly} stomach. Appreciating the bench's sacrifice, you return to fucking ${him}.`);
+				if (eventSlave.bellyPreg >= 600000) {
+					r.push(`Penetrating ${him} while feeling so much movement between you is unbelievably lewd. ${His} children squirm at their mother's excitement, causing ${his} bloated body to rub against you in ways you couldn't imagine.`);
+				}
+			} else if (eventSlave.belly >= 100000) {
+				r.push(`pull ${him} as close as you can with ${his} ${belly} belly between you. Struggling to support the immense weight, you back ${him} against a rail so that you can continue to fuck ${him} while holding ${him}.`);
+				if (eventSlave.bellyPreg >= 600000) {
+					r.push(`Penetrating ${him} while feeling so much movement between you is unbelievably lewd. ${His} children squirm at their mother's excitement, causing ${his} bloated body to rub against you in ways you couldn't imagine.`);
+				}
+			} else {
+				r.push(`hoist ${his} legs up so ${he}'s pinned against your`);
+				if (V.PC.belly >= 1500) {
+					r.push(`pregnancy,`);
+				} else if (V.PC.boobs < 300) {
+					r.push(`chest,`);
+				} else {
+					r.push(`boobs,`);
+				}
+				r.push(`helpless to do anything but let you hold ${him} in midair and fuck ${him}.`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina > 1) {
+					r.push(`${His} pussy can take a hard pounding, so you give it to ${him}.`);
+				} else {
+					r.push(`${His} poor tight pussy can barely take the pounding you're administering.`);
+				}
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				if (eventSlave.anus > 1) {
+					r.push(`${His} loose butthole can take a hard pounding, so you give it to ${him}.`);
+				} else {
+					r.push(`${His} poor tight butthole can barely take the pounding you're administering.`);
+				}
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`${He} loses all composure, gasping and panting as the massive weight of ${his} chest bounces up and down, making an audible clap with each stroke as ${his} huge tits slap painfully together. Despite this, or perhaps partly because of it, ${he} begins to orgasm,`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`the discomfort of being half-hard under ${his} chastity cage making ${him} squirm as cum rushes out of the hole at its tip.`);
+			} else if (canAchieveErection(eventSlave)) {
+				if (eventSlave.dick > 4) {
+					r.push(`${his} monster of a cock releasing a jet of cum with each thrust into ${him}.`);
+				} else if (eventSlave.dick > 3) {
+					r.push(`${his} huge cock releasing a jet of cum with each thrust into ${him}.`);
+				} else if (eventSlave.dick > 2) {
+					r.push(`${his} cock releasing a spurt of cum with each thrust into ${him}.`);
+				} else {
+					r.push(`${his} tiny dick spurting cum with each thrust into ${him}.`);
+				}
+			} else if (eventSlave.dick > 9) {
+				r.push(`${his} huge, soft cock spurting cum as it wiggles to your motions.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`${his} soft cock scattering cum all over the place as it flops around.`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(`${his}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly adding to ${his} near-total discomfiture.`);
+			} else if (eventSlave.weight > 95) {
+				r.push(`${his} soft body jiggling as ${he} climaxes.`);
+			} else if (eventSlave.muscles > 5) {
+				r.push(`${his} abs convulsing deliciously as ${he} climaxes.`);
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(`${his} pussy tightening.`);
+			} else {
+				r.push(`${his} poor anal ring tightening.`);
+			}
+			r.push(`The crowd that surrounds you during this noisy spectacle <span class="reputation inc">is suitably impressed.</span>`);
+			repX(1250, "event", eventSlave);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/hugelyPregnant.js b/src/events/RESS/review/hugelyPregnant.js
new file mode 100644
index 0000000000000000000000000000000000000000..db88d6cd3986e72f3cb06d1acbe9112f188baf05
--- /dev/null
+++ b/src/events/RESS/review/hugelyPregnant.js
@@ -0,0 +1,267 @@
+App.Events.RESSHugelyPregnant = class RESSHugelyPregnant extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.seePreg !== 0,
+		]; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.bellyPreg >= 10000,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let r = [];
+		r.push(
+			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(eventSlave), "'s"),
+			`daily routine includes frequent application of special skin care to ${his} ${eventSlave.skin}, hugely swollen belly to prevent ${his} pregnancy from ruining ${his} appearance with unsightly stretch marks. Several times a day, ${he} visits the bathroom to`
+		);
+		if (!hasAnyArms(eventSlave)) {
+			r.push(`have another slave`);
+		} else {
+			r.push(`carefully`);
+		}
+		r.push(`coat ${his} entire ${belly} stomach in the stuff. ${He}'s so pregnant that it's hard to reach`);
+		if (eventSlave.belly >= 150000) {
+			r.push(`most of its mass.`);
+		} else {
+			r.push(`the underside.`);
+		}
+		r.push(`The chore keeps ${him} occupied and stationary for quite a while; there's no need to leave ${him} sexually idle while ${he} completes it.`);
+
+		App.Events.addParagraph(node, r);
+
+		let choices = [new App.Events.Result(`Help ${him} with those hard to reach places`, reach)];
+		if ((canDoAnal(eventSlave) && eventSlave.mpreg === 1) || canDoVaginal(eventSlave)) {
+			choices.push(new App.Events.Result(`Gently fuck ${him} while helping ${him} apply lotion`, lotion, virginityWarning()));
+		}
+		if (canDoAnal(eventSlave)) {
+			choices.push(new App.Events.Result(`${His} backdoor can't get more pregnant`, backdoor, virginityWarning(true)));
+		} else {
+			choices.push(new App.Events.Result(`${His} backdoor isn't pregnant`, unPregnant, virginityWarning(true)));
+		}
+		if ((canDoAnal(eventSlave) && eventSlave.mpreg === 1) || canDoVaginal(eventSlave) && eventSlave.belly >= 300000) {
+			choices.push(new App.Events.Result(`Tip ${him} over and fuck ${him}`, tip, virginityWarning()));
+		}
+		App.Events.addResponses(node, choices);
+
+		function virginityWarning(anusOnly = false) {
+			if (anusOnly) {
+				if (eventSlave.anus === 0) {
+					return `This option will take ${his} virginity`;
+				}
+			}
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0) && eventSlave.mpreg === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function reach() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you gently encircle ${him} from behind with a hug`);
+			if (V.PC.belly >= 5000) {
+				r.push(r.pop() + `, pushing your own gravid belly into the small of ${his} back`);
+			}
+			r.push(r.pop() + `. When you take the lotion and begin to lovingly massage it into ${his} harder to reach areas, ${he} sighs with pleasure and leans against you.`);
+			if (hasAnyArms(eventSlave) && V.PC.belly >= 1500) {
+				r.push(`${He} takes the lotion and begins to return the favor. You spend the rest of ${his} break carefully massaging each other's baby bumps.`);
+			}
+			if (!canTalk(eventSlave)) {
+				if (eventSlave.voice === 0) {
+					r.push(`${He} looks like ${he} would love to thank you, were ${he} not mute.`);
+				} else if (eventSlave.accent >= 3) {
+					r.push(`${He} looks like ${he} would love to thank you, if ${he} knew how.`);
+				}
+			} else {
+				if (eventSlave.lips > 70) {
+					r.push(`${He} murmurs through ${his} huge lips,`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`${He} murmurs through ${his} piercings,`);
+				} else {
+					r.push(`${He} murmurs,`);
+				}
+				r.push(Spoken(eventSlave, `"That felt really nice, ${Master}."`));
+				if (V.PC.belly >= 1500) {
+					r.push(`You have to agree, it did feel nice on your growing middle.`);
+				}
+			}
+			r.push(`<span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function lotion() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you gently encircle ${him} from behind with a hug`);
+			if (V.PC.belly >= 5000) {
+				r.push(r.pop() + `, pushing your own gravid belly into the small of ${his} back`);
+			}
+			r.push(r.pop() + `. When you take the lotion and begin to lovingly massage it into ${his} harder to reach areas, ${he} sighs with pleasure and leans back into you. ${He} feels`);
+			if (V.PC.dick === 0) {
+				r.push(`the warmth of your growing arousal`);
+			} else {
+				r.push(`your erection hard`);
+			}
+			r.push(`against ${him}, so ${he}`);
+			if (isAmputee(eventSlave)) {
+				r.push(`wriggles ${his} limbless form around on the floor so as to offer ${himself} to you.`);
+			} else {
+				r.push(`slowly kneels down with you into a comfortable lotus position on the bathroom floor.`);
+			}
+			if (eventSlave.mpreg === 1) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			r.push(`Coupling like this, you can't`);
+			if (V.PC.dick === 0) {
+				r.push(`scissor`);
+			} else {
+				r.push(`fuck`);
+			}
+			r.push(`${him} all that hard, but that's just fine given`);
+			if (V.PC.preg >= 5000) {
+				r.push(`your condition.`);
+			} else {
+				r.push(`${his} condition.`);
+			}
+			r.push(`${He} snuggles back into you as you have gentle sex while looking after ${his} drum-taut skin.`);
+			if (!canTalk(eventSlave)) {
+				if (eventSlave.voice === 0) {
+					r.push(`${He} looks like ${he} would love to thank you, were ${he} not mute.`);
+				} else if (eventSlave.accent >= 3) {
+					r.push(`${He} looks like ${he} would love to thank you, if ${he} knew how.`);
+				}
+			} else {
+				if (eventSlave.lips > 70) {
+					r.push(`${He} murmurs through ${his} huge lips,`);
+				} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+					r.push(`${He} murmurs through ${his} piercings,`);
+				} else {
+					r.push(`${He} murmurs,`);
+				}
+				r.push(Spoken(eventSlave, `"That feels really nice, ${Master}."`));
+			}
+			r.push(`<span class="trust inc">${He} has become more trusting of you.</span>`);
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function backdoor() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and bend ${him} over the sink for a quick assfuck.`);
+			r.push(VCheck.Anal(eventSlave, 1));
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to brace ${himself} against the sink, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			r.push(`Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function unPregnant() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and bend ${him} over the sink for a quick assfuck.`);
+			r.push(VCheck.Anal(eventSlave, 1));
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to brace ${himself} against the sink, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			r.push(`Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function tip() {
+			r = [];
+			r.push(`${He}'s absorbed enough with ${his} application that ${he} starts with surprise when you seize ${his} hips and shove ${him} onto ${his} ${belly} stomach for a quick fuck.`);
+			if (eventSlave.mpreg === 1) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			}
+			if (hasAnyArms(eventSlave)) {
+				r.push(`${He} does ${his} best to steady ${himself} atop the squirming mass, but ${his}`);
+				if (!hasBothArms(eventSlave)) {
+					r.push(`hand is`);
+				} else {
+					r.push(`hands are`);
+				}
+				r.push(`slick from the lotion and ${he} slides around for a while before ${he} gives up and accepts that ${he}'s in for an uncomfortable time.`);
+			}
+			if (eventSlave.mpreg === 1) {
+				r.push(`Taking it up the ass`);
+			} else {
+				r.push(`Getting roughly fucked`);
+			}
+			r.push(`while hugely pregnant isn't the most comfortable way to have sex, neither is being forced to put more pressure on an already overfilled organ, but such is the life of a sex slave.`);
+			if (eventSlave.lactation === 1) {
+				r.push(`As you pound ${him}, ${his} breasts, sore from lactation, give ${him} quite a bit of discomfort.`);
+			} else if (eventSlave.boobs > 1000) {
+				r.push(`As you pound ${him}, ${his} huge breasts compound the discomfort.`);
+			}
+			r.push(`When you finally finish and withdraw your`);
+			if (V.PC.dick === 0) {
+				r.push(`vibrating strap-on,`);
+			} else {
+				r.push(`cock,`);
+			}
+			r.push(`${he} groans with relief and rolls onto ${his} side. <span class="devotion inc">${He} has become more submissive.</span>`);
+			eventSlave.devotion += 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/likeMe.js b/src/events/RESS/review/likeMe.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd2e04d02880c5d5e9f3a4be6de1c0e544093196
--- /dev/null
+++ b/src/events/RESS/review/likeMe.js
@@ -0,0 +1,427 @@
+App.Events.RESSLikeMe = class RESSLikeMe extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.trust <= 20,
+				s => s.trust >= -75,
+				s => s.devotion <= 30,
+				s => s.devotion >= -20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master, say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			App.UI.DOM.slaveDescriptionDialog(eventSlave),
+			`appears at the door of your office, looking frightened. ${He} takes one hesitant step in and stops, wavering, ${his} hand balled into fists and ${his} lower lip caught behind ${his} teeth. The ${SlaveTitle(eventSlave)} is getting used to ${his} place as chattel, but ${he} isn't sure of ${himself} yet. After a few moments, it becomes obvious that ${he}'s lost whatever mental momentum propelled ${him} to come in here, and can't muster the courage to back out, either. You rescue ${him} by politely but firmly ordering ${him} to tell you why ${he}'s here. After two false starts, ${he}`
+		);
+		if (!canTalk(eventSlave)) {
+			r.push(`uses shaky hands to ask you to fuck ${him}.`);
+		} else {
+			r.push(
+				Spoken(eventSlave, `"P-please fuck me, ${Master},"`),
+				`${he} chokes out.`
+			);
+		}
+		r.push(`To go by ${his} behavior, the likelihood that ${he}'s actually eager to`);
+		if (PC.dick === 0) {
+			r.push(`eat pussy,`);
+		} else {
+			r.push(`take a dick,`);
+		}
+		r.push(`never mind yours, is vanishingly small.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Fuck ${him}`, fuck, virginityWarning()),
+			new App.Events.Result(`Rape ${him}`, rape, virginityWarning()),
+			new App.Events.Result(`Get the truth out of ${him}`, truth),
+		]);
+
+		function virginityWarning(){
+			if ((eventSlave.anus === 0 || eventSlave.vagina === 0) && PC.dick !== 0) {
+				return `This option will take ${his} virginity`;
+			}
+		}
+
+		function fuck() {
+			r = [];
+			r.push(`${He} asked for it, and ${he}'ll get it. You get to your`);
+			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+				r.push(`feet, unhook ${his} chastity,`);
+			} else {
+				r.push(`feet`);
+			}
+			r.push(`and snap your fingers, pointing`);
+			if (PC.dick === 0) {
+				r.push(`at the floor in front of you`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "floor"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
+				if (eventSlave.belly >= 300000) {
+					r.push(`pulling onto ${his} ${belly} stomach`);
+				} else {
+					r.push(`shoving ${him} down to kneel at your feet`);
+				}
+				r.push(`with ${his} face`);
+				if (PC.belly >= 5000) {
+					r.push(`crammed under your pregnant belly, level with your cunt.`);
+				} else {
+					r.push(`level with your cunt.`);
+				}
+				r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off, looking oddly proud of ${himself}. It seems ${he} got something out of that: <span class="trust inc">a confidence boost,</span> at least.`);
+			} else {
+				r.push(`at the couch next to the desk`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "couch"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over and`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`gently eases ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					} else {
+						r.push(`swollen`);
+					}
+					r.push(`body to the ground,`);
+				} else {
+					r.push(`kneels,`);
+				}
+				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height.`);
+				if (PC.vagina !== -1) {
+					r.push(`You ensure that you're fully hard and get ${him} in the right frame of mind by grinding the pussy beneath your dick against ${him}.`);
+				}
+				r.push(`You fuck`);
+				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+					r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
+					r.push(VCheck.Both(eventSlave, 1));
+					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
+				} else if (canDoVaginal(eventSlave)) {
+					r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
+					r.push(VCheck.Vaginal(eventSlave, 1));
+					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
+				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+					r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
+					r.push(VCheck.Anal(eventSlave, 1));
+					r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
+				}
+				r.push(`${He} stumbles off to wash, looking oddly proud of ${himself}. It seems ${he} got something out of that: <span class="trust inc">a confidence boost,</span> at least.`);
+			}
+			eventSlave.trust += 4;
+			return r;
+		}
+
+		function rape() {
+			r = [];
+			r.push(`${He}'ll get more than ${he} asked for. You get to your`);
+			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+				r.push(`feet, unhook ${his} chastity,`);
+			} else {
+				r.push(`feet`);
+			}
+			r.push(`and snap your fingers, pointing`);
+			if (PC.dick === 0) {
+				r.push(`at the floor in front of you`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "floor"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`${His}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`gravid`);
+					} else {
+						r.push(`bloated`);
+					}
+					r.push(`form`);
+				} else {
+					r.push(`${He}`);
+				}
+				r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
+			} else {
+				r.push(`at the couch next to the desk`);
+				if (!canSee(eventSlave)) {
+					r.push(`along with a commanding "couch"`);
+				}
+				r.push(r.pop() + `. ${He} hurries over and`);
+				if (eventSlave.belly >= 5000) {
+					r.push(`gently eases ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnant`);
+					} else {
+						r.push(`swollen`);
+					}
+					r.push(`body to the ground,`);
+				} else {
+					r.push(`kneels,`);
+				}
+				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
+				if (eventSlave.belly >= 600000) {
+					r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
+				} else {
+					r.push(`jabbing a thumb into one of ${his} kidneys,`);
+				}
+				r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
+				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
+					r.push(VCheck.Both(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+				} else if (canDoVaginal(eventSlave)) {
+					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
+					r.push(VCheck.Vaginal(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
+					if (canGetPregnant(eventSlave)) {
+						r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
+					}
+					r.push(r.pop() + `.`);
+				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+					r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
+					r.push(VCheck.Anal(eventSlave, 1));
+					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+				}
+				r.push(`It isn't the first time you've heard that, or the hundredth.`);
+			}
+			r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking <span class="trust dec">fearful</span> but strangely <span class="devotion inc">complacent,</span> as though ${he}'s accepted this to an extent.`);
+			eventSlave.trust -= 4;
+			eventSlave.devotion += 4;
+			return r;
+		}
+
+		function truth() {
+			const frag = document.createDocumentFragment();
+			r = [];
+			r.push(`You ask ${him} why ${he}'s really here, with devastating directness and in a tone that will brook no disobedience. ${He} quails, ${his} shoulders slumping as ${he}`);
+			if (eventSlave.belly >= 1500) {
+				if (eventSlave.pregKnown === 1) {
+					r.push(`hugs ${his} pregnancy`);
+				} else {
+					r.push(`attempts to hug ${himself} with ${his} ${belly} belly in the way`);
+				}
+			} else {
+				r.push(`hugs ${himself}`);
+			}
+			r.push(`and ${his} knees turning inward as ${he} cringes, the perfect picture of the standard human fear response. It seems ${he} thought you wouldn't notice ${his} insincerity. ${He} swallows nervously and makes no response, but then you`);
+			if (canSee(eventSlave)) {
+				r.push(`allow impatience to cloud your brow`);
+			} else {
+				r.push(`cough with impatience`);
+			}
+			r.push(`and ${he} hurriedly explains ${himself}.`);
+			if (!canTalk(eventSlave)) {
+				r.push(`${He} uses sign language to communicate that ${he} asked the other slaves what ${he} could do to improve ${his} life, and that they told ${him} to do ${his} best to win your favor. ${He} asked them how to do that, and they told ${him} to ask you to fuck ${him}.`);
+			} else {
+				r.push(
+					Spoken(eventSlave, `"${Master}, I, um, asked the other girls what I could do to, you know, do better here,"`),
+					`${he} ${say}s.`,
+					Spoken(eventSlave, `"They said to g-get you to like me. A-and when I asked them how to do that, th-they said t-to ask you to fuck me."`)
+				);
+			}
+			r.push(`Then ${he} bites ${his} lip and`);
+			if (canSee(eventSlave)) {
+				r.push(`watches you`);
+			} else if (canHear(eventSlave)) {
+				r.push(`listens`);
+			} else {
+				r.push(`waits`);
+			}
+			r.push(`anxiously.`);
+
+			App.Events.addParagraph(frag, r);
+			App.Events.addResponses(frag, [
+				new App.Events.Result(`They're not wrong`, wrong, virginityWarning()),
+				new App.Events.Result(`Now rape ${him}`, rape2, virginityWarning()),
+				new App.Events.Result(`It's not that simple`, simple)
+			]);
+			return frag;
+
+			function wrong() {
+				r = [];
+
+				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is`);
+				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+					r.push(`palpable as you undo ${his} chastity.`);
+				} else {
+					r.push(`palpable.`);
+				}
+				r.push(`You snap your fingers, pointing`);
+				if (PC.dick === 0) {
+					r.push(`at the floor in front of you`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "floor"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
+					if (eventSlave.belly >= 300000) {
+						r.push(`pulling onto ${his} ${belly} stomach`);
+					} else {
+						r.push(`shoving ${him} down to kneel at your feet`);
+					}
+					r.push(`with ${his} face`);
+					if (PC.belly >= 5000) {
+						r.push(`crammed under your pregnant belly, level with your cunt.`);
+					} else {
+						r.push(`level with your cunt.`);
+					}
+					r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off,`);
+				} else {
+					r.push(`at the couch next to the desk`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "couch"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over and`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`gently eases ${his}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnant`);
+						} else {
+							r.push(`swollen`);
+						}
+						r.push(`body to the ground,`);
+					} else {
+						r.push(`kneels,`);
+					}
+					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height. You fuck`);
+					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+						r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
+						r.push(VCheck.Both(eventSlave, 1));
+						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
+						r.push(VCheck.Vaginal(eventSlave, 1));
+						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
+					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+						r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
+						r.push(VCheck.Anal(eventSlave, 1));
+						r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
+					}
+					r.push(`${He} stumbles off to wash,`);
+				}
+				r.push(`looking <span class="trust inc">much more confident.</span>`);
+				eventSlave.trust += 4;
+				return r;
+			}
+
+			function rape2() {
+				r = [];
+				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is palpable, but ${he}'s getting ahead of`);
+				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
+					r.push(`${himself} as you undo ${his} chastity.`);
+				} else {
+					r.push(`${himself}.`);
+				}
+				r.push(`You snap your fingers, pointing`);
+				if (PC.dick === 0) {
+					r.push(`at the floor in front of you`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "floor"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`${His}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`gravid`);
+						} else {
+							r.push(`bloated`);
+						}
+						r.push(`form`);
+					} else {
+						r.push(`${He}`);
+					}
+					r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
+				} else {
+					r.push(`at the couch next to the desk`);
+					if (!canSee(eventSlave)) {
+						r.push(`along with a commanding "couch"`);
+					}
+					r.push(r.pop() + `. ${He} hurries over and`);
+					if (eventSlave.belly >= 5000) {
+						r.push(`gently eases ${his}`);
+						if (eventSlave.bellyPreg >= 3000) {
+							r.push(`pregnant`);
+						} else {
+							r.push(`swollen`);
+						}
+						r.push(`body to the ground,`);
+					} else {
+						r.push(`kneels,`);
+					}
+					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
+					if (eventSlave.belly >= 600000) {
+						r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
+					} else {
+						r.push(`jabbing a thumb into one of ${his} kidneys,`);
+					}
+					r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
+					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
+						r.push(VCheck.Both(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+					} else if (canDoVaginal(eventSlave)) {
+						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
+						r.push(VCheck.Vaginal(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
+						if (canGetPregnant(eventSlave)) {
+							r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
+						}
+						r.push(r.pop() + `.`);
+					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
+						r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
+						r.push(VCheck.Anal(eventSlave, 1));
+						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
+					}
+					r.push(`It isn't the first time you've heard that, or the hundredth.`);
+				}
+				r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking <span class="trust dec">fearful</span> but <span class="devotion inc">submissive,</span> knowing that ${he} now has a better idea of what you want, even if what you want isn't very nice.`);
+				eventSlave.trust -= 4;
+				eventSlave.devotion += 4;
+				return r;
+			}
+			function simple() {
+				r = [];
+				r.push(`You tell ${him} kindly that it isn't that simple, but that if ${he} obeys orders and does ${his} best, you will like ${him} just fine, and ${he} will do well as your slave. Relief floods through ${him}.`);
+				if (!canTalk(eventSlave)) {
+					r.push(`${He} gestures ${his} thanks, and an apology for being silly.`);
+				} else {
+					r.push(
+						Spoken(eventSlave, `"Thank you, ${Master} and I'm sorry for being silly,"`),
+						`${he} apologizes.`
+					);
+				}
+				r.push(`You dismiss ${him}, and ${he} goes, a strangely <span class="devotion inc">respectful</span> look on ${his} face. ${He}'s no more confident of ${his} ability to find safety and stability here with you than ${he} was before, but ${he} seems to like that it apparently isn't as simple as`);
+				if (PC.dick !== 0) {
+					r.push(`taking your cock up ${his} butt`);
+					if (PC.vagina !== -1) {
+						r.push(`or`);
+					}
+				}
+				if (PC.vagina !== -1) {
+					r.push(`eating you out`);
+				}
+				r.push(r.pop() + `.`);
+				eventSlave.devotion += 4;
+				return r;
+			}
+		}
+	}
+};
diff --git a/src/events/RESS/review/masterfulEntertainer.js b/src/events/RESS/review/masterfulEntertainer.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ddbadb8c0d3257e74c7c5a5de9d68c0b41cc7f7
--- /dev/null
+++ b/src/events/RESS/review/masterfulEntertainer.js
@@ -0,0 +1,191 @@
+App.Events.RESSMasterfulEntertainer = class RESSMasterfulEntertainer extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				hasAnyLegs,
+				s => s.assignment === Job.PUBLIC,
+				s => s.skill.entertainment >= 100,
+				s => s.trust > 50,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			His, He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		r.push(
+			`It's Friday evening, the most socially important part of the week in ${V.arcologies[0].name}.`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`happens to be free this evening, and your schedule is open, too. Lately, ${he}'s been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever ${he} gets the chance to catch someone's eye`
+		);
+		if (eventSlave.belly >= 5000) {
+			r.push(r.pop() + `, even with ${his}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`advanced pregnancy`);
+			} else if (eventSlave.bellyImplant >= 3000) {
+				r.push(`${belly} rounded belly`);
+			} else {
+				r.push(`sloshing ${eventSlave.inflationType}-filled stomach`);
+			}
+		}
+		r.push(r.pop() + `. There are a number of events tonight you could attend with ${him} on your arm.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Go clubbing`, clubbing),
+			(eventSlave.belly < 15000)
+				? new App.Events.Result(`Attend a milonga`, milonga)
+				: new App.Events.Result(),
+			new App.Events.Result(`Never mind Friday night; the moon's out and it's romantic on the balcony`, romantic, virginityWarning()),
+		]);
+
+		function virginityWarning() {
+			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
+				return `This option will take ${his} virginity`;
+			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+
+		function clubbing() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing glitzy heels, an extremely short skirt`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`barely noticeable under ${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly`);
+			}
+			r.push(r.pop() + `, and a string bikini top so brief that ${his} areolae are clearly visible. As you descend through ${V.arcologies[0].name} the beats get faster and the drops get heavier. By the time you reach the club where the Free Cities' hottest DJ has a show tonight, ${eventSlave.slaveName} is a whirlwind of sexual energy in motion, moving`);
+			if (canHear(eventSlave)) {
+				r.push(`with every beat`);
+			} else {
+				r.push(`wildly`);
+			}
+			r.push(`and catching every eye`);
+			if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
+				r.push(r.pop() + `, despite how far along ${he} is`);
+			} else if (eventSlave.belly >= 5000 || eventSlave.weight > 130) {
+				r.push(r.pop() + `, despite how big ${he} is`);
+			}
+			r.push(r.pop() + `. ${His} skills could have half the club lining up to fuck ${him} for money, but tonight ${he}'s all yours. The entire floor is envious of you as the night wears on and ${his} dancing turns into sexually servicing you`);
+			if (canHear(eventSlave)) {
+				r.push(`in time with the music`);
+			}
+			r.push(r.pop() + `.`);
+			if (eventSlave.chastityPenis === 1) {
+				r.push(`The smell of ${his} pre-cum is noticeable even over the stink of sweat.`);
+			} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
+				r.push(`${His} tiny skirt does nothing to hide ${his} erection.`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`${His} tiny skirt displays ${his} big, engorged clit.`);
+			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`${His} arched back and cocked hips make it very clear that ${he} wants ${his} asspussy fucked.`);
+			} else {
+				r.push(`The smell of ${his} arousal is noticeable even over the stink of sweat.`);
+			}
+			if (eventSlave.boobs > 1000) {
+				r.push(`${His} breasts get groped and mauled all night.`);
+			} else if (eventSlave.butt > 5) {
+				r.push(`${He} grinds ${his} ass against your crotch all night.`);
+			} else {
+				r.push(`Cum joins the sweat running off ${him}.`);
+			}
+			r.push(`The crowd is duly impressed; <span class="green">your reputation has increased.</span>`);
+			repX(500, "event", eventSlave);
+			return r;
+		}
+
+		function milonga() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing classy heels and a gorgeous long dress cunningly designed to adhere to ${him} while ${he} dances despite the fact that it displays all of one leg, ${his} entire back,`);
+			if (eventSlave.belly >= 5000) {
+				r.push(`${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly,`);
+			}
+			r.push(`cleavage, and the sides of both breasts. ${He} has ${his} hair up in a perfect bun accented with a spray of the latest jewelry, and is wearing severe makeup that makes ${him} look aristocratic and elegant by turns. The host of the milonga, an old-world tango enthusiast, knows well the social graces and invites you, as the most prominent attendee, to perform the traditional demonstration tango that begins the dance. It goes wonderfully, and the entire party sighs in appreciation as you perform the classic tango. You lower ${eventSlave.slaveName}`);
+			if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
+				r.push(`'s heavy body`);
+			}
+			r.push(`gracefully and pull ${him} back up into a close embrace, and breath catches in more than one throat. As tradition dictates ${he} dances with many partners throughout the night. One concession to Free Cities sensibilities is that the male and female roles in the tango may be filled by anyone, and ${eventSlave.slaveName} switches flawlessly between playing the female role to the elderly host one dance and the male role to his teenage granddaughter the next. The poor girl spends the rest of the evening staring at ${eventSlave.slaveName} with her tongue tied. Whoever ${eventSlave.slaveName} dances with, ${he} always subtly shows by glance and gesture that it's you ${he} truly wants. Everyone is quite envious of you; <span class="green">your reputation has increased.</span>`);
+			repX(500, "event", eventSlave);
+			return r;
+		}
+
+		function romantic() {
+			r = [];
+			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door absolutely naked`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.push(r.pop() + `, ${his} motherly body on full display`);
+			}
+			r.push(r.pop() + `. ${He} has half a question on ${his} face, wondering whether this is going too far, but it vanishes when you`);
+			if (canSee(eventSlave)) {
+				r.push(`smile reassuringly at`);
+			} else {
+				r.push(`compliment`);
+			}
+			r.push(`${him}. You take ${him} by the hand and lead ${him} out onto the private balcony outside your office. It's a cloudless night, and the moon is full. You order the arcology to play a classic dance medley, and ${eventSlave.slaveName} becomes all innocence and grace, the perfect dance partner`);
+			if (eventSlave.bellyPreg >= 10000) {
+				r.push(r.pop() + `, despite ${his} heavy pregnancy`);
+			} else if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
+				r.push(r.pop() + `, despite ${his} weight`);
+			}
+			r.push(r.pop() + `. The only real consequence of ${his} nudity is`);
+			if (eventSlave.boobs >= 300) {
+				r.push(`the extra sway of ${his} breasts,`);
+			}
+			if (canPenetrate(eventSlave)) {
+				r.push(`${his} visible erection, and`);
+			} else if (eventSlave.clit > 0) {
+				r.push(`${his} visibly engorged clit and`);
+			} else if (eventSlave.boobs >= 300) {
+				r.push(`and`);
+			}
+			if (eventSlave.nipples !== "fuckable") {
+				r.push(`the hardness of ${his} nipples`);
+			} else {
+				r.push(`how swollen ${his} nipples are`);
+			}
+			r.push(`in the cool night when the dance brings you close. ${He} enjoys ${himself} immensely and in no time at all, ${he}'s meekly asking you to take ${him} inside and dance with ${him} on the bed. Naturally, you oblige.`);
+			eventSlave.devotion += 3;
+			eventSlave.trust += 3;
+			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
+				seX(eventSlave, "penetrative", PC, "vaginal");
+				if (canImpreg(PC, eventSlave)) {
+					r.push(knockMeUp(PC, 20, 0, eventSlave.ID));
+				}
+			} else if (canDoVaginal(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 1));
+			} else if (eventSlave.boobs >= 1000) {
+				seX(eventSlave, "mammary", PC, "penetrative");
+			} else {
+				seX(eventSlave, "oral", PC, "penetrative");
+			}
+			r.push(`${His} <span class="devotion inc">devotion to you</span> and <span class="mediumaquamarine">trust in you</span> have increased.`);
+			return r;
+		}
+	}
+};
diff --git a/src/events/RESS/review/modsPlease.js b/src/events/RESS/review/modsPlease.js
index 547e83829bb31e52150093ebe97ac568197ad1ab..24ace8c53dec23ecb3eec07b27462680a4bb627c 100644
--- a/src/events/RESS/review/modsPlease.js
+++ b/src/events/RESS/review/modsPlease.js
@@ -77,7 +77,7 @@ App.Events.RESSModsPlease = class RESSModsPlease extends App.Events.BaseEvent {
 			r.push(`acknowledgment,`);
 		}
 		r.push(he);
-		if (eventSlave.fetishKnown === 1) {
+		if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none") {
 			if (eventSlave.fetish === "submissive") {
 				r.push(
 					`gives a submissive shudder, and turns to show you ${his} bare back.`,
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/shapedAreolae.js b/src/events/RESS/review/shapedAreolae.js
new file mode 100644
index 0000000000000000000000000000000000000000..489950a8a38152e35fcdb5650f2eeda127c783c4
--- /dev/null
+++ b/src/events/RESS/review/shapedAreolae.js
@@ -0,0 +1,105 @@
+App.Events.RESSShapedAreolae = class RESSShapedAreolae 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.boobs > 1200,
+				s => s.areolaeShape !== "circle",
+				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, woman
+		} = getPronouns(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		r.addToLast(`'s breasts are real works of art. ${His}`);
+		if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
+			r.push(`massive fake`);
+		} else if (eventSlave.boobsImplant > 0) {
+			r.push(`massive, partially unnatural`);
+		} else {
+			r.push(`massive, sagging natural`);
+		}
+		r.push(`tits dominate ${his} figure, but the real attention getter are ${his} unique, ${eventSlave.areolaeShape}-shaped areolae. The darker flesh around ${his} nipples would be — should be — circular in any other ${woman}, and the cute ${eventSlave.areolaeShape} shapes around ${eventSlave.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.`);
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Show ${him} off around the arcology`, show),
+			new App.Events.Result(`Use that pride as an advertisement`, use),
+
+		]);
+
+		function show() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You give ${eventSlave.slaveName} a variation on a usual slave gown. It's just as gorgeous, but this one actually covers ${his}`);
+			if (eventSlave.belly >= 1500) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 1500) {
+					r.push(`pregnancy,`);
+				} else {
+					r.push(`belly,`);
+				}
+			}
+			r.push(`ass and crotch as well. In fact, it covers ${his}`);
+			if (isAmputee(eventSlave)) {
+				r.push(`limbless torso and head completely: everything except the lower part of ${his} face, and ${his} boobs.`);
+			} else {
+				if (hasAllLimbs(eventSlave)) {
+					r.push(`arms, legs,`);
+				} else {
+					r.push(`limbs`);
+				}
+				r.push(`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 (!hasAnyLegs(eventSlave)) {
+				r.push(`You carry ${him} around`);
+			} else {
+				r.push(`You place a gentle hand on the small of ${his} back to guide ${him}, and stroll around`);
+			}
+			if (V.club !== 0) {
+				r.push(`${V.clubName}.`);
+			} else {
+				r.push(`${V.arcologies[0].name}'s clubs.`);
+			}
+			r.push(`${eventSlave.slaveName}`);
+			if (canSee(eventSlave)) {
+				r.push(`is blinded by the silk over ${his} face,`);
+			} else {
+				r.push(`may not be able to see,`);
+			}
+			r.push(`but ${he} can still`);
+			if (canHear(eventSlave)) {
+				r.push(`hear the appreciative murmurs`);
+			} else {
+				r.push(`feel the appreciative presence`);
+			}
+			r.push(`of onlookers as they eye ${his} magnificent breasts with their ${eventSlave.areolaeShape}-shaped areolae. ${He} shivers a little with suppressed pride. <span class="devotion inc">${His} devotion to you has increased,</span> and <span class="green">your reputation as a person with unique property grows.</span>`);
+			eventSlave.devotion += 4;
+			repX(500, "event", eventSlave);
+			r.toParagraph();
+			return r.container();
+		}
+
+		function use() {
+			eventSlave.devotion += 4;
+			cashX(500, "event", eventSlave);
+			return `There's all sorts of business going on in ${V.arcologies[0].name}, from flesh rented or bought down to more pedestrian affairs. Advertisement never goes amiss. You place ${eventSlave.slaveName} naked on a slowly rotating pedestal surrounded by a clear plastiglass tube on a busy thoroughfare in the lower parts of ${V.arcologies[0].name}. These devices are often used to display slaves for sale or slave whores for rent; ${eventSlave.slaveName} is simply identified by your name as arcology owner, which is thus <span class="yellowgreen">identified with business prosperity.</span> ${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} ${eventSlave.areolaeShape}-shaped areolae. ${He} loves all the attention, and <span class="devotion inc">${his} devotion to you has increased.</span>`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/shiftMasturbation.js b/src/events/RESS/review/shiftMasturbation.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ae16844a698c2eb4122a6e65959c6c9eebd68f2
--- /dev/null
+++ b/src/events/RESS/review/shiftMasturbation.js
@@ -0,0 +1,306 @@
+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/shiftSleep.js b/src/events/RESS/review/shiftSleep.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d1f23f5c462349610f359b7b3ae864cbc06f41a
--- /dev/null
+++ b/src/events/RESS/review/shiftSleep.js
@@ -0,0 +1,335 @@
+App.Events.RESSShiftSleep = class RESSShiftSleep extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.corp.Incorporated !== 0,
+		]; // 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),
+			]
+		];
+	}
+
+	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 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(`Though it's late, ${he}'s surprised to find the lights in the master suite off. You had an unusually trying day, so you've retired for the night; you're on the point of sleep when ${he} comes in`);
+		if (S.Concubine && S.Concubine.ID !== eventSlave.ID) {
+			r.addToLast(`, ${S.Concubine.slaveName} nestled under your arm`);
+		}
+		r.addToLast(`. After a moment's hesitation, ${eventSlave.slaveName} strips quietly and`);
+		if (eventSlave.belly >= 100000) {
+			r.push(`gently lowers ${his} extremely gravid body onto`);
+		} else if (eventSlave.belly >= 10000) {
+			r.push(`gently lowers ${his}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			} else {
+				r.push(`heavily swollen`);
+			}
+			r.push(`body onto`);
+		} else if (eventSlave.weight > 95) {
+			r.push(`gently lowers ${his} heavy body onto`);
+		} else {
+			r.push(`sits on`);
+		}
+		r.push(`the edge of the bed, preparing to climb quietly in. ${He} clearly thinks you're asleep, and is doing ${his} best not to wake you. The dim, blue-toned light of your bedroom at night washes out ${his} ${eventSlave.skin} skin and robs ${his} ${App.Desc.eyesColor(eventSlave)} of their color, but it highlights`);
+		if (eventSlave.belly >= 100000) {
+			r.push(`${his} ${belly} dome of a stomach,`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`greatly swollen with life.`);
+			} else if (eventSlave.bellyImplant >= 3000) {
+				r.push(`greatly distended by ${his} implant.`);
+			}
+		} else if (eventSlave.nipples === "huge") {
+			r.push(`the wonderful nipples jutting from ${his} flesh, stiffening in the cool night air.`);
+		} else if (eventSlave.weight > 130) {
+			r.push(`${his} fat gut, with each fold making its own shadowed trench and ${his} navel forming a little dark hollow in ${his} soft stomach.`);
+		} else if (eventSlave.belly >= 5000) {
+			r.push(`${his} rounded belly,`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`swollen with life.`);
+			} else if (eventSlave.bellyImplant >= 3000) {
+				r.push(`filled out by ${his} implant.`);
+			} else {
+				r.push(`bloated with ${eventSlave.inflationType}.`);
+			}
+		} else if (eventSlave.weight > 95) {
+			r.push(`${his} fat belly, with ${his} navel forming a little dark hollow in ${his} soft stomach.`);
+		} else if (eventSlave.weight > 10) {
+			r.push(`${his} plush belly, with ${his} navel forming a little dark hollow in ${his} pretty stomach.`);
+		} else if (eventSlave.muscles > 30) {
+			r.push(`${his} washboard abs, with each muscle casting its own little shadow.`);
+		} else if (eventSlave.boobs > 1000) {
+			r.push(`the huge curve of ${his} breasts, a giant dark presence.`);
+		} else if (eventSlave.dick > 2) {
+			r.push(`the presence between ${his} legs.`);
+		} else {
+			r.push(`${his} pretty face.`);
+		}
+		if (canSee(eventSlave)) {
+			r.push(`${He} perceives the glint of your open eyes,`);
+		} else if (canHear(eventSlave)) {
+			r.push(`${He} hears your breathing change,`);
+		} else {
+			r.push(`${He} correctly guesses you're wide awake,`);
+		}
+		r.push(`and stops, patiently waiting for some sign of what you'd like ${him} to do.`);
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Relaxed sex`, relaxed),
+			eventSlave.belly < 150000 && canDoVaginal(eventSlave)
+				? new App.Events.Result(`Surprise sex`, surprise, (eventSlave.vagina === 0) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			eventSlave.belly < 150000 && canDoAnal(eventSlave)
+				? new App.Events.Result(`Surprise buttsex`, surprise2, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null)
+				: new App.Events.Result(),
+		]);
+
+		function relaxed() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You flip the sheet off your naked body, revealing your already`);
+			if (V.PC.dick === 0) {
+				r.push(`wet pussy`);
+			} else {
+				r.push(`stiff prick`);
+				if (V.PC.vagina !== -1) {
+					r.push(`and the wet pussy below it`);
+				}
+			}
+			r.addToLast(`. ${He} slides ${himself} down, pressing ${his}`);
+			if (eventSlave.boobs > 2000) {
+				r.push(`ridiculous tits`);
+			} else if (eventSlave.boobs > 800) {
+				r.push(`big breasts`);
+			} else if (eventSlave.boobs > 300) {
+				r.push(`nice boobs`);
+			} else {
+				r.push(`trim chest`);
+			}
+			r.push(`against your legs, and nuzzles ${his} warm nose and wet tongue against`);
+			if (V.PC.balls >= 9) {
+				r.push(`your oversized nuts.`);
+			} else if (V.PC.vagina !== -1) {
+				r.push(`your moist folds.`);
+			} else {
+				r.push(`your ballsack.`);
+			}
+			r.push(`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 (V.PC.vagina !== -1) {
+				r.push(`pussylips.`);
+			} else {
+				r.push(`cock.`);
+			}
+			r.push(`${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 (eventSlave.belly >= 10000) {
+				r.push(belly);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				}
+				r.push(`belly a light pat`);
+			} else {
+				r.push(`shoulder a little tug`);
+			}
+			r.push(`to let ${him} know that's enough, ${he} <span class="mediumaquamarine">cuddles up close to you</span> without hesitation.`);
+			eventSlave.trust += 4;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			r.toParagraph();
+			return r.container();
+		}
+
+		function surprise() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You uncoil from under the sheet like a striking serpent, tackling ${his} ${eventSlave.skin} body off the edge of the bed`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.addToLast(`, twisting in midair,`);
+			}
+			r.push(`and onto the floor with a crash. The wind is knocked out of ${him} with an audible grunt as`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.push(`${he} lands on top of you and rolls over.`);
+			} else {
+				r.push(`you land on top of ${him}.`);
+			}
+			if (eventSlave.bellyPreg < 1500) {
+				if (eventSlave.belly >= 10000) {
+					r.push(`${His} ${belly} belly squashes out to either side of ${his} torso,`);
+				} else if (eventSlave.boobs > 2000) {
+					r.push(`${His} huge breasts squash out to either side of ${his} torso,`);
+				} else if (eventSlave.dick > 0) {
+					r.push(`${He} shifts desperately to get some weight off ${his} trapped dick,`);
+				} else {
+					r.push(`${He} squirms reflexively,`);
+				}
+			} else if (eventSlave.boobs > 2000) {
+				r.push(`${His} huge breasts flop to either side of ${his} torso,`);
+			} else {
+				r.push(`${He} squirms reflexively,`);
+			}
+			r.push(`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 (eventSlave.butt > 5) {
+				r.push(`inconveniently plush butt`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big buttocks`);
+			} else {
+				r.push(`trim buttocks`);
+			}
+			r.push(`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 (V.PC.dick === 0) {
+				r.push(`the tip of your strap-on`);
+			} else {
+				r.push(`your dickhead`);
+			}
+			r.push(`against ${his} moist slit. The relaxation`);
+			if (eventSlave.vagina > 2) {
+				r.push(`gapes ${his} vagina wide, welcoming you in without any resistance at all.`);
+			} else if (eventSlave.vagina > 1) {
+				r.push(`welcomes you in, offering you only a delicious bit of resistance to push against.`);
+			} else {
+				r.push(`welcomes you in, though ${he} does buck a little at the first penetration.`);
+			}
+			r.push(`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 (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+				r.push(`an egg vibe. You shove it between ${him} and the cushion to give ${his} limp dick some stimulation.`);
+			} else if (eventSlave.dick > 4) {
+				r.push(`a huge onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`an onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
+			} else if (eventSlave.clit > 1) {
+				r.push(`a shallow vibrating onahole. You push it between ${him} and the cushion so ${he} can stuff ${his} pseudophallic clit into it.`);
+			} else if (canDoAnal(eventSlave)) {
+				r.push(`an egg vibe. You push it into ${his} ass to stimulate ${his}`);
+				if (eventSlave.prostate > 0) {
+					r.push(`prostate.`);
+				} else {
+					r.push(`insides.`);
+				}
+			} else {
+				r.push(`an egg vibe. You place it under ${him} so it can stimulate the sensitive skin between ${his} legs, just beneath ${his} asspussy.`);
+			}
+			if (!canTalk(eventSlave)) {
+				r.push(`${His} hands jerk out a spastic thank you in the darkness,`);
+			} else {
+				r.push(`${He} coos a wordless thanks,`);
+			}
+			r.push(`and ${he} starts humping away. If ${he} thought you were too tired for sex, you certainly <span class="hotpink">impress ${him};</span> as you spend an hour exhausting yourself against ${his} vagina, ${he} wonders whether ${his} ${getWrittenTitle(eventSlave)} is ever too tired to fuck.`);
+			eventSlave.devotion += 4;
+			r.push(VCheck.Vaginal(eventSlave, 1));
+			r.toParagraph();
+			return r.container();
+		}
+
+		function surprise2() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You uncoil from under the sheet like a striking serpent, tackling ${his} ${eventSlave.skin} body off the edge of the bed`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.addToLast(`, twisting in midair,`);
+			}
+			r.push(`and onto the floor with a crash. The wind is knocked out of ${him} with an audible grunt as`);
+			if (eventSlave.bellyPreg >= 1500) {
+				r.push(`${he} lands on top of you and rolls over.`);
+			} else {
+				r.push(`you land on top of ${him}.`);
+			}
+			if (eventSlave.bellyPreg < 1500) {
+				if (eventSlave.belly >= 10000) {
+					r.push(`${His} ${belly} belly squashes out to either side of ${his} torso,`);
+				} else if (eventSlave.boobs > 2000) {
+					r.push(`${His} huge breasts squash out to either side of ${his} torso,`);
+				} else if (eventSlave.dick > 0) {
+					r.push(`${He} shifts desperately to get some weight off ${his} trapped dick,`);
+				} else {
+					r.push(`${He} squirms reflexively,`);
+				}
+			} else if (eventSlave.boobs > 2000) {
+				r.push(`${His} huge breasts flop to either side of ${his} torso,`);
+			} else {
+				r.push(`${He} squirms reflexively,`);
+			}
+			r.push(`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 (eventSlave.butt > 5) {
+				r.push(`inconveniently plush butt`);
+			} else if (eventSlave.butt > 2) {
+				r.push(`big buttocks`);
+			} else {
+				r.push(`trim buttocks`);
+			}
+			r.push(`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 (V.PC.dick === 0) {
+				r.push(`the tip of your strap-on`);
+			} else {
+				r.push(`your dickhead`);
+			}
+			r.push(`against ${his} anus. The relaxation`);
+			if (eventSlave.anus > 2) {
+				r.push(`gapes ${his} asspussy wide, welcoming you in without any resistance at all.`);
+			} else if (eventSlave.anus > 1) {
+				r.push(`welcomes you in, offering you only a delicious bit of resistance to push against.`);
+			} else {
+				r.push(`saves ${him} from too much anal pain, though ${he} does buck a little at the first penetration.`);
+			}
+			r.push(`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 (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+				r.push(`an egg vibe. You shove it between ${him} and the cushion to give ${his} limp dick some stimulation.`);
+			} else if (eventSlave.dick > 4) {
+				r.push(`a huge onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
+			} else if (eventSlave.dick > 0) {
+				r.push(`an onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
+			} else if (eventSlave.clit > 1) {
+				r.push(`a shallow vibrating onahole. You push it between ${him} and the cushion so ${he} can stuff ${his} pseudophallic clit into it.`);
+			} else if (eventSlave.vagina === -1) {
+				r.push(`an egg vibe. You place it under ${him} so it can stimulate the sensitive skin between ${his} legs, just beneath ${his} asspussy.`);
+			} else {
+				r.push(`an egg vibe. You push it between ${him} and the cushion so ${he} can rub ${his}`);
+				if (!canDoVaginal(eventSlave)) {
+					r.push(`chaste`);
+				}
+				r.push(`pussy against it.`);
+			}
+			if (!canTalk(eventSlave)) {
+				r.push(`${His} hands jerk out a spastic thank you in the darkness,`);
+			} else {
+				r.push(`${He} coos a wordless thanks,`);
+			}
+			r.push(`and ${he} starts humping away. If ${he} thought you were too tired for sex, you certainly <span class="hotpink">impress ${him};</span> as you spend an hour exhausting yourself against ${his} asshole, ${he} wonders whether ${his} ${getWrittenTitle(eventSlave)} is ever too tired to fuck a butt.`);
+			eventSlave.devotion += 4;
+			r.push(VCheck.Anal(eventSlave, 1));
+			r.toParagraph();
+			return r.container();
+		}
+	}
+};
diff --git a/src/events/RESS/review/slaveDickHuge.js b/src/events/RESS/review/slaveDickHuge.js
new file mode 100644
index 0000000000000000000000000000000000000000..73379dc9813366306d7749b3b66960a53e097ac7
--- /dev/null
+++ b/src/events/RESS/review/slaveDickHuge.js
@@ -0,0 +1,247 @@
+App.Events.RESSSlaveDickHuge = class RESSSlaveDickHuge 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.rules.release.masturbation === 1,
+				s => s.dick > 4,
+				hasAnyArms,
+				canAchieveErection,
+				s => s.belly < 10000,
+				s => s.chastityPenis !== 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 PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(
+			`The showers your slaves use are well vented and transparent walled so that you can see their occupants clearly, even from your desk. Working late at night, you see`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`sitting hunched under the water in one of the showers, with ${his} back to you. You tell your desk to focus on ${him}, and you are rewarded with three different angles of ${eventSlave.slaveName} giving ${himself} a blowjob. ${He} has to bend over very hard`,
+		);
+		if (eventSlave.belly >= 5000) {
+			r.push(`and at a very awkward angle`);
+		}
+		r.push(`to get the tip of ${his} huge`);
+		if (V.seeRace === 1) {
+			r.push(eventSlave.race);
+		}
+		r.push(`dick`);
+		if (eventSlave.belly >= 5000) {
+			r.push(`around ${his}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnant`);
+			}
+			r.push(`belly and`);
+		}
+		r.push(`into ${his} mouth, but ${he}'s obviously enjoying it all the same. It's not against the rules for ${him} to masturbate; ${he}'s just found an impressive way of doing it.`);
+		if (eventSlave.scrotum > 0) {
+			if (eventSlave.balls >= 10) {
+				r.push(`As ${he} works ${himself}, ${he} plays with ${his} inhuman balls, massaging and caressing as much of them ${he} as ${he} can with`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`both hands.`);
+				} else {
+					r.push(`${his} hand.`);
+				}
+			} else if (eventSlave.balls > 8) {
+				r.push(`As ${he} works ${himself}, ${he} plays with ${his} monster balls, massaging and caressing them with`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`both hands.`);
+				} else {
+					r.push(`${his} hand.`);
+				}
+			} else if (eventSlave.balls > 5) {
+				r.push(`As ${he} works ${himself}, ${he} plays with ${his} massive balls, cupping them and squeezing gently.`);
+			} else if (eventSlave.balls > 3) {
+				r.push(`As ${he} works ${himself}, ${he} plays with ${his} big balls, rolling them around and squeezing them gently.`);
+			} else if (eventSlave.balls > 1) {
+				r.push(`As ${he} works ${himself}, ${he} plays with ${his} balls, massaging them with`);
+				if (hasBothArms(eventSlave)) {
+					r.push(`one`);
+				} else {
+					r.push(his);
+				}
+				r.push(`hand.`);
+			}
+		}
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`Enter the shower and take ${him}`, shower, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
+				: new App.Events.Result(),
+			(PC.dick !== 0)
+				? new App.Events.Result(`The only dick ${he} should suck is ${his} ${getWrittenTitle(eventSlave)}'s`, suck)
+				: new App.Events.Result(),
+			(eventSlave.belly < 5000) && (canDoAnal(eventSlave) || canDoVaginal(eventSlave))
+				? new App.Events.Result(`See if ${he} can do that while you take ${him}`, take, 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 shower() {
+			const r = new SpacedTextAccumulator();
+			r.push(`${He}'s so occupied that ${he} doesn't`);
+			if (canHear(eventSlave)) {
+				r.push(`hear`);
+			} else {
+				r.push(`notice`);
+			}
+			r.push(`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 (eventSlave.belly >= 5000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`gravid`);
+				} else {
+					r.push(`rounded`);
+				}
+				r.push(`body`);
+			}
+			r.push(`against the wall of the shower and stuff your`);
+			if (PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`dick`);
+			}
+			r.push(`up ${his}`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`cunt.`);
+			} else {
+				r.push(`ass.`);
+			}
+			r.push(`${He} was already very close to orgasm, and the stimulation of ${his} dick rubbing against the warm, wet wall`);
+			if (eventSlave.belly >= 1500) {
+				r.push(`of the shower and ${his} belly,`);
+			} else {
+				r.push(`of the shower,`);
+			}
+			r.push(`not to mention the feeling of being`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`fucked,`);
+			} else {
+				r.push(`buttfucked,`);
+			}
+			r.push(`is enough that ${he} climaxes quickly.`);
+			if (eventSlave.balls === 3) {
+				r.push(`${His} huge load coats the shower wall with cum.`);
+			}
+			r.push(`You pull out and let ${him} finish by`);
+			if (PC.dick === 0) {
+				r.push(`giving you oral`);
+			} else {
+				r.push(`sucking your dick`);
+				if (PC.vagina !== -1) {
+					r.push(`and eating your pussy`);
+				}
+			}
+			r.addToLast(`, since ${he} started by sucking ${himself}. <span class="devotion inc">${He} has become more submissive to you.</span>`);
+			eventSlave.devotion += 4;
+			if (canDoVaginal(eventSlave)) {
+				if (eventSlave.vagina === 0) {
+					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin pussy.</span>`);
+					eventSlave.vagina = 1;
+					r.push(`<span class="devotion inc">${He} enjoys losing ${his} cherry to you.</span>`);
+					eventSlave.devotion += 4;
+				}
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				if (eventSlave.anus === 0) {
+					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin ass.</span>`);
+					eventSlave.anus = 1;
+					r.push(`<span class="devotion inc">${He} enjoys losing ${his} butt cherry to you.</span>`);
+					eventSlave.devotion += 4;
+				}
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.toParagraph();
+			return r.container();
+		}
+
+		function suck() {
+			const r = new SpacedTextAccumulator();
+			r.push(`${He}'s so occupied that ${he} doesn't`);
+			if (canHear(eventSlave)) {
+				r.push(`hear`);
+			} else {
+				r.push(`notice`);
+			}
+			r.push(`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) {
+				r.push(`cunt`);
+			} else {
+				r.push(`balls`);
+			}
+			r.push(`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 (eventSlave.balls === 3) {
+				r.push(`${His} huge balls made an especially major contribution.`);
+			}
+			r.push(`<span class="devotion inc">${He} has become more submissive to you.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", PC, "penetrative");
+			r.toParagraph();
+			return r.container();
+		}
+
+		function take() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You interrupt ${eventSlave.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(eventSlave)) {
+				r.push(VCheck.Vaginal(eventSlave, 1));
+			} else {
+				r.push(VCheck.Anal(eventSlave, 1));
+			}
+			r.push(`So contorted, ${his}`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`pussy`);
+			} else {
+				r.push(`anus`);
+			}
+			r.push(`is not well angled for comfortable`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`penetration,`);
+			} else {
+				r.push(`sodomy,`);
+			}
+			r.push(`so ${he} is soon moaning and grunting into ${his} cock as you fuck ${him}.`);
+			r.push(`${He} finishes`);
+			if (eventSlave.balls >= 3) {
+				r.push(`${his} enormous ejaculation`);
+			}
+			r.push(`into ${his} own mouth and then`);
+			if (PC.dick === 0) {
+				r.push(`finds ${himself} giving you oral directly, since you pulled your strap-on off.`);
+			} else {
+				r.push(`receives your load into ${his} now-brimming throat.`);
+				if (PC.vagina !== -1) {
+					r.push(`${He} barely has time to swallow before you press your pussy against ${his} mouth.`);
+				}
+			}
+			r.push(`<span class="devotion inc">${His} devotion to you has increased.</span>`);
+			eventSlave.devotion += 4;
+			r.toParagraph();
+			return r.container();
+		}
+	}
+};
diff --git a/src/events/RESS/review/tendonFall.js b/src/events/RESS/review/tendonFall.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee6afcafac6caab70a13009fabed21576c691753
--- /dev/null
+++ b/src/events/RESS/review/tendonFall.js
@@ -0,0 +1,165 @@
+App.Events.RESSTendonFall = class RESSTendonFall extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => 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.devotion >= -20,
+				s => s.heels === 1,
+				s => shoeHeelCategory(s) > 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 belly = bellyAdjective(eventSlave);
+		const PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(
+			`There is a horrible crash from the bathroom. You rush in to see`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`curled up helplessly in the bottom of the shower with the water playing over ${his}`,
+		);
+		if (eventSlave.belly >= 5000) {
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`gravid`);
+			} else {
+				r.push(`rounded`);
+			}
+		} else {
+			r.push(`altered`);
+		}
+		r.push(`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 (eventSlave.lips > 70) {
+			r.push(`through ${his} huge lips`);
+		} else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) {
+			r.push(`through ${his} piercings`);
+		}
+		r.addToLast(`, "Help me, ${Master}!"`);
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Help ${him} clean ${himself}`, clean),
+			(canDoVaginal(eventSlave) || canDoAnal(eventSlave))
+				?	new App.Events.Result(`Fuck ${his} prostrate body`, prostate, (V.PC.dick !== 0 && ((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(`Let ${him} struggle`, struggle),
+		]);
+
+		function clean() {
+			const r = new SpacedTextAccumulator();
+			r.push(`You step into the running water and seat yourself in the shower, drawing ${him} into your lap. ${He} seems surprised and`);
+			if (canSee(eventSlave)) {
+				r.push(`stares at you through the steam`);
+			} else {
+				r.push(`gazes towards you`);
+			}
+			r.push(`for a moment before looking away with a blush. ${He} expects you to`);
+			if (V.PC.dick === 0) {
+				r.push(`ride ${his} wet face,`);
+			} else {
+				r.push(`insert your member into ${his} wet body,`);
+			}
+			r.push(`but finds you handing ${him} the soap instead. You gently support ${him} as ${he} washes, partaking of physical closeness and support. <span class="devotion inc">${He} has become more devoted to you.</span>`);
+			eventSlave.devotion += 4;
+			r.toParagraph();
+			return r.container();
+		}
+
+		function prostate() {
+			let didVaginal = false;
+			let didAnal = false;
+			const r = new SpacedTextAccumulator();
+			r.push(`You make no answer, entering the shower to stand over ${him} prostrate form. You reach down and grope ${him} soapy`);
+			if (V.seeRace === 1) {
+				r.push(`${eventSlave.race}`);
+			}
+			r.push(`buttocks, questing fingers moving towards ${his} asscrack.`);
+			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 finger fuck ${him} for a while, the sting of the soap on ${his} sensitive insides making ${him} gasp.`);
+			}
+			r.push(`As ${he} moans down on the shower floor, you lie down behind ${him}, spooning ${his} helpless body`);
+			if (eventSlave.belly >= 5000) {
+				r.addToLast(`, your hands encircling ${his} ${belly}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnancy`);
+				} else {
+					r.push(`middle`);
+				}
+			}
+			r.addToLast(`.`);
+			if (V.PC.dick !== 0) {
+				r.push(`Your cock slides into ${him} with ease`);
+			} else if (V.PC.boobs >= 300) {
+				r.push(`${His} soft back is delicious against your hard nipples`);
+			} else {
+				r.push(`The contours of ${his} soft rear feel lovely against your feminine petals`);
+			}
+			r.push(`and the warm water playing over your warm bodies is a comforting accompaniment to the comforting sex.`);
+			if (V.PC.dick === 0) {
+				r.push(`You ride yourself against ${his} warm wet body until you climax from the rubbing alone`);
+			} 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;
+			r.toParagraph();
+			return r.container();
+		}
+
+		function struggle() {
+			eventSlave.devotion -= 5;
+			return `${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 <span class="devotion dec">reduces ${his} devotion.</span>`;
+		}
+	}
+};
diff --git a/src/events/RESS/review/unhappyVirgin.js b/src/events/RESS/review/unhappyVirgin.js
new file mode 100644
index 0000000000000000000000000000000000000000..f117b738174a75e82c17fabdaa51fa2673b2e8b6
--- /dev/null
+++ b/src/events/RESS/review/unhappyVirgin.js
@@ -0,0 +1,140 @@
+App.Events.RESSUnhappyVirgin = class RESSUnhappyVirgin 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.rules.speech !== "restrictive",
+				canDoVaginal,
+				s => s.fetish !== "buttslut",
+				s => s.vagina === 0,
+				s => s.anus !== 0,
+				s => s.counter.oral + s.counter.vaginal + s.counter.anal > 100,
+			]
+		];
+	}
+
+	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 PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		const r = new SpacedTextAccumulator(node);
+		r.push(
+			`During a routine inspection,`,
+			contextualIntro(PC, eventSlave, "DOM"),
+			`respectfully asks a question.`,
+		);
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} uses amusingly lewd gestures to depict how frequently ${he} gets fucked, and then points to ${his} virgin pussy. ${He} communicates that ${he} wants another hole to help share the work.`);
+		} else {
+			r.push(
+				`${He} ${say}s,`,
+				Spoken(eventSlave, `"${Master}, I take a lot of dick. I try my best, but`)
+			);
+			if (canDoAnal(eventSlave)) {
+				r.push(Spoken(eventSlave, `my butt really hurts sometimes and my throat's sore, too.`));
+			} else {
+				r.push(Spoken(eventSlave, `my throat's really sore and I can't feel my tongue too well.`));
+			}
+			r.push(Spoken(eventSlave, `Can I get fucked in the pussy, to spread it out a little?"`));
+		}
+
+		r.toParagraph();
+		App.Events.addResponses(node, [
+			canDoAnal(eventSlave)
+				? new App.Events.Result(`No, and ${his} role is to suck dick and take it in the ass`, ass)
+				: new App.Events.Result(`No, and ${his} role is to suck dick and like it`, suck),
+			new App.Events.Result(`No, and ${he} shouldn't have asked`, asked),
+			new App.Events.Result(`Yes, the time has come`, yes, eventSlave.chastityVagina ? `This option will remove ${his} chastity belt` : null) // TODO: consider warning for virginity loss
+		]);
+
+		function ass() {
+			const r = new SpacedTextAccumulator();
+			r.push(`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 (V.PC.dick === 0) {
+				r.push(`strap-on`);
+			} else {
+				r.push(`dick`);
+			}
+			r.push(`up ${his} ass while making out with ${him} and playing with ${his} nipples. ${He} understands your forbearance and <span class="devotion inc">appreciates how kind ${his} ${getWrittenTitle(eventSlave)} is.</span>`);
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			r.push(VCheck.Anal(eventSlave, 1));
+			r.toParagraph();
+			return r.container();
+		}
+
+		function suck() {
+			eventSlave.devotion += 4;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			return `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 <span class="devotion inc">appreciates how kind ${his} ${getWrittenTitle(eventSlave)} is.</span>`;
+		}
+
+		function asked() {
+			const r = new SpacedTextAccumulator();
+			r.push(`Despite being allowed to ask questions ${he} should not question ${his} ${getWrittenTitle(eventSlave)}'s choices about ${his} sexual duties. To communicate the point, you`);
+			if (V.PC.dick === 0) {
+				r.push(`don a strap-on and`);
+			}
+			r.push(`order ${him} to lie on the desk, on ${his} back, with ${his} throat slack for penetration.`);
+			if (canDoAnal(eventSlave)) {
+				r.push(`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 {
+				r.push(`Only after an extended and forceful series of throatfuckings that leaves the bewildered ${SlaveTitle(eventSlave)} 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.`);
+			}
+			r.push(`As ${he} leaves, sore all over, ${he}'s <span class="devotion dec">badly confused</span> that ${he} was apparently punished for asking questions.`);
+			eventSlave.devotion -= 5;
+			if (canDoAnal(eventSlave)) {
+				r.push(VCheck.Anal(eventSlave, 1));
+				seX(eventSlave, "oral", V.PC, "penetrative");
+			} else {
+				seX(eventSlave, "oral", V.PC, "penetrative", 4);
+			}
+			r.toParagraph();
+			return r.container();
+		}
+
+		function yes() {
+			const r = new SpacedTextAccumulator();
+			r.push(`${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(eventSlave)}. You're already quite`);
+			if (V.PC.dick === 0) {
+				r.push(`turned on by the idea, so you pull on a strap-on, pull ${him} over to the couch,`);
+				if (eventSlave.chastityVagina) {
+					r.push(`unfasten ${his} chastity belt,`);
+				}
+			} else {
+				r.push(`hard, so you just lie down with ${him} on the couch,`);
+				if (eventSlave.chastityVagina) {
+					r.push(`unfasten ${his} chastity belt,`);
+				}
+			}
+			r.push(`and have gentle vaginal sex in the missionary position`);
+			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+				r.addToLast(`, your own pussy moving back and forth gently at the base of your dick as you fuck ${him}`);
+			}
+			r.addToLast(`. ${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} <span class="devotion inc">adores ${his} kind ${getWrittenTitle(eventSlave)}.</span>`);
+			eventSlave.devotion += 10;
+			eventSlave.vagina = 1;
+			seX(eventSlave, "vaginal", V.PC, "penetrative");
+			eventSlave.chastityVagina = 0;
+			if (canImpreg(eventSlave, V.PC)) {
+				r.push(knockMeUp(eventSlave, 25, 0, -1));
+			} // TODO: consider adding VCheck
+			r.toParagraph();
+			return r.container();
+		}
+	}
+};
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/nonRandom/daughters/pCoupCollaboration.js b/src/events/nonRandom/daughters/pCoupCollaboration.js
index bb2745d40143ff299fd793b4056f0fb14ed2c03c..7a7af2ec2fee6702834a1806a16279cafe2d05d1 100644
--- a/src/events/nonRandom/daughters/pCoupCollaboration.js
+++ b/src/events/nonRandom/daughters/pCoupCollaboration.js
@@ -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 98ae7bfe19003a63012389f3fe57dd73096aa204..b511961c403098ea608931cba128bf6b6c2bb626 100644
--- a/src/events/nonRandom/daughters/pCoupLoss.js
+++ b/src/events/nonRandom/daughters/pCoupLoss.js
@@ -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/randomEvent.js b/src/events/randomEvent.js
index fcd4e5f343212ff467f693da9649a14ce41420cc..1b9c9db11fff652e75d67f0660855039b0788767 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -12,6 +12,7 @@ App.Events.getIndividualEvents = function() {
 		// example: new App.Events.TestEvent(),
 		new App.Events.RESSAgeDifferenceOldPC(),
 		new App.Events.RESSAgeDifferenceYoungPC(),
+		new App.Events.RESSAgeImplant(),
 		new App.Events.RESSAmpDevoted(),
 		new App.Events.RESSAGift(),
 		new App.Events.RESSAmpResting(),
@@ -37,15 +38,22 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSDevotedVirgin(),
 		new App.Events.RESSDevotedWaist(),
 		new App.Events.RESSDickgirlPC(),
+		new App.Events.RESSDickWringing(),
+		new App.Events.RESSDiet(),
 		new App.Events.RESSEscapee(),
+		new App.Events.RESSExtremeAphrodisiacs(),
+		new App.Events.RESSFearfulBalls(),
 		new App.Events.RESSFearfulHumiliation(),
 		new App.Events.RESSForbiddenMasturbation(),
 		new App.Events.RESSFrighteningDick(),
 		new App.Events.RESSGaggedSlave(),
+		new App.Events.RESSHatesOral(),
 		new App.Events.RESSHeavyPiercing(),
 		new App.Events.RESSHeels(),
 		new App.Events.RESSHormoneDysfunction(),
 		new App.Events.RESSHotPC(),
+		new App.Events.RESSHugelyPregnant(),
+		new App.Events.RESSHugeNaturals(),
 		new App.Events.RESSHugeTits(),
 		new App.Events.RESSIgnorantHorny(),
 		new App.Events.RESSImpregnationPlease(),
@@ -55,7 +63,9 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSKitchenMolestation(),
 		new App.Events.RESSLanguageLesson(),
 		new App.Events.RESSLazyEvening(),
+		new App.Events.RESSLikeMe(),
 		new App.Events.RESSLooseButtslut(),
+		new App.Events.RESSMasterfulEntertainer(),
 		new App.Events.RESSMasterfulWhore(),
 		new App.Events.RESSMeanGirls(),
 		new App.Events.RESSMillenary(),
@@ -76,6 +86,7 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSObedientShemale(),
 		new App.Events.RESSObjectifyingVisit(),
 		new App.Events.RESSPAFlirting(),
+		new App.Events.RESSPAServant(),
 		new App.Events.RESSPassingDeclaration(),
 		new App.Events.RESSPermittedMasturbation(),
 		new App.Events.RESSPlimbHelp(),
@@ -92,7 +103,12 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSScrubbing(),
 		new App.Events.RESSServantMaid(),
 		new App.Events.RESSServeThePublicDevoted(),
+		new App.Events.RESSSexySuccubus(),
+		new App.Events.RESSShapedAreolae(),
 		new App.Events.RESSShiftDoorframe(),
+		new App.Events.RESSShiftMasturbation(),
+		new App.Events.RESSShiftSleep(),
+		new App.Events.RESSSlaveDickHuge(),
 		new App.Events.RESSSlaveOnSlaveClit(),
 		new App.Events.RESSSlaveOnSlaveDick(),
 		new App.Events.RESSSleepingAmbivalent(),
@@ -100,8 +116,10 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSSoreAss(),
 		new App.Events.RESSSuppositoryResistance(),
 		new App.Events.RESSSurgeryAddict(),
+		new App.Events.RESSTendonFall(),
 		new App.Events.RESSTooThinForCumDiet(),
 		new App.Events.RESSTrustingHG(),
+		new App.Events.RESSUnhappyVirgin(),
 		new App.Events.RESSUsedWhore(),
 		new App.Events.RESSVocalDisobedience(),
 		new App.Events.RESSWaistlineWoes(),
@@ -146,8 +164,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(),
@@ -159,6 +175,7 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESiblingRevenge(),
 		new App.Events.RERelationshipAdvice(),
 		new App.Events.RESlaveMarriage(),
+		new App.Events.RESiblingPlease(),
 	];
 };
 
@@ -214,6 +231,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(),
diff --git a/src/events/recETS/recetsAddictMotherDaughter.js b/src/events/recETS/recetsAddictMotherDaughter.js
index c572bed90f91e58021c613818f896bec5a8679c8..7d3618ce5ac6d72e670c90fab9a9b38db5e87cc7 100644
--- a/src/events/recETS/recetsAddictMotherDaughter.js
+++ b/src/events/recETS/recetsAddictMotherDaughter.js
@@ -44,7 +44,8 @@ App.Events.recetsAddictMotherDaughter = class recetsAddictMotherDaughter extends
 
 		const daughter = generateRelatedSlave(mother, "daughter");
 		daughter.origin = "You tricked $his mother into selling $him into slavery to clear addiction debts.";
-		daughter.career = App.Data.Careers.General.uneducated.random();
+		daughter.intelligenceImplant = 0;
+		daughter.career = randomCareer(daughter);
 		daughter.slaveName = daughter.birthName;
 		daughter.devotion += 10;
 		daughter.trust += 10;
diff --git a/src/events/recETS/recetsIncestTwinBrother.js b/src/events/recETS/recetsIncestTwinBrother.js
index 5b187938e006287e8a4d430832800ed208917f98..181131c5a58931ae1c0d29c258d69a1c1a18c285 100644
--- a/src/events/recETS/recetsIncestTwinBrother.js
+++ b/src/events/recETS/recetsIncestTwinBrother.js
@@ -38,15 +38,11 @@ App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.E
 		brother1.relationship = 3;
 
 		const brother2 = generateRelatedSlave(brother1, "twin");
-		brother2.slaveName = brother2.birthName;
 		brother2.height += random(-5, 5);
 		brother2.relationship = 3;
 		brother2.relationshipTarget = brother1.ID;
 		brother1.relationshipTarget = brother2.ID;
 
-		WombChangeGene(brother1, "fatherName", brother2.slaveName);
-		WombChangeGene(brother1, "motherName", brother1.slaveName);
-
 		const {
 			sister
 		} = getPronouns(brother1);
diff --git a/src/events/recETS/recetsIncestTwinsMixed.js b/src/events/recETS/recetsIncestTwinsMixed.js
index 41a173380eaf8ac05d615ea2af2cdbf192dde6d3..591ad9cb539e93ad186ff0704a109d83fda8fcb4 100644
--- a/src/events/recETS/recetsIncestTwinsMixed.js
+++ b/src/events/recETS/recetsIncestTwinsMixed.js
@@ -64,6 +64,9 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 		sis2.relationshipTarget = sis1.ID;
 		sis1.relationshipTarget = sis2.ID;
 
+		WombChangeGene(sis1, "fatherName", sis2.slaveName);
+		WombChangeGene(sis1, "motherName", sis1.slaveName);
+
 		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
diff --git a/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js b/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
index be23e9be32e16a412d38c0bcc820e136efa62ffa..fe68dc3f41f681c34e9f297983c24a3d8f2eaf8a 100644
--- a/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
+++ b/src/events/recFS/recfsFSEgyptianRevivalistAcquisition.js
@@ -35,14 +35,6 @@ App.Events.recFSEgyptianRevivalistAcquisition = class recFSEgyptianRevivalistAcq
 		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();
-		} else {
-			secondSlave.career = App.Data.Careers.General.uneducated.random();
-		}
-
 		/* they've been fucking, obviously, so no virginity */
 		if (secondSlave.dick > 0) {
 			if (slave.vagina === 0) {
diff --git a/src/events/scheduled/pitFight.js b/src/events/scheduled/pitFight.js
index 5941ebad3d0c9156866efbd9eebcd1090412c65a..287d316e53b95c29a1f8457d529feb6ae7798592 100644
--- a/src/events/scheduled/pitFight.js
+++ b/src/events/scheduled/pitFight.js
@@ -20,7 +20,7 @@ App.Events.SEPitFight = class SEPitFight extends App.Events.BaseEvent {
 		} else {
 			if (available.length > 0) {
 				// first fighter
-				if (S.Bodyguard && V.pit.bodyguardFights) {
+				if (S.Bodyguard && V.pit.fighters === 1) {
 					available.delete(S.Bodyguard.ID);
 					this.actors.push(S.Bodyguard.ID);
 				} else {
@@ -28,7 +28,7 @@ App.Events.SEPitFight = class SEPitFight extends App.Events.BaseEvent {
 				}
 
 				// second fighter
-				if (!V.pit.animal) {
+				if (V.pit.fighters !== 2) {
 					if (available.length > 0) {
 						this.actors.push(available.pluck());
 					} else {
diff --git a/src/events/scheduled/pitFightLethal.js b/src/events/scheduled/pitFightLethal.js
index 2f617c8513198c8a7fb11a82daa8ff0118809bef..6886cd313e1e116349f79f8d7f2bb409682e2f25 100644
--- a/src/events/scheduled/pitFightLethal.js
+++ b/src/events/scheduled/pitFightLethal.js
@@ -3,6 +3,8 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 	const frag = new DocumentFragment();
 
 	const animals = [];
+	/** @type {FC.AnimalState} */
+	let animal = null;
 
 	if (V.active.canine) {
 		animals.push(V.active.canine);
@@ -14,9 +16,11 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 		animals.push(V.active.feline);
 	}
 
-	const animal = V.pit.animal === 'random'
-		? animals.random()
-		: V.pit.animal;
+	if (V.pit.fighters === 2 || V.pit.slaveFightingAnimal) {
+		animal = V.pit.animal === 'random'
+			? animals.random()
+			: V.pit.animal;
+	}
 
 	let winner;
 	let loser;
@@ -35,7 +39,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 
 	intro(frag);
 	fighterDeadliness(frag, getSlave(fighters[0]));
-	if (!V.pit.animal) {
+	if (!animal) {
 		fighterDeadliness(frag, getSlave(fighters[1]));
 	}
 	fight(frag);
diff --git a/src/events/scheduled/pitFightNonlethal.js b/src/events/scheduled/pitFightNonlethal.js
index 9761f9753a33ba7be28c80d85af0c810368898ce..df7436ba77c9b7cadda67511c3a81ed0674037d2 100644
--- a/src/events/scheduled/pitFightNonlethal.js
+++ b/src/events/scheduled/pitFightNonlethal.js
@@ -3,6 +3,8 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 	const frag = new DocumentFragment();
 
 	const animals = [];
+	/** @type {FC.AnimalState} */
+	let animal = null;
 
 	if (V.active.canine) {
 		animals.push(V.active.canine);
@@ -14,9 +16,11 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 		animals.push(V.active.feline);
 	}
 
-	const animal = V.pit.animal === 'random'
-		? animals.random()
-		: V.pit.animal;
+	if (V.pit.fighters === 2 || V.pit.slaveFightingAnimal) {
+		animal = V.pit.animal === 'random'
+			? animals.random()
+			: V.pit.animal;
+	}
 
 	/** @param {App.Entity.SlaveState} slave */
 	const canRun = slave => slave.muscles > -30
@@ -44,7 +48,7 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 
 	intro(frag);
 	fighterDeadliness(frag, getSlave(fighters[0]));
-	if (!V.pit.animal) {
+	if (!animal) {
 		fighterDeadliness(frag, getSlave(fighters[1]));
 	}
 	fight(frag);
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/facilities/arcade/arcade.js b/src/facilities/arcade/arcade.js
index 23118203220425406bace710780a24d0497e4eae..01554939571b30f54a399647ee68a55624604eb8 100644
--- a/src/facilities/arcade/arcade.js
+++ b/src/facilities/arcade/arcade.js
@@ -20,7 +20,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Arcade";
 		V.encyclopedia = "Arcade";
 	}
 
@@ -100,8 +99,9 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 				property: "arcadeUpgradeInjectors",
 				tiers: [
 					{
-						value: 1,
-						base: `It is a standard arcade. It can be upgraded to either maximize the pleasure of those that visit it at the expense of the health of the inmates, or to keep them healthy (if not happy) and milk them of useful fluids.`,
+						value: 0,
+						upgraded: 1,
+						text: `It is a standard arcade. It can be upgraded to either maximize the pleasure of those that visit it at the expense of the health of the inmates, or to keep them healthy (if not happy) and milk them of useful fluids.`,
 						link: `Upgrade the arcade with invasive performance-enhancing systems`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -111,33 +111,32 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 						},
 						note: `, increases upkeep costs, and is mutually exclusive with the collectors`,
 						prereqs: [
-							() => V.arcadeUpgradeInjectors < 1,
 							() => V.arcadeUpgradeCollectors < 1,
 						],
 					},
 					{
-						value: 2,
-						base: `It has been upgraded with electroshock applicators. Whether they're enjoying themselves or not is irrelevant; they are shocked to tighten their holes regardless. You may also apply aphrodisiacs to further enhance performance.`,
-						upgraded: `It has been upgraded with aphrodisiac injection systems and electroshock applicators. If the aphrodisiacs fail to force an orgasm from an inmate, they are shocked to tighten their holes regardless.`,
+						value: 1,
+						upgraded: 2,
+						text: `It has been upgraded with electroshock applicators. Whether they're enjoying themselves or not is irrelevant; they are shocked to tighten their holes regardless. You may also apply aphrodisiacs to further enhance performance.`,
 						link: `Apply aphrodisiacs`,
-						handler: () => {
-							V.PC.skill.engineering += .1;
-
-							App.UI.reload();
-						},
+						handler: () => V.PC.skill.engineering += .1,
 						prereqs: [
-							() => V.arcadeUpgradeInjectors > 0,
 							() => V.arcadeUpgradeCollectors < 1,
 						],
 					},
+					{
+						value: 2,
+						text: `It has been upgraded with aphrodisiac injection systems and electroshock applicators. If the aphrodisiacs fail to force an orgasm from an inmate, they are shocked to tighten their holes regardless.`,
+					},
 				],
 			},
 			{
 				property: "arcadeUpgradeCollectors",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `It has been retrofitted to milk lactating slaves${V.seeDicks !== 0 ? ` and cockmilk slaves capable of ejaculating` : ``}, though less efficiently than a dedicated facility.`,
+						value: 0,
+						upgraded: 1,
+						text: `The fluids produced by the inmates here can be collected and sold.`,
 						link: `Retrofit the arcade to collect useful fluids`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -150,14 +149,19 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							() => V.arcadeUpgradeInjectors < 1,
 						],
 					},
+					{
+						value: 1,
+						text: `It has been retrofitted to milk lactating slaves${V.seeDicks !== 0 ? ` and cockmilk slaves capable of ejaculating` : ``}, though less efficiently than a dedicated facility.`,
+					},
 				],
 			},
 			{
 				property: "arcadeUpgradeHealth",
 				tiers: [
 					{
-						value: 1,
-						base: `The arcade can be upgraded to include curative injectors in order to keep inmates from succumbing under the harsh treatment. You are assured the inmates won't like their time in the arcade any better; it is purely intended to keep them functional and ready for use around the clock. It comes equipped with two settings.`,
+						value: -1,
+						upgraded: 0,
+						text: `The arcade can be upgraded to include curative injectors in order to keep inmates from succumbing under the harsh treatment. You are assured the inmates won't like their time in the arcade any better; it is purely intended to keep them functional and ready for use around the clock. It comes equipped with two settings.`,
 						link: `Install curative injectors`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -166,9 +170,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							App.UI.reload();
 						},
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.arcadeUpgradeHealth < 0,
-						],
 					},
 				],
 			},
@@ -176,8 +177,9 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 				property: "arcadeUpgradeFuckdolls",
 				tiers: [
 					{
-						value: 1,
-						base: `${capFirstChar(V.arcadeName)} is not equipped to convert inmates into standard Fuckdolls.`,
+						value: 0,
+						upgraded: 1,
+						text: `${capFirstChar(V.arcadeName)} is not equipped to convert inmates into standard Fuckdolls.`,
 						link: `Upgrade the arcade to create Fuckdolls`,
 						cost: 5000 * V.upgradeMultiplierArcology,
 						handler: () => {
@@ -186,9 +188,6 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility {
 							App.UI.reload();
 						},
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.arcadeUpgradeFuckdolls === 0,
-						],
 					},
 				],
 			},
diff --git a/src/facilities/brothel/brothel.js b/src/facilities/brothel/brothel.js
index 5cd3e2d0567fa08e90b70a3068f0c50b01e3b84c..968aef7d262110a076502a0b730854cc2ac4e857 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.`,
@@ -141,15 +140,25 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 				property: "brothelUpgradeDrugs",
 				tiers: [
 					{
-						value: 1,
-						base: `It is a standard brothel.`,
+						value: 0,
+						upgraded: 1,
+						text: `It is a standard brothel.`,
 						link: `Upgrade the brothel with aphrodisiac injection systems`,
 						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.engineering += .1,
 						note: ` and will increase upkeep costs`,
-						prereqs: [
-							() => V.brothelUpgradeDrugs === 0,
-						],
+					},
+					{
+						value: 0.1,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
+					},
+					{
+						value: 1,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
+					},
+					{
+						value: 2,
+						text: `It has been upgraded with an injection system that can keep whores horny and ready to fuck at the drop of a hat.`,
 					},
 				],
 			},
@@ -197,17 +206,17 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 					{
 						get text() {
 							const {him} = getPronouns(S.Madam);
-							return `${S.Madam.slaveName} has been instructed to ignore flaws in the whores serving under ${him}.`;
+							return `${S.Madam.slaveName} will attempt to fix flaws in whores serving under ${him}.`;
 						},
-						link: `Ignore flaws`,
+						link: `Fix flaws`,
 						value: 0,
 					},
 					{
 						get text() {
 							const {him} = getPronouns(S.Madam);
-							return `${S.Madam.slaveName} will attempt to fix flaws in whores serving under ${him}.`;
+							return `${S.Madam.slaveName} has been instructed to ignore flaws in the whores serving under ${him}.`;
 						},
-						link: `Fix flaws`,
+						link: `Ignore flaws`,
 						value: 1,
 					},
 				],
@@ -220,18 +229,18 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 				options: [
 					{
 						get text() {
-							const {he, himself} = getPronouns(S.Madam);
-							return `${S.Madam.slaveName} will not whore ${himself} out even if ${he} has time.`;
+							const {he, him, himself} = getPronouns(S.Madam);
+							return `${S.Madam.slaveName} will whore ${himself} out when ${he} doesn't have enough whores serving under ${him}.`;
 						},
-						link: `Don't serve clients`,
+						link: `Serve clients`,
 						value: 0,
 					},
 					{
 						get text() {
-							const {he, him, himself} = getPronouns(S.Madam);
-							return `${S.Madam.slaveName} will whore ${himself} out when ${he} doesn't have enough whores serving under ${him}.`;
+							const {he, himself} = getPronouns(S.Madam);
+							return `${S.Madam.slaveName} will not whore ${himself} out even if ${he} has time.`;
 						},
-						link: `Serve clients`,
+						link: `Don't serve clients`,
 						value: 1,
 					},
 				],
diff --git a/src/facilities/brothel/brothelAds.js b/src/facilities/brothel/brothelAds.js
index 1be152743ce848b53129df7f3b270cffe3aa1287..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.`);
diff --git a/src/facilities/cellblock/cellblock.js b/src/facilities/cellblock/cellblock.js
index 68436c3dd3935507c8a9b460d2f1028ee398c7da..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.`,
@@ -98,9 +97,9 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 				property: "cellblockUpgrade",
 				tiers: [
 					{
-						value: 1,
-						base: `Its compliance systems are standard.`,
-						upgraded: `Its compliance systems have been upgraded to allow slaves no mental respite, painstakingly correcting the tiniest misbehaviors to soften flaws into quirks at the cost of considerable anguish to inmates denied any rest from correction.`,
+						value: 0,
+						upgraded: 1,
+						text: `Its compliance systems are standard.`,
 						link: `Upgrade them to soften slave flaws`,
 						cost: 20000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => {
@@ -108,6 +107,10 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 							V.PC.skill.hacking += 0.1;
 						},
 					},
+					{
+						value: 1,
+						text: `Its compliance systems have been upgraded to allow slaves no mental respite, painstakingly correcting the tiniest misbehaviors to soften flaws into quirks at the cost of considerable anguish to inmates denied any rest from correction.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/clinic/clinic.js b/src/facilities/clinic/clinic.js
index ea5cab998a3fe0e3215ee61508ddc81ac8a6955d..fb3910da00f7e28414de4ad4f128d6c6cf2d8d45 100644
--- a/src/facilities/clinic/clinic.js
+++ b/src/facilities/clinic/clinic.js
@@ -18,7 +18,6 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Clinic";
 		V.encyclopedia = "Clinic";
 	}
 
@@ -99,57 +98,69 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility {
 				property: "clinicUpgradeScanner",
 				tiers: [
 					{
-						value: 1,
-						base: `It mounts powerful medical scanning technology.`,
-						upgraded: `${this.facility.nameCaps}'s scanners have been upgraded with a sampling system that can estimate carcinogenic damage to a slave's body.`,
+						value: 0,
+						upgraded: 1,
+						text: `It mounts powerful medical scanning technology.`,
 						link: `Upgrade the scanners to help detect genomic damage`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 10000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and increases the effectiveness of ${V.clinicName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps}'s scanners have been upgraded with a sampling system that can estimate carcinogenic damage to a slave's body.`,
+					},
 				],
 			},
 			{
 				property: "clinicUpgradeFilters",
 				tiers: [
 					{
-						value: 1,
-						base: `It includes standard dialysis equipment.`,
-						upgraded: `The entire floor beneath ${V.clinicName} is occupied by a huge filtration plant that constantly cycles out the patients' blood to remove impurities.`,
+						value: 0,
+						upgraded: 1,
+						text: `It includes standard dialysis equipment.`,
 						link: `Install advanced blood treatment equipment to help address drug side effects`,
-						cost: Math.trunc(50000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
-						handler: () => V.PC.skill.hacking += 0.1,
+						cost: 50000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
+						handler: () => {
+							V.PC.skill.hacking += 0.1;
+
+							App.UI.reload();
+						},
 						note: ` and increases the effectiveness of ${V.clinicName}`,
 					},
+					{
+						value: 1,
+						text: `The entire floor beneath ${V.clinicName} is occupied by a huge filtration plant that constantly cycles out the patients' blood to remove impurities.`,
+					},
 				],
 			},
 			{
 				property: "clinicUpgradePurge",
 				tiers: [
 					{
-						value: 1,
-						base: V.clinicUpgradeFilters ? `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.` : null,
+						value: 0,
+						upgraded: 1,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.`,
 						link: `Increase the effectiveness of the impurity purging`,
-						cost: Math.trunc(150000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 150000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and may cause health problems in slaves`,
 						prereqs: [
 							() => V.clinicUpgradeFilters > 0,
-							() => V.clinicUpgradePurge < 1,
 						],
 					},
 					{
-						value: 2,
-						base: V.clinicUpgradeFilters ? `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.` : null,
-						upgraded: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells. The blood is intensely cleaned to greatly decrease the presence of impurities at the cost of compatibility. Patients will likely be ill for the duration of the treatment.`,
+						value: 1,
+						upgraded: 2,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells.`,
 						link: `Further increase the effectiveness of the impurity purging by utilizing nano magnets`,
-						cost: Math.trunc(300000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier)),
+						cost: 300000 * V.upgradeMultiplierArcology * Math.min(V.upgradeMultiplierMedicine, V.HackingSkillMultiplier),
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and increases the effectiveness of ${V.clinicName}`,
-						prereqs: [
-							() => V.clinicUpgradeFilters > 0,
-							() => V.clinicUpgradePurge > 0,
-						],
+					},
+					{
+						value: 2,
+						text: `Microscopic magnets have been added to better facilitate the leeching of impurities from cells. The blood is intensely cleaned to greatly decrease the presence of impurities at the cost of compatibility. Patients will likely be ill for the duration of the treatment.`,
 						nodes: !S.Nurse
 							? [`However, without a nurse in attendance, the <span class="yellow">blood treatment equipment remains idle.</span>`]
 							: null,
diff --git a/src/facilities/club/club.js b/src/facilities/club/club.js
index 356fc76f5ef67554f676e227065de533ea5afe78..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";
 	}
 
@@ -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 {
@@ -268,14 +267,18 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 				property: "clubUpgradePDAs",
 				tiers: [
 					{
-						value: 1,
-						base: `The rooms are standard.`,
-						upgraded: `${this.facility.nameCaps} has been wired for unobtrusive personal data assistants to let your sluts pass tips about enslavable people to your recruiter.`,
+						value: 0,
+						upgraded: 1,
+						text: `The rooms are standard.`,
 						link: `Upgrade them with PDAs to help your recruiter`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier),
+						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.engineering += 0.1,
 						note: ` and will increase upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been wired for unobtrusive personal data assistants to let your sluts pass tips about enslavable people to your recruiter.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/club/clubAdvertisement.js b/src/facilities/club/clubAdvertisement.js
index a0646b53b2c297bf2ef11ef511525b841d18ff19..9b0036b238fb17a3079afe73f1f52d172aad86c2 100644
--- a/src/facilities/club/clubAdvertisement.js
+++ b/src/facilities/club/clubAdvertisement.js
@@ -128,7 +128,7 @@ App.Facilities.Club.ads = function() {
 		}
 		if (V.seePreg === 1) {
 			if (V.clubAdsPreg === 1) {
-				r.push(`Most of strippers have firm, rounded bellies.`);
+				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 {
diff --git a/src/facilities/dairy/freeRangeDairyAssignmentScene.js b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
index 4e8a41577862b1d8e939530121e010134daeb224..2cce90b7af17277dc28f46a85268f674604d549f 100644
--- a/src/facilities/dairy/freeRangeDairyAssignmentScene.js
+++ b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
@@ -478,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 7af753cbc09e66b6c32b27d184186af1348ae73b..5ed236cdd06f7ba53ee4ff02deea53f6f49da532 100644
--- a/src/facilities/dairy/industrialDairyAssignmentScene.js
+++ b/src/facilities/dairy/industrialDairyAssignmentScene.js
@@ -493,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`);
@@ -504,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 3de4088de3242efd01390a8d85893508c8c24fc8..d9011d4d686a7957c610c801368aa04f6fcf7aed 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -52,7 +52,6 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Farmyard";
 		V.encyclopedia = "Farmyard";
 	}
 
@@ -138,11 +137,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "pump",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
-						upgraded: `The water pump in ${V.farmyardName} is a more efficient model, slightly improving the amount of crops it produces.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
 						link: `Upgrade the water pump`,
-						cost: Math.trunc(5000 * V.upgradeMultiplierArcology),
+						cost: 5000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -150,6 +149,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 						},
 						note: ` and slightly decreases upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is currently using the basic water pump that it came with.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -157,10 +160,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "fertilizer",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is using a higher-quality fertilizer, moderately increasing the amount of crops it produces and slightly raising upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The fertilizer being used in ${this.facility.name} is the cheap, buy-in-bulk stuff you can purchase at the local supermarket.`,
 						link: `Use a higher-quality fertilizer`,
-						cost: Math.trunc(10000 * V.upgradeMultiplierArcology),
+						cost: 10000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -171,6 +175,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.pump > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using a specialized fertilizer created to result in a higher crop yield.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -178,10 +186,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "hydroponics",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus moderately reducing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `There is room enough in ${this.facility.name} to install a hydroponics system for irrigation.`,
 						link: `Purchase an advanced hydroponics system`,
-						cost: Math.trunc(20000 * V.upgradeMultiplierArcology),
+						cost: 20000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -192,6 +201,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.fertilizer > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus saving a bit on your water bill.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -199,10 +212,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "seeds",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `${this.facility.nameCaps} is using genetically modified seeds, significantly increasing the amount of crops it produces and moderately increasing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The seeds ${this.facility.name} is using are the standard seeds one could pick up at the local farmers' market.`,
 						link: `Purchase genetically modified seeds`,
-						cost: Math.trunc(25000 * V.upgradeMultiplierArcology),
+						cost: 25000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -213,6 +227,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.hydroponics > 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using genetically modified seeds, designed to produce a much greater yield while remaining more resistant to pests and disease.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
@@ -220,10 +238,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				property: "machinery",
 				tiers: [
 					{
-						value: 1,
-						upgraded: `The machinery in ${V.farmyardName} has been upgraded and is more efficient, significantly increasing crop yields and significantly decreasing upkeep costs.`,
+						value: 0,
+						upgraded: 1,
+						text: `The machinery in ${this.facility.name} is equipment that was imported before the old world began to fall apart and is fairly old and outdated.`,
 						link: `Upgrade the machinery`,
-						cost: Math.trunc(50000 * V.upgradeMultiplierArcology),
+						cost: 50000 * V.upgradeMultiplierArcology,
 						handler: () => {
 							V.PC.skill.engineering += 0.1;
 
@@ -234,6 +253,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 							() => V.farmyardUpgrades.seeds > 0
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is using the latest in farming equipment and technology.`,
+					},
 				],
 				object: V.farmyardUpgrades,
 			},
diff --git a/src/facilities/headGirlSuite/headGirlSuite.js b/src/facilities/headGirlSuite/headGirlSuite.js
index 6cf8dd1ac3880a9078119b5c0924a108b0b97449..c47653f56f4b2d04c799f39daee4debf10729d97 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];
@@ -39,6 +38,14 @@ App.Facilities.HGSuite.headGirlSuite = class HeadGirlSuite extends App.Facilitie
 		return text.join(' ');
 	}
 
+	/** @returns {FC.Facilities.Expand} */
+	get expand() {
+		return {
+			maximum: 1,
+			unexpandable: true,
+		};
+	}
+
 	/** @returns {FC.Facilities.Rule[]} */
 	get rules() {
 		if (S.HeadGirl) {	// only display rules if a Headgirl is assigned
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 f267652e9c420ecf0f6e94304a626c259303676c..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.`,
@@ -267,9 +266,9 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				property: "masterSuiteUpgradeLuxury",
 				tiers: [
 					{
-						value: 1,
-						base: `The master suite is a fairly standard room, albeit a much larger and more luxurious one.`,
-						upgraded: `The large bed in the center of the room has been replaced with one that is nothing short of massive.`,
+						value: 0,
+						upgraded: 1,
+						text: `The master suite is a fairly standard room, albeit a much larger and more luxurious one.`,
 						link: `Refit the suite to the height of traditional opulence`,
 						cost: V.masterSuiteUpgradeLuxury === 0
 							? 25000 * V.upgradeMultiplierArcology
@@ -278,8 +277,13 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						note: ` and will focus the suite on you`,
 					},
 					{
-						value: 2,
-						upgraded: `A large, recessed space has been built in the center of the room where slaves can spend their days fucking each other.`,
+						value: 1,
+						text: `The large bed in the center of the room has been replaced with one that is nothing short of massive.`,
+					},
+					{
+						value: 0,
+						upgraded: 2,
+						text: ``,
 						link: `Remodel the suite around a luxurious pit for group sex`,
 						cost: V.masterSuiteUpgradeLuxury === 0
 							? 25000 * V.upgradeMultiplierArcology
@@ -287,22 +291,34 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						handler: () => V.PC.skill.engineering += .1,
 						note: ` and will encourage fucktoys to fuck each other`,
 					},
+					{
+						value: 2,
+						text: `A large, recessed space has been built in the center of the room where slaves can spend their days fucking each other.`,
+					},
 				],
 			},
 			{
 				property: "masterSuiteUpgradePregnancy",
 				tiers: [
 					{
-						value: 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.`,
+					},
 				],
 			},
 		];
@@ -321,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/nursery.js b/src/facilities/nursery/nursery.js
new file mode 100644
index 0000000000000000000000000000000000000000..a03f4d60b00dc19b878f65a284049a29de1a26f3
--- /dev/null
+++ b/src/facilities/nursery/nursery.js
@@ -0,0 +1,769 @@
+App.Facilities.Nursery.nursery = class Nursery extends App.Facilities.Facility {
+	constructor() {
+		const nursery = App.Entity.facilities.nursery;
+		const decommissionHandler = () => {
+			V.nursery = 0;
+			V.nurseryDecoration = "standard";
+			V.nurseryNannies = 0;
+			V.nannyInfluence = 0;
+			V.cribs = [];
+		};
+
+		super(
+			nursery,
+			decommissionHandler,
+		);
+
+		V.nextButton = "Back to Main";
+		V.nextLink = "Main";
+		V.encyclopedia = "Nursery";
+	}
+
+	/** @returns {string} */
+	get intro() {
+		// TODO: add in effects based on number of children hosted
+		const text = [];
+
+		text.push(this.facility.nameCaps, this.decorations);
+
+		if (this.facility.hostedSlaves > 2) {
+			text.push(`${this.facility.nameCaps} is bustling with activity. Nannies are busily moving about, feeding babies and changing diapers.`);
+		} else if (this.facility.hostedSlaves > 0) {
+			text.push(`${this.facility.nameCaps} is working steadily. Nannies are moving about, cleaning up and feeding hungry children.`);
+		} else if (S.Matron) {
+			text.push(`${S.Matron.slaveName} is alone in ${this.facility.name}, and keeps the place clean and looks after the children ${getPronouns(S.Matron).himself}.`);
+		} else {
+			text.push(`${this.facility.nameCaps} is empty and quiet.`);
+		}
+
+		return text.join(' ');
+	}
+
+	/** @returns {string} */
+	get decorations() {
+		/** @type {FC.Facilities.Decoration} */
+		const FS = {
+			"Roman Revivalist": `is run with the Roman dream in mind, with wide open windows exposing the babies to the elements. The sleek marble halls bring a sense of serenity and duty as wet nurses wander the halls.`,
+			"Neo-Imperialist": `is modeled as an ultra high-tech nursing area, with omnipresent advanced machinery monitoring every heartbeat of the babies within, the soft glow of machines pulsating against the banners of your family crest lining the walls.`,
+			"Aztec Revivalist": `is lined head to toe in illustrious Aztec gold. Tiny but notable subscripts lay in plaques to honor the mothers who died giving birth, the children of said mothers, alive or dead, are tirelessly watched over to tend to their every need.`,
+			"Egyptian Revivalist": `is decorated by sleek, sandstone tablets, golden statues, and even grander Egyptian wall sculptures, many of them depicting the conception, birth, and raising of a child. Each babe is reverently wrapped in linen covers as they drift to sleep to the stories of mighty pharaohs and prosperous palaces.`,
+			"Edo Revivalist": `is minimalist in nature, but the errant paintings of cherry blossoms and vibrant Japanese maples give a certain peaceful air as the caretakers do their duties.`,
+			"Arabian Revivalist": `is decorated wall to wall with splendorous carvings and religious Hamsas meant to protect the fostering children.`,
+			"Chinese Revivalist": `is ripe with Chinese spirit. Depictions of colorful dragons and oriental designs grace the halls, rooms, and cribs of the babies who reside inside.`,
+			"Chattel Religionist": `is decorated with childish religious cartoons and artistic tapestries of slaves bowing in submission, their themes always subsiding varying degrees of sexual worship. The caretakers that wander the halls obediently wear their habits, and never waste a moment to tenderly lull the children to sleep with stories of their prophet.`,
+			"Degradationist": `is bare and sullen. The cries of the neglected children destined for slavery trying to find comfort in their burlap coverings echo the halls, while those that await freedom are raised among luxury and are taught to look down on their less fortunate peers.`,
+			"Repopulationist": `is designed to be very open and public; a showing testament to your arcology's repopulation efforts. For those old enough to support them, they are strapped with big, but body warming, empathy bellies as to remind them of their destiny.`,
+			"Eugenics": `is of utmost quality without a single pleasantry missing — if the parents are of the elite blood of course. While there are rare stragglers of unworthy genes, the child populace overall is pampered with warm rooms and plentiful small toys.`,
+			"Asset Expansionist": `is not so much decorated as it is intelligently staffed. Every passerby, slave or not, burns the image of their jiggling asses and huge, wobbling tits into the minds of the children.`,
+			"Transformation Fetishist": `is kept simple and clean. From their toys down to the nursemaids, the babies are exposed to the wonders of body transformation whenever possible.`,
+			"Gender Radicalist": `is decorated by cheery cartoon depictions of slaves of many shapes, sizes, and genitals, all of them undeniably feminine. The elated smiles and yips of the nurses getting reamed constantly instill the appreciation of nice, pliable buttholes.`,
+			"Gender Fundamentalist": `is simply designed and painted with soft feminine colors. The staff heavily encourage the children to play dress up and house, subtly sculpting their minds to proper gender norms and properly put them in line if they try to do otherwise.`,
+			"Physical Idealist": `is furnished with kiddy health books and posters; their caretakers making painstakingly sure that the importance is drilled into their heads at a young age. Their food is often littered with vitamins and supplements to keep the children growing strong.`,
+			"Supremacist": `is designed and structured to give those of ${V.arcologies[0].FSSupremacistRace} ethnicity the limelight of the nursery, while the others stay sectioned off and neglected to the world.`,
+			"Subjugationist": `is made to foster and raise the young children of ${V.arcologies[0].FSSubjugationistRace} ethnicity. They are reminded of their place with every failure and are encouraged to submissively follow their stereotypes at a ripe young age.`,
+			"Paternalist": `is well-stocked and by Paternalistic customs, constantly swaddle the children with love and attention. With the warm colors and sound of child laughter, to the untrained eye, the children actually seem free.`,
+			"Pastoralist": `is decorated to make the children grow up thinking that a life focused on breast milk, cum, and other human secretions are part of the norm. The milky tits swaying above their cow-patterned cribs certainly help with that.`,
+			"Maturity Preferentialist": `decorations remind the kids to respect those curvy and mature. The older nurserymaids are always flattered whenever the children try to act like adults and take care of the younger toddlers for them.`,
+			"Youth Preferentialist": `is making young children the center of attention, their rooms supplied with plenty of toys, blankets, and surrogate mothers at their beck and call.`,
+			"Body Purist": `is decorated to be very clean cut and sterilized with perfect corners and curves; symbolic of the human figure. Nursery maids are encouraged to show off their natural assets to show the children what the appropriate body should be.`,
+			"Slimness Enthusiast": `constantly encourages the kids to try and keep their slim and cute physiques. They are given perfectly metered meals to make this possible.`,	// TODO: tie this in to food system
+			"Hedonistic": `would make any toddler drool in amazement. Meals and naps every other hour, cribs stalked with toys and blankets, and plush slaves carry them to and fro without preamble. A delicious layer of baby fat is the ideal figure of a baby, and they couldn't be happier.`,
+			"Intellectual Dependency": ``,	// TODO:
+			"Slave Professionalism": ``,	// TODO:
+			"Petite Admiration": `has large photos and paintings on the walls depicting small, petite children enjoying ${this.facility.name}'s amenities and having fun together.`,
+			"Statuesque Glorification": `has large photos and paintings on the walls depicting tall children enjoying ${this.facility.name}'s amenities and having fun together.`,
+			"standard": `is as comfortable and child-friendly as it needs to be. They have everything they need to grow into a proper slave.`,
+			"": ``,
+		};
+
+		const res = FS[V.nurseryDecoration];
+
+		if (!res) {
+			throw new Error(`Unknown V.nurseryDecoration value of '${V.nurseryDecoration}' found in decorations().`);
+		}
+
+		return res;
+	}
+
+	/** @returns {FC.Facilities.Expand} */
+	get expand() {
+		const slaves = this.facility.hostedSlaves;
+		const nannies = numberWithPluralOne(V.nurseryNannies, 'nanny', 'nannies');
+
+		return {
+			amount: 1,
+			desc: `${this.facility.nameCaps} has room to support ${num(V.nurseryNannies)} ${nannies}. There ${slaves === 1 ? `is` : `are`} currently ${nannies} taking care of ${numberWithPlural(V.nurseryChildren, 'child', 'children')}.`,
+			maximum: 5,
+		};
+	}
+
+	/** @returns {FC.IUpgrade[]} */
+	get upgrades() {
+		return [
+			{
+				property: "nurseryWeight",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} has only the most basic monitoring systems available.`,
+						link: `Upgrade the monitoring system`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `The monitoring systems have been upgraded and allow for monitoring children's food intakes.`,
+					},
+				],
+			},
+			{
+				property: "nurseryMuscles",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `There is space in one part of ${this.facility.name} where a playground and different toys and equipment could be installed to keep children fit and healthy.`,
+						link: `Install a playground`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `A playground and various toys and equipment have been installed in one part of ${this.facility.name}.`,
+					},
+				],
+			},
+			{
+				property: "nurseryHormones",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} doesn't have any sort of artificial hormones designed for children.`,
+						link: `Invest in purpose-built hormones`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `Hormones designed specifically for children have been developed for ${this.facility.name}.`,
+					},
+				],
+			},
+		];
+	}
+
+	/** @returns {FC.Facilities.Rule[]}*/
+	get rules() {
+		return [
+			{
+				property: "MatronIgnoresFlaws",
+				prereqs: [
+					() => !!S.Matron,
+				],
+				options: [
+					{
+						get text() { return `${S.Matron.slaveName} has been instructed to ignore flaws in the nannies serving under ${getPronouns(S.Matron).him}.`; },
+						link: `Ignore flaws`,
+						value: 1,
+					},
+					{
+						get text() { return `${S.Matron.slaveName} will attempt to fix flaws in nannies serving under ${getPronouns(S.Matron).him}.`; },
+						link: `Fix flaws`,
+						value: 0,
+					},
+				],
+			},
+			{
+				property: "nurserySex",
+				prereqs: [
+					() => !!V.extremeUnderage,
+				],
+				options: [
+					{
+						get text() { return `${capFirstChar(V.nurseryName)} staff are not allowed to molest the children.`; },
+						link: `Forbid`,
+						value: 0,
+					},
+					{
+						get text() { return `${capFirstChar(V.nurseryName)} staff are allowed to molest the children.`; },
+						link: `Allow`,
+						value: 1,
+					},
+				],
+			},
+			// TODO: really not happy with most of these – rework these
+			{
+				property: "nurseryWeightSetting",
+				prereqs: [
+					() => !!V.nurseryWeight,
+				],
+				options: [
+					{
+						get text() { return `Food intake is not being managed; children may end up malnourished.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Food intake is being managed; children will be raised at a healthy weight.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+			{
+				property: "nurseryMusclesSetting",
+				prereqs: [
+					() => !!V.nurseryMuscles,
+				],
+				options: [
+					{
+						get text() { return `Children are not getting any exercise; they may end up quite weak and frail.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Exercise is being managed; children will be raised with average fitness.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+			{
+				property: "nurseryHormonesSetting",
+				prereqs: [
+					() => !!V.nurseryHormones,
+				],
+				options: [
+					{
+						get text() { return `Artificial hormones are not being given; children will undergo normal puberty.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Artificial hormone levels are being managed; children may experience precocious puberty.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+		];
+	}
+
+	/** @returns {HTMLDivElement} */
+	get mothers() {
+		const div = document.createElement("div");
+
+		const text = [];
+
+		let childrenReserved = 0;
+
+		text.push(`Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of ${V.nursery} rooms, ${numberWithPlural(V.nursery - V.nurseryChildren, 'is', 'are')} unoccupied. Of those, ${numberWithPlural(FetusGlobalReserveCount("nursery"), 'room is', 'rooms are')} reserved.`);
+
+		App.Events.addNode(div, text);
+
+		const refreshDiv = document.createElement("div");
+		refreshDiv.append(content());
+		div.append(refreshDiv);
+
+		return div;
+
+		function content() {
+			const div = document.createElement("div");
+
+			div.append(
+				sort(),
+				mothers(),
+			);
+
+			return div;
+		}
+
+		function sort() {
+			const div = document.createElement("div");
+
+			const sorts = [];
+			let sort = 'Unsorted';
+
+			sorts.push(App.UI.DOM.link(`Sort by Name`, () => {
+				sort = 'Name';
+				sortNurseryPossiblesByName();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Reserved Nursery Spots`, () => {
+				sort = 'Reserved Nursery Spots';
+				sortNurseryPossiblesByReservedSpots();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Pregnancy Week`, () => {
+				sort = 'Pregnancy Week';
+				sortNurseryPossiblesByPregnancyWeek();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Number of Children`, () => {
+				sort = 'Number of Children';
+				sortNurseryPossiblesByPregnancyCount();
+			}));
+
+			div.append(
+				`Sorting: ${sort}`,
+				App.UI.DOM.generateLinksStrip(sorts),
+			);
+
+			return div;
+		}
+
+		function mothers() {
+			const el = new DocumentFragment();
+			let r = [];
+			let eligibility = 0;
+			let linkArray;
+			const reservedChildren = FetusGlobalReserveCount("incubator");
+			const incubatorSlaves = V.incubator.tanks.length;
+			const freeTanks = V.incubator.capacity - incubatorSlaves;
+			r.push(`Reserve an eligible mother-to-be's child to be placed in a tank upon birth. Of ${V.incubator.capacity} tanks, ${freeTanks}`);
+			if (freeTanks === 1) {
+				r.push(`is`);
+			} else {
+				r.push(`are`);
+			}
+			r.push(`unoccupied. Of those, ${reservedChildren}`);
+			if (reservedChildren === 1) {
+				r.push(`tank is`);
+			} else {
+				r.push(`tanks are`);
+			}
+			r.push(`reserved.`);
+			App.Events.addNode(el, r, "div");
+
+			const sortingOptions = new Map([
+				["Name", "data-name"],
+				["Reserved Incubator Spots", "data-reserved-spots"],
+				["Pregnancy Week", "data-preg-week"],
+				["Number of Children", "data-preg-count"],
+			]);
+
+			if (V.slaves.length > 0) {
+			/**
+			 * @param {Map<string, string>} sortingOptions
+			 */
+				const sortingBarFunc = function(sortingOptions) {
+					const el = new DocumentFragment();
+					App.UI.DOM.appendNewElement("span", el, "Sorting: ", "note");
+					const linkArray = [];
+					for (const [title, attr] of sortingOptions) {
+						if (V.sortIncubatorList === title) {
+							linkArray.push(App.UI.DOM.makeElement("span", title, "bold"));
+						} else {
+							linkArray.push(
+								App.UI.DOM.link(
+									title,
+									() => {
+										V.sortIncubatorList = title;
+										sortBy(attr);
+										jQuery(sortingBar).empty().append(sortingBarFunc(sortingOptions));
+									}
+								)
+							);
+						}
+					}
+					el.append(App.UI.DOM.generateLinksStrip(linkArray));
+					return el;
+				};
+
+				const sortingBar = document.createElement("div");
+				sortingBar.classList.add("incubator-underscore");
+
+				V.sortIncubatorList = V.sortIncubatorList || 'Unsorted';
+				sortingBar.append(sortingBarFunc(sortingOptions));
+				el.append(sortingBar);
+			}
+
+			const qlIncubator = document.createElement("div");
+			for (const slave of V.slaves) {
+				if (slave.preg > 0 && slave.pregKnown === 1 && slave.eggType === "human") {
+					const r = [];
+					const reserveDisallowed = (slave.assignment === "work in the dairy" && V.dairyPregSetting > 0) || slave.assignment === "be your agent" || slave.assignment === "live with your agent";
+					if (!reserveDisallowed) {
+						const {
+							His, his
+						} = getPronouns(slave);
+						const freeTanks = V.incubator.capacity - incubatorSlaves;
+						const WL = slave.womb.length;
+						const reservedIncubator = WombReserveCount(slave, "incubator");
+						const reservedNursery = WombReserveCount(slave, "nursery");
+						const momEl = document.createElement("p");
+						momEl.id = "slave-" + slave.ID;
+						momEl.classList.add("possible");
+
+						momEl.setAttribute("data-preg-count", slave.womb.length.toString());
+						momEl.setAttribute("data-reserved-spots", reservedIncubator.toString());
+						momEl.setAttribute("data-preg-week", slave.pregWeek.toString());
+						momEl.setAttribute("data-name", SlaveFullName(slave));
+
+						linkArray = [];
+						const choices = document.createElement("div");
+						choices.classList.add("choices");
+						r.push(App.UI.DOM.slaveDescriptionDialog(slave));
+						r.push(`is ${slave.pregWeek} ${(slave.pregWeek === 1) ? `week` : `weeks`} pregnant with`);
+						if (slave.pregSource === 0 || slave.preg <= 5) {
+							r.push(`someone's${(slave.preg <= 5) ? `, though it is too early to tell whose,` : ``}`);
+						} else if (slave.pregSource === -1) {
+							r.push(`your`);
+						} else if (slave.pregSource === -2) {
+							r.push(`a citizen's`);
+						} else if (slave.pregSource === -3) {
+							r.push(`your Master's`);
+						} else if (slave.pregSource === -4) {
+							r.push(`another arcology owner's`);
+						} else if (slave.pregSource === -5) {
+							r.push(`your client's`);
+						} else if (slave.pregSource === -6) {
+							r.push(`the Societal Elite's`);
+						} else if (slave.pregSource === -7) {
+							r.push(`the lab's`);
+						} else if (slave.pregSource === -9) {
+							r.push(`the Futanari Sisters'`);
+						} else {
+							const father = getSlave(slave.pregSource);
+							if (father) {
+								r.push(`${father.slaveName}'s`);
+							} else if (WL === 1) {
+								r.push("a");
+							}
+						}
+						if (WL > 1) {
+							r.push(`${WL} babies.`);
+						} else {
+							r.push(`baby.`);
+						}
+						if (reservedIncubator > 0) {
+							childrenReserved = 1;
+							if (WL === 1) {
+								r.push(`${His} child`);
+							} else if (reservedIncubator < WL) {
+								r.push(`${reservedIncubator} of ${his} children`);
+							} else if (WL === 2) {
+								r.push(`Both of ${his} children`);
+							} else {
+								r.push(`All ${reservedIncubator} of ${his} children`);
+							}
+							r.push(`will be placed in ${V.incubator.name}.`);
+							if ((reservedIncubator + reservedNursery < WL) && (reservedChildren < freeTanks)) {
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep another child`,
+										() => {
+											WombAddToGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if (reservedIncubator > 0) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep one less child`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 1);
+												refresh();
+											}
+										)
+									);
+								}
+								if (reservedIncubator > 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep none of ${his} children`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+								if ((reservedChildren + WL - reservedIncubator) <= freeTanks) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep the rest of ${his} children`,
+											() => {
+												WombAddToGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							} else if ((reservedIncubator === WL) || (reservedChildren === freeTanks) || (reservedIncubator + reservedNursery === WL)) {
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep one less child`,
+										() => {
+											WombCleanGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if (reservedIncubator > 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep none of ${his} children`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							}
+						} else if (reservedChildren < freeTanks) {
+							if (WL - reservedNursery === 0) {
+								r.push(App.UI.DOM.makeElement("span", `${His} children are already reserved for ${V.nurseryName}`, "note"));
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep ${his} ${((WL > 1) ? "children" : "child")} here instead`,
+										() => {
+											WombChangeReserveType(slave, 'nursery', 'incubator');
+											refresh();
+										}
+									)
+								);
+							} else {
+								r.push(`You have `);
+								if (freeTanks === 1) {
+									r.push(`an <span class="lime">available aging tank.</span>`);
+								} else {
+									r.push(`<span class="lime">available aging tanks.</span>`);
+								}
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									if (V.pregnancyMonitoringUpgrade === 1) {
+										linkArray.push(
+											App.UI.DOM.link(
+												`Inspect pregnancy`,
+												() => {
+													V.AS = slave.ID;
+												},
+												[],
+												`Analyze Pregnancy`
+											)
+										);
+									}
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep ${(WL > 1) ? "a" : "the"} child`,
+										() => {
+											WombAddToGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if ((WL > 1) && (reservedChildren + WL - reservedIncubator) <= freeTanks) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep all of ${his} children`,
+											() => {
+												WombAddToGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							}
+						} else if (reservedChildren === freeTanks) {
+							if (V.pregnancyMonitoringUpgrade === 1) {
+								linkArray.push(
+									App.UI.DOM.link(
+										`Inspect pregnancy`,
+										() => {
+											V.AS = slave.ID;
+										},
+										[],
+										`Analyze Pregnancy`
+									)
+								);
+							}
+							const noRoom = new DocumentFragment();
+							noRoom.append(`You have `);
+							App.UI.DOM.appendNewElement("span", noRoom, `no room for ${his} offspring.`, "red");
+							linkArray.push(noRoom);
+						}
+						eligibility = 1;
+
+						App.Events.addNode(momEl, r, "div");
+						choices.append(App.UI.DOM.generateLinksStrip(linkArray));
+						momEl.append(choices);
+						qlIncubator.append(momEl);
+					}
+				}
+			}
+			sortByPreviousSort();
+			el.append(qlIncubator);
+			if (eligibility === 0) {
+				App.UI.DOM.appendNewElement("div", el, `You have no pregnant slaves bearing eligible children.`, "note");
+			}
+
+			if (reservedChildren !== 0 || childrenReserved === 1) { // the oops I made it go negative somehow button
+				App.UI.DOM.appendNewElement(
+					"div",
+					el,
+					App.UI.DOM.link(
+						"Clear all reserved children",
+						() => {
+							for (const slave of V.slaves) {
+								if (WombReserveCount(slave, "incubator") !== 0) {
+									WombCleanGenericReserve(slave, 'incubator', 9999);
+								}
+							}
+							WombCleanGenericReserve(V.PC, 'incubator', 9999);
+							refresh();
+						}
+					)
+				);
+			}
+			return el;
+
+			function refresh() {
+				App.UI.reload();
+			}
+
+			function sortBy(attrName) {
+				let sortedIncubatorPossibles = $(qlIncubator).children('p.possible').detach();
+				sortedIncubatorPossibles = sortDomObjects(sortedIncubatorPossibles, attrName);
+				$(sortedIncubatorPossibles).appendTo(qlIncubator);
+			}
+
+			function sortByPreviousSort() {
+				const sortAttr = sortingOptions.get(V.sortIncubatorList);
+				if (sortAttr) {
+					sortBy(sortAttr);
+				}
+			}
+		}
+	}
+
+	/** @returns {HTMLDivElement} */
+	get children() {
+		const div = document.createElement("div");
+
+		div.append(App.Facilities.Nursery.childList());
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement} */
+	get targetAge() {
+		const div = document.createElement("div");
+
+		const links = [
+			App.UI.DOM.link(`Minimum Legal Age`, () => {
+				V.targetAgeNursery = V.minimumSlaveAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Average Age of Fertility`, () => {
+				V.targetAgeNursery = V.fertilityAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Average Age of Potency`, () => {
+				V.targetAgeNursery = V.potencyAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Legal Adulthood`, () => {
+				V.targetAgeNursery = 18;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+		];
+
+		div.append(
+			`Target age for release: `,
+			App.UI.DOM.makeTextBox(V.targetAgeNursery, target => {
+				V.targetAgeNursery = target;
+
+				App.UI.reload();
+			})
+		);
+
+		App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(links), ['indent']);
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement} */
+	get rooms() {
+		const div = document.createElement("div");
+
+		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
+		const links = [];
+
+		div.append(`It can support ${numberWithPlural(V.nursery, 'child', 'children')}. There ${numberWithPlural(V.nurseryChildren, 'is', 'are')} currently ${numberWithPlural(V.nurseryChildren, 'room')} in use in ${this.facility.name}.`);
+
+		links.push(App.UI.DOM.link(`Add room for another 5 children`, () => {
+			cashX(forceNeg(cost), "nursery");
+			V.nursery += 5;
+
+			App.UI.reload();
+		}, [], '', `Costs ${cashFormat(cost)} and will increase upkeep costs.`));
+
+		if (V.nursery > 1 && FetusGlobalReserveCount("nursery") < V.nursery - V.nurseryChildren) {
+			links.push(App.UI.DOM.link(`Remove a room`, () => {
+				cashX(forceNeg(cost / 5), "nursery");
+				V.nursery -= 5;
+
+				App.UI.reload();
+			}, [], '', `Costs ${cashFormat(cost / 5)} and will decrease upkeep costs.`));
+		}
+
+		App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(links), ['indent']);
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement[]} */
+	get customNodes() {
+		return [
+			this.mothers,
+			this.children,
+			this.targetAge,
+			this.rooms,
+		];
+	}
+};
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
deleted file mode 100644
index af80183f2710526ecbd22b4a3f0139ff92aedad6..0000000000000000000000000000000000000000
--- a/src/facilities/nursery/nursery.tw
+++ /dev/null
@@ -1,405 +0,0 @@
-:: Nursery [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Nursery", $encyclopedia = "Nursery">>
-<<set $targetAgeNursery = Number($targetAgeNursery) || $minimumSlaveAge>>
-<<set $targetAgeNursery = Math.clamp($targetAgeNursery, $minimumSlaveAge, 42)>>
-
-<<set $nurseryChildren = $cribs.length, _freecribs = $nursery - $nurseryChildren, _NL = App.Entity.facilities.nursery.employeesIDs().size, _SL = $slaves.length, _eligibility = 0, _reservedChildren = FetusGlobalReserveCount("incubator"), _reservedChildrenNursery = FetusGlobalReserveCount("nursery")>>
-<p class="scene-intro">
-	<<set _nurseryNameCaps = capFirstChar($nurseryName)>>
-	_nurseryNameCaps
-	<<switch $nurseryDecoration>>
-		<<case "Roman Revivalist">>
-			is run with the Roman dream in mind, with wide open windows exposing the babies to the elements. The sleek marble halls bring a sense of serenity and duty as wet nurses wander the halls.
-		<<case "Neo-Imperialist">>
-			is modeled as an ultra high-tech nursing area, with omnipresent advanced machinery monitoring every heartbeat of the babies within, the soft glow of machines pulsating against the banners of your family crest lining the walls.
-		<<case "Aztec Revivalist">>
-			is lined head to toe in illustrious Aztec gold. Tiny but notable subscripts lay in plaques to honor the mothers who died giving birth, the children of said mothers, alive or dead, are tirelessly watched over to tend to their every need.
-		<<case "Egyptian Revivalist">>
-			is decorated by sleek, sandstone tablets, golden statues, and even grander Egyptian wall sculptures, many of them depicting the conception, birth, and raising of a child. Each babe is reverently wrapped in linen covers as they drift to sleep to the stories of mighty pharaohs and prosperous palaces.
-		<<case "Edo Revivalist">>
-			is minimalistic in nature, but the errant paintings of cherry blossoms and vibrant Japanese maples give a certain peaceful air as the caretakers do their duties.
-		<<case "Arabian Revivalist">>
-			is decorated wall to wall with splendorous carvings and religious Hamsas meant to protect the fostering children.
-		<<case "Chinese Revivalist">>
-			is ripe with Chinese spirit. Depictions of colorful dragons and oriental designs grace the halls, rooms, and cribs of the babies who reside inside.
-		<<case "Chattel Religionist">>
-			is decorated with childish religious cartoons and artistic tapestries of slaves bowing in submission, their themes always subsiding varying degrees of sexual worship. The caretakers that wander the halls obediently wear their habits, and never waste a moment to tenderly lull the children to sleep with stories of their prophet.
-		<<case "Degradationist">>
-			is bare and sullen. The cries of the neglected children destined for slavery trying to find comfort in their burlap coverings echo the halls, while those that await freedom are raised among luxury and are taught to look down on their less fortunate peers.
-		<<case "Repopulationist">>
-			is designed to be very open and public; a showing testament to your arcology's repopulation efforts. For those old enough to support them, they are strapped with big, but body warming, empathy bellies as to remind them of their destiny.
-		<<case "Eugenics">>
-			is of utmost quality without a single pleasantry missing — if the parents are of the elite blood of course. While there are rare stragglers of unworthy genes, the child populace overall is pampered with warm rooms and plentiful small toys.
-		<<case "Asset Expansionist">>
-			is not so much decorated as it is intelligently staffed. Every passerby, slave or not, burns the image of their jiggling asses and huge, wobbling tits into the minds of the children.
-		<<case "Transformation Fetishist">>
-			is kept simple and clean. From their toys down to the nursemaids, the babies are exposed to the wonders of body transformation whenever possible.
-		<<case "Gender Radicalist">>
-			is decorated by cheery cartoon depictions of slaves of many shapes, sizes, and genitals, all of them undeniably feminine. The elated smiles and yips of the nurses getting reamed constantly instill the appreciation of nice, pliable buttholes.
-		<<case "Gender Fundamentalist">>
-			is simply designed and painted with soft feminine colors. The staff heavily encourage the children to play dress up and house, subtly sculpting their minds to proper gender norms and properly put them in line if they try to do otherwise.
-		<<case "Physical Idealist">>
-			is furnished with kiddy health books and posters; their caretakers making painstakingly sure that the importance is drilled into their heads at a young age. Their food is often littered with vitamins and supplements to keep the children growing strong.
-		<<case "Supremacist">>
-			is designed and structured to give those of $arcologies[0].FSSupremacistRace ethnicity the limelight of the nursery, while the others stay sectioned off and neglected to the world.
-		<<case "Subjugationist">>
-			is made to foster and raise the young children of $arcologies[0].FSSubjugationistRace ethnicity. They are reminded of their place with every failure and are encouraged to submissively follow their stereotypes at a ripe young age.
-		<<case "Paternalist">>
-			is well-stocked and by Paternalistic customs, constantly swaddle the children with love and attention. With the warm colors and sound of child laughter, to the untrained eye, the children actually seem free.
-		<<case "Pastoralist">>
-			is decorated to make the children grow up thinking that a life focused on breast milk, cum, and other human secretions are part of the norm. The milky tits swaying above their cow-patterned cribs certainly help with that.
-		<<case "Maturity Preferentialist">>
-			decorations remind the kids to respect those curvy and mature. The older nurserymaids are always flattered whenever the children try to act like adults and take care of the younger toddlers for them.
-		<<case "Youth Preferentialist">>
-			is making young children the center of attention, their rooms supplied with plenty of toys, blankets, and surrogate mothers at their beck and call.
-		<<case "Body Purist">>
-			is decorated to be very clean cut and sterilized with perfect corners and curves; symbolic of the human figure. Nursery maids are encouraged to show off their natural assets to show the children what the appropriate body should be.
-		<<case "Slimness Enthusiast">>
-			constantly encourages the kids to try and keep their slim and cute physiques. They are given perfectly metered meals to make this possible.	/* TODO: tie this in to food system */
-		<<case "Hedonistic">>
-			would make any toddler drool in amazement. Meals and naps every other hour, cribs stalked with toys and blankets, and plush slaves carry them to and fro without preamble. A delicious layer of baby fat is the ideal figure of a baby, and they couldn't be happier.
-		<<case "Intellectual Dependency">>
-			/* TODO: */
-		<<case "Slave Professionalism">>
-			/* TODO: */
-		<<case "Petite Admiration">>
-			has large photos and paintings on the walls depicting small, petite children enjoying $nurseryName's amenities and having fun together.
-		<<case "Statuesque Glorification">>
-			has large photos and paintings on the walls depicting tall children enjoying $nurseryName's amenities and having fun together.	/* TODO: rewrite so it's not so similar? */
-		<<default>>
-			is as comfortable and child-friendly as it needs to be. They have everything they need to grow into a proper slave.
-	<</switch>>
-
-	<<if $MatronID>>
-		<<setLocalPronouns _S.Matron>>
-	<</if>>
-
-	<<if _NL > 2>>
-		_nurseryNameCaps is bustling with activity. Nannies are busily moving about, feeding babies and changing diapers.
-	<<elseif _NL > 0>>
-		_nurseryNameCaps is working steadily. Nannies are moving about, cleaning up and feeding hungry children.
-		<<set $nannyInfluence = 1>>
-	<<elseif $MatronID>>
-		_S.Matron.slaveName is alone in $nurseryName, and keeps the place clean and looks after the children $himself.
-	<<elseif (_NL <= 0) && ($nurseryChildren <= 0)>>
-		_nurseryNameCaps is empty and quiet.
-		<div class="choices" style="font-style:normal">
-			<<link "Decommission the Nursery" "Main">>
-				<<set $nursery = 0, $nurseryNannies = 0, $nannyInfluence = 0, $nurseryDecoration = "standard", $cribs = [], _reservedChildrenNursery = 0>>
-				<<for _i = 0; _i < $slaves.length; _i++>>
-					<<run WombCleanGenericReserve($slaves[_i], "nursery", 9999)>>
-				<</for>>
-			<</link>>
-		</div>
-	<</if>>
-</p>
-
-<div class="tab-bar">
-	/* <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'nannies')" id="tab nannies">Nannies</button> */
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'pregnant-slaves')" id="tab pregnant-slaves">Pregnant Slaves</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'children')" id="tab children">Children</button>
-</div>
-
-/*
-<div id="nannies" class="tab-content">
-	<div id="content">
-	*/
-		<<set _Tmult0 = Math.trunc($nurseryNannies*1000*$upgradeMultiplierArcology)>>
-		<br>It can support $nurseryNannies <<if $nurseryNannies != 1>>nannies<<else>>nanny<</if>>.
-		There <<if _NL == 1>>is<<else>>are<</if>> _NL <<if _NL != 1>>nannies<<else>>nanny<</if>> in $nurseryName.
-		<<if $nurseryChildren > 0 && _NL < 1 && (!_S.Matron)>>
-			<div class="note">
-				You must have a Matron or at least one nanny to be able to influence the children's upbringing
-			</div>
-		<</if>>
-		<<if $nurseryNannies < 5>>
-			<div class="choices">
-				[[Expand the nursery|Nursery][cashX(forceNeg(_Tmult0), "capEx"), $nurseryNannies += 1, $PC.skill.engineering += .1]]
-				<span class="note">
-					Costs <<print cashFormat(_Tmult0)>> and will increase upkeep costs
-				</span>
-			</div>
-		<<else>>
-			<span class="note">
-				_nurseryNameCaps can support a maximum of 5 slaves
-			</span>
-		<</if>>
-
-		<div class="choices">
-			<<if _NL > 0>>
-				<<includeDOM removeFacilityWorkers(App.Entity.facilities.nursery, "rest", "rest")>>
-			<</if>>
-		</div>
-
-		<div>
-			<<if _S.Matron>>
-				<<if $MatronIgnoresFlaws != 1>>
-					_S.Matron.slaveName will attempt to fix flaws in nannies serving under $him.
-					<div class="choices">
-						[[Ignore flaws|Nursery][$MatronIgnoresFlaws = 1]]
-					</div>
-				<<else>>
-					_S.Matron.slaveName has been instructed to ignore flaws in the nannies serving under $him.
-					<div class="choices">
-						[[Fix flaws|Nursery][$MatronIgnoresFlaws = 0]]
-					</div>
-				<</if>>
-			<</if>>
-		</div>
-
-		<p>
-			<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.nursery)>>
-		</p>
-		/*
-	</div>
-</div>
-*/
-
-<div id="pregnant-slaves" class="tab-content">
-	<div id="content">
-		<br><br>
-		Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $nursery rooms, <<print _freecribs>> <<if _freecribs == 1>>is<<else>>are<</if>> unoccupied. Of those, _reservedChildrenNursery room<<if _reservedChildrenNursery == 1>> is<<else>>s are<</if>> reserved.
-
-		<<if (0 < _SL)>>
-			<<set $sortNurseryList = $sortNurseryList || 'Unsorted'>>
-			<br>
-			<span class="note">
-				Sorting:
-			</span>
-			''<span id="ql-nursery-sort">$sortNurseryList</span>.''
-			<<link "Sort by Name">>
-				<<set $sortNurseryList = 'Name'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByName();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Reserved Nursery Spots">>
-				<<set $sortNurseryList = 'Reserved Nursery Spots'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByReservedSpots();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Pregnancy Week">>
-				<<set $sortNurseryList = 'Pregnancy Week'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByPregnancyWeek();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Number of Children">>
-				<<set $sortNurseryList = 'Number of Children'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByPregnancyCount();
-				<</script>>
-			<</link>>
-			<br>
-		<</if>>
-		<div id="ql-nursery">
-			<<for _u = 0; _u < _SL; _u++>>
-				<<setLocalPronouns $slaves[_u]>>
-				<<if $slaves[_u].preg > 0 && $slaves[_u].broodmother == 0 && $slaves[_u].pregKnown == 1 && $slaves[_u].eggType == "human">>
-					<<if $slaves[_u].assignment == "work in the dairy" && $dairyPregSetting > 0>>
-					<<else>>
-						<<set _slaveId = "slave-" + $slaves[_u].ID>>
-						<<set _WL = $slaves[_u].womb.length>>
-						<<set _reservedNursery = WombReserveCount($slaves[_u], "nursery")>>
-						<<set _reservedIncubator = WombReserveCount($slaves[_u], "incubator")>>
-						<<set _pregWeek = $slaves[_u].pregWeek>>
-						<<set _slaveName = SlaveFullName($slaves[_u])>>
-						<div class="possible" @id="_slaveId" @data-preg-count="_WL" @data-reserved-spots="_reservedNursery" @data-preg-week="_pregWeek" @data-name="_slaveName">
-						<<print "[[_slaveName|Slave Interact][$AS = $slaves[" + _u + "].ID, $nextLink = passage()]]">> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with
-						<<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>>
-						<<elseif $slaves[_u].pregSource == -1>>your
-						<<elseif $slaves[_u].pregSource == -2>>a citizen's
-						<<elseif $slaves[_u].pregSource == -3>>your Master's
-						<<elseif $slaves[_u].pregSource == -4>>another arcology owner's
-						<<elseif $slaves[_u].pregSource == -5>>your client's
-						<<elseif $slaves[_u].pregSource == -6>>the Societal Elite's
-						<<elseif $slaves[_u].pregSource == -7>>the lab's
-						<<elseif $slaves[_u].pregSource == -9>>the Futanari Sisters'
-						<<else>>
-							<<set _t = $slaveIndices[$slaves[_u].pregSource]>>
-							<<if def _t>>
-								<<print $slaves[_t].slaveName>>'s
-							<</if>>
-						<</if>>
-						<<if _WL > 1>>_WL babies<<else>>baby<</if>>.
-						<<if _reservedNursery > 0>>
-							<<set _childrenReservedNursery = 1>>
-							<<if _WL == 1>>
-								$His child will be placed in $nurseryName.
-							<<elseif _reservedNursery < _WL>>
-								_reservedNursery of $his children will be placed in $nurseryName.
-							<<elseif _WL == 2>>
-								Both of $his children will be placed in $nurseryName.
-							<<else>>
-								All _reservedNursery of $his children will be placed in $nurseryName.
-							<</if>>
-							<<if (_reservedIncubator + _reservedNursery < _WL) && (_reservedChildrenNursery < _freecribs)>>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep another child|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if _reservedNursery > 0>>
-									| <<print "[[Keep one less child|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<</if>>
-								<<if _reservedNursery > 1>>
-									| <<print "[[Keep none of " + $his + " children|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-								<<if (_reservedChildrenNursery + _WL - _reservedNursery) <= _freecribs>>
-									| <<print "[[Keep the rest of " + $his + " children|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<<elseif (_reservedNursery == _WL) || (_reservedChildrenNursery == _freecribs) || (_reservedIncubator + _reservedNursery == _WL)>>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep one less child|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if _reservedNursery > 1>>
-									| <<print "[[Keep none of " + $his + " children|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<</if>>
-						<<elseif (_reservedChildrenNursery < _freecribs) && (_freecribs > _WL)>>
-							<<if _WL - _reservedIncubator == 0>>
-								<span class="note">
-									$His children are already reserved for <<= $incubator.name>>
-								</span>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep " + $his + " " + ((_WL > 1) ? "children" : "child") + " here instead|Nursery][WombChangeReserveType($slaves[" + _u + "], 'incubator', 'nursery')]]">>
-							<<else>>
-								You have <<if _freecribs == 1>>an<</if>> @@.lime;available room<<if _freecribs > 1>>s<</if>>.@@
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep "+ ((_WL > 1) ? "a" : "the") +" child|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if (_WL > 1) && (_reservedChildrenNursery + _WL - _reservedNursery) <= _freecribs>>
-									| <<print "[[Keep all of " + $his + " children|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<</if>>
-						<<elseif _reservedChildrenNursery == _freecribs>>
-							<br>&nbsp;&nbsp;&nbsp;&nbsp;
-							You have @@.red;no room for $his offspring.@@
-						<</if>>
-						<<set _eligibility = 1>>
-						</div>
-					<</if>>
-				<</if>>
-			<</for>>
-		</div>
-		<<script>>
-			$('div#ql-nursery').ready(sortNurseryPossiblesByPreviousSort);
-		<</script>>
-	</div>
-</div>
-
-<div id="children" class="tab-content">
-	<div id="content">
-		<p>
-			Target age for release: <<textbox "$targetAgeNursery" $targetAgeNursery "Nursery">>
-			[[Minimum Legal Age|Nursery][$targetAgeNursery = $minimumSlaveAge]] |
-			[[Average Age of Fertility|Nursery][$targetAgeNursery = $fertilityAge]] |
-			[[Average Age of Potency|Nursery][$targetAgeNursery = $potencyAge]] |
-			[[Legal Adulthood|Nursery][$targetAgeNursery = 18]]
-			<span class="note">
-				Setting will not be applied to rooms in use.
-			</span>
-		</p>
-
-		It can support $nursery child<<if $nursery != 1>>ren<</if>>. There <<if $nurseryChildren == 1>>is<<else>>are<</if>> currently $nurseryChildren room<<if $nurseryChildren != 1>>s<</if>> in use in $nurseryName.
-		<<if $nursery < 50>>
-			<div class="choices">
-				[[Add another room|Nursery][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "nursery"), $nursery += 5]]
-				<span class="note">
-					Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-				</span>
-				<<if _freecribs == 0>>
-					All of the rooms are currently occupied by growing children.
-				<</if>>
-			</div>
-		<<else>>
-			<span class="note">
-				_nurseryNameCaps can support a maximum of 50 children
-			</span>
-		<</if>>
-
-		<<if $nursery > 1 && _reservedChildrenNursery < _freecribs>>
-			<div class="choices">
-				[[Remove a room|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nursery -= 5]]
-				<span class="note">
-					Costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will reduce upkeep costs
-				</span>
-			</div>
-		<</if>>
-
-		<br>
-		<h3>Rules</h3>
-		<hr style="margin:0">
-		<<if $extremeUnderage>>
-			<<if $nurserySex>>
-				_nurseryNameCaps staff are ''allowed'' to molest the children. [[Forbid|Nursery][$nurserySex = 0]]
-			<<else>>
-				_nurseryNameCaps staff are ''not allowed'' to molest the children. [[Allow|Nursery][$nurserySex = 1]]
-			<</if>>
-		<</if>>
-		<br>
-
-		<<if $nurseryWeight>>
-			<<if $nurseryWeightSetting>>
-				Food intake ''is'' being managed; children will be raised at a healthy weight.
-				[[End managing|Nursery][$nurseryWeightSetting = 0]]
-			<<else>>
-				Food intake ''is not'' being managed; children may end up malnourished.
-				[[Begin managing|Nursery][$nurseryWeightSetting = 1]]
-			<</if>>
-		<<else>>
-			The amount of food the children eat ''is not'' being monitored, meaning they may end up becoming malnourished.
-			[[Monitor the amount of food the children eat|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryWeight = 1]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<if $nurseryMuscles>>
-			<<if $nurseryMusclesSetting>>
-				Exercise ''is'' being managed; children will be raised with average fitness.
-				[[End managing|Nursery][$nurseryMusclesSetting = 0]]
-			<<else>>
-				Children ''are not'' getting any exercise; they may end up quite weak and frail.
-				[[Begin managing|Nursery][$nurseryMusclesSetting = 1]]
-			<</if>>
-		<<else>>
-			The children ''are not'' getting any exercise, meaning they will likely end up becoming fairly weak and frail.
-			[[Allow the children to remain active|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryMuscles = 1]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<if $nurseryUpgradeHormones>>
-			<<if $nurseryHormonesSetting>>
-				Artificial hormone levels ''are'' being managed; children may experience precocious puberty.
-				[[Disable|Nursery][$nurseryHormonesSetting = 0]]
-			<<else>>
-				Artificial hormones ''are not'' being given; children will undergo normal puberty.
-				[[Activate|Nursery][$nurseryHormonesSetting = 1]]
-			<</if>>
-		<<else>>
-			The children ''are not'' being given any artificial hormones.
-			[[Give the children growth hormones|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryUpgradeHormones = 1, $nurseryHormonesSetting = 0]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<includeDOM App.Facilities.Nursery.childList()>>
-	</div>
-</div>
-
-<p>
-	Rename $nurseryName: <<textbox "$nurseryName" $nurseryName "Nursery">>
-	<span class="note">
-		Use a noun or similar short phrase
-	</span>
-</p>
-
-<<run App.UI.SlaveList.ScrollPosition.restore()>>
diff --git a/src/facilities/penthouse/penthousePassage.js b/src/facilities/penthouse/penthousePassage.js
index 4f0237d3a37148fc064c85191bb88e38a39dd95e..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;
 	}
diff --git a/src/facilities/pit/pit.js b/src/facilities/pit/pit.js
index 20ab165ab106ae570a1b66006aba1037e39cf747..9085bdf2a0c39979b5a27af5a3faa7ce1de2cb73 100644
--- a/src/facilities/pit/pit.js
+++ b/src/facilities/pit/pit.js
@@ -14,7 +14,6 @@ App.Facilities.Pit.pit = class Pit extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Pit";
 		V.encyclopedia = "Pit";
 	}
 
diff --git a/src/facilities/schoolroom/schoolroom.js b/src/facilities/schoolroom/schoolroom.js
index f9f5a9ba3a3d966aeb87f0de69ae081e761a2843..cb1281235508c4d9ce18b17a22d666165896390c 100644
--- a/src/facilities/schoolroom/schoolroom.js
+++ b/src/facilities/schoolroom/schoolroom.js
@@ -17,7 +17,6 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Schoolroom";
 		V.encyclopedia = "Schoolroom";
 	}
 
@@ -99,35 +98,43 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 				property: "schoolroomUpgradeSkills",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} inculcates the basic skills necessary to a sex slave.`,
-						upgraded: `${this.facility.nameCaps} provides slaves with some intermediate skills, including a solid foundation in sex, efficient and safe prostitution, and the rudiments of courtesanship.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} inculcates the basic skills necessary to a sex slave.`,
 						link: `Upgrade the curriculum to cover some intermediate skills`,
 						cost: 10000 * V.upgradeMultiplierArcology,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} provides slaves with some intermediate skills, including a solid foundation in sex, efficient and safe prostitution, and the rudiments of courtesanship.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomUpgradeLanguage",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} includes only basic language classes in its curriculum.`,
-						upgraded: `${this.facility.nameCaps} boasts state of the art linguistic interfaces that allow it to teach the basics of the arcology's lingua franca with increased success.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} includes only basic language classes in its curriculum.`,
 						link: `Install advanced linguistic interfaces to efficiently teach the arcology's lingua franca`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} boasts state of the art linguistic interfaces that allow it to teach the basics of the arcology's lingua franca with increased success.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomRemodelBimbo",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
-						upgraded: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
 						link: `Redesign the curriculum to undo pesky educations and retard slaves while benefiting the most simple of minds`,
 						cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.schoolroomUpgradeRemedial = 0,
@@ -135,10 +142,14 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.arcologies[0].FSIntellectualDependency > 80,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
+					},
 					{
 						value: 0,
-						base: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
-						upgraded: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling.`,
 						link: `Restore the curriculum to the standard`,
 						cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.schoolroomUpgradeRemedial = 0,
@@ -146,15 +157,19 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.arcologies[0].FSIntellectualDependency > 80,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education.`,
+					},
 				],
 			},
 			{
 				property: "schoolroomUpgradeRemedial",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} teaches woefully smart slaves using its modified methods.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the smartest slave learn at an acceptable pace. Dumb slaves won't learn much faster as a result, but smarties will benefit a great deal.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} teaches woefully smart slaves using its modified methods.`,
 						link: `Purchase specialized materials to help smart slaves get on the right track`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
@@ -164,8 +179,15 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 					},
 					{
 						value: 1,
-						base: `${this.facility.nameCaps} teaches idiots using standard methods.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the stupidest slave learn at an acceptable pace. Intelligent slaves won't learn much faster as a result, but idiots will benefit a great deal.`,
+						text: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the smartest slave learn at an acceptable pace. Dumb slaves won't learn much faster as a result, but smarties will benefit a great deal.`,
+						prereqs: [
+							() => V.schoolroomRemodelBimbo === 1,
+						],
+					},
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} teaches idiots using standard methods.`,
 						link: `Purchase specialized materials to help stupid slaves learn good`,
 						cost: 5000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						note: ` and increases the effectiveness of ${V.schoolroomName}`,
@@ -173,6 +195,13 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F
 							() => V.schoolroomRemodelBimbo === 0,
 						],
 					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been upgraded with advanced teaching tools to help even the stupidest slave learn at an acceptable pace. Intelligent slaves won't learn much faster as a result, but idiots will benefit a great deal.`,
+						prereqs: [
+							() => V.schoolroomRemodelBimbo === 0,
+						],
+					},
 				],
 			},
 		];
diff --git a/src/facilities/servantsQuarters/servantsQuarters.js b/src/facilities/servantsQuarters/servantsQuarters.js
index 3fb0b7267e1f50d153b3d50a1aa9feb3b17c7226..4616bd215d93f303176fc6bb7629dd45794468f4 100644
--- a/src/facilities/servantsQuarters/servantsQuarters.js
+++ b/src/facilities/servantsQuarters/servantsQuarters.js
@@ -14,7 +14,6 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Servants' Quarters";
 		V.encyclopedia = "Servants' Quarters";
 	}
 
@@ -96,14 +95,18 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend
 				property: "servantsQuartersUpgradeMonitoring",
 				tiers: [
 					{
-						value: 1,
-						base: `The quarters are standard.`,
-						upgraded: `The quarters have been upgraded with enhanced monitoring systems to make the servants work harder, improving their obedience and efficiency.`,
+						value: 0,
+						upgraded: 1,
+						text: `The quarters are standard.`,
 						link: `Upgrade the monitoring systems to force harder work`,
 						cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier,
 						handler: () => V.PC.skill.hacking += 0.1,
 						note: ` and will increase upkeep costs`,
 					},
+					{
+						value: 1,
+						text: `The quarters have been upgraded with enhanced monitoring systems to make the servants work harder, improving their obedience and efficiency.`,
+					},
 				],
 			},
 		];
diff --git a/src/facilities/spa/spa.js b/src/facilities/spa/spa.js
index 1b5f78fbd20538c0b0f4ea297a1d4b3fd0c3b723..c0baafe4e225604508747c2195cb6ea0e54a06eb 100644
--- a/src/facilities/spa/spa.js
+++ b/src/facilities/spa/spa.js
@@ -15,7 +15,6 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility {
 
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Spa";
 		V.encyclopedia = "Spa";
 	}
 
@@ -101,12 +100,16 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility {
 				property: "spaUpgrade",
 				tiers: [
 					{
-						value: 1,
-						base: `${this.facility.nameCaps} is a standard spa.`,
-						upgraded: `${this.facility.nameCaps} has been upgraded with state of the art temperature treatment options, from hot and cold mineral water pools to baking saunas and dense steam rooms.`,
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} is a standard spa.`,
 						link: `Upgrade ${V.spaName} with saunas, steam rooms, and mineral water baths`,
 						cost: 1000 * V.upgradeMultiplierArcology,
 						note: ` and increases the effectiveness of ${V.spaName}`,
+					},
+					{
+						value: 1,
+						text: `${this.facility.nameCaps} has been upgraded with state of the art temperature treatment options, from hot and cold mineral water pools to baking saunas and dense steam rooms.`,
 					}
 				],
 			},
diff --git a/src/facilities/surgery/analyzePregnancy.js b/src/facilities/surgery/analyzePregnancy.js
index 1326fc33646c4f2e2a9d3fb927257afc8c7c8f8b..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);
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/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js
index 1473a3ab3b98ead5487ee20dfaedc69f276513c0..f6165bbaeb41195d2503e828b908f14d60b8ad31 100644
--- a/src/facilities/surgery/surgeryPassageLower.js
+++ b/src/facilities/surgery/surgeryPassageLower.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.surgeryPassageLower = function(slave, cheat = false) {
+App.UI.surgeryPassageLower = function(slave, refreshParent, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -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 1a4cb7a288738f9715332e94534e0db6617bd4a3..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;
@@ -122,7 +122,7 @@ App.UI.surgeryPassageUpper = function(slave, cheat = false) {
 			}
 			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));
+			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 = [];
@@ -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/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 74e3cedb49582e3e63d28637e00310160e14ba22..b1e643e14e4025dcbe8fa525de0732c505286759 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -495,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/options/options.js b/src/gui/options/options.js
index 02f80bedbdee502c565f741e60811a831fc11a16..504710b5a4095b0d86a34528f74e5029d40cc789 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());
 
@@ -766,6 +775,10 @@ App.UI.optionsPassage = function() {
 		options.addOption("New event", "tempEventToggle")
 			.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
 
+		options.addOption("Sex overhaul", "sexOverhaul", V.experimental)
+			.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
+			.addComment("This will enable a new way to interact with slaves. Currently working but missing flavor text.");
+
 		el.append(options.render());
 		return el;
 	}
@@ -1075,10 +1088,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();
@@ -1113,7 +1127,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/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. 
+			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>`);
 
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/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 e6e7bc4b36f716b9e4cad1624e4f4927712082dc..c3c7b95432a96a96b8de212f648d899c238b0919 100644
--- a/src/interaction/siNavigation.js
+++ b/src/interaction/siNavigation.js
@@ -17,25 +17,45 @@ App.UI.SlaveInteract.navigation = function(slave) {
 	}
 
 	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']);
 
-	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 = placeInLine[0]; }), "adjacent-slave");
-	prevSpan.id = "prev-slave";
-	p.append(" ", prevSpan);
+	name.style.display = 'inline-block';
 
-	const centerSpan = document.createElement("span");
-	centerSpan.classList.add("interact-name");
+	previous.id = "prev-slave";
+	next.id = "next-slave";
 
-	App.UI.DOM.appendNewElement("span", centerSpan, slave.slaveName, "slave-name");
-	centerSpan.append(" ", App.UI.favoriteToggle(slave));
-	p.append(centerSpan);
+	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']),
+	);
 
-	const nextSpan = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Next", "Slave Interact",
-		() => { V.AS = placeInLine[1]; }), "adjacent-slave");
-	nextSpan.id = "next-slave";
-	p.append(nextSpan, " ");
-	App.UI.DOM.appendNewElement("span", p, 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 1736d8532eb7a5bb9bae1f09290945a23cba2d7b..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() {
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index 32d9c50c8993d8eaeaa9ac259a19878c9159b6de..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}`,
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 2e7333ab8a7005d09a969a8c81268f6aa74ee94a..ebe6d096fde62e8269f57f18da8bb8087dc91923 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"),
 					});
 				}
@@ -737,6 +737,11 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 		}
 		el.append(`Use ${him}: `);
 		el.appendChild(generateRows(sexOptions));
+
+		if (V.experimental.sexOverhaul) {
+			el.appendChild(App.UI.SlaveInteract.useSlave(slave));
+		}
+
 		if (!jQuery.isEmptyObject(fillFaceOptions)) {
 			let fill = document.createElement('div');
 			fill.appendChild(document.createTextNode(` Fill ${his} mouth with: `));
diff --git a/src/interaction/universalRules.js b/src/interaction/universalRules.js
index 7a5f50e48354515e66648918a4cc018ce42952e7..aaa5716cfad057ab780ff0ca312ae24ed57a1682 100644
--- a/src/interaction/universalRules.js
+++ b/src/interaction/universalRules.js
@@ -17,12 +17,6 @@ App.UI.universalRules = function() {
 
 		let options = new App.UI.OptionsGroup();
 
-		options.addOption("When unhealthy on assignment, slaves", "universalRulesRest")
-			.addValueList([
-				["Remain on assignment", 1],
-				[`Automatically rest`, 0]
-			]);
-
 		options.addOption("Get consent before fucking other slaves", "universalRulesConsent")
 			.addValue("Yes", 1).on()
 			.addValue(`No`, 0).off();
diff --git a/src/interaction/useSlave/useSlave.css b/src/interaction/useSlave/useSlave.css
new file mode 100644
index 0000000000000000000000000000000000000000..4094355ce4097b12e958592472870c98f5f1248e
--- /dev/null
+++ b/src/interaction/useSlave/useSlave.css
@@ -0,0 +1,5 @@
+#use-slave-container {
+	overflow: scroll;
+	max-height: 16em;
+	margin: 1em 0;
+}
diff --git a/src/interaction/useSlave/useSlave.js b/src/interaction/useSlave/useSlave.js
new file mode 100644
index 0000000000000000000000000000000000000000..bca63469cabbbcd2e0a4e7110ce0c0002e2c0a60
--- /dev/null
+++ b/src/interaction/useSlave/useSlave.js
@@ -0,0 +1,734 @@
+/**
+ * @typedef {Object} UseSlave.Option
+ *
+ * @property {string} link The link text.
+ * @property {string} desc The text that appears when the option is selected.
+ * @property {string} tooltip The link tooltip.
+ * @property {() => boolean} prereq Any prerequisites required for the option to appear.
+ * @property {() => void} effect Any effects the option has.
+ */
+
+/**
+ * Creates a new sex scene.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {HTMLDivElement}
+ */
+App.UI.SlaveInteract.useSlave = function(slave) {
+	/** A class containing the different temporary variables and states for each participant. */
+	class CharacterState {
+		constructor() {
+			/** @type {number} The character's lust. Orgasm occurs at 100. */
+			this.lust = 0;
+			/** @type {Position} Whether the character is standing, kneeling, or laying down. */
+			this.position = null;
+			/** @type {boolean} Whether the character is pressed up close to the other actor. */
+			this.close = false;
+			/** Properties relating to the character's clothing. */
+			this.clothing = {
+				/** Properties relating to the character's clothing top. */
+				top: {
+					/** @type {boolean} Whether the top is pulled up. */
+					pulledUp: false,
+					/** @type {boolean} Whether the top is off. */
+					isOff: false,
+				},
+				/** Properties relating to the character's clothing bottom. */
+				bottom: {
+					/**
+					 * @type {boolean}
+					 * Whether the bottom is pulled down.
+					 *
+					 * If the clothing is a dress, whether the bottom is pulled up over the character's waist. */
+					pulledDown: false,
+					/** @type {boolean} Whether the bottom is off. */
+					isOff: false,
+				},
+				/** @type {boolean} Whether the character is wearing a bra. */
+				bra: true,
+				/** @type {boolean} Whether the character is wearing underwear. */
+				underwear: true,
+				/** @type {boolean} Whether the character is wearing a strapon. */
+				strapon: false,
+			};
+		}
+
+		/** @param {Clone} actor The actor to assign the state to. */
+		assign(actor) {
+			actor.state = this;
+
+			return this;
+		}
+
+		/** @type {boolean} Whether the character is standing up. */
+		get isStanding() {
+			return this.position === Position.STANDING;
+		}
+
+		/** @type {boolean} Whether the character is kneeling. */
+		get isKneeling() {
+			return this.position === Position.KNEELING;
+		}
+
+		/** @type {boolean} Whether the character is laying down. */
+		get isLaying() {
+			return this.position === Position.LAYING;
+		}
+
+		/** @type {boolean} Whether the character is completely naked. */
+		get isNaked() {
+			return this.clothing.top.isOff
+				&& this.clothing.bottom.isOff
+				&& !this.clothing.bra
+				&& !this.clothing.underwear;
+		}
+
+		/** @type {boolean} Whether the character's chest is accessible. */
+		get topFree() {
+			return this.clothing.top.isOff || this.clothing.top.pulledUp;
+		}
+
+		/** @type {boolean} Whether the character's crotch is accessible. */
+		get bottomFree() {
+			return this.clothing.bottom.isOff || this.clothing.bottom.pulledDown;
+		}
+	}
+
+	/**
+	 * A class for creating a temporary clone of the slave.
+	 * Not to be confused with SlaveState's `.clone` property.
+	 */
+	class Clone extends App.Entity.SlaveState {
+		/** @param {App.Entity.SlaveState} slave The slave to clone. */
+		constructor(slave) {
+			super();
+
+			this.slave = _.cloneDeep(slave);
+			/** @type {CharacterState} */
+			this.state = null;
+		}
+
+		/** @param {CharacterState} state The state to assign to the clone. */
+		assign(state) {
+			this.state = state;
+
+			return this;
+		}
+
+		/** @returns {App.Entity.SlaveState} */
+		getSlave() {
+			return this.slave;
+		}
+	}
+
+	// Declarations
+
+	const playerState = new CharacterState();
+	const slaveState = new CharacterState();
+
+	const PC = V.PC;
+	const tempSlave = new Clone(slave)
+		.assign(slaveState)
+		.getSlave();
+
+	const refreshArt = () => App.Events.refreshEventArt(tempSlave);
+
+	const {He, he, him, his, hers} = getPronouns(tempSlave);
+
+	/** @enum {string} */
+	const Fetish = {
+		NONE: "none",
+		MINDBROKEN: "mindbroken",
+		SUBMISSIVE: "submissive",
+		CUMSLUT: "cumslut",
+		HUMILIATION: "humiliation",
+		BUTTSLUT: "buttslut",
+		BOOBS: "boobs",
+		SADIST: "sadist",
+		MASOCHIST: "masochist",
+		DOM: "dom",
+		PREGNANCY: "pregnancy",
+	};
+	/** @enum {boolean} */
+	const Position = {
+		STANDING: true,
+		KNEELING: false,
+		LAYING: false,
+	};
+	/** @enum {string} */
+	const none = "none";
+
+	let clothes = tempSlave.clothes;
+	let introShown = false;
+
+	const div = document.createElement("div");
+
+	const face = App.UI.SlaveInteract.useSlave.faceText;
+	const faceOptions = [
+		{
+			link: `Kiss ${him}`,
+			desc: face.regularKiss(tempSlave),
+			tooltip: `Press your lips to ${hers} and kiss ${him}.`,
+			prereq: () => tempSlave.mouthAccessory === none,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Kiss ${him} passionately`,
+			desc: face.passionateKiss(tempSlave),
+			tooltip: `Press ${his} body to yours and kiss ${him}.`,
+			prereq: () => tempSlave.mouthAccessory === none,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Kiss ${him} intimately`,
+			desc: face.intimateKiss(tempSlave),
+			tooltip: `Share a romantic kiss.`,
+			prereq: () => tempSlave.mouthAccessory === none,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Have ${him} go down on you`,
+			desc: face.slaveGivesOral(tempSlave),
+			tooltip: `Have ${him} give you oral.`,
+			prereq: () => (tempSlave.mouthAccessory === none || tempSlave.mouthAccessory === "ring gag")
+				&& !playerState.isKneeling
+				&& !slaveState.isKneeling,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+				slaveState.position = Position.KNEELING;
+			}
+		},
+		{
+			link: `Go down on ${him}`,
+			desc: face.playerGivesOral(tempSlave),
+			tooltip: `Give ${him} oral.`,
+			prereq: () => clothes === "no clothing" && !playerState.isKneeling && !slaveState.isKneeling,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+				playerState.position = Position.KNEELING;
+			}
+		},
+	];
+
+	const chest = App.UI.SlaveInteract.useSlave.chestText;
+	const chestOptions = [
+		{
+			link: `Grope ${his} chest`,
+			desc: chest.grope(tempSlave),
+			tooltip: tempSlave.boobs >= 300 ? `Play with ${his} tits a bit.` : `Stroke ${his} chest a bit.`,
+			prereq: () => true,
+			effect: () => {
+				playerState.lust += 2;
+				slaveState.lust += tempSlave.fetish === Fetish.BOOBS ? 7 : 4;
+			}
+		},
+	];
+
+	const crotch = App.UI.SlaveInteract.useSlave.crotchText;
+	const crotchOptions = [
+		{
+			link: `Grope ${his} pussy`,
+			desc: crotch.gropePussy(tempSlave),
+			tooltip: `Fondle and play with ${his} crotch a bit.`,
+			prereq: () => tempSlave.vagina > -1,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Grope ${his} ass`,
+			desc: crotch.gropeAss(tempSlave),
+			tooltip: `Grab ${his} ass and give it a good fondle.`,
+			prereq: () => true,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Finger ${his} pussy`,
+			desc: crotch.fingerPussy(tempSlave),
+			tooltip: `Play with ${his} clit a little, maybe slide a finger in there. Go on, you know you want to.`,
+			prereq: () => tempSlave.vagina > -1 && (slaveState.bottomFree || clothes.includes("dress")) && !tempSlave.chastityVagina,
+			effect: () => {
+				playerState.lust += 2;
+				slaveState.lust += 5;
+			}
+		},
+		{
+			link: `Finger ${his} asshole`,
+			desc: crotch.fingerAnus(tempSlave),
+			tooltip: `Play with ${his} backdoor a little. Go on, you know you want to.`,
+			prereq: () => slaveState.bottomFree || clothes.includes("dress") && !tempSlave.chastityAnus,
+			effect: () => {
+				playerState.lust += 2;
+				slaveState.lust += tempSlave.fetish === Fetish.BUTTSLUT ? 7 : 4;
+			}
+		},
+		{
+			link: `Fuck ${his} pussy`,
+			desc: crotch.fuckPussy(tempSlave),
+			tooltip: `Push your ${PC.dick ? `dick` : `strapon`} into ${his} pussy.`,
+			prereq: () => tempSlave.vagina > -1
+				&& slaveState.bottomFree
+				&& !slaveState.clothing.underwear
+				&& !tempSlave.chastityVagina
+				&& playerState.lust > 5,
+			effect: () => {
+				playerState.lust += 8;
+				slaveState.lust += 8;
+			}
+		},
+		{
+			link: `Fuck ${his} asshole`,
+			desc: crotch.fuckAnus(tempSlave),
+			tooltip: `Push your ${PC.dick ? `dick` : `strapon`} into ${his} asshole.`,
+			prereq: () => slaveState.bottomFree
+				&& !slaveState.clothing.underwear
+				&& !tempSlave.chastityAnus
+				&& playerState.lust > 5,
+			effect: () => {
+				playerState.lust += 8;
+				slaveState.lust += tempSlave.fetish === Fetish.BUTTSLUT ? 8 : 5;
+			}
+		},
+		{
+			link: `Start a sixty-nine`,
+			desc: crotch.sixtyNine(tempSlave),
+			tooltip: `Show each other some mutual affection.`,
+			prereq: () => slaveState.bottomFree && playerState.bottomFree,
+			effect: () => {
+				playerState.lust += 10;
+				slaveState.lust += 10;
+			}
+		}
+	];
+
+	const general = App.UI.SlaveInteract.useSlave.generalText;
+	const generalOptions = [
+		{
+			link: `Have ${him} dance for you`,
+			desc: general.dance(tempSlave),
+			tooltip: `Make ${him} give you a sensual dance.`,
+			prereq: () => !slaveState.isKneeling && !slaveState.isLaying,
+			effect: () => {
+				playerState.lust += 4;
+				slaveState.lust += 3;
+			}
+		},
+		{
+			link: `Have ${him} perform a striptease for you`,
+			desc: general.striptease(tempSlave),
+			tooltip: `Make ${him} strip for you.`,
+			prereq: () => !slaveState.isKneeling && !slaveState.isLaying && clothes !== "no clothing",
+			effect: () => {
+				clothes = "no clothing";
+				playerState.lust += 5;
+				slaveState.lust += 6;
+			}
+		},
+		{
+			link: `Push ${him} down`,
+			desc: general.pushDown(tempSlave),
+			tooltip: `Have ${him} go down on you.`,
+			prereq: () => !slaveState.isKneeling,
+			effect: () => {
+				slaveState.position = Position.KNEELING;
+			}
+		},
+		{
+			link: `Pull ${him} up`,
+			desc: general.pullUp(tempSlave),
+			tooltip: `Have ${him} stop going down on you.`,
+			prereq: () => slaveState.isKneeling,
+			effect: () => {
+				slaveState.position = Position.STANDING;
+			}
+		},
+		{
+			link: `Pull ${him} in close`,
+			desc: general.pullClose(tempSlave),
+			tooltip: `Pull ${his} body in close to yours.`,
+			prereq: () => !slaveState.close,
+			effect: () => {
+				slaveState.close = true;
+			}
+		},
+		{
+			link: `Push ${him} away`,
+			desc: general.pushAway(tempSlave),
+			tooltip: `Put some distance between you two.`,
+			prereq: () => slaveState.close,
+			effect: () => {
+				slaveState.close = false;
+			}
+		},
+		{
+			link: `Take ${him} to bed`,
+			desc: general.goToBed(tempSlave),
+			tooltip: `Take ${him} somewhere a bit more comfortable.`,
+			prereq: () => !playerState.isLaying && !slaveState.isLaying,
+			effect: () => {
+				playerState.position = Position.LAYING;
+				slaveState.position = Position.LAYING;
+			}
+		},
+		{
+			link: `Get out of bed`,
+			desc: general.getOutOfBed(tempSlave),
+			tooltip: `In case you need a little more maneuverability.`,
+			prereq: () => playerState.isLaying && slaveState.isLaying,
+			effect: () => {
+				playerState.position = Position.STANDING;
+				slaveState.position = Position.STANDING;
+			}
+		},
+		{
+			link: `Bring in another slave`,
+			desc: general.bringInSlave(tempSlave),
+			tooltip: `Have another slave join the two of you.`,
+			prereq: () => V.slaves.length > 1,
+			effect: () => {
+				return;	// temporarily disabled
+			}
+		},
+	];
+
+	if (V.active.canine) {
+		generalOptions.push({
+			link: `Bring in ${V.active.canine.articleAn} ${V.active.canine.name}`,
+			desc: general.bringInCanine(tempSlave),
+			tooltip: `Spice things up with ${V.active.canine.species === 'dog' ? `man's best friend` : `a four-legged friend`}.`,
+			prereq: () => V.active.canine !== null,
+			effect: () => {
+				return;	// temporarily disabled
+			}
+		});
+	}
+
+	if (V.active.hooved) {
+		generalOptions.push({
+			link: `Bring in ${V.active.hooved.articleAn} ${V.active.hooved.name}`,
+			desc: general.bringInHooved(tempSlave),
+			tooltip: `Make things more interesting with something a bit larger.`,
+			prereq: () => V.active.hooved !== null,
+			effect: () => {
+				return;	// temporarily disabled
+			}
+		});
+	}
+
+	if (V.active.feline) {
+		generalOptions.push({
+			link: `Bring in ${V.active.feline.articleAn} ${V.active.feline.name}`,
+			desc: general.bringInFeline(tempSlave),
+			tooltip: `Have some fun with a furry ${V.active.feline.species === 'cat' ? `little` : ``} friend.`,
+			prereq: () => V.active.feline !== null,
+			effect: () => {
+				return;	// temporarily disabled
+			}
+		});
+	}
+
+	const clothing = App.UI.SlaveInteract.useSlave.clothingText;
+	const clothingOptions = [
+		{
+			link: `Pull up ${his} dress`,
+			desc: clothing.pullUpDress(tempSlave),
+			tooltip: `For easier access.`,
+			prereq: () => clothes.includes("dress") && !slaveState.clothing.bottom.pulledDown,
+			effect: () => {
+				slaveState.clothing.bottom.pulledDown = true;
+				playerState.lust++;
+				slaveState.lust++;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} clothing`,
+			desc: clothing.removeClothing(tempSlave),
+			tooltip: `Have ${him} get completely naked.`,
+			prereq: () => clothes !== "no clothing" && !slaveState.clothing.top.isOff && !slaveState.clothing.bottom.isOff,
+			effect: () => {
+				tempSlave.clothes = "no clothing";
+				slaveState.clothing.top.isOff = true;
+				slaveState.clothing.bottom.isOff = true;
+
+				playerState.lust++;
+				slaveState.lust += 2;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} top`,
+			desc: clothing.removeTop(tempSlave),
+			tooltip: `For easier access to ${his} ${tempSlave.boobs >= 300 ? `tits` : `chest`}.`,
+			prereq: () => !clothes.includes("dress") && !slaveState.clothing.top.isOff,
+			effect: () => {
+				slaveState.clothing.top.isOff = true;
+				playerState.lust++;
+				slaveState.lust++;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} bottoms`,
+			desc: clothing.removeBottom(tempSlave),
+			tooltip: `For easier access to ${his} crotch.`,
+			prereq: () => !clothes.includes("dress") && !slaveState.clothing.bottom.isOff,
+			effect: () => {
+				slaveState.clothing.bottom.isOff = true;
+				playerState.lust++;
+				slaveState.lust++;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} bra`,
+			desc: clothing.removeBra(tempSlave),
+			tooltip: `Get ${his} bra out of the way.`,
+			prereq: () => slaveState.topFree && slaveState.clothing.bra,
+			effect: () => {
+				slaveState.clothing.bra = false;
+				playerState.lust++;
+				slaveState.lust++;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} underwear`,
+			desc: clothing.removeUnderwear(tempSlave),
+			tooltip: `Get ${his} ${tempSlave.vagina > -1 ? `panties` : `underwear`} out of the way.`,
+			prereq: () => slaveState.bottomFree && slaveState.clothing.underwear,
+			effect: () => {
+				slaveState.clothing.underwear = false;
+				playerState.lust++;
+				slaveState.lust++;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Pull aside ${his} underwear`,
+			desc: clothing.pullAsideUnderwear(tempSlave),
+			tooltip: `Move ${his} ${tempSlave.vagina > -1 ? `panties` : `underwear`} out of the way for easier access to what's underneath.`,
+			prereq: () => slaveState.bottomFree && slaveState.clothing.underwear,
+			effect: () => {
+				playerState.lust++;
+				slaveState.lust++;
+			}
+		},
+		{
+			link: `Give ${him} a ball gag`,
+			desc: clothing.addMouthAccessory(tempSlave),
+			tooltip: `In case ${he}'s being too mouthy – or just for fun.`,
+			prereq: () => tempSlave.mouthAccessory === none,
+			effect: () => {
+				tempSlave.mouthAccessory = "ball gag";
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Give ${him} a ring gag`,
+			desc: clothing.addMouthAccessory(tempSlave),
+			tooltip: `In case ${he}'s being too mouthy, but you still want access to ${his} throat.`,
+			prereq: () => tempSlave.mouthAccessory === none,
+			effect: () => {
+				tempSlave.mouthAccessory = "ring gag";
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take ${tempSlave.mouthAccessory.includes("dildo") ? `out` : `off`} ${his} ${tempSlave.mouthAccessory}`,
+			desc: clothing.removeMouthAccessory(tempSlave),
+			tooltip: `Give ${him} some respite.`,
+			prereq: () => tempSlave.mouthAccessory !== none,
+			effect: () => {
+				tempSlave.mouthAccessory = none;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} vaginal chastity device`,
+			desc: clothing.removeChastityVaginal(tempSlave),
+			tooltip: `${He} won't be needing it.`,
+			prereq: () => (clothes === "no clothing" || clothes.includes("dress"))
+				&& tempSlave.chastityVagina === 1,
+			effect: () => {
+				tempSlave.chastityVagina = 0;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take off ${his} anal chastity device`,
+			desc: clothing.removeChastityAnal(tempSlave),
+			tooltip: `${He} won't be needing it.`,
+			prereq: () => (clothes === "no clothing" || clothes.includes("dress"))
+				&& tempSlave.chastityVagina === 1,
+			effect: () => {
+				tempSlave.chastityVagina = 0;
+
+				refreshArt();
+			}
+		},
+		{
+			link: `Take the chastity device off of ${his} dick`,
+			desc: clothing.removeChastityPenis(tempSlave),
+			tooltip: `${He} won't be needing it.`,
+			prereq: () => (clothes === "no clothing" || clothes.includes("dress"))
+				&& tempSlave.chastityPenis === 1,
+			effect: () => {
+				tempSlave.chastityPenis = 0;
+
+				refreshArt();
+			}
+		},
+	];
+
+	div.id = 'use-slave-container';
+	div.append(main());
+
+	return div;
+
+	// Main Loop
+
+	function main() {
+		const div = document.createElement("div");
+
+		if (playerState.lust < 100) {
+			if (introShown) {
+				div.appendChild(options());
+			} else {
+				div.appendChild(intro());
+			}
+		} else {
+			if (introShown) {
+				div.append(`You are out of stamina.`);
+			} else {
+				App.UI.DOM.appendNewElement("span", div, `You have recently had sex with ${him}`, "note");
+			}
+		}
+
+		return div;
+	}
+
+	// Text Functions
+
+	function intro() {
+		introShown = true;
+
+		const mainSpan = App.UI.DOM.makeElement("span", `Use ${him} and take control: `);
+
+		if (tempSlave.devotion > 50) {
+			const intro = App.UI.DOM.makeElement("div", `You pull ${tempSlave.slaveName} in close and tell ${him} that you want to make love. With ${tempSlave.mouthAccessory === none
+				? `a ${Beauty(tempSlave) > 150 && tempSlave.face > 10 ? `pretty` : `quick`} smile`
+				: `as much of a smile as ${his} ${tempSlave.mouthAccessory} will allow`
+			}, ${he} makes it clear that your advances are not unwanted.`);
+
+			intro.appendChild(options());
+			mainSpan.appendChild(App.UI.DOM.linkReplace(
+				`Have sex with ${him}`,
+				intro
+			));
+
+			return mainSpan;
+		} else if (tempSlave.devotion > 20) {
+			const intro = App.UI.DOM.makeElement("div", `You tell ${tempSlave.slaveName} that you want to fuck ${him}. Though ${he} seems hesitant, your tone and the stern look in your eye make it clear that ${he} has no choice, and ${he} reluctantly agrees.`);
+
+			intro.appendChild(options());
+			mainSpan.appendChild(App.UI.DOM.linkReplace(
+				`Fuck ${him}`,
+				intro
+			));
+
+			return mainSpan;
+		} else {
+			const intro = App.UI.DOM.makeElement("div", `You tell ${tempSlave.slaveName} that you're going to fuck ${him}, whether ${he} likes it or not. The daggers ${he} glares at you feel almost physically tangible, but ${he} knows that ${he} ultimately has no choice.`);
+
+			intro.appendChild(options());
+			mainSpan.appendChild(App.UI.DOM.linkReplace(
+				`Rape ${him}`,
+				intro
+			));
+
+			return mainSpan;
+		}
+	}
+
+	// Generator Functions
+
+	function options() {
+		const optionsDiv = document.createElement("div");
+
+		const face = generateOptions(faceOptions, optionsDiv);
+		const chest = generateOptions(chestOptions, optionsDiv);
+		const crotch = generateOptions(crotchOptions, optionsDiv);
+		const general = generateOptions(generalOptions, optionsDiv);
+		const clothing = generateOptions(clothingOptions, optionsDiv);
+
+		optionsDiv.append(face, chest, crotch, general, clothing);
+
+		return optionsDiv;
+	}
+
+	/**
+	 * @param {Array<UseSlave.Option>} arr
+	 * @param {HTMLDivElement} div
+	 * @returns {HTMLDivElement}
+	 */
+	function generateOptions(arr, div) {
+		const mainDiv = document.createElement("div");
+
+		const availableOptions = arr.filter(option => option.prereq());
+
+		mainDiv.appendChild(generateLinks(availableOptions, div));
+
+		return mainDiv;
+	}
+
+	/**
+	 * @param {Array<UseSlave.Option>} available
+	 * @param {HTMLDivElement} div
+	 */
+	function generateLinks(available, div) {
+		const links = [];
+
+		available.forEach((e) => links.push(App.UI.DOM.link(e.link, () => {
+			div.innerHTML = e.desc;
+			e.effect();
+
+			if (V.debugMode) {
+				console.log(
+					playerState,
+					slaveState,
+				);
+			}
+
+			div.appendChild(main());
+
+			div.scrollTop = div.scrollHeight - div.clientHeight;
+		}, null, '', e.tooltip)));
+
+		return App.UI.DOM.generateLinksStrip(links);
+	}
+};
diff --git a/src/interaction/useSlave/useSlaveText.js b/src/interaction/useSlave/useSlaveText.js
new file mode 100644
index 0000000000000000000000000000000000000000..25bddc7d967712aff2ae97d8bb0018da9f7e6785
--- /dev/null
+++ b/src/interaction/useSlave/useSlaveText.js
@@ -0,0 +1,610 @@
+App.UI.SlaveInteract.useSlave.faceText = {
+	/** @param {App.Entity.SlaveState} slave */
+	regularKiss(slave) {
+		const {him} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `You pull ${him} in close and kiss ${him}.`;
+		} else if (slave.devotion > 20) {
+			return `Face test regular 2`;
+		} else if (slave.devotion > -20) {
+			return `Face test regular 3`;
+		} else {
+			return `Face test regular 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	passionateKiss(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Face test passionate 1`;
+		} else if (slave.devotion > 20) {
+			return `Face test passionate 2`;
+		} else if (slave.devotion > -20) {
+			return `Face test passionate 3`;
+		} else {
+			return `Face test passionate 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	intimateKiss(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Face test intimate 1`;
+		} else if (slave.devotion > 20) {
+			return `Face test intimate 2`;
+		} else if (slave.devotion > -20) {
+			return `Face test intimate 3`;
+		} else {
+			return `Face test intimate 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	slaveGivesOral(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Face test slave oral 1`;
+		} else if (slave.devotion > 20) {
+			return `Face test slave oral 2`;
+		} else if (slave.devotion > -20) {
+			return `Face test slave oral 3`;
+		} else {
+			return `Face test slave oral 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	playerGivesOral(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Face test player oral 1`;
+		} else if (slave.devotion > 20) {
+			return `Face test player oral 2`;
+		} else if (slave.devotion > -20) {
+			return `Face test player oral 3`;
+		} else {
+			return `Face test player oral 4`;
+		}
+	},
+};
+
+App.UI.SlaveInteract.useSlave.chestText = {
+	/** @param {App.Entity.SlaveState} slave */
+	grope(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Chest test grope 1`;
+		} else if (slave.devotion > 20) {
+			return `Chest test grope 2`;
+		} else if (slave.devotion > -20) {
+			return `Chest test grope 3`;
+		} else {
+			return `Chest test grope 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	lick(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Chest test lick 1`;
+		} else if (slave.devotion > 20) {
+			return `Chest test lick 2`;
+		} else if (slave.devotion > -20) {
+			return `Chest test lick 3`;
+		} else {
+			return `Chest test lick 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	suck(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Chest test suck 1`;
+		} else if (slave.devotion > 20) {
+			return `Chest test suck 2`;
+		} else if (slave.devotion > -20) {
+			return `Chest test suck 3`;
+		} else {
+			return `Chest test suck 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	bite(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Chest test bite 1`;
+		} else if (slave.devotion > 20) {
+			return `Chest test bite 2`;
+		} else if (slave.devotion > -20) {
+			return `Chest test bite 3`;
+		} else {
+			return `Chest test bite 4`;
+		}
+	},
+};
+
+App.UI.SlaveInteract.useSlave.crotchText = {
+	/** @param {App.Entity.SlaveState} slave */
+	gropePussy(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Groping pussy test 1`;
+		} else if (slave.devotion > 20) {
+			return `Groping pussy test 2`;
+		} else if (slave.devotion > -20) {
+			return `Groping pussy test 3`;
+		} else {
+			return `Groping pussy test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	gropeAss(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Groping ass test 1`;
+		} else if (slave.devotion > 20) {
+			return `Groping ass test 2`;
+		} else if (slave.devotion > -20) {
+			return `Groping ass test 3`;
+		} else {
+			return `Groping ass test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	fingerPussy(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Fingering pussy test 1`;
+		} else if (slave.devotion > 20) {
+			return `Fingering pussy test 2`;
+		} else if (slave.devotion > -20) {
+			return `Fingering pussy test 3`;
+		} else {
+			return `Fingering pussy test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	fingerAnus(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Fingering anus test 1`;
+		} else if (slave.devotion > 20) {
+			return `Fingering anus test 2`;
+		} else if (slave.devotion > -20) {
+			return `Fingering anus test 3`;
+		} else {
+			return `Fingering anus test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	fuckPussy(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Fuck pussy test 1`;
+		} else if (slave.devotion > 20) {
+			return `Fuck pussy test 2`;
+		} else if (slave.devotion > -20) {
+			return `Fuck pussy test 3`;
+		} else {
+			return `Fuck pussy test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	fuckAnus(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Fuck asshole test 1`;
+		} else if (slave.devotion > 20) {
+			return `Fuck asshole test 2`;
+		} else if (slave.devotion > -20) {
+			return `Fuck asshole test 3`;
+		} else {
+			return `Fuck asshole test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	sixtyNine(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `69 test 1`;
+		} else if (slave.devotion > 20) {
+			return `69 test 2`;
+		} else if (slave.devotion > -20) {
+			return `69 test 3`;
+		} else {
+			return `69 test 4`;
+		}
+	}
+};
+
+App.UI.SlaveInteract.useSlave.generalText = {
+	/** @param {App.Entity.SlaveState} slave */
+	dance(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Dance test 1`;
+		} else if (slave.devotion > 20) {
+			return `Dance test 2`;
+		} else if (slave.devotion > -20) {
+			return `Dance test 3`;
+		} else {
+			return `Dance test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	striptease(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Striptease test 1`;
+		} else if (slave.devotion > 20) {
+			return `Striptease test 2`;
+		} else if (slave.devotion > -20) {
+			return `Striptease test 3`;
+		} else {
+			return `Striptease test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	pushDown(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Push down test 1`;
+		} else if (slave.devotion > 20) {
+			return `Push down test 2`;
+		} else if (slave.devotion > -20) {
+			return `Push down test 3`;
+		} else {
+			return `Push down test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	pullUp(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Pull up test 1`;
+		} else if (slave.devotion > 20) {
+			return `Pull up test 2`;
+		} else if (slave.devotion > -20) {
+			return `Pull up test 3`;
+		} else {
+			return `Pull up test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	pushAway(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Push away test 1`;
+		} else if (slave.devotion > 20) {
+			return `Push away test 2`;
+		} else if (slave.devotion > -20) {
+			return `Push away test 3`;
+		} else {
+			return `Push away test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	pullClose(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Pull in test 1`;
+		} else if (slave.devotion > 20) {
+			return `Pull in test 2`;
+		} else if (slave.devotion > -20) {
+			return `Pull in test 3`;
+		} else {
+			return `Pull in test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	goToBed(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Go to bed test 1`;
+		} else if (slave.devotion > 20) {
+			return `Go to bed test 2`;
+		} else if (slave.devotion > -20) {
+			return `Go to bed test 3`;
+		} else {
+			return `Go to bed test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	getOutOfBed(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Get out of bed test 1`;
+		} else if (slave.devotion > 20) {
+			return `Get out of bed test 2`;
+		} else if (slave.devotion > -20) {
+			return `Get out of bed test 3`;
+		} else {
+			return `Get out of bed test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	bringInSlave(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Second slave test 1`;
+		} else if (slave.devotion > 20) {
+			return `Second slave test 2`;
+		} else if (slave.devotion > -20) {
+			return `Second slave test 3`;
+		} else {
+			return `Second slave test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	bringInCanine(slave) {
+	// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Canine test 1`;
+		} else if (slave.devotion > 20) {
+			return `Canine test 2`;
+		} else if (slave.devotion > -20) {
+			return `Canine test 3`;
+		} else {
+			return `Canine test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	bringInHooved(slave) {
+	// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Hooved test 1`;
+		} else if (slave.devotion > 20) {
+			return `Hooved test 2`;
+		} else if (slave.devotion > -20) {
+			return `Hooved test 3`;
+		} else {
+			return `Hooved test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	bringInFeline(slave) {
+	// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Feline test 1`;
+		} else if (slave.devotion > 20) {
+			return `Feline test 2`;
+		} else if (slave.devotion > -20) {
+			return `Feline test 3`;
+		} else {
+			return `Feline test 4`;
+		}
+	},
+};
+
+App.UI.SlaveInteract.useSlave.clothingText = {
+	/** @param {App.Entity.SlaveState} slave */
+	pullUpDress(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Pull up dress test 1`;
+		} else if (slave.devotion > 20) {
+			return `Pull up dress test 2`;
+		} else if (slave.devotion > -20) {
+			return `Pull up dress test 3`;
+		} else {
+			return `Pull up dress test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeClothing(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove clothing test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove clothing test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove clothing test 3`;
+		} else {
+			return `Remove clothing test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeTop(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove top test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove top test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove top test 3`;
+		} else {
+			return `Remove top test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeBottom(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove bottom test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove bottom test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove bottom test 3`;
+		} else {
+			return `Remove bottom test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeBra(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove bra test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove bra test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove bra test 3`;
+		} else {
+			return `Remove bra test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeUnderwear(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove underwear test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove underwear test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove underwear test 3`;
+		} else {
+			return `Remove underwear test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	pullAsideUnderwear(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Pull aside underwear test 1`;
+		} else if (slave.devotion > 20) {
+			return `Pull aside underwear test 2`;
+		} else if (slave.devotion > -20) {
+			return `Pull aside underwear test 3`;
+		} else {
+			return `Pull aside underwear test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	addMouthAccessory(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Add mouth accessory test 1`;
+		} else if (slave.devotion > 20) {
+			return `Add mouth accessory test 2`;
+		} else if (slave.devotion > -20) {
+			return `Add mouth accessory test 3`;
+		} else {
+			return `Add mouth accessory test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeMouthAccessory(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove mouth accessory test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove mouth accessory test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove mouth accessory test 3`;
+		} else {
+			return `Remove mouth accessory test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeChastityVaginal(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove chastity vaginal test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove chastity vaginal test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove chastity vaginal test 3`;
+		} else {
+			return `Remove chastity vaginal test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeChastityAnal(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove chastity anal test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove chastity anal test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove chastity anal test 3`;
+		} else {
+			return `Remove chastity anal test 4`;
+		}
+	},
+
+	/** @param {App.Entity.SlaveState} slave */
+	removeChastityPenis(slave) {
+		// const {him, his} = getPronouns(slave);
+
+		if (slave.devotion > 50) {
+			return `Remove chastity penis test 1`;
+		} else if (slave.devotion > 20) {
+			return `Remove chastity penis test 2`;
+		} else if (slave.devotion > -20) {
+			return `Remove chastity penis test 3`;
+		} else {
+			return `Remove chastity penis test 4`;
+		}
+	},
+
+};
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 596863bca5b2d7b14fd6a77804bc57dc6c18d053..f0e7f63c8b13d1f8d51ae535908dca8cfb52a968 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -2886,7 +2886,7 @@ globalThis.DefaultRules = (function() {
 				}
 			}
 		}
-		if (rule.autoBrand === 1) {
+		if (rule.autoBrand === 1 && rule.brandDesign !== null) {
 			if (slave.health.condition > -20) {
 				let brandPlace = "";
 				let left;
diff --git a/src/js/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/birth/birth.js b/src/js/birth/birth.js
index bec390fac9d8a2b3e35d70136c52663b49770bdc..9059b66256f2bca02dbbc3e85f2483cb021f69fc 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -2219,7 +2219,10 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 		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`;
@@ -4067,7 +4070,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 
 	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);
@@ -4923,7 +4927,9 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 
 	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`;
@@ -5624,7 +5630,9 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 
 	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`;
@@ -6005,7 +6013,10 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 
 	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/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 3bc5ac5536baf2e7ba79822317e3471bfa1a82a1..20681d19154b01e0f1be03460bf1b88107eca2c0 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -20,32 +20,6 @@ globalThis.generateRandomEventPool = function(eventSlave) {
 					}
 				}
 
-				if (V.assistant.personality === 1) {
-					if (V.assistant.appearance !== "normal") {
-						if (eventSlave.devotion >= -20) {
-							if (canSee(eventSlave)) {
-								if (eventSlave.devotion <= 50) {
-									if (eventSlave.assignment === Job.HOUSE || eventSlave.assignment === Job.QUARTER) {
-										if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-											V.RESSevent.push("PA servant");
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.clothes === "a succubus outfit") {
-						if (eventSlave.devotion > 20) {
-							if (eventSlave.trust > 20) {
-								V.RESSevent.push("sexy succubus");
-							}
-						}
-					}
-				}
-
 				if (eventSlave.assignment !== Job.QUARTER) {
 					if (eventSlave.muscles > 5) {
 						if (eventSlave.devotion > 20) {
@@ -104,26 +78,6 @@ if(eventSlave.drugs === "breast injections") {
 */
 				}
 
-				if (eventSlave.assignment !== Job.QUARTER) {
-					if (eventSlave.physicalAge > 30) {
-						if (eventSlave.ageImplant > 0) {
-							if (eventSlave.devotion > 20) {
-								V.RESSevent.push("age implant");
-							}
-						}
-					}
-				}
-
-				if (V.slaves.length > 2) {
-					if (eventSlave.devotion >= -20) {
-						if (eventSlave.heels === 1) {
-							if (shoeHeelCategory(eventSlave) > 0) {
-								V.RESSevent.push("tendon fall");
-							}
-						}
-					}
-				}
-
 				if (V.spa > 0) {
 					if (eventSlave.boobs > 2000) {
 						if (eventSlave.devotion > 20) {
@@ -287,42 +241,7 @@ if(eventSlave.drugs === "breast injections") {
 				}
 			}
 
-			if (eventSlave.dick > 8) {
-				if (eventSlave.balls > 0) {
-					if (eventSlave.energy > 60) {
-						if (eventSlave.devotion > 50) {
-							if (eventSlave.trust > 50) {
-								if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-									if (eventSlave.belly < 100000) {
-										V.RESSevent.push("dick wringing");
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-
-			if (eventSlave.trust <= 20) {
-				if (eventSlave.trust >= -75) {
-					if (eventSlave.devotion <= 30) {
-						if (eventSlave.devotion >= -20) {
-							V.RESSevent.push("like me");
-						}
-					}
-				}
-			}
 			if (eventSlave.assignment !== Job.QUARTER) {
-				if (eventSlave.boobs >= 2000) {
-					if (eventSlave.boobsImplant === 0) {
-						if (eventSlave.nipples !== "tiny" && eventSlave.nipples !== "fuckable") {
-							if (eventSlave.devotion > 20) {
-								V.RESSevent.push("huge naturals");
-							}
-						}
-					}
-				}
-
 				if (eventSlave.boobs > 800) {
 					if (Math.floor(eventSlave.boobsImplant / eventSlave.boobs) >= 0.60) {
 						if (eventSlave.devotion > 20) {
@@ -332,26 +251,6 @@ if(eventSlave.drugs === "breast injections") {
 				}
 			}
 
-			if (eventSlave.devotion <= 50) {
-				if (eventSlave.trust >= -50) {
-					if (eventSlave.behavioralFlaw === "gluttonous") {
-						if (eventSlave.diet === "restricted") {
-							V.RESSevent.push("diet");
-						}
-					}
-				}
-			}
-
-			if (eventSlave.assignment !== Job.QUARTER) {
-				if (eventSlave.skill.entertainment >= 100) {
-					if (eventSlave.trust > 50) {
-						if (eventSlave.assignment === Job.PUBLIC) {
-							V.RESSevent.push("masterful entertainer");
-						}
-					}
-				}
-			}
-
 			if (eventSlave.assignment === Job.PUBLIC) {
 				if (eventSlave.devotion >= -20) {
 					if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
@@ -366,16 +265,6 @@ if(eventSlave.drugs === "breast injections") {
 				if (eventSlave.devotion > 20) {
 					if (eventSlave.trust >= -20) {
 						if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
-							if ((eventSlave.chastityPenis !== 1) || (eventSlave.dick === 0)) {
-								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) {
 									if (eventSlave.dick === 0) {
@@ -410,80 +299,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.sexualFlaw === "hates oral") {
-			if (V.PC.dick !== 0) {
-				if (eventSlave.devotion <= 50) {
-					V.RESSevent.push("hates oral");
-				}
-			}
-		}
-
-		if (eventSlave.assignment !== Job.QUARTER) {
-			if (V.seeExtreme === 1) {
-				if (eventSlave.balls > 1) {
-					if (eventSlave.scrotum > 0) {
-						if (eventSlave.devotion <= 20) {
-							if (eventSlave.trust <= 20) {
-								if (eventSlave.rules.speech !== "restrictive") {
-									V.RESSevent.push("fearful balls");
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.assignment !== Job.QUARTER) {
-			if (eventSlave.rules.speech !== "restrictive") {
-				if (canDoVaginal(eventSlave)) {
-					if (eventSlave.fetish !== "buttslut") {
-						if (eventSlave.vagina === 0) {
-							if (eventSlave.anus !== 0) {
-								if (eventSlave.counter.oral + eventSlave.counter.vaginal + eventSlave.counter.anal > 100) {
-									V.RESSevent.push("unhappy virgin");
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.aphrodisiacs > 1 || eventSlave.inflationType === "aphrodisiac") {
-			if (eventSlave.rules.speech === "restrictive" && eventSlave.rules.release.master === 1 && App.Utils.releaseRestricted(eventSlave)) {
-				V.RESSevent.push("extreme aphrodisiacs");
-			}
-		}
-
-		if (eventSlave.rules.release.masturbation === 1) {
-			if (eventSlave.dick > 4) {
-				if (hasAnyArms(eventSlave)) {
-					if (canAchieveErection(eventSlave)) {
-						if (eventSlave.belly < 10000) {
-							if (eventSlave.chastityPenis !== 1) {
-								V.RESSevent.push("slave dick huge");
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (eventSlave.boobs > 1200) {
-			if (eventSlave.areolaeShape !== "circle") {
-				if (eventSlave.devotion > 50) {
-					V.RESSevent.push("shaped areolae");
-				}
-			}
-		}
-
-		if (V.seePreg !== 0) {
-			if (eventSlave.bellyPreg >= 10000) {
-				V.RESSevent.push("hugely pregnant");
-			}
-		}
-
 		if (V.PC.dick !== 0) {
 			if (eventSlave.bellyPreg >= 300000) {
 				V.RESSevent.push("hyperpreg stuck");
diff --git a/src/js/ibcJS.js b/src/js/ibcJS.js
index 79be763d94e0f2da03d02644b8d31f739d43bea1..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;
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/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/slaveCostJS.js b/src/js/slaveCostJS.js
index 37943e5eae6c2cbc2b1eb1e18fce3501c557ba31..8003662e2caaca6858e750e27e3c945270bfe219 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -2605,9 +2605,9 @@ globalThis.slaveCostBeauty = (function() {
 				updateMultiplyer(`catgirl`, 0.9);
 			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 0) {
 				updateMultiplyer(`catgirl`, -0.5);
-			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 1) {
+			} 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) {
+			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techReleased === 0) {
 				updateMultiplyer(`catgirl`, 0.9);
 			}
 			if (arcology.FSEgyptianRevivalist !== "unset") {
@@ -2836,10 +2836,16 @@ globalThis.slaveCostBeauty = (function() {
 			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) {
-				updateMultiplyer(`near retirement`, (multiplier - (V.retirementAge - slave.actualAge) / 5));
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.actualAge));
 			} else {
-				updateMultiplyer(`near retirement`, (multiplier - (V.retirementAge - slave.physicalAge) / 5));
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.physicalAge));
 			}
 		}
 	}
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index f6e7a907a9a175f3ed600ab6028293d74f2bb58e..93bc5bfd457fbd4bba163f0bfc00e20d5a9530e3 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -517,7 +517,7 @@ globalThis.isSurgicallyImproved = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.isFullyPotent = function(slave) {
diff --git a/src/js/upgrade.js b/src/js/upgrade.js
index 599f0f99d2f7e0e39cd2d8b890ba6b7875041fac..3dae4c386f200df899779eb90c16ab9e9e2c1229 100644
--- a/src/js/upgrade.js
+++ b/src/js/upgrade.js
@@ -12,7 +12,7 @@ App.Upgrade = class Upgrade {
 		/** @private */
 		this._div = document.createElement("div");
 		/** @private @type {Object} */
-		this._object = object;
+		this._object = object || V;
 		/** @private @type {FC.IUpgradeTier[]} */
 		this._tiers = tiers;
 	}
@@ -28,39 +28,30 @@ App.Upgrade = class Upgrade {
 
 		this.tiers.forEach(tier => {
 			const {
-				value, link, base, upgraded, handler, note, prereqs, nodes,
+				value, link, text, upgraded, handler, note, prereqs, nodes,
 			} = tier;
 
-			let cost = Math.trunc(tier.cost) || 0;
-
-			if (!prereqs || prereqs.every(prereq => prereq())) {
-				if (upgraded
-					&& (_.isEqual(V[this.property], value)
-						|| _.isEqual(this._object[this.property], value))) {
-					App.UI.DOM.appendNewElement("div", frag, upgraded);
-				} else {
-					App.UI.DOM.appendNewElement("div", frag, base);
-					App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.link(link, () => {
-						cashX(forceNeg(cost), "capEx");
-
-						if (this._object) {
-							this._object[this.property] = value;
-						} else {
-							V[this.property] = value;
-						}
-
-						if (handler) {
-							handler();
-						}
-
-						this.refresh();
-					}, [], '',
-					`${cost > 0 ? `Costs ${cashFormat(cost)}` : `Free`}${note ? `${note}` : ``}.`),
-					['indent']);
-
-					if (nodes) {
-						App.Events.addNode(frag, nodes);
+			const cost = Math.trunc(tier.cost) || 0;
+
+			if ((!prereqs || prereqs.every(prereq => prereq()))
+				&& _.isEqual(value, this._object[this._property])) {
+				App.UI.DOM.appendNewElement("div", frag, text);
+				App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.link(link, () => {
+					cashX(forceNeg(cost), "capEx");
+
+					this._object[this._property] = upgraded;
+
+					if (handler) {
+						handler();
 					}
+
+					this.refresh();
+				}, [], '',
+				`${cost > 0 ? `Costs ${cashFormat(cost)}` : `Free`}${note ? `${note}` : ``}.`),
+				['indent']);
+
+				if (nodes) {
+					App.Events.addNode(frag, nodes);
 				}
 			}
 		});
@@ -69,7 +60,7 @@ App.Upgrade = class Upgrade {
 	}
 
 	/**
-	 * Renders the facility onscreen.
+	 * Renders the upgrade onscreen.
 	 *
 	 * @returns {HTMLDivElement}
 	 */
@@ -80,7 +71,7 @@ App.Upgrade = class Upgrade {
 	}
 
 	/**
-	 * Refreshes the facility onscreen.
+	 * Refreshes the upgrade onscreen.
 	 *
 	 * @returns {void}
 	 */
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index 9dc8690bcae36ea50fbe57514056e03af3079f6c..314b1100149dec7c6c30dccf2f6f5927d8568355 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -542,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");
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 05f7401ddcc8774b3d990b2d516ab41031648c08..8740161a1e0e2436bb0572d2553d8af9fa36f233 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -3009,7 +3009,11 @@ globalThis.parentNames = function(parent, child) {
 globalThis.faceIncrease = function(slave, amount) {
 	const oldFace = slave.face;
 	faceIncreaseAction(slave, amount);
-	return faceIncreaseDesc(slave, oldFace);
+	const newFace = slave.face;
+	slave.face = oldFace;
+	const desc = faceIncreaseDesc(slave, newFace);
+	slave.face = newFace;
+	return desc;
 };
 
 /**
@@ -3024,28 +3028,28 @@ globalThis.faceIncreaseAction = function(slave, amount) {
 };
 
 /**
- * Describes the slave face changes AFTER they were applied to the slave
+ * Describes the slave face changes BEFORE they are applied to the slave
  *
  * @param {App.Entity.SlaveState} slave
- * @param {number} oldFace
+ * @param {number} newFace
  * @returns {string}
  */
-globalThis.faceIncreaseDesc = function(slave, oldFace) {
+globalThis.faceIncreaseDesc = function(slave, newFace) {
 	const pronouns = getPronouns(slave);
 	const his = pronouns.possessive;
 	const His = capFirstChar(his);
 	let r = "";
-	if (oldFace <= -95) {
+	if (slave.face <= -95) {
 		r += `<span class="green">${His} face is no longer horrifying,</span> and is now merely ugly.`;
-	} else if (oldFace <= -40 && slave.face > -40) {
+	} else if (slave.face <= -40 && newFace > -40) {
 		r += `<span class="green">${His} face is no longer ugly,</span> and is now merely unattractive.`;
-	} else if (oldFace <= -10 && slave.face > -10) {
+	} else if (slave.face <= -10 && newFace > -10) {
 		r += `<span class="green">${His} face is no longer unattractive,</span> and is now somewhat tolerable.`;
-	} else if (oldFace <= 10 && slave.face > 10) {
+	} else if (slave.face <= 10 && newFace > 10) {
 		r += `<span class="green">${His} face is now decently attractive,</span> rather than merely tolerable.`;
-	} else if (oldFace <= 40 && slave.face > 40) {
+	} else if (slave.face <= 40 && newFace > 40) {
 		r += `<span class="green">${His} face is now quite beautiful,</span> rather than merely pretty.`;
-	} else if (oldFace <= 95 && slave.face > 95) {
+	} else if (slave.face <= 95 && newFace > 95) {
 		r += `<span class="green">${His} face is now perfect.</span> It's difficult to imagine how it could be any more beautiful.`;
 	}
 	return r;
diff --git a/src/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/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/slaveShelter.js b/src/markets/specificMarkets/slaveShelter.js
index a4ab86791cd7f65e2ed2d93d523e0e458771e3ca..a577b8e6f6147ff8a9f7345676ac7dce85af86c9 100644
--- a/src/markets/specificMarkets/slaveShelter.js
+++ b/src/markets/specificMarkets/slaveShelter.js
@@ -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});
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/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/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index 0cb97ed2d93092160dadd203dea1ffca57c6d083..3c2b157096380ef2eb40d3a78ec44c98a621c0cf 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -943,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)) {
@@ -1022,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)) {
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/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js
index 6d9ad605f45b1e66e2b8e24fb38b6afebefba20f..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.`);
 		}
@@ -654,7 +654,7 @@ App.Desc.vagina = function(slave) {
 	} 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.`);
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/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 f97424d4254c388c4910804d557fc56249588c10..27c64f2b01b7c690a6cac322614aade78f78e3a8 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1121,9 +1121,33 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				eyeSurgery(slave, "both", "blur");
 			}
 			slave.hears = jsEither([-2, -1, -1, -1, -1, 0, 0, 0]);
-			if (V.seeExtreme === 1 && jsRandom(0, 2) === 2) {
-				// TODO: maybe only partly amputee?
-				removeLimbs(slave, "all");
+			if (V.seeExtreme === 1) {
+				/** @type {FC.LimbArgument[]} */
+				const limbs = ["left arm", "left leg", "right arm", "right leg"];
+				switch (jsRandom(0, 16)) {
+					case 1:
+					case 2:
+						// 1/8 chance quad amputee
+						removeLimbs(slave, "all");
+						break;
+					case 3:
+						// 1/16 chance no arms
+						removeLimbs(slave, "left arm");
+						removeLimbs(slave, "right arm");
+						break;
+					case 4:
+						// 1/16 chance no legs
+						removeLimbs(slave, "left leg");
+						removeLimbs(slave, "right leg");
+						break;
+					case 5:
+					case 6:
+						// 1/8 chance missing one random limb
+						removeLimbs(slave, limbs.random());
+						break;
+					default:
+						// 5/8 chance all limbs intact
+				}
 			}
 			if (hasAnyLegs(slave)) {
 				slave.heels = jsEither([0, 0, 0, 0, 0, 1, 1]);
diff --git a/src/npc/generate/generateRelatedSlave.js b/src/npc/generate/generateRelatedSlave.js
index 0b7273f2fbbad6756f6d43aa0d13e8c58dcf6d5c..8cf3aa77cfe1faef9b932075f7d7e27cee1dfec3 100644
--- a/src/npc/generate/generateRelatedSlave.js
+++ b/src/npc/generate/generateRelatedSlave.js
@@ -359,6 +359,9 @@ globalThis.generateRelatedSlave = (function() {
 
 		// reset health (but keep condition, which disproportionately influences slave value)
 		setHealth(slave, slave.health.condition);
+
+		// reset career
+		slave.career = randomCareer(slave);
 	}
 
 	/**
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 23b0fdf4223504d4bcfda118858fae19a7339c30..aad7bf50564b86a2fdc5ecc045ba964852a5d4c5 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -490,10 +490,10 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 			slave.devotion -= 3;
 			slave.trust += 10;
 		} else if (PC.career === "gang") {
-			r.push(`${He} recognizes you from various crime reports, <span class="fear inc">filling ${him} with fear</span> over what life under you will be like.`);
+			r.push(`${He} recognizes you from various crime reports, <span class="trust dec">filling ${him} with fear</span> over what life under you will be like.`);
 			slave.trust -= 10;
 		} else if ((PC.career === "hoodlum" || PC.career === "street urchin") && canSee(slave)) { // switch to tat?
-			r.push(`${He} scoffs at first at being owned by such a colorful character, <span class="fear inc">but ${he} soon pales</span> once ${he} sees the gang signs adorning your neck.`);
+			r.push(`${He} scoffs at first at being owned by such a colorful character, <span class="trust dec">but ${he} soon pales</span> once ${he} sees the gang signs adorning your neck.`);
 			slave.trust -= 10;
 		}
 
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/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/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/fRelation.js b/src/npc/interaction/fRelation.js
index 48633ee820d1a94ffe56eeb8b7746518ad839bf0..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);
@@ -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) {
@@ -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/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/surgery/fatGraft.js b/src/npc/surgery/fatGraft.js
index 287102ef65c0b29bfc1c72bd392b8f7592133317..461f12ceecd4e31a7f8023fe68c97dddd3dec01e 100644
--- a/src/npc/surgery/fatGraft.js
+++ b/src/npc/surgery/fatGraft.js
@@ -96,12 +96,23 @@ App.UI.SlaveInteract.fatGraft = function(slave) {
 			linkArray.push(App.UI.DOM.disabledLink(`No fat marked for ass use.`, []));
 		}
 		App.UI.DOM.appendNewElement("div", p, App.UI.DOM.generateLinksStrip(linkArray));
+		App.UI.DOM.appendNewElement("p", el, App.UI.DOM.passageLink("Finalize fat transfer", "Surgery Degradation", () => {
+			slave.boobs += boobFat * 100;
+			slave.butt += buttFat;
+			slave.boobs = Math.clamp(slave.boobs, 0, 50000);
+			slave.butt = Math.clamp(slave.butt, 0, 20);
+
+			V.boobFat = boobFat;
+			V.buttFat = buttFat;
+
+			surgeryDamage(slave, 40);
+			cashX(forceNeg(V.surgeryCost * 2), "slaveSurgery", slave);
+			V.surgeryType = "fat graft";
+		}));
 		return el;
 	}
 
 	function refresh() {
-		V.boobFat = boobFat;
-		V.buttFat = buttFat;
 		jQuery(passage).empty().append(content());
 	}
 };
diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js
index 28a08180ed060d80a7eb9fee2ee64357c74e7be2..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/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/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/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 6a9948349a692f272a546c4f653f5c5665a5ab0a..6cd73c198e0bd61e3e10b13a0301973106f83559 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -42,7 +42,7 @@
 <<set $nextButton = "Continue", $nextLink = "AS Dump", $returnTo = "Next Week", _didAnal = 0, _didVaginal = 0>>
 
 <<set _clothesTemp = $activeSlave.clothes>>
-<<if ["age implant",
+<<if [
 "ara ara",
 "back stretch",
 "bonded love",
@@ -51,30 +51,19 @@
 "devoted exhibition",
 "devoted lotion",
 "desperate null",
-"extreme aphrodisiacs",
-"fearful balls",
 "fucktoy tribbing",
 "gaped asshole",
 "happy dance",
-"huge naturals",
-"hugely pregnant",
 "implant inspection",
 "orchiectomy please",
-"sexy succubus",
-"shaped areolae",
-"shift masturbation",
-"shift sleep",
 "shower slip",
-"slave dick huge",
 "sore shoulders",
 "spa boobs",
 "subjugation blues",
-"tendon fall",
 "terrified inspection",
 "tittymonster inspection",
 "torpedo squeeze",
-"transition anxiety",
-"unhappy virgin"].includes($RESSevent)>>
+"transition anxiety"].includes($RESSevent)>>
 	<<set $activeSlave.clothes = "no clothing">>
 <</if>>
 
@@ -351,340 +340,6 @@ in the middle of the room with the machines all around $him. $He has <<if canDoV
 <br><br>
 The source of the many-voiced personal assistant becomes clear: probably on the incorrigible $activeSlave.slaveName's request, your sultry personal assistant is voicing each and every one of the machines. When the nymphomaniac masturbator tries to smile <<if hasAnyArms($activeSlave)>> and wave<</if>>, there's an absolute chorus of "Back to work, slut", "Smile less, suck more", "Take it, bitch", et cetera. Yet another instance of $assistant.name chuckles in your ear. "Care to join in, <<= properTitle()>>? I'm sure we can find room somewhere."
 
-<<case "age implant">>
-
-In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each others' youthful energy. At the back of the pack is <<= App.UI.slaveDescriptionDialog($activeSlave)>>. $He looks as young as any of them, but after they're out, $he leans against the door frame for a moment and exhales slowly.
-<br><br>
-$His <<= App.Desc.eyeColor($activeSlave)>>-eyed gaze catches yours for a moment, and you are reminded that $he isn't as young as they are, not at all. $His face might look youthful, but $his eyes don't. <<if canSee($activeSlave)>>$He sees your consideration, and<<else>>You make yourself known, and $he<</if>> murmurs, "<<S>>orry, <<Master>>. Ju<<s>>t a little <<s>>low thi<<s>> morning."
-$He hurries after $his sisters, $his
-<<if $activeSlave.butt > 12>>
-	massive
-<<elseif $activeSlave.butt > 8>>
-	giant
-<<elseif $activeSlave.butt > 5>>
-	huge
-<<elseif $activeSlave.butt > 2>>
-	big
-<<else>>
-	pretty little
-<</if>>
-naked ass catching your eye as $he goes.
-
-<<case "shift masturbation">>
-
-Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if _S.Concubine>>Your concubine, _S.Concubine.slaveName<<elseif $HeadGirlID != 0>>Your Head Girl, _S.HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift.
-<br><br>
-And has $he ever come on shift. $He enters your office at something not far removed from a run, displaying evident signs of sexual excitation, a blush visible on $his $activeSlave.skin cheeks. Between $his job, the mild drugs in $his food, and $his life, $he's beside $himself with need. $He realizes you're working and tries to compose $himself, but gives up after a short struggle and flings $himself down on the couch. $He scoots down so $his <<if $activeSlave.butt > 5>>enormous<<elseif $activeSlave.butt > 2>>healthy<<else>>trim<</if>> butt is hanging off the edge of the cushion, and spreads $his legs up and back<<if $activeSlave.belly >= 5000>> to either side of $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>> as wide as they'll go<<if ($activeSlave.boobs > 1000)>>, hurriedly shoving $his tits out of the way<</if>>. $He uses both hands to frantically
-<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-	<<if ($activeSlave.hormoneBalance >= 100)>>
-		rub $his hormone-dysfunctional penis,
-	<<elseif $activeSlave.balls > 0 && $activeSlave.ballType == "sterile">>
-		rub $his limp, useless penis,
-	<<elseif ($activeSlave.balls == 0)>>
-		rub $his limp, ballsless penis,
-	<<else>>
-		rub $his soft penis,
-	<</if>>
-<<elseif $activeSlave.dick > 4>>
-	jack off $his titanic erection,
-<<elseif $activeSlave.dick > 2>>
-	jack $himself off,
-<<elseif $activeSlave.dick > 0>>
-	rub $his pathetic little hard-on,
-<<elseif $activeSlave.vagina == -1>>
-	frantically rubs the sensitive area beneath $his asspussy,
-<<elseif $activeSlave.clit > 0>>
-	rub $his huge, engorged clit,
-<<elseif $activeSlave.labia > 0>>
-	play with $his clit and $his generous labia,
-<<else>>
-	rub $his pussy,
-<</if>>
-but after a moment $he clearly decides this isn't enough stimulation. $He <<if $activeSlave.dick > 0>>uses two fingers to collect the precum dribbling from $his dickhead.<<else>>fucks $himself vigorously with two fingers to collect some girl lube.<</if>> $He brings these fingers up to $his face to check $his work, hesitates, visibly decides $he doesn't care, and reaches down to <<if $activeSlave.anus > 2>>slide them into $his loose asspussy. $He sighs with pleasure at the sensation.<<elseif $activeSlave.anus > 1>>shove them up $his butt. $He wriggles a little at the makeshift lubrication but is clearly enjoying $himself.<<else>>push them up $his tight butt. The pain of anal penetration with only makeshift lubrication extracts a huge sobbing gasp from $him, and $he tears up a little even as $he masturbates furiously.<</if>>
-
-<<case "shift sleep">>
-
-Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if _S.Concubine>>Your concubine, _S.Concubine.slaveName<<elseif $HeadGirlID != 0>>Your Head Girl, _S.HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift.
-<br><br>
-Though it's late, $he's surprised to find the lights in the master suite off. You had an unusually trying day, so you've retired for the night; you're on the point of sleep when $he comes in<<if _S.Concubine && _S.Concubine.ID !== $activeSlave.ID>>, _S.Concubine.slaveName nestled under your arm<</if>>. After a moment's hesitation, $activeSlave.slaveName strips quietly and
-<<if $activeSlave.belly >= 100000>>
-	gently lowers $his extremely gravid body onto
-<<elseif $activeSlave.belly >= 10000>>
-	gently lowers $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>heavily swollen<</if>> body onto
-<<elseif $activeSlave.weight > 95>>
-	gently lowers $his heavy body onto
-<<else>>
-	sits on
-<</if>>
-the edge of the bed, preparing to climb quietly in. $He clearly thinks you're asleep, and is doing $his best not to wake you. The dim, blue-toned light of your bedroom at night washes out $his $activeSlave.skin skin and robs $his <<= App.Desc.eyesColor($activeSlave)>> of their color, but it highlights
-<<if ($activeSlave.belly >= 100000)>>
-	$his _belly dome of a stomach,
-	<<if $activeSlave.bellyPreg >= 3000>>
-		greatly swollen with life.
-	<<elseif $activeSlave.bellyImplant >= 3000>>
-		greatly distended by $his implant.
-	<</if>>
-<<elseif ($activeSlave.nipples == "huge")>>
-	the wonderful nipples jutting from $his flesh, stiffening in the cool night air.
-<<elseif ($activeSlave.weight > 130)>>
-	$his fat gut, with each fold making its own shadowed trench and $his navel forming a little dark hollow in $his soft stomach.
-<<elseif ($activeSlave.belly >= 5000)>>
-	$his rounded belly,
-	<<if $activeSlave.bellyPreg >= 3000>>
-		swollen with life.
-	<<elseif $activeSlave.bellyImplant >= 3000>>
-		filled out by $his implant.
-	<<else>>
-		bloated with <<print $activeSlave.inflationType>>.
-	<</if>>
-<<elseif ($activeSlave.weight > 95)>>
-	$his fat belly, with $his navel forming a little dark hollow in $his soft stomach.
-<<elseif ($activeSlave.weight > 10)>>
-	$his plush belly, with $his navel forming a little dark hollow in $his pretty stomach.
-<<elseif ($activeSlave.muscles > 30)>>
-	$his washboard abs, with each muscle casting its own little shadow.
-<<elseif ($activeSlave.boobs > 1000)>>
-	the huge curve of $his breasts, a giant dark presence.
-<<elseif ($activeSlave.dick > 2)>>
-	the presence between $his legs.
-<<else>>
-	$his pretty face.
-<</if>>
-<<if canSee($activeSlave)>>$He perceives the glint of your open eyes<<elseif canHear($activeSlave)>>$He hears your breathing change<<else>>$He correctly guesses you're wide awake<</if>>, and stops, patiently waiting for some sign of what you'd like $him to do.
-
-<<case "slave dick huge">>
-
-The showers your slaves use are well vented and transparent walled so that you can see their occupants clearly, even from your desk. Working late at night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> sitting hunched under the water in one of the showers, with $his back to you. You tell your desk to focus on $him, and you are rewarded with three different angles of $activeSlave.slaveName giving $himself a blowjob. $He has to bend over very hard<<if $activeSlave.belly >= 5000>> and at a very awkward angle<</if>> to get the tip of $his huge <<if $seeRace == 1>>$activeSlave.race <</if>>dick<<if $activeSlave.belly >= 5000>> around $his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>> belly and<</if>> into $his mouth, but $he's obviously enjoying it all the same. It's not against the rules for $him to masturbate; $he's just found an impressive way of doing it.
-<<if $activeSlave.scrotum > 0>>
-	<<if $activeSlave.balls >= 10>>
-		As $he works $himself, $he plays with $his inhuman balls, massaging and caressing as much of them $he as $he can with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-	<<elseif $activeSlave.balls > 8>>
-		As $he works $himself, $he plays with $his monster balls, massaging and caressing them with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>.
-	<<elseif $activeSlave.balls > 5>>
-		As $he works $himself, $he plays with $his massive balls, cupping them and squeezing gently.
-	<<elseif $activeSlave.balls > 3>>
-		As $he works $himself, $he plays with $his big balls, rolling them around and squeezing them gently.
-	<<elseif $activeSlave.balls > 1>>
-		As $he works $himself, $he plays with $his balls, massaging them with <<if hasBothArms($activeSlave)>>one<<else>>$his<</if>> hand.
-	<</if>>
-<</if>>
-
-<<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>>!"
-
-<<case "unhappy virgin">>
-
-During a routine inspection, <<= App.UI.slaveDescriptionDialog($activeSlave)>> respectfully asks a question.
-<<if !canTalk($activeSlave)>>
-	$He uses amusingly lewd gestures to depict how frequently $he gets fucked, and then points to $his virgin pussy. $He communicates that $he wants another hole to help share the work.
-<<else>>
-	$He <<say>>s, "<<Master>>, I take a lot of dick. I try my be<<s>>t, but
-	<<if canDoAnal($activeSlave)>>
-		my butt really hurt<<s>> <<s>>ometime<<s>> and my throat'<<s>> <<s>>ore, too.
-	<<else>>
-		my throat'<<s>> really <<s>>ore and I can't feel my tongue too well.
-	<</if>>
-	Can I get fucked in the pu<<ss>>y, to <<s>>pread it out a little?"
-<</if>>
-
-<<case "fearful balls">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is still having obedience problems, particularly with $his proper role as a <<if $girl == "girl">>female <</if>>receptacle for cock. Though they're an almost too-obvious explanation, it's hard to avoid $his retention of $his gonads as a possible explanation for $his behavioral issues. They certainly contribute to $his less than perfectly feminine hormonal balance.
-<br><br>
-It's time for $his routine inspection, and $he's standing before you, nude. $He certainly doesn't find $his sexually vulnerable position arousing; $he's totally flaccid. The physical manifestations of $his disobedience are right in front of you, and quite defenseless.
-
-<<case "extreme aphrodisiacs">>
-
-As you are retiring for the night, <<= App.UI.slaveDescriptionDialog($activeSlave)>>
-<<if !canWalk($activeSlave)>>
-	crawls
-<<elseif shoeHeelCategory($activeSlave) > 1>>
-	totters
-<<elseif $activeSlave.belly >= 10000>>
-	waddles
-<<else>>
-	walks
-<</if>>
-into your bedroom. Since $he is not allowed to ask questions, $he says nothing, but $his reason for being here is obvious enough. $He's on a medically reckless dosage of aphrodisiacs, and $he's panting as $he
-<<if ($activeSlave.heels == 1) && (shoeHeelCategory($activeSlave) == 0)>>
-	kneels
-<<elseif (shoeHeelCategory($activeSlave) > 1)>>
-	teeters
-<<else>>
-	stands
-<</if>>
-there. $His nipples are <<if $activeSlave.nipples != "fuckable">>hard<<else>>swollen shut<</if>>, and there's visible moisture on $his <<if $seeRace == 1>>$activeSlave.race <</if>><<if $activeSlave.vagina != -1>>pussylips<<else>><<if $activeSlave.dick != 0>>dickhead<<else>>tiny little front hole<</if>><</if>>. It's also against the rules for $him to masturbate, so $he clearly decided to come to you rather than break the rules. There's no way $he'll be able to sleep like this.
-
-<<case "shaped areolae">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>>'s breasts are real works of art. $His
-<<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>>
-	massive fake
-<<elseif $activeSlave.boobsImplant > 0>>
-	massive, partially unnatural
-<<else>>
-	massive, sagging natural
-<</if>>
-tits dominate $his figure, but the real attention getter are $his unique, <<= $activeSlave.areolaeShape>>-shaped areolae. The darker flesh around $his nipples would be — should be — circular in any other $woman, and the cute $activeSlave.areolaeShape shapes around $activeSlave.slaveName's nipples are proof of just how much you've modified $him. $He's devoted to you, so much so that $he loves showing off $his special assets.
-
-<<case "diet">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is on a diet, and $he needs it. That doesn't make it any easier for $him. Your slaves are not permitted time to waste over meals. They enter the simple kitchen, drink their allotted portion of slave food out of a cup, and get on with their duties.<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/1.33>> Despite eating for <<if $activeSlave.pregType <= 1>>two<<elseif $activeSlave.pregType >= 10>>far too many<<else>><<= num($activeSlave.pregType + 1)>><</if>>, $his diet is still in full effect.<</if>> <<= capFirstChar($assistant.name)>> catches $activeSlave.slaveName, whose cup is always filled less than halfway, skulking around in the hope that one of the others will take $his eyes off $his cup, or even leave leftovers.
-
-<<case "huge naturals">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes before you naked for a routine inspection. You take particular care to examine $his massive breasts, since they've grown so large it's necessary to check for unsightly veins, stretch marks, and the like. You note $his big nipples with appreciation. Since $his breasts are so enormous and completely free of implants, they're quite heavy. When $he stands,
-<<if $activeSlave.boobShape == "saggy" || $activeSlave.boobShape == "downward-facing">>
-	$his nipples face out and down.
-<<else>>
-	gravity causes them to hang low.
-<</if>>
-As you inspect $him with your hands, $he
-<<if !canTalk($activeSlave)>>
-	breathes a little harder and looks like $he would speak, were $he not mute.
-<<else>>
-	<<if ($activeSlave.lips > 70)>>
-		murmurs through $his huge lips,
-	<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-		murmurs through $his piercings,
-	<<else>>
-		murmurs,
-	<</if>>
-	"That feel<<s>> really ni<<c>>e, <<Master>>."
-<</if>>
-
-<<case "hugely pregnant">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>>'s daily routine includes frequent application of special skin care to $his $activeSlave.skin, hugely swollen belly to prevent $his pregnancy from ruining $his appearance with unsightly stretch marks. Several times a day, $he visits the bathroom to <<if (!hasAnyArms($activeSlave))>>have another slave<<else>>carefully<</if>> coat $his entire _belly stomach in the stuff. $He's so pregnant that it's hard to reach <<if $activeSlave.belly >= 150000>>most of its mass<<else>>the underside<</if>>. The chore keeps $him occupied and stationary for quite a while; there's no need to leave $him sexually idle while $he completes it.
-
-<<case "PA servant">>
-
-As you begin your day one morning, you hear the quiet
-<<switch $assistant.appearance>>
-<<case "monstergirl">>
-	but unmistakably sensual voice of your monster<<= _girlA>>
-<<case "shemale">>
-	but unmistakably lewd voice of your shemale
-<<case "amazon">>
-	but unmistakably aggressive voice of your amazon
-<<case "businesswoman">>
-	but unmistakably dominant voice of your business<<= _womanA>>
-<<case "fairy" "pregnant fairy">>
-	but unmistakably adorable voice of your fairy
-<<case "goddess" "hypergoddess">>
-	and kindly voice of your goddess
-<<case "loli">>
-	and childish voice of your _loliA
-<<case "preggololi">>
-	and childish, out of breath voice of your pregnant _loliA
-<<case "angel">>
-	but unmistakably caring voice of your angel
-<<case "cherub">>
-	yet overly cheerful voice of your cherub
-<<case "incubus">>
-	and commanding, but obviously aroused voice of your incubus
-<<case "succubus">>
-	and seductive, but obviously aroused voice of your succubus
-<<case "imp">>
-	and harassing voice of your imp
-<<case "witch">>
-	and oddly aroused voice of your witch
-<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-	and very distinct voice of your avatar
-<<case "schoolgirl">>
-	but unmistakably suggestive voice of your school<<= _girlA>>
-<</switch>>
-personal assistant coming from your office. Looking in, you are treated to the sight of <<= App.UI.slaveDescriptionDialog($activeSlave)>>'s <<if $activeSlave.butt > 8>>ridiculous bottom jiggling<<elseif $activeSlave.butt > 4>>big behind bouncing<<else>>cute rear<</if>><<if $activeSlave.belly >= 5000>>, and the _ belly rounded belly hanging between $his legs,<</if>> as $he reaches out over the glass top of your desk with a soft, dust-free cloth and a bottle of screen cleaner. <<= capFirstChar($assistant.name)>> is displaying _hisA avatar right under where the slave is cleaning the glass screen, and _heA's displaying it nude. _HeA's positioned _himselfA so that the poor slave appears to be wiping
-<<switch $assistant.appearance>>
-<<case "monstergirl">>
-	_hisA hair-tentacles
-<<case "shemale">>
-	the shaft of _hisA massive prick
-<<case "amazon">>
-	the insides of _hisA muscular thighs
-<<case "businesswoman">>
-	_hisA pussy
-<<case "fairy">>
-	_hisA tiny body
-<<case "pregnant fairy">>
-	_hisA tiny yet swollen body
-<<case "goddess">>
-	_hisA motherly tits
-<<case "hypergoddess">>
-	_hisA huge pregnant belly
-<<case "loli">>
-	_hisA flat chest
-<<case "preggololi">>
-	_hisA pregnant belly
-<<case "angel">>
-	_hisA wide-spread wings
-<<case "cherub">>
-	_hisA cute pussy
-<<case "incubus">>
-	_hisA throbbing prick
-<<case "succubus">>
-	_hisA lovely pussy
-<<case "imp">>
-	_hisA pussy
-<<case "witch">>
-	_hisA plump tits
-<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-	_hisA phallic tentacles
-<<case "schoolgirl">>
-	_hisA perky tits
-<</switch>>
-down with screen cleaner, and is talking dirty to the furiously blushing servant. "Ohh, that feels good," _heA moans. "Rub me right there, you $desc slut! I love it!" The poor slave is doing $his best to hurry, embarrassed and unsure of how to react to $assistant.name's behavior.
-
-<<case "like me">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> appears at the door of your office, looking frightened. $He takes one hesitant step in and stops, wavering, $his hand balled into fists and $his lower lip caught behind $his teeth. The $desc is getting used to $his place as chattel, but $he isn't sure of $himself yet. After a few moments, it becomes obvious that $he's lost whatever mental momentum propelled $him to come in here, and can't muster the courage to back out, either. You rescue $him by politely but firmly ordering $him to tell you why $he's here. After two false starts, $he
-<<if !canTalk($activeSlave)>>
-	uses shaky hands to ask you to fuck $him.
-<<else>>
-	"P-plea<<s>>e fuck me, <<Master>>," $he chokes out.
-<</if>>
-To go by $his behavior, the likelihood that $he's actually eager to <<if $PC.dick == 0>>eat pussy<<else>>take a dick<</if>>, never mind yours, is vanishingly small.
-
-<<case "hates oral">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. $He's <<if canSee($activeSlave)>>seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves<<elseif canHear($activeSlave)>>heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more<<else>>felt seminal fluid on $his skin and on $his lips, always coercively or accidentally<</if>>. It's clear from $activeSlave.slaveName's recent reactions to these acts that $he's quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for $him to overcome or a weakness you can exploit.
-
-<<case "masterful entertainer">>
-
-It's Friday evening, the most socially important part of the week in $arcologies[0].name. <<= App.UI.slaveDescriptionDialog($activeSlave)>> happens to be free this evening, and your schedule is open, too. Lately, $he's been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever $he gets the chance to catch someone's eye<<if $activeSlave.belly >= 5000>>, even with $his <<if $activeSlave.bellyPreg >= 3000>>advanced pregnancy<<elseif $activeSlave.bellyImplant >= 3000>>_belly rounded belly<<else>>sloshing <<print $activeSlave.inflationType>>-filled stomach<</if>><</if>>. There are a number of events tonight you could attend with $him on your arm.
-
-<<case "sexy succubus">>
-
-You cross paths with <<= App.UI.slaveDescriptionDialog($activeSlave)>> as $he moves from the living area to $activeSlave.assignment, just starting $his day. $He's full of energy, and $his succubus outfit is delightful. $He <<if canSee($activeSlave)>>sees your glance<<else>>recognizes your whistle<</if>> and greets you with a <<if canSee($activeSlave)>>wicked glint in $his eye<<else>>wicked smirk on $his face<</if>>, bowing a bit to show off $his <<if $activeSlave.boobs > 6000>>bare, inhumanly large breasts<<elseif $activeSlave.lactation > 0>>bare udders, heavy with milk<<elseif $activeSlave.boobsImplant > 0>>naked fake tits<<elseif $activeSlave.boobs > 800>>heavy, naked breasts<<elseif $activeSlave.boobs > 300>>naked little tits<<else>>pretty chest<</if>> and then continuing towards you with a pirouette. $His tail bounces flirtily, holding the back of $his skirt up to show off <<if $activeSlave.butt > 8>>$his absurdly wide bottom<<elseif $activeSlave.analArea > 3>>the broad area of puckered skin around $his slutty asspussy<<elseif $activeSlave.buttImplant > 0>>$his butt implants<<elseif $activeSlave.butt > 5>>$his big butt<<elseif $activeSlave.anus > 1>>a hint of $his asshole, which $his cute buttocks don't quite conceal<<else>>$his cute bottom<</if>>.
-<br><br>
-$He looks like <<if $activeSlave.bellyPreg >= 1500 || $activeSlave.bellyImplant >= 1500>>a lusty, pregnant, hungry<<elseif $activeSlave.bellyFluid >= 1500>>a gluttonous, over-fed but still hungry<<elseif $activeSlave.height > 180>>an imposing, hungry<<elseif $activeSlave.muscles > 30>>a muscular, hungry<<elseif $activeSlave.weight > 10>>a well-fed but still hungry<<elseif $activeSlave.energy > 95>>a desperately hungry<<else>>a cute, hungry little<</if>> sex demon, and you tell $him so.
-<<if $activeSlave.intelligence > 50>>
-	The clever $girl knows all about succubi.
-<<elseif $activeSlave.intelligenceImplant >= 15>>
-	$He's been taught the basics about succubi.
-<<else>>
-	$He quickly searches $his memory for the basic information about succubi that came with $his outfit.
-<</if>>
-<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-	"Oh <<Master>> I'm thtarving," $he lisps,
-<<else>>
-	"Oh <<Master>>, I'm ssstarving," $he moans,
-<</if>>
-running $his tongue over $his<<if $activeSlave.lips > 40>> whorish<<elseif $activeSlave.lips > 20>> plush<</if>> lips and sticking out $his chest to present $his boobs even more obviously.
-
-<<case "dick wringing">>
-
-You run into <<= App.UI.slaveDescriptionDialog($activeSlave)>> in the hallway outside your office. The devoted $desc smiles at you as $he approaches. You barely notice how awkward $his gait is, since $he usually walks a little strangely. $His third leg tends to have that effect. But on consideration, $he does seem especially uncomfortable right now. The poor $girl's <<if $activeSlave.scrotum == 0>>internal balls<<elseif $activeSlave.balls < 3>>girly balls<<elseif $activeSlave.scrotum < 4>>balls, held tightly against $his body by $his taut scrotum,<<else>>swinging balls<</if>> must be in dire need of emptying.
-<br><br>
-$He trusts you, so $he approaches you as sensually as $he can manage and asks for your help.
-<<if !canTalk($activeSlave)>>
-	$He uses quick but submissive gestures to beg you to help $him cum, pleading the special difficulties caused by $his outlandish member, which $he can manage most comfortably if $he has both hands free for it.
-<<else>>
-	"<<Master>>, would you plea<<s>>e, plea<<s>>e help me cum?" $he begs submissively. "It'<<s>> ni<<c>>e if I can u<<s>>e both hand<<s>> on it to, um, manage thing<<s>>."
-<</if>>
-$He's referring to the volume issue with $his unnaturally massive dick. The thing is so huge and so soft that <<if $activeSlave.balls < 3>>one of $his (by comparison) pathetically weak ejaculations<<elseif $activeSlave.balls < 6>>one of $his comparatively normal ejaculations<<else>>a single one of even $his copious ejaculations<</if>> often fails to make it all the way to the tip of $his cock, making it only partway down $his urethra without help.
-
 <<case "fucktoy tribbing">>
 
 <<setNonlocalPronouns $seeDicks>>
@@ -2257,2097 +1912,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
 <</if>>
 
-<<case "age implant">>
-
-<<link "Go out clubbing to make $him feel young again">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent club<<= $girl>> outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously.
-		"I hope they let me into the club without checking my I.D., <<Master>>," $he jokes,
-		for which $he receives a swat on $his rear as you head out. With the full day of rest, $he is full of vigor and ready to dance. $He eagerly heads out onto the floor with you,
-		<<if ($activeSlave.skill.entertainment >= 100)>>
-			masterfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, grabbing the attention of all the men and most of the women in $clubName.
-		<<elseif ($activeSlave.skill.entertainment > 60)>>
-			expertly moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, mesmerizing $his neighbors on the floor.
-		<<elseif ($activeSlave.skill.entertainment > 30)>>
-			skillfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, drawing a lustful gaze or two.
-		<<else>>
-			clumsily moving <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> $his body to the heavy beat, attracting little notice among the press of novices.
-		<</if>>
-		It doesn't take long for $him to back $himself into you so $he can grind; $he cranes $his neck back to plant an @@.hotpink;earnest kiss@@ on your chin.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Attend a sporting event with $him">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen; you tell $him $he'll be spending the day with you at a game outside the arcology, and $he's to meet you at your VTOL pad in two hours. $He ponders for a moment but clearly understands this is related to $his age, somehow. Right at the proper time, $he arrives on the pad. $He's clearly spent the whole time getting the right clothing; somehow $he used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal $his <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>lack of private parts<<else>>pussy<</if>>, and $he bounces a little on $his heels for you to show off how $he's going commando underneath it. $His
-		<<if ($activeSlave.belly >= 100000)>>
-			_belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>
-		<<elseif ($activeSlave.weight > 130)>>
-			hugely soft
-		<<elseif ($activeSlave.belly >= 1500)>>
-			_belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>
-		<<elseif ($activeSlave.muscles > 30)>>
-			ripped
-		<<elseif ($activeSlave.weight > 30)>>
-			fat
-		<<elseif ($activeSlave.weight > 10)>>
-			plush
-		<<else>>
-			taut
-		<</if>>
-		midriff is bare. The top <<if ($activeSlave.boobs > 2000)>>somehow contains $his tits, with the team's logo at least <<if $showInches == 2>>three feet<<else>>a meter<</if>> wide across $his chest<<elseif ($activeSlave.boobs > 1000)>>is a great location for the team's logo, since $his tits allow it to be quite large<<elseif ($activeSlave.boobs > 300)>>is a good location for the team's logo, since $his tits allow it to be pretty big<<else>>flatters $his flat chest, especially with the team logo over it<</if>>. $He even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; $he's made up to look even younger.
-		<br><br>
-		You have a front-row seat, of course, and $he excitedly takes $his place beside you,
-		<<if $activeSlave.butt > 12>>
-			thankful that you reserved a seat for both of $his massive cheeks.
-		<<elseif $activeSlave.belly >= 300000>>
-			thankful that the front row has plenty of room for $his _belly belly to occupy.
-		<<elseif $activeSlave.butt > 6>>
-			carefully fitting $his big bottom into the seat.
-		<<elseif $activeSlave.boobs > 4000>>
-			$his absurd boobs rubbing against your arm.
-		<</if>>
-		$He cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before @@.green;recognizing you,@@ putting two and two together, and realizing enviously that $he's your sex slave. Since this is the Free Cities, the big screen gives $him more attention rather than cutting away when $he intentionally cheers hard enough that $his skirt rides up.
-		<<if $activeSlave.broodmother == 2 && $activeSlave.preg > 37>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, facing away from the game and goes into labor on another of $his brood; the contractions forcing $him to lean forward onto $his _belly stomach and give the players below a clear view of $his crowning child.
-		<<elseif $activeSlave.belly < 300000>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, facing away from the game and bending down to show cleavage to the stands in such a way that $his <<if ($activeSlave.butt > 5)>>massive ass<<elseif ($activeSlave.butt > 2)>>big butt<<else>>nice ass<</if>> lifts $his skirt up enough that the players below can clearly see $his <<if ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<elseif $activeSlave.anus > 0>>tight asshole<<else>>virgin asshole<</if>><<if $activeSlave.vagina > 3>> and gaping pussy<<elseif $activeSlave.vagina > 2>> and used pussy<<elseif $activeSlave.vagina > 1>> and lovely pussy<<elseif $activeSlave.vagina > 0>> and tight pussy<<elseif $activeSlave.vagina == 0>> and virgin pussy<</if>>.
-		<<else>>
-			The only slightly embarrassing incident is when $he's standing up to rally the crowd behind $him, cheering while swinging $his absurd belly back and forth and accidentally smashes into a concession vendor sending them to the floor. $His efforts to help him up forces $him to stand in such a way that $his <<if ($activeSlave.butt > 5)>>massive ass<<elseif ($activeSlave.butt > 2)>>big butt<<else>>nice ass<</if>> lifts $his skirt up enough that the players below can clearly see $his <<if ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<elseif $activeSlave.anus > 0>>tight asshole<<else>>virgin asshole<</if>><<if $activeSlave.vagina > 3>> and gaping pussy<<elseif $activeSlave.vagina > 2>> and used pussy<<elseif $activeSlave.vagina > 1>> and lovely pussy<<elseif $activeSlave.vagina > 0>> and tight pussy<<elseif $activeSlave.vagina == 0>> and virgin pussy<</if>>.
-		<</if>>
-		A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.
-		<<run repX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<br><<link "Put the old whore in $his place">>
-	<<replace "#result">>
-		You call out to stop $him, and $he turns obediently to listen. You tell $him you're interested to see if $his old body can still perform. Something about the way you say 'old' makes $him flinch, and $he's right to worry. You tell $him to go out and make you <<print cashFormat(200)>>, and to hurry back if $he wants to avoid punishment. $He hesitates for an instant before hurrying outside. A few hours later you check on $him remotely. The feed shows $him <<if $activeSlave.belly >= 10000>>waddle<<else>>walk<</if>> quickly up to a couple out on the street; you can't hear what's said, but $he
-		<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-			turns around to rub $his bare butt against the crotch of the man's pants. He pulls them down and fucks $him right there<<if canDoVaginal($activeSlave) && $activeSlave.vagina == 0>>@@.lime;taking $his virginity@@<<set _didVaginal = 1>><<elseif canDoAnal($activeSlave) && $activeSlave.anus == 0>>@@.lime;taking $his anal virginity@@<<set _didAnal = 1>><</if>>, as the woman <<if $activeSlave.nipples != "fuckable">>pulls and abuses<<else>>roughly fingers<</if>> $his poor nipples. Boring of this, he switches to torturing the poor slave's
-			<<if ($activeSlave.dick > 0)>>
-				dick,
-			<<elseif $activeSlave.vagina == -1>>
-				butthole,
-			<<else>>
-				pussy,
-			<</if>>
-			slapping $him until $he cries and then making out with the weeping whore. Much later, $activeSlave.slaveName limps tiredly into your office and gives you your @@.yellowgreen;<<print cashFormat(200)>>.@@ You ask $him how $he's feeling, and $he mumbles, "I'm OK, <<Master>>. Hole<<s>> are pretty <<s>>ore though. Kinda loo<<s>>e."
-		<<else>>
-			drops to $his knee<<if hasBothLegs($activeSlave)>>s<</if>> to nuzzle against the man's pants. He pulls them down and facefucks $him right there, as the woman <<if $activeSlave.nipples != "fuckable">>pulls and abuses<<else>>roughly fingers<</if>> $his poor nipples. Boring of this, $he switches to torturing the poor slave's
-			<<if ($activeSlave.dick > 0)>>
-				dick,
-			<<elseif $activeSlave.vagina == -1>>
-				butthole,
-			<<else>>
-				pussy,
-			<</if>>
-			slapping $him until $he cries and then making out with the weeping whore. Much later, $activeSlave.slaveName limps tiredly into your office and gives you your @@.yellowgreen;<<print cashFormat(200)>>.@@ You ask $him how $he's feeling, and $he mumbles, "I'm OK, <<Master>>. My jaw kinda hurt<<s>> and my leg<<s>> are really <<s>>ore."
-		<</if>>
-		You tell $him that's of little concern, since $he has relatively few years of use left: you may as well extract what value you can from $him. $He's too exhausted to hide $his response, and collapses, @@.gold;sobbing.@@
-		<<run cashX(200, "event", $activeSlave)>>
-		<<set $activeSlave.trust -= 5>>
-		<<if _didAnal == 1>>
-			<<set $activeSlave.anus++>>
-			<<run seX($activeSlave, "anal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 1, -2)>>
-			<</if>>
-		<<elseif _didVaginal == 1>>
-			<<set $activeSlave.vagina++>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 0, -2)>>
-			<</if>>
-		<<elseif canDoVaginal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 0, -2)>>
-			<</if>>
-		<<elseif canDoAnal($activeSlave)>>
-			<<run seX($activeSlave, "anal", "public", "penetrative")>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 1, -2)>>
-			<</if>>
-		<<else>>
-			<<run seX($activeSlave, "oral", "public", "penetrative")>>
-		<</if>>
-	<</replace>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-
-<<case "shift masturbation">>
-
-<<link "Leave $him to it">>
-	<<replace "#result">>
-		You have work to do. You ignore the shameless slut, who gets $himself off in no time at all,
-		<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave.balls == 0)>>
-			$his limp dick dribbling cum onto $his<<if $activeSlave.pregKnown == 1>> pregnant<</if>> stomach.
-		<<elseif $activeSlave.dick > 0>>
-			orgasming so strongly $he manages to hit $himself in the face with $his own cum.
-		<<elseif $activeSlave.vagina == -1>>
-			indulging in the anal self-stimulation that's $his best remaining avenue to an orgasm.
-		<<else>>
-			the smell of female pleasure filling the office.
-		<</if>>
-		$He gets up, washes $himself off and rearranges $his body on the couch again, languidly this time. $He returns to masturbating, gently playing with $himself with one hand and <<if $activeSlave.nipples != "fuckable">>teasing<<else>>fingering<</if>> a nipple with the other.
-	<</replace>>
-<</link>>
-<br><<link "Lend $him some assistance">>
-	<<replace "#result">>
-		You stand and ask $him mockingly if $he could use some assistance. $He gapes at you for a lust-hazed moment before nodding happily,
-		<<if !canTalk($activeSlave)>>
-			gesturing $his thanks.
-		<<else>>
-			squealing, "Ye<<s>> plea<<s>>e, <<Master>>!"
-		<</if>>
-		$He stops wanking and takes $his hand<<if hasBothArms($activeSlave)>>s<</if>> away, laying $himself wide for you like a horny human buffet. You make a show of selecting, but decide on $his
-		<<if canDoVaginal($activeSlave)>>
-			<<if $activeSlave.vagina > 2>>
-				slutty pussy.
-			<<elseif $activeSlave.vagina > 1>>
-				experienced pussy.
-			<<else>>
-				tight pussy.
-			<</if>>
-			<<set _didVaginal = 1>>
-		<<else>>
-			<<if $activeSlave.anus > 2>>
-				slutty anal slit.
-			<<elseif $activeSlave.anus > 1>>
-				well prepared asshole.
-			<<else>>
-				still-tight butt.
-			<</if>>
-			<<set _didAnal = 1>>
-		<</if>>
-		$He calmed down a little while offering $himself to you, so $he manages not to climax immediately when you <<if $PC.dick == 0>>push your strap-on into $him<<else>>thrust your dick into $him<</if>>, but $he's in a rare mood. You reward $him by guiding $his hands back to $his crotch as you ramp up the pace, at which $he looks up at you with something like wordless glee. $He goes back to
-		<<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-			playing with $his limp dick,
-		<<elseif $activeSlave.dick > 4>>
-			jerking off $his giant cock,
-		<<elseif $activeSlave.dick > 2>>
-			jerking off,
-		<<elseif $activeSlave.dick > 0>>
-			teasing $his girly little dick,
-		<<elseif $activeSlave.clit > 0>>
-			jerking off $his ridiculous clit,
-		<<elseif $activeSlave.labia > 0>>
-			spreading and teasing $his petals,
-		<<elseif $activeSlave.vagina == -1>>
-			playing with $his asspussy,
-		<<else>>
-			rubbing $his clit,
-		<</if>>
-		<<if !canTalk($activeSlave)>>
-			making little raspy pleasure noises.
-		<<else>>
-			mewling with pleasure.
-		<</if>>
-		When you're finally done, $he's fairly tired, but $he manages to give $his <<if $activeSlave.butt > 5>>huge<<elseif $activeSlave.butt > 2>>big<<else>>cute<</if>>, well-fucked butt a little wiggle for you, @@.mediumaquamarine;<<if canSee($activeSlave)>>looking<<else>>smiling<</if>> at you gratefully,@@ as $he skips off to wash.
-		<<set $activeSlave.trust += 4>>
-		<<if _didAnal == 1>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<elseif _didVaginal == 1>>
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<</if>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<br><<link "Show the slut off">>
-	<<replace "#result">>
-		It takes a trifling command at your desk to surreptitiously slave one of the office cameras to $his impromptu masturbation session, and send the feed to many of the public screens. After a few minutes, <<if canSee($activeSlave)>>$he notices the setup through one of the office's glass walls<<else>>you inform the eager masturbator that $his show is live across the arcology<</if>>.
-		<<if ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishStrength > 60) && ($activeSlave.fetishKnown == 1)>>
-			$He climaxes almost instantly at the realization, which plays right into $his fetish.
-		<<else>>
-			$He pauses for a moment at the realization, but goes back to $his business, blushing a little harder.
-		<</if>>
-		$He even plays it up a little for $his audience; when $he
-		<<if ($activeSlave.belly >= 120000) && ($activeSlave.dick > 0)>>
-			climaxes, $he makes sure they can see the way $his enormously distended body spasms with orgasm.
-		<<elseif ($activeSlave.belly >= 10000) && ($activeSlave.dick > 0)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. However, $his <<if $activeSlave.bellyPreg >= 5000>>advanced pregnancy<<else>>_belly belly<</if>> thwarts $his efforts and $he ends up cumming on $his stomach's underside. $He brushes some cum off with $his fingers and brings it to $his mouth, smiling at the <<if canTaste($activeSlave)>>taste<<else>>sensation<</if>>.
-		<<elseif ($activeSlave.dick > 0) && ($activeSlave.dick < 5) && ($activeSlave.belly >= 5000)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. However, $he ends up just coating $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>_belly belly<</if>> in $his own cum.
-		<<elseif ($activeSlave.dick > 4) && ($activeSlave.belly >= 5000)>>
-			finally orgasms, $he attempts to hike $his hips over $his head and direct the cum into $his mouth. $His dick is large enough to extend past $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>_belly belly<</if>>, allowing $him to blow $his load into $his waiting maw.
-		<<elseif ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-			finally manages to extract an orgasm from $his limp dick, $he hikes $his hips over $his head to direct it into $his mouth.
-		<<elseif $activeSlave.dick > 0>>
-			finally empties $his balls, $he hikes $his hips over $his head to direct the cum into $his mouth.
-		<<elseif $activeSlave.vagina == -1>>
-			climaxes, $he makes sure they can see the way $his asspussy spasms with orgasm.
-		<<else>>
-			finally climaxes, $he carefully licks $his hands clean, showing off $his enjoyment of $his own <<if canTaste($activeSlave)>>taste<<else>>fluids<</if>>.
-		<</if>>
-		Authenticity is hard to fake, and the many citizens who saw the broadcast don't doubt @@.green;your ability to train@@ a shameless slut.
-		<<run repX(1250, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-
-<<case "shift sleep">>
-
-<<link "Relaxed sex">>
-	<<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 "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 "diet">>
-
-<<link "Catch $him at it and punish $him">>
-	<<replace "#result">>
-		It's childishly easy to catch $him at it. You simply call a slave eating $his breakfast away over the arcology's audio system, and then enter the kitchen by a different door. $activeSlave.slaveName has the departed slave's cup in $his hand and halfway to $his mouth when $he's caught in the act. You relieve $him of $his prize, and finding that $he has not started $his own proper portion, pour it out onto the floor. You tell $him to lap it up without using $his hands, and begin counting down from ten. $He obeys,
-		<<if $activeSlave.belly >= 300000>>
-			only to find $his _belly stomach keeps $him from reaching the puddle. When you reach zero you shove $him over $his middle, face first into the pool of slave food, and administer a stinging slap across $his thieving <<if $seeRace == 1>>$activeSlave.race <</if>> ass.
-		<<else>>
-			but slowly and hesitantly. When you reach zero you order $him to get <<if hasAllLimbs($activeSlave)>>to all fours<<else>>on the ground<</if>> and administer a stinging slap across $his thieving <<if $seeRace == 1>>$activeSlave.race <</if>> ass.
-		<</if>>
-		$He alternates ten seconds of desperate lapping with being beaten across the buttocks until $he's done, by which time $he is @@.gold;desperate to obey and avoid further punishment.@@
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Make $him eat in your office and keep $him busy while $he does">>
-		<<replace "#result">>
-			$He knows what it means when $he's informed that $him meals will now be available in your office only. You not only supervise $him intake strictly, but set up a bowl for $him on a little stand so the chubby bitch can lap up $his food<<if hasBothArms($activeSlave)>> hands-free<</if>> on
-			<<if $activeSlave.belly >= 300000>>
-				$his _belly belly,
-			<<elseif hasAllLimbs($activeSlave)>>
-				all fours,
-			<<else>>
-				the ground,
-			<</if>>
-			leaving $him open for use from behind.
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				<<= VCheck.Both($activeSlave, 3, 3)>>
-			<<elseif canDoVaginal($activeSlave)>>
-				<<= VCheck.Vaginal($activeSlave, 6)>>
-			<<elseif canDoAnal($activeSlave)>>
-				<<= VCheck.Anal($activeSlave, 6)>>
-			<</if>>
-			You're careful to avoid associating pleasure with misbehavior by taking $his cruelly every time $he eats, pinching $his nipples, and slapping $his <<if $seeRace == 1>>$activeSlave.race <</if>> ass as you ride $him. This is so effective that @@.gold;$he learns to obey@@ and @@.orange;loses weight@@ both.
-			<<set $activeSlave.trust -= 5, $activeSlave.weight -= 10, $activeSlave.diet = "healthy">>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<br><<link "Fill $him up with water as punishment">>
-	<<replace "#result">>
-		You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You indicate a table full of cups, and tell $him that $he can drink as much as $he wants from them if $he'll tell you the truth. $He confesses, and is horrified to find they're full of water, not food. You add casually that $he can choose not to 'eat' the contents... but that $he'll get no real food until $he finishes every one. Torn between hunger and reluctance, $he spends the next hour struggling with so much water that you have to check $him for water intoxication. $He finishes with <<if $activeSlave.belly >= 1500>>an even more bulbous<<else>>a bulging<</if>> stomach and a @@.gold;sincere desire to avoid further punishment.@@
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<br><<link "Make $him eat until $he regrets it">>
-	<<replace "#result">>
-		You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You indicate a table full of cups, and tell $him that $he is going to eat the contents of every last one, every day, until $he regrets being a glutton. $He gulps at the sight, but eagerly digs in. As $his stomach steadily distends and the cups rapidly empty, you realize you may have made a mistake. $He finishes with <<if $activeSlave.belly >= 1500>>an even more bulbous<<else>>a hugely bulging<</if>> stomach and a @@.mediumorchid;smirk at your so-called punishment.@@
-		<<set $activeSlave.devotion -= 5, $activeSlave.inflationType = "food", $activeSlave.inflationMethod = 1>>
-		<<if $activeSlave.bellyPreg > 0 || $activeSlave.bellyImplant > 0>>
-			<<set $activeSlave.inflation = 1>>
-		<<else>>
-			<<set $activeSlave.inflation = 3>>
-		<</if>>
-		<<run SetBellySize($activeSlave)>>
-	<</replace>>
-<</link>>
-<<if (cumSlaves().length >= 5) && (($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown == 0))>>
-	<br><<link "Restrict $him to nothing but fresh cum from the Dairy">>
-		<<replace "#result">>
-			You meet $him in time for $his next meal and tell $him that you're aware of $his stealing. You tell $him that you understand $his need to eat, and that for the rest of the week you'll mercifully be allowing $him to try a new diet on which $he can eat as much as $he wants. $He's overjoyed <<if canHear($activeSlave)>>to hear it<<elseif canSee($activeSlave)>>when $he reads it on a nearby screen display<<else>>when $he figures it out<</if>>, though this pleasure is replaced with extreme disgust when $he learns that $his only culinary options are limited to cum. It's just nutritionally augmented enough to prevent starvation. Disgust is defeated by hunger pangs, and $he spends most of the week going around with a @@.hotpink;preoccupied@@ look on $his face and<<if $activeSlave.belly >= 1500>> an even more<<else>> a slightly<</if>> distended belly. By the end, $he's starting to @@.lightcoral;salivate@@ at the mere <<if canSmell($activeSlave)>>scent<<else>>thought<</if>> of ejaculate.
-			<<set $activeSlave.devotion += 4, $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65, $activeSlave.inflation = 1, $activeSlave.inflationType = "cum", $activeSlave.inflationMethod = 1>>
-			<<run SetBellySize($activeSlave)>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "huge naturals">>
-
-<<link "Give $him a nice massage">>
-	<<replace "#result">>
-		You sit on the couch next to your desk and pat your thighs. $He smiles and comes over, lowering $himself
-		<<if $PC.belly >= 10000>>
-			beside you and cozying up to your pregnant belly and sliding a hand down to see to your pussy without hesitation. You help $him get comfortable and instead of demanding $he please you or get down on all fours, you just sit there with $him,
-		<<elseif $PC.dick == 0>>
-			into your lap without hesitation. You help $him get comfortable and instead of <<if $PC.dick == 0>>grinding<<else>>thrusting<</if>> or telling $him to ride, you just sit there with $him in your lap,
-		<<else>>
-			onto your member
-			<<if $PC.vagina != -1>>
-				and sliding a hand down to see to your pussy
-			<</if>>
-			without hesitation. You help $him get comfortable and instead of <<if $PC.dick == 0>>grinding<<else>>thrusting<</if>> or telling $him to ride, you just sit there with $him in your lap,
-		<</if>>
-		gently massaging $his massive tits. They get sore from swinging around as $he moves, works, and fucks, and soon $he's groaning with pleasure at the attention. You finally manage to bring $him to orgasm with almost nothing but delicate stimulation of $his nipples. @@.mediumaquamarine;$He has become more trusting of you.@@
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-		<<if $activeSlave.lactation > 0>>
-			<<set $activeSlave.lactationDuration = 2>>
-			<<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>>
-		<<else>>
-			<<= induceLactation($activeSlave, 3)>>
-		<</if>>
-	<</replace>>
-<</link>>
-<<if (canDoAnal($activeSlave) || canDoVaginal($activeSlave)) && $activeSlave.belly < 100000>>
-	<br><<link "Use $him so they swing around">>
-		<<replace "#result">>
-			You tell $him to kneel on the smooth floor. $He knows this means doggy style, so $he compliantly arches $his back and cocks $his hips to offer $himself to you. You<<if $PC.dick == 0>> don a strap-on and<</if>> enter
-			<<if canDoVaginal($activeSlave)>>
-				$his pussy
-			<<else>>
-				$his ass
-			<</if>>
-			without preamble and seize $his hips. $He braces $himself, knowing what's coming, but soon $he discovers a new disadvantage to $his pendulous breasts: as you pound $him hard, $his long nipples frequently brush against the floor, causing $him to wince and buck.
-			<<if $activeSlave.dick > 0 && !($activeSlave.chastityPenis)>>
-				<<if canAchieveErection($activeSlave)>>
-					$His cock doesn't help, either, flopping around half-erect as $he vacillates between pain and arousal.
-				<<elseif $activeSlave.dick > 20>>
-					$His cock doesn't help, either, flopping around on the floor as $he vacillates between pain and arousal.
-				<<else>>
-					$His cock doesn't help, either, flopping around feebly as $he vacillates between pain and arousal.
-				<</if>>
-			<<elseif $activeSlave.clit > 2>>
-				$His huge clit doesn't help, either, flopping around half-erect as $he vacillates between pain and arousal.
-			<</if>>
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				When you switch to $his ass, the shallower strokes give $his nipples a bit of respite.
-			<</if>>
-			You finish with a particularly hard thrust
-			<<if $PC.dick == 0>>
-				and shake with climax,
-			<<else>>
-				to spill your seed deep inside $his
-				<<if canDoAnal($activeSlave)>>
-					butt, ramming forward hard enough to spill $him down onto $his bosom. As you rise, $his discomfited form is a pretty sight, with $his breasts squashed against the floor and $his well fucked butt lewdly relaxed.
-				<<else>>
-					pussy, ramming forward hard enough to spill $him down onto $his bosom. As you rise, $his discomfited form is a pretty sight, with $his breasts squashed against the floor and $his well fucked cunt lewdly gaped.
-				<</if>>
-			<</if>>
-			@@.hotpink;$He has become more submissive.@@
-			<<set $activeSlave.devotion += 4>>
-			<<= VCheck.Both($activeSlave, 1)>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Show $him off in public">>
-		<<replace "#result">>
-			You bring $him out onto the promenade, still nude, $his huge bare udders attracting open stares as $his every movement sets them in motion.
-			<<if $activeSlave.sexualFlaw == "attention whore">>
-				The slut loves being the center of attention and couldn't ask for more.
-			<<elseif ($activeSlave.fetishKnown == 1) && ($activeSlave.fetishStrength > 60) && ($activeSlave.fetish == "humiliation")>>
-				The slut loves being embarrassed, and $he blushes furiously as $his nipples stiffen with arousal.
-			<<elseif ($activeSlave.energy > 95)>>
-				The nympho slut loves being shown off, and $he flaunts $his boobs shamelessly.
-			<<elseif ($activeSlave.counter.anal > 100) && ($activeSlave.counter.oral > 100)>>
-				$He's such a veteran sex slave that $he takes the stares in stride.
-			<<else>>
-				$He blushes a little, but tips $his chin up and follows you obediently.
-			<</if>>
-			When you reach a good spot, you grab $his
-			<<if ($activeSlave.weight > 30)>>
-				fat ass
-			<<elseif ($activeSlave.weight > 10)>>
-				plush hips
-			<<elseif ($activeSlave.weight >= -10)>>
-				trim hips
-			<<elseif ($activeSlave.butt > 2)>>
-				big butt
-			<<else>>
-				skinny ass
-			<</if>>
-			and
-			<<if ($activeSlave.height >= 185)>>
-				pull $his tall body in
-			<<elseif ($activeSlave.height >= 160)>>
-				pull $him up on tiptoe
-			<<else>>
-				push $his petite form up onto a railing
-			<</if>>
-			for standing sex. $He cocks $his hips and takes your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> compliantly, and after a few thrusts you reach down, seize $him behind each knee, and
-			<<if $PC.belly >= 5000 && $activeSlave.belly >= 100000>>
-				collapse against a nearby bunch under the excessive weight between your pregnancy and $his _belly stomach. Appreciating the bench's sacrifice, you return to fucking $him.
-				<<if $activeSlave.bellyPreg >= 600000>>
-					Penetrating $him while feeling so much movement between you is unbelievably lewd. $His children squirm at their mother's excitement, causing $his bloated body to rub against you in ways you couldn't imagine.
-				<</if>>
-			<<elseif $activeSlave.belly >= 100000>>
-				pull $him as close as you can with $his _belly belly between you. Struggling to support the immense weight, you back $him against a rail so that you can continue to fuck $him while holding $him.
-				<<if $activeSlave.bellyPreg >= 600000>>
-					Penetrating $him while feeling so much movement between you is unbelievably lewd. $His children squirm at their mother's excitement, causing $his bloated body to rub against you in ways you couldn't imagine.
-				<</if>>
-			<<else>>
-				hoist $his legs up so $he's pinned against your
-				<<if $PC.belly >= 1500>>
-					pregnancy,
-				<<elseif ($PC.boobs < 300)>>
-					chest,
-				<<else>>
-					boobs,
-				<</if>>
-				helpless to do anything but let you hold $him in midair and fuck $him.
-			<</if>>
-			<<if canDoVaginal($activeSlave)>>
-				<<if ($activeSlave.vagina > 1)>>
-					$His pussy can take a hard pounding, so you give it to $him.
-				<<else>>
-					$His poor tight pussy can barely take the pounding you're administering.
-				<</if>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<<else>>
-				<<if ($activeSlave.anus > 1)>>
-					$His loose butthole can take a hard pounding, so you give it to $him.
-				<<else>>
-					$His poor tight butthole can barely take the pounding you're administering.
-				<</if>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<</if>>
-			$He loses all composure, gasping and panting as the massive weight of $his chest bounces up and down, making an audible clap with each stroke as $his huge tits slap painfully together. Despite this, or perhaps partly because of it, $he begins to orgasm,
-			<<if ($activeSlave.chastityPenis == 1)>>
-				the discomfort of being half-hard under $his chastity cage making $him squirm as cum rushes out of the hole at its tip.
-			<<elseif canAchieveErection($activeSlave)>>
-				<<if ($activeSlave.dick > 3)>>
-					$his monster of a cock releasing a jet of cum with each thrust into $him.
-				<<elseif ($activeSlave.dick > 3)>>
-					$his huge cock releasing a jet of cum with each thrust into $him.
-				<<elseif ($activeSlave.dick > 1)>>
-					$his cock releasing a spurt of cum with each thrust into $him.
-				<<else>>
-					$his tiny dick spurting cum with each thrust into $him.
-				<</if>>
-			<<elseif ($activeSlave.dick > 9)>>
-				$his huge, soft cock spurting cum as it wiggles to your motions.
-			<<elseif ($activeSlave.dick > 0)>>
-				$his soft cock scattering cum all over the place as it flops around.
-			<<elseif ($activeSlave.belly >= 1500)>>
-				$his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly adding to $his near-total discomfiture.
-			<<elseif $activeSlave.weight > 95>>
-				$his soft body jiggling as $he climaxes.
-			<<elseif ($activeSlave.muscles > 5)>>
-				$his abs convulsing deliciously as $he climaxes.
-			<<elseif canDoVaginal($activeSlave)>>
-				$his pussy tightening.
-			<<else>>
-				$his poor anal ring tightening.
-			<</if>>
-			The crowd that surrounds you during this noisy spectacle @@.green;is suitably impressed.@@
-			<<run repX(1250, "event", $activeSlave)>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "hugely pregnant">>
-
-<<link "Help $him with those hard to reach places">>
-	<<replace "#result">>
-		$He's absorbed enough with $his application that $he starts with surprise when you gently encircle $him from behind with a hug<<if $PC.belly >= 5000>>, pushing your own gravid belly into the small of $his back<</if>>. When you take the lotion and begin to lovingly massage it into $his harder to reach areas, $he sighs with pleasure and leans against you.
-		<<if hasAnyArms($activeSlave) && $PC.belly >= 1500>> $He takes the lotion and begins to return the favor. You spend the rest of $his break carefully massaging each other's baby bumps.<</if>>
-		<<if !canTalk($activeSlave)>>
-			<<if $activeSlave.voice == 0>>
-				$He looks like $he would love to thank you, were $he not mute.
-			<<elseif ($activeSlave.accent >= 3)>>
-				$He looks like $he would love to thank you, if $he knew how.
-			<</if>>
-		<<else>>
-			<<if ($activeSlave.lips > 70)>>
-				$He murmurs through $his huge lips,
-			<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-				$He murmurs through $his piercings,
-			<<else>>
-				$He murmurs,
-			<</if>>
-			"That felt really ni<<c>>e, <<Master>>."
-			<<if $PC.belly >= 1500>>
-				You have to agree, it did feel nice on your growing middle.
-			<</if>>
-		<</if>>
-		@@.mediumaquamarine;$He has become more trusting of you.@@
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>>
-<<if (canDoAnal($activeSlave) && $activeSlave.mpreg == 1) || (canDoVaginal($activeSlave))>>
-	<br><<link "Gently fuck $him while helping $him apply lotion">>
-		<<replace "#result">>
-			$He's absorbed enough with $his application that $he starts with surprise when you gently encircle $him from behind with a hug<<if $PC.belly >= 5000>>, pushing your own gravid belly into the small of $his back<</if>>. When you take the lotion and begin to lovingly massage it into $his harder to reach areas, $he sighs with pleasure and leans back into you. $He feels <<if $PC.dick == 0>>the warmth of your growing arousal<<else>>your erection hard<</if>> against $him, so $he
-			<<if isAmputee($activeSlave)>>
-				wriggles $his limbless form around on the floor so as to offer $himself to you.
-			<<else>>
-				slowly kneels down with you into a comfortable lotus position on the bathroom floor.
-			<</if>>
-			<<if $activeSlave.mpreg == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<</if>>
-			Coupling like this, you can't <<if $PC.dick == 0>>scissor<<else>>fuck<</if>> $him all that hard, but that's just fine given
-			<<if $PC.preg >= 5000>>
-				your condition.
-			<<else>>
-				$his condition.
-			<</if>>
-			$He snuggles back into you as you have gentle sex while looking after $his drum-taut skin.
-			<<if !canTalk($activeSlave)>>
-				<<if $activeSlave.voice == 0>>
-					$He looks like $he would love to thank you, were $he not mute.
-				<<elseif ($activeSlave.accent >= 3)>>
-					$He looks like $he would love to thank you, if $he knew how.
-				<</if>>
-			<<else>>
-				<<if ($activeSlave.lips > 70)>>
-					$He murmurs through $his huge lips,
-				<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>>
-					$He murmurs through $his piercings,
-				<<else>>
-					$He murmurs,
-				<</if>>
-				"That feel<<s>> really ni<<c>>e, <<Master>>."
-			<</if>>
-			@@.mediumaquamarine;$He has become more trusting of you.@@
-			<<set $activeSlave.trust += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.mpreg == 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave)>>
-	<<if $activeSlave.mpreg == 1>>
-		<br><<link "$His backdoor can't get more pregnant">>
-			<<replace "#result">>
-				$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and bend $him over the sink for a quick assfuck.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				<<if hasAnyArms($activeSlave)>>
-					$He does $his best to brace $himself against the sink, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-				<</if>>
-				Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.
-				<<if ($activeSlave.lactation == 1)>>
-					As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-				<<elseif ($activeSlave.boobs > 1000)>>
-					As you pound $him, $his huge breasts compound the discomfort.
-				<</if>>
-				When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief. @@.hotpink;$He has become more submissive.@@
-				<<set $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his virginity//<</if>>
-		<<else>>
-			<br><<link "$His backdoor isn't pregnant">>
-				<<replace "#result">>
-				$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and bend $him over the sink for a quick assfuck.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				<<if hasAnyArms($activeSlave)>>
-					$He does $his best to brace $himself against the sink, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-				<</if>>
-				Taking it up the ass while hugely pregnant isn't the most comfortable way to have sex, but such is the life of a sex slave.
-				<<if ($activeSlave.lactation == 1)>>
-					As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-				<<elseif ($activeSlave.boobs > 1000)>>
-					As you pound $him, $his huge breasts compound the discomfort.
-				<</if>>
-				When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief. @@.hotpink;$He has become more submissive.@@
-				<<set $activeSlave.devotion += 4>>
-			<</replace>>
-		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his virginity//<</if>>
-	<</if>>
-<</if>>
-<<if (canDoAnal($activeSlave) && $activeSlave.mpreg == 1) || (canDoVaginal($activeSlave)) && $activeSlave.belly >= 300000>>
-	<br><<link "Tip $him over and fuck $him">>
-		<<replace "#result">>
-			$He's absorbed enough with $his application that $he starts with surprise when you seize $his hips and shove $him onto $his _belly stomach for a quick fuck.
-			<<if $activeSlave.mpreg == 1>>
-				<<= VCheck.Anal($activeSlave, 1)>>
-			<<else>>
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-			<</if>>
-			<<if hasAnyArms($activeSlave)>>
-				$He does $his best to steady $himself atop the squirming mass, but $his <<if !hasBothArms($activeSlave)>>hand is<<else>>hands are<</if>> slick from the lotion and $he slides around for a while before $he gives up and accepts that $he's in for an uncomfortable time.
-			<</if>>
-			<<if $activeSlave.mpreg == 1>>
-				Taking it up the ass
-			<<else>>
-				Getting roughly fucked
-			<</if>>
-			while hugely pregnant isn't the most comfortable way to have sex, neither is being forced to put more pressure on an already overfilled organ, but such is the life of a sex slave.
-			<<if ($activeSlave.lactation == 1)>>
-				As you pound $him, $his breasts, sore from lactation, give $him quite a bit of discomfort.
-			<<elseif ($activeSlave.boobs > 1000)>>
-				As you pound $him, $his huge breasts compound the discomfort.
-			<</if>>
-			When you finally finish and withdraw your <<if $PC.dick == 0>>vibrating strap-on<<else>>cock<</if>>, $he groans with relief and rolls onto $his side. @@.hotpink;$He has become more submissive.@@
-			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.mpreg == 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "PA servant">>
-
-<<link "Share the slave with your PA">>
-	<<replace "#result">>
-		You enter, eliciting an embarrassed
-		"Um, hi <<Master>>" from $activeSlave.slaveName and a cheery wave from $assistant.name. At this stage of your morning ablutions, you're conveniently naked, so you
-		<<if $PC.belly >= 5000>>
-			heft yourself
-		<<elseif $PC.belly >= 1500>>
-			clamber up
-		<<else>>
-			leap up
-		<</if>>
-		onto the desktop and kneel upright, legs splayed. (Naturally, the desk is reinforced and sealed for exactly this reason.) You point meaningfully at your
-		<<if $PC.dick != 0>>
-			stiff prick <<if $PC.vagina != -1>>and flushed pussy<</if>>, and the obedient slave <<if $activeSlave.belly >= 5000>>hefts $himself<<else>>clambers<</if>> up to suck you off<<if $PC.vagina != -1>> and eat you out<</if>>. When you're close, you surprise $him by pulling your cock out of $his mouth and blowing your load onto the glass.
-		<<else>>
-			hot cunt, and the obedient slave <<if $activeSlave.belly >= 5000>>hefts $himself<<else>>clambers<</if>> up to eat you out. You surprise $him by taking your time, drawing out the oral session with the ulterior motive of getting as much saliva and pussyjuice onto the glass as possible.
-		<</if>>
-		<<= capFirstChar($assistant.name)>> shifts _hisA avatar so that this lands all over _hisA
-		<<switch $assistant.appearance>>
-		<<case "monstergirl">>
-			cocks.
-		<<case "shemale">>
-			huge cock.
-		<<case "amazon">>
-			muscular pussy.
-		<<case "businesswoman">>
-			mature pussy.
-		<<case "fairy" "pregnant fairy">>
-			tiny body.
-		<<case "goddess">>
-			fertile pussy.
-		<<case "hypergoddess">>
-			gaping pussy.
-		<<case "loli" "cherub">>
-			tight virgin pussy.
-		<<case "preggololi">>
-			tight young pussy.
-		<<case "angel">>
-			virgin pussy.
-		<<case "incubus">>
-			perfect dick.
-		<<case "succubus">>
-			lovely pussy.
-		<<case "imp">>
-			slutty pussy.
-		<<case "witch">>
-			plump breasts.
-		<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-			pussy-like body.
-		<<case "schoolgirl">>
-			pretty young pussy.
-		<</switch>>
-		"Clean me off, $activeSlave.slaveName," _heA demands, winking broadly at you. The slave, knowing that commands from _himA are commands from you, repositions $himself to lick up the <<if $PC.dick != 0>>ejaculate<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>girlcum<</if>>.
-		<br><br>
-		This brings the slave into a crouch with $his ass pointed at you,
-		<<if canDoVaginal($activeSlave)>>
-			<<if $activeSlave.vagina > 2>>
-				$his experienced pussy practically begging for a pounding.
-			<<elseif $activeSlave.vagina > 1>>
-				$his nice pussy practically begging for a good hard fucking.
-			<<else>>
-				$his tight little pussy completely vulnerable.
-			<</if>>
-			As <<if $PC.dick != 0>><<if $PC.vagina != -1>>use manual stimulation of your pussy to get your dick<<else>>stroke yourself<</if>> rapidly back to full mast<<else>>don a strap-on<</if>>, $assistant.name opines helpfully, "Hey $activeSlave.slaveName! You're about to get fucked!" The slave reacts by obediently reaching back to spread $his buttocks and relaxing, but $assistant.name ruins $his attempt at graceful submission." <<if $PC.title == 1>>Siiir,<<else>>Ma'aaam,<</if>> $he's bluuuushing," $he says tauntingly, and the slave stiffens with renewed embarrassment, not to mention stimulation, as you penetrate $him.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			<<if $activeSlave.anus > 2>>
-				$his big asspussy practically begging for a pounding.
-			<<elseif $activeSlave.anus > 1>>
-				$his nice asshole practically begging for a good hard fucking.
-			<<else>>
-				$his tight little rosebud completely vulnerable.
-			<</if>>
-			As <<if $PC.dick != 0>><<if $PC.vagina != -1>>use manual stimulation of your pussy to get your dick<<else>>stroke yourself<</if>> rapidly back to full mast<<else>>don a strap-on<</if>>, $assistant.name opines helpfully, "Hey $activeSlave.slaveName! You're about to get buttfucked!" The slave reacts by obediently reaching back to spread $his buttocks, and relaxes $his anus, but $assistant.name ruins $his attempt at graceful anal submission." <<if $PC.title == 1>>Siiir,<<else>>Ma'aaam,<</if>> $he's bluuuushing," $he says tauntingly, and the slave stiffens with renewed embarrassment, not to mention discomfort, as you penetrate $him.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		$He keeps licking away, cleaning up the mess you made as $assistant.name does everything $he can to make it seem like the slave is pleasuring $him. Partway through, $assistant.name sticks out a hand for a high-five from you, producing a gurgle of indignation @@.mediumaquamarine;or perhaps even laughter@@ as $his owner and $his owner's personal assistant program high-five over $his back.
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<<if canDoAnal($activeSlave)>>
-	<br><<link "Double penetrate the slave with your PA">>
-		<<replace "#result">>
-			You enter, eliciting an embarrassed
-			"Um, hi <<Master>>" from $activeSlave.slaveName, and ask $assistant.name if $he'd like to DP the slave with you.
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				"Oh yes," _heA purrs threateningly over the slave's moan of apprehension, and _hisA avatar begins to stroke _hisA dicks meaningfully.
-			<<case "shemale" "incubus">>
-				"Fuck yes," _heA groans over the slave's moan of apprehension, and _hisA avatar begins to stroke _hisA cock meaningfully.
-			<<case "amazon">>
-				"Yeah!" _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on carved from mammoth tusk.
-			<<case "businesswoman">>
-				"Oh yes," _heA purrs sadistically over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on.
-			<<case "fairy" "pregnant fairy">>
-				"Oh yeah!" _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly conjures up a magic floating dick.
-			<<case "goddess" "hypergoddess">>
-				"That would be lovely," _heA says radiantly over the slave's moan of apprehension, and _hisA avatar acquires a phallus of light.
-			<<case "angel" "cherub">>
-				"If you insist," _heA says reluctantly over the slave's moan of apprehension, and _hisA avatar acquires a phallus of light.
-			<<case "succubus">>
-				"Just this once," _heA says stroking $his clit as it steadily swells into a fully functional cock.
-			<<case "imp">>
-				"Fuck yes," _heA groans over the slave's moan of apprehension, and _hisA avatar quickly dons a huge, spiked strap-on.
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				"Of course," _heA shouts over the slave's moan of apprehension, and _hisA avatar quickly forms a huge, fleshy, bulbous cock.
-			<<default>>
-				"Fuck yeah!" _heA cheers over the slave's moan of apprehension, and _hisA avatar quickly dons a big strap-on.
-			<</switch>>
-			You indicate a fuckmachine in the corner of the room, and the slave obediently hurries over to it. It's vertical, and $he hops up on it, positioning $his anus over its
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				pair of dildos. They insert themselves
-			<<case "shemale" "incubus">>
-				frighteningly big dildo. It inserts itself
-			<<case "amazon">>
-				animalistically ribbed dildo. It inserts itself
-			<<case "imp">>
-				terrifyingly spiked, huge dildo. It inserts itself
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				frighteningly big, lumpy and uneven dildo. It inserts itself
-			<<default>>
-				large dildo. It inserts itself
-			<</switch>>
-			gently but firmly and then stops, the panting slave's
-			<<if $activeSlave.weight > 130>>
-				thick
-			<<elseif $activeSlave.weight > 95>>
-				chubby
-			<<elseif $activeSlave.muscles > 30>>
-				heavily muscled
-			<<elseif $activeSlave.preg >= $activeSlave.pregData.normalBirth/8>>
-				motherly
-			<<elseif $activeSlave.weight > 10>>
-				plush
-			<<elseif $activeSlave.muscles > 5>>
-				toned
-			<<else>>
-				feminine
-			<</if>>
-			thighs quivering a little from supporting $his body in its perch atop the machine, and from the fullness of $his anus.
-			<<= VCheck.Anal($activeSlave, 3)>>
-			$He knows this is going to be challenging, and is breathing deeply, doing $his best to stay relaxed. You cannot resist slapping your <<if $PC.dick != 0>>big cock lightly<<else>>lubricated strap-on<</if>> against $his cheek, producing a groan of apprehension.
-			<br><br>
-			You push $him gently backward, letting $him get accustomed to the new angle.<<if $activeSlave.boobs > 2000>> $His monstrous tits spread to either side of $his <<if $activeSlave.belly >= 5000>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>now upright torso<</if>>, and you take a moment to play with them as $he prepares $himself.<</if>>
-			<<if canDoVaginal($activeSlave)>>
-				$He gasps as $he feels <<if $PC.dick != 0>>your hot dickhead<<else>>the slick head of your strap-on<</if>> part $his pussylips, no doubt feeling full already.
-				<<= VCheck.Vaginal($activeSlave, 3)>>
-				When you're all the way in, the <<if $assistant.appearance == "monstergirl">>dildos in $his butt begin<<else>>dildo in $his butt begins<</if>> to fuck $him, harder and harder, as $assistant.name moans happily. The all-encompassing feeling of fullness as $his cunt and ass are fucked to the very limit of their capacities
-			<<else>>
-				$He gasps as $he feels you push a finger up $his already-full butt and pull $his sphincter a bit wider. You withdraw it and replace it with <<if $PC.dick != 0>>your turgid cock<<else>>your strap-on<</if>>; the slave writhes involuntarily, $his body trying to refuse the invasion of yet another phallus.
-				<<= VCheck.Anal($activeSlave, 3)>>
-				When you're all the way in, the <<if $assistant.appearance == "monstergirl">>dildos alongside your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>> in $his butt begin<<else>>dildo alongside your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>> in $his butt begins<</if>> to fuck $him, harder and harder, as $assistant.name moans happily. The all-encompassing feeling of fullness as $his ass is fucked to the very limit of its capacity
-			<</if>>
-			quickly drives all feminine grace, presence of mind, or really, @@.hotpink;conscious thought out of the poor slave.@@ After begging for mercy for a short while, $he lapses into animal groans, drooling and leaking tears out the corner of $his eyes as you and $assistant.name fuck $him into insensibility. When you climax, $assistant.name ejaculates, filling the slave's anus with warm fluid.
-			<br><br>
-			By this point $he's so helpless that you
-			<<if $activeSlave.belly >= 300000 || $activeSlave.weight > 190>>
-				have to struggle to lift
-			<<else>>
-				gently lift
-			<</if>>
-			$him off the fuckmachine and carry $him to the shower. You set $him down there, and $assistant.name activates the water, using the powerful jets in pulses to massage life back into your exhausted fuckpuppet. $His avatar appears on a screen behind the shower, creating an optical illusion that makes it look like $he's petting the slave in time with the water. $He reassures to the slave as $he does:
-			<<switch $assistant.appearance>>
-			<<case "monstergirl">>
-				"You're a good little cocksock," $he says kindly.
-			<<case "shemale">>
-				"I like your butthole," $he says politely.
-			<<case "amazon">>
-				"I like fucking your butthole," $he says kindly.
-			<<case "businesswoman">>
-				"I'm sure you won't be sold right away," $he says.
-			<<case "fairy" "pregnant fairy">>
-				"You're a good $girl," $he says.
-			<<case "goddess" "hypergoddess">>
-				"There, there," $he says kindly. "You are a good sex slave."
-			<<case "angel" "cherub">>
-				"There, there," $he says kindly. "You are a good $girl."
-			<<case "incubus" "succubus" "imp">>
-				"You're a good little cocksleeve," $he says honestly.
-			<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-				"You're a good little nursery," $he says.
-			<<default>>
-				"I like you," $he says cheerily.
-			<</switch>>
-			<<set $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
-<<case "like me">>
-
-<<link "Fuck $him">>
-	<<replace "#result">>
-		$He asked for it, and $he'll get it. You get to your
-		<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-			feet, unhook $his chastity,
-		<<else>>
-			feet
-		<</if>>
-		and snap your fingers, pointing
-		<<if $PC.dick == 0>>
-			at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by grabbing $him on either side of $his neck and
-			<<if $activeSlave.belly >= 300000>>
-				pulling onto $his _belly stomach
-			<<else>>
-				shoving $him down to kneel at your feet
-			<</if>>
-			with $his face
-			<<if $PC.belly >= 5000>>
-				crammed under your pregnant belly, level with your cunt.
-			<<else>>
-				level with your cunt.
-			<</if>>
-			One of your hands shifts behind $his head and tilts it back as you step forward, grinding against $his mouth. $He struggles involuntarily, but then perceptibly recollects $himself, relaxes, and starts to eat you out. Whatever internal turmoil $he's working through, you don't care, and neither does your pussy. When you climax and release $him, $he stumbles off, looking oddly proud of $himself. It seems $he got something out of that: @@.mediumaquamarine;a confidence boost,@@ at least.
-		<<else>>
-			at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-			<<if $activeSlave.belly >= 5000>>
-				gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-			<<else>>
-				kneels,
-			<</if>>
-			$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by shoving $him down so $his collarbone is resting on the back of the couch and $his ass is at just the right height.<<if $PC.vagina != -1>> You ensure that you're fully hard and get $him in the right frame of mind by grinding the pussy beneath your dick against $him.<</if>> You fuck
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				$his pussy and then $his ass in quick succession, plundering $his holes without much regard for $his pleasure.
-				<<= VCheck.Both($activeSlave, 1)>>
-				$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up $his butt.
-			<<elseif canDoVaginal($activeSlave)>>
-				$his pussy hard, without much regard for $his pleasure.
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-				$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside $him.
-			<<else>>
-				$his ass hard, without cruelty but without much concern for $his pleasure, either.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				$He takes it obediently, and does $his best to act like $he's enjoying being sodomized.
-			<</if>>
-			$He stumbles off to wash, looking oddly proud of $himself. It seems $he got something out of that: @@.mediumaquamarine;a confidence boost,@@ at least.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-<br><<link "Rape $him">>
-	<<replace "#result">>
-		$He'll get more than $he asked for. You get to your
-		<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-			feet, unhook $his chastity,
-		<<else>>
-			feet
-		<</if>>
-		and snap your fingers, pointing
-		<<if $PC.dick == 0>>
-			at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by slapping $him, and when $he instinctively cringes away from the blow, poking the back of one of $his knees with your foot.
-			<<if $activeSlave.belly >= 5000>>
-				$His <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> form
-			<<else>>
-				$He
-			<</if>>
-			collapses like a doll with its strings cut, already crying. You seize $his head in both hands and ride $his sobbing mouth. If $he thought that rape required a dick, $he was wrong. If $he thought that you needed a strap-on to rape $him, $he was wrong. Your fingers form claws, holding $his head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against $his crying face.
-		<<else>>
-			at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-			<<if $activeSlave.belly >= 5000>>
-				gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-			<<else>>
-				kneels,
-			<</if>>
-			$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by
-			<<if $activeSlave.belly >= 600000>>
-				slamming your hands against the bloated mass grossly distending $his sides,
-			<<else>>
-				jabbing a thumb into one of $his kidneys,
-			<</if>>
-			forcing $his back to arch in involuntary response, and then grinding $his face into the couch cushions.
-			<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-				$His cunt isn't all that wet, and $he has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to $his anus.
-				<<= VCheck.Both($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-			<<elseif canDoVaginal($activeSlave)>>
-				$His cunt isn't all that wet, and $he has cause to regret this as you waste no time with foreplay.
-				<<= VCheck.Vaginal($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you rape $him into inelegant, tearful begging for you to take your dick out of $his cunt because it hurts<<if canGetPregnant($activeSlave)>>, followed by desperate pleas to not cum inside $him since it's a danger day<</if>>.
-			<<else>>
-				You spit on $his asshole and then give $him some anal foreplay, if slapping your dick against $his anus twice before shoving it inside $him counts as anal foreplay.
-				<<= VCheck.Anal($activeSlave, 1)>>
-				$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-			<</if>>
-			It isn't the first time you've heard that, or the hundredth.
-		<</if>>
-		When you're done, you discard $him like the human sex toy $he is, and go back to your work. $He stumbles off, looking @@.gold;fearful@@ but strangely @@.hotpink;complacent,@@ as though $he's accepted this to an extent.
-		<<set $activeSlave.trust -= 4, $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-<br><<link "Get the truth out of $him">>
-	<<replace "#result">>
-		You ask $him why $he's really here, with devastating directness and in a tone that will brook no disobedience. $He quails, $his shoulders slumping as $he
-		<<if $activeSlave.belly >= 1500>>
-			<<if $activeSlave.pregKnown == 1>>
-				hugs $his pregnancy
-			<<else>>
-				attempts to hug $himself with $his _belly belly in the way
-			<</if>>
-		<<else>>
-			hugs $himself
-		<</if>>
-		and $his knees turning inward as $he cringes, the perfect picture of the standard human fear response. It seems $he thought you wouldn't notice $his insincerity. $He swallows nervously and makes no response, but then you <<if canSee($activeSlave)>>allow impatience to cloud your brow<<else>>cough with impatience<</if>> and $he hurriedly explains $himself.
-		<<if !canTalk($activeSlave)>>
-			$He uses sign language to communicate that $he asked the other slaves what $he could do to improve $his life, and that they told $him to do $his best to win your favor. $He asked them how to do that, and they told $him to ask you to fuck $him.
-		<<else>>
-			"<<Master>>, I, um, a<<s>>ked the other girl<<s>> what I could do to, you know, do better here," $he <<say>>s. "They <<s>>aid to g-get you to like me. A-and when I a<<s>>ked them how to do that, th-they <<s>>aid t-to a<<s>>k you to fuck me."
-		<</if>>
-		Then $he bites $his lip and <<if canSee($activeSlave)>>watches you<<elseif canHear($activeSlave)>>listens<<else>>waits<</if>> anxiously.
-		<br><br><span id="result2">
-			<<link "They're not wrong">>
-				<<replace "#result2">>
-					You get to your feet, letting $him know that the other slaves weren't wrong. $His relief is
-					<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-						palpable as you undo $his chastity.
-					<<else>>
-						palpable.
-					<</if>>
-					You snap your fingers, pointing
-					<<if $PC.dick == 0>>
-						at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by grabbing $him on either side of $his neck and
-						<<if $activeSlave.belly >= 300000>>
-							pulling onto $his _belly stomach
-						<<else>>
-							shoving $him down to kneel at your feet
-						<</if>>
-						with $his face
-						<<if $PC.belly >= 5000>>
-							crammed under your pregnant belly, level with your cunt.
-						<<else>>
-							level with your cunt.
-						<</if>>
-						One of your hands shifts behind $his head and tilts it back as you step forward, grinding against $his mouth. $He struggles involuntarily, but then perceptibly recollects $himself, relaxes, and starts to eat you out. Whatever internal turmoil $he's working through, you don't care, and neither does your pussy. When you climax and release $him, $he stumbles off,
-					<<else>>
-						at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-						<<if $activeSlave.belly >= 5000>>
-							gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-						<<else>>
-							kneels,
-						<</if>>
-						$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by shoving $him down so $his collarbone is resting on the back of the couch and $his ass is at just the right height. You fuck
-						<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-							$his pussy and then $his ass in quick succession, plundering $his holes without much regard for $his pleasure.
-							<<= VCheck.Both($activeSlave, 1)>>
-							$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up $his butt.
-						<<elseif canDoVaginal($activeSlave)>>
-							$his pussy hard, without much regard for $his pleasure.
-							<<= VCheck.Vaginal($activeSlave, 1)>>
-							$He gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside $him.
-						<<else>>
-							$his ass hard, without cruelty but without much concern for $his pleasure, either.
-							<<= VCheck.Anal($activeSlave, 1)>>
-							$He takes it obediently, and does $his best to act like $he's enjoying being sodomized.
-						<</if>>
-						$He stumbles off to wash,
-					<</if>>
-					looking @@.mediumaquamarine;much more confident.@@
-					<<set $activeSlave.trust += 4>>
-				<</replace>>
-			<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-			<br><<link "Now rape $him">>
-				<<replace "#result2">>
-					You get to your feet, letting $him know that the other slaves weren't wrong. $His relief is palpable, but $he's getting ahead of
-					<<if ($activeSlave.chastityVagina) || !canDoAnal($activeSlave)>>
-						$himself as you undo $his chastity.
-					<<else>>
-						$himself.
-					<</if>>
-					You snap your fingers, pointing
-					<<if $PC.dick == 0>>
-						at the floor in front of you<<if !canSee($activeSlave)>> along with a commanding "floor"<</if>>. $He hurries over, but hesitates for an instant, unsure of what to do next. You help $him understand by slapping $him, and when $he instinctively cringes away from the blow, poking the back of one of $his knees with your foot.
-						<<if $activeSlave.belly >= 5000>>
-							$His <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> form
-						<<else>>
-							$He
-						<</if>>
-						collapses like a doll with its strings cut, already crying. You seize $his head in both hands and ride $his sobbing mouth. If $he thought that rape required a dick, $he was wrong. If $he thought that you needed a strap-on to rape $him, $he was wrong. Your fingers form claws, holding $his head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against $his crying face.
-					<<else>>
-						at the couch next to the desk<<if !canSee($activeSlave)>> along with a commanding "couch"<</if>>. $He hurries over and
-						<<if $activeSlave.belly >= 5000>>
-							gently eases $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>swollen<</if>> body to the ground,
-						<<else>>
-							kneels,
-						<</if>>
-						$his rear pointing at you, but hesitates for an instant, unsure of what to do next. You help $him understand by
-						<<if $activeSlave.belly >= 600000>>
-							slamming your hands against the bloated mass grossly distending $his sides,
-						<<else>>
-							jabbing a thumb into one of $his kidneys,
-						<</if>>
-						forcing $his back to arch in involuntary response, and then grinding $his face into the couch cushions.
-						<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-							$His cunt isn't all that wet, and $he has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to $his anus.
-							<<= VCheck.Both($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-						<<elseif canDoVaginal($activeSlave)>>
-							$His cunt isn't all that wet, and $he has cause to regret this as you waste no time with foreplay.
-							<<= VCheck.Vaginal($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you rape $him into inelegant, tearful begging for you to take your dick out of $his cunt because it hurts<<if canGetPregnant($activeSlave)>>, followed by desperate pleas to not cum inside $him since it's a danger day<</if>>.
-						<<else>>
-							You spit on $his asshole and then give $him some anal foreplay, if slapping your dick against $his anus twice before shoving it inside $him counts as anal foreplay.
-							<<= VCheck.Anal($activeSlave, 1)>>
-							$He tries to be brave and relax, but those are contradictory goals and $he manages neither as you assrape $him into inelegant, tearful begging for you to take your dick out of $his butt, because it hurts.
-						<</if>>
-						It isn't the first time you've heard that, or the hundredth.
-					<</if>>
-					When you're done, you discard $him like the human sex toy $he is, and go back to your work. $He stumbles off, looking @@.gold;fearful@@ but @@.hotpink;submissive,@@ knowing that $he now has a better idea of what you want, even if what you want isn't very nice.
-					<<set $activeSlave.trust -= 4, $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>><<if (($activeSlave.anus == 0) || ($activeSlave.vagina == 0)) && ($PC.dick != 0)>> //This option will take $his virginity//<</if>>
-			<br><<link "It's not that simple">>
-				<<replace "#result2">>
-					You tell $him kindly that it isn't that simple, but that if $he obeys orders and does $his best, you will like $him just fine, and $he will do well as your slave. Relief floods through $him.
-					<<if !canTalk($activeSlave)>>
-						$He gestures $his thanks, and an apology for being silly.
-					<<else>>
-						"Thank you, <<Master>> and I'm <<s>>orry for being <<s>>illy," $he apologizes.
-					<</if>>
-					You dismiss $him, and $he goes, a strangely @@.hotpink;respectful@@ look on $his face. $He's no more confident of $his ability to find safety and stability here with you than $he was before, but $he seems to like that it apparently isn't as simple as <<if $PC.dick != 0>>taking your cock up $his butt<<if $PC.vagina != -1>> or <</if>><</if>><<if $PC.vagina != -1>>eating you out<</if>>.
-					<<set $activeSlave.devotion += 4>>
-				<</replace>>
-			<</link>>
-		</span>
-	<</replace>>
-<</link>>
-
-<<case "hates oral">>
-
-<<link "Let $him earn a break for $his throat">>
-	<<replace "#result">>
-		You tell $him $he's a sex slave, and that $he needs to learn how to suck dick.
-		<<if !canTalk($activeSlave) && hasAnyArms($activeSlave)>>
-			$He frantically begs with gestures, pleading <<if hasBothLegs($activeSlave)>>on $his knees<<else>>desperately<</if>>.
-		<<elseif !canTalk($activeSlave)>>
-			$He frantically mouths pleas that you leave $his throat cock-free.
-		<<else>>
-			$He begs, "Plea<<s>>e no, <<Master>>, plea<<s>>e don't rape my mouth, <<Master>>!"
-		<</if>>
-		You make a show of considering, and then tell $him that if $he's extra obedient, you might let $him earn a break for $his throat — for now.
-		<<if canDoVaginal($activeSlave) && $activeSlave.vagina > 0>>
-			You tell $him to lie back and spread $his legs, because you're going to give $him a good old fashioned missionary-position pounding. $He does so with unusual obedience<<if $activeSlave.belly >= 5000>>, $his legs hanging off the couch to give you a better angle with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> in the way<</if>>, and as you're giving $him a thorough pounding, whether out of relief, gratitude, or a desire to put on a good performance, $he certainly seems to be enjoying it more than usual.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<elseif canDoAnal($activeSlave) && $activeSlave.anus > 0>>
-			You tell $him to bend over and spread $his ass for you, because if $he doesn't want you going in one end you're going to go in the other. $He does so with unusual obedience, and as you
-			<<if ($activeSlave.anus == 1)>>
-				gently but firmly pound $his still-tight ass
-			<<elseif ($activeSlave.anus == 2)>>
-				pound away at $his well-used backdoor
-			<<else>>
-				mercilessly jackhammer $his gaping hole
-			<</if>>
-			$he actively tries to match the rhythm of your thrusts.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<<else>>
-			You tell $him that if $he's going to hesitate to use $his mouth when
-			<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-				$he has no other hole to amuse you
-			<<elseif !canDoAnal($activeSlave) && $activeSlave.vagina == 0>>
-				$his only available hole is still virgin
-			<<elseif $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-				all $his other holes are still virgin
-			<<elseif $activeSlave.anus == 0>>
-				$his girly little butthole is still virgin
-			<</if>>
-			$he's going to have to find an amazingly thorough way to please a dick if $he's going to earn $his throat a reprieve. $He looks<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant < -15>> uncharacteristically<</if>> thoughtful for a moment before bending over before you, spitting in $his hand
-			<<if $activeSlave.vagina == 0>>
-				and thoroughly coating $his inner thighs with $his saliva.
-			<<else>>
-				and thoroughly coating the
-				<<if $activeSlave.butt <= 2>>
-					crack of $his slender
-				<<elseif $activeSlave.butt <= 4>>
-					crack of $his curvy
-				<<elseif $activeSlave.butt <= 8>>
-					crack of $his huge
-				<<elseif $activeSlave.butt <= 12>>
-					crevice of $his expansive
-				<<elseif $activeSlave.butt <= 20>>
-					ravine of $his endless
-				<</if>>
-				ass.
-			<</if>>
-			The invitation is obvious, but just to be sure $he pleads with you to satisfy yourself alongside $his
-			<<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>>
-				chastity. You answer $his pleading with your dick, and though it's not quite as pleasurable as pilfering an off-limits hole,
-				<<if $activeSlave.vagina > -1>>
-					before long $his <<if $activeSlave.vagina == 0>>virgin <</if>>cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts.
-				<<else>>
-					$activeSlave.slaveName's trembling whenever your thrusts slam against $his anal chastity is thoroughly entertaining.
-				<</if>>
-				Before long, you plaster $his belt with your cum.
-			<<elseif !canDoAnal($activeSlave) && $activeSlave.vagina == 0>>
-				virgin hole. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, before long $his virgin cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts. Before long, you plaster $his still-virgin hole with your cum.
-			<<elseif $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-				virgin holes. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole,
-				<<if $activeSlave.vagina == 0>>
-					before long $his virgin cunt starts to supply extra lubrication and $he starts to gasp and moan along with your thrusts.
-				<<else>>
-					$activeSlave.slaveName's trembling whenever your thrusts come perilously close to penetrating $his virgin ass is thoroughly entertaining.
-				<</if>>
-				Before long, you plaster $his still-virgin hole with your cum.
-			<<elseif $activeSlave.anus == 0>>
-				virgin hole. You answer $his pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, $activeSlave.slaveName's trembling whenever your thrusts come perilously close to penetrating $his virgin ass is thoroughly entertaining. Before long, you plaster $his still-virgin hole with your cum.
-			<</if>>
-		<</if>>
-		When you're done, you bend down and whisper in $his ear that if $he shows any sign of rebelliousness, you'll give every dick in $arcologies[0].name free access to $his throat. @@.hotpink;$He has become more obedient,@@ in the hope this will persuade you to not follow through on your threat.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Try to brute-force $his oral resistance with a public blowbang">>
-	<<replace "#result">>
-		Simple problems require simple solutions — $he'll get fucked in the mouth until $he either gets over $his hang-ups about oral or learns to hide them. You drag the protesting $activeSlave.slaveName out in public, chain $him low so that $his mouth is available, and tell $him that $he'll suck dicks until $he gets through five in a row without grimacing, gagging, or resisting. You have a comfortable chair brought out to you and settle in to watch the show.
-		$activeSlave.slaveName tries, $he really does. But when word gets out as to the conditions of $his enslavement, $his users take a perverse enjoyment in being rougher than usual to evoke the exact reactions $he's trying to avoid. By the third failed streak, you've started to grow bored of the spectacle, but luckily you find entertainment in conversation with those who have already been entertained by poor $activeSlave.slaveName. Before long more chairs have been brought up and an impromptu salon has been set up alongside the blowbang line. By the sixth failed streak, an enterprising citizen has set up a small bar and is serving drinks. By the ninth, you've delegated watching $activeSlave.slaveName to your assistant. You personally break the eleventh streak after $he reached four, to general acclaim from your newfound friends and a toast to your virility.
-		When the fourteenth streak is finally successful, there are serious talks about making these blowbang salons a regular occurrence and some backslapping directed towards you for your innovation in genteel hedonism. While you seriously doubt $activeSlave.slaveName enjoys oral sex any more than $he did at the start of the day, $he's certainly @@.green;learned to keep $his feelings on the matter to $himself.@@ $He did, however, @@.health.dec;have quite a rough time@@ of it<<if $activeSlave.skill.oral <= 30>>, though $he did learn a thing or two about sucking dick.<<= slaveSkillIncrease('oral', $activeSlave, 10)>><<else>>.<</if>> And last of all, you and $activeSlave.slaveName did make @@.green;quite a good impression@@ today, though for widely differing reasons.
-		<<set $activeSlave.sexualFlaw = "none">>
-		<<run seX($activeSlave, "oral", "public", "penetrative", random(65,80))>>
-		<<run repX(500, "event", $activeSlave), healthDamage($activeSlave, 10)>>
-	<</replace>>
-<</link>>
-<br><<link "Teach $him to see cum as a reward">>
-	<<replace "#result">>
-		You bring $activeSlave.slaveName into your office and stand $him in front of your leather couch. $He <<if canSee($activeSlave)>>eyes you <<elseif canHear($activeSlave)>>listens <<else>>waits silently and <</if>><<if $activeSlave.devotion < -20>>suspiciously<<else>>worriedly<</if>> as you ready a bullet vibrator.
-		<<if $activeSlave.dick > 0>>
-			You secure the bullet to $activeSlave.slaveName's frenulum.
-		<<elseif $activeSlave.vagina == -1>>
-			You secure the bullet to $his perineum.
-		<<else>>
-			You secure the bullet to $activeSlave.slaveName's clit.
-		<</if>>
-		You explain that the arcology continually monitors your vital signs, and will use them to estimate your arousal; the system controls the bullet vibrator, which will emit stimulating vibrations scaled to your pleasure. The more pleasure you feel, the more pleasant the vibrations will be, though they will not bring $him to orgasm until you climax. To demonstrate, you give the head of your cock a quick squeeze. $activeSlave.slaveName squeals in surprise at the sudden stimulation as the bullets spring to life. You tell $him to get to work. Though timid at first, as $he proceeds to blow you, $he becomes more and more enthusiastic as $his own pleasure builds. It isn't long until $he's deepthroating you enthusiastically and begging you to cum in $his mouth. You make $him hold out a bit longer, and then you complete the training session,
-		<<if $PC.balls >= 30>>
-			pumping cum into $his stomach until it visibly begins to swell.
-		<<elseif $PC.balls >= 14>>
-			pumping cum into $his stomach until it threatens to come back up.
-		<<elseif $PC.balls >= 9>>
-			cumming into $his mouth until it spurts from $his nose.
-		<<else>>
-			filling $his mouth with your cum.
-		<</if>>
-		$He climaxes in turn, and virtually melts into a quivering mess on your floor.
-		<<if $activeSlave.dick > 0>>
-			$activeSlave.slaveName's cock oozes cum from $his intense orgasm, and you command $him to clean it off the floor before $he gets back to $his duties.
-		<</if>>
-		<<if random(1,4) == 4>>
-			@@.lightcoral;You've successfully linked cum and pleasure in $his mind,@@ guaranteeing $him a confusing few days as $he tries to reconcile this with $his hatred of oral sex.
-			<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>>
-		<<else>>
-			This has @@.green;broken $him of $his bad habits.@@
-			<<set $activeSlave.sexualFlaw = "none">>
-		<</if>>
-		This demonstration of your control over $him has @@.hotpink;worn down $his resistance to your commands.@@
-		<<set $activeSlave.devotion += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if ($activeSlave.dick > 0) && $activeSlave.balls > 0 && ($activeSlave.belly < 1500) && $activeSlave.weight < 130>> /* won't work if too pregnant */
-	<br><<link "Make $him eat $his own cum">>
-		<<replace "#result">>
-			Your cum training tactics have two components: Cum should be linked with pleasure, and cum should not be disgusting to $activeSlave.slaveName, because even $activeSlave.slaveName produces it. To drive home these lessons, you lead $activeSlave.slaveName to your office's leather couch, arranging $his
-			<<if $activeSlave.height < 150>>
-				petite
-			<<elseif $activeSlave.height < 160>>
-				short
-			<<elseif $activeSlave.height >= 170>>
-				tall
-			<<elseif $activeSlave.height >= 185>>
-				very tall
-			<</if>>
-			form upside down with $his head on the cushion, $his back on the backrest, and $his <<if hasBothLegs($activeSlave)>>legs<<else>>ass<</if>> in the air. In this position, $his
-			<<if ($activeSlave.dick > 10)>>
-				obscene
-			<<elseif ($activeSlave.dick > 9)>>
-				inhuman
-			<<elseif ($activeSlave.dick > 8)>>
-				monstrous
-			<<elseif ($activeSlave.dick > 7)>>
-				imposing
-			<<elseif ($activeSlave.dick > 6)>>
-				massive
-			<<elseif ($activeSlave.dick > 5)>>
-				gigantic
-			<<elseif ($activeSlave.dick > 4)>>
-				huge
-			<<elseif ($activeSlave.dick > 3)>>
-				large
-			<<elseif ($activeSlave.dick > 2)>>
-				average
-			<<elseif ($activeSlave.dick > 1)>>
-				small
-			<<elseif ($activeSlave.dick > 0)>>
-				tiny
-			<</if>>
-			cock <<if $activeSlave.belly >= 100 || $activeSlave.weight > 30>>rests over $his <<if $activeSlave.pregKnown == 1>>early pregnancy<<else>>belly<</if>> and <</if>>hangs directly over $his anxious face.
-			<<if ($activeSlave.aphrodisiacs > 0) || $activeSlave.inflationType == "aphrodisiac">>
-				The aphrodisiacs in $his system already have $him so aroused $he's already dripping precum; as you approach $his vulnerable form on the couch, a drop lands on $his chin.
-			<<elseif $activeSlave.prostate > 1>>
-				$His overactive prostate has $him steadily dripping precum; as you approach $his vulnerable form on the couch, a drop lands on $his chin.
-			<<else>>
-				You sit next to $his vulnerable form on the couch as $he looks at you in anticipation.
-			<</if>>
-			You
-			<<if canDoAnal($activeSlave)>>
-				<<if ($activeSlave.anus > 2)>>
-					insert a wide vibrating plug into $his gaping anus,
-				<<elseif ($activeSlave.anus > 1)>>
-					insert a big vibrating plug into $his ass,
-				<<elseif ($activeSlave.anus > 0)>>
-					insert a vibrating plug into $his tight ass,
-				<<else>>
-					place a bullet vibrator over the pucker of $his virgin anus,
-				<</if>>
-			<<else>>
-				strap a strong vibrator to $his anal chastity,
-			<</if>>
-			secure a bullet vibrator $his quivering perineum, and another to the base of $his dick, and set them all to gradually increase the strength of their vibrations. In no time at all $he releases a
-			<<if ($activeSlave.chastityPenis == 1)>>
-				squirt of ejaculate from $his cock cage,
-			<<elseif $activeSlave.balls > 0>>
-				torrent of thick, white semen,
-			<<elseif $activeSlave.prostate > 2>>
-				torrent of nearly clear, watery ejaculate,
-			<<elseif $activeSlave.prostate == 0>>
-				pathetic dribble of semen,
-			<<else>>
-				pathetic dribble of watery ejaculate,
-			<</if>>
-			all of which lands right on $his outstretched tongue and pools in $his throat. You nudge $his chin to make $him close $his mouth and swallow. After a week of such treatment, $he @@.lightcoral;acquires a taste for semen.@@
-			<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.devotion += 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-/*Written by anon, coded by Boney M*/
-
-<<case "masterful entertainer">>
-
-<<link "Go clubbing">>
-	<<replace "#result">>
-		You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door wearing glitzy heels, an extremely short skirt<<if $activeSlave.belly >= 5000>> barely noticeable under $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>, and a string bikini top so brief that $his areolae are clearly visible. As you descend through $arcologies[0].name the beats get faster and the drops get heavier. By the time you reach the club where the Free Cities' hottest DJ has a show tonight, $activeSlave.slaveName is a whirlwind of sexual energy in motion, moving <<if canHear($activeSlave)>>with every beat<<else>>wildly<</if>> and catching every eye<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/1.33>>, despite how far along $he is<<elseif $activeSlave.belly >= 5000 || $activeSlave.weight > 130>>, despite how big $he is<</if>>. $His skills could have half the club lining up to fuck $him for money, but tonight $he's all yours. The entire floor is envious of you as the night wears on and $his dancing turns into sexually servicing you<<if canHear($activeSlave)>> in time with the music<</if>>.
-		<<if ($activeSlave.chastityPenis == 1)>>
-			The smell of $his pre-cum is noticeable even over the stink of sweat.
-		<<elseif ($activeSlave.dick > 0) && canAchieveErection($activeSlave)>>
-			$His tiny skirt does nothing to hide $his erection.
-		<<elseif ($activeSlave.clit > 0)>>
-			$His tiny skirt displays $his big, engorged clit.
-		<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			$His arched back and cocked hips make it very clear that $he wants $his asspussy fucked.
-		<<else>>
-			The smell of $his arousal is noticeable even over the stink of sweat.
-		<</if>>
-		<<if ($activeSlave.boobs > 1000)>>
-			$His breasts get groped and mauled all night.
-		<<elseif ($activeSlave.butt > 5)>>
-			$He grinds $his ass against your crotch all night.
-		<<else>>
-			Cum joins the sweat running off $him.
-		<</if>>
-		The crowd is duly impressed; @@.green;your reputation has increased.@@
-		<<run repX(500, "event", $activeSlave)>>
-	<</replace>>
-<</link>>
-<<if $activeSlave.belly < 15000>>
-	<br><<link "Attend a milonga">>
-		<<replace "#result">>
-			You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door wearing classy heels and a gorgeous long dress cunningly designed to adhere to $him while $he dances despite the fact that it displays all of one leg, $his entire back<<if $activeSlave.belly >= 5000>>, $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>, cleavage, and the sides of both breasts. $He has $his hair up in a perfect bun accented with a spray of the latest jewelry, and is wearing severe makeup that makes $him look aristocratic and elegant by turns. The host of the milonga, an old-world tango enthusiast, knows well the social graces and invites you, as the most prominent attendee, to perform the traditional demonstration tango that begins the dance. It goes wonderfully, and the entire party sighs in appreciation as you perform the classic tango. You lower $activeSlave.slaveName<<if $activeSlave.belly >= 10000 || $activeSlave.weight > 130>>'s heavy body<</if>> gracefully and pull $him back up into a close embrace, and breath catches in more than one throat. As tradition dictates $he dances with many partners throughout the night. One concession to Free Cities sensibilities is that the male and female roles in the tango may be filled by anyone, and $activeSlave.slaveName switches flawlessly between playing the female role to the elderly host one dance and the male role to his teenage granddaughter the next. The poor girl spends the rest of the evening staring at $activeSlave.slaveName with her tongue tied. Whoever $activeSlave.slaveName dances with, $he always subtly shows by glance and gesture that it's you $he truly wants. Everyone is quite envious of you; @@.green;your reputation has increased.@@
-			<<run repX(500, "event", $activeSlave)>>
-		<</replace>>
-	<</link>>
-<</if>>
-<br><<link "Never mind Friday night; the moon's out and it's romantic on the balcony">>
-	<<replace "#result">>
-		You inform $activeSlave.slaveName of your plans and tell $him to get dressed appropriately. $He meets you at the door absolutely naked<<if $activeSlave.bellyPreg >= 1500>>, $his motherly body on full display<</if>>. $He has half a question on $his face, wondering whether this is going too far, but it vanishes when you <<if canSee($activeSlave)>>smile reassuringly at<<else>>compliment<</if>> $him. You take $him by the hand and lead $him out onto the private balcony outside your office. It's a cloudless night, and the moon is full. You order the arcology to play a classic dance medley, and $activeSlave.slaveName becomes all innocence and grace, the perfect dance partner<<if $activeSlave.bellyPreg >= 10000>>, despite $his heavy pregnancy<<elseif $activeSlave.belly >= 10000 || $activeSlave.weight > 130>>, despite $his weight<</if>>. The only real consequence of $his nudity is
-		<<if $activeSlave.boobs >= 300>>
-			the extra sway of $his breasts,
-		<</if>>
-		<<if canPenetrate($activeSlave)>>
-			$his visible erection, and
-		<<elseif ($activeSlave.clit > 0)>>
-			$his visibly engorged clit and
-		<<elseif $activeSlave.boobs >= 300>>
-			and
-		<</if>>
-		<<if $activeSlave.nipples != "fuckable">>the hardness of $his nipples<<else>>how swollen $his nipples are<</if>> in the cool night when the dance brings you close. $He enjoys $himself immensely and in no time at all, $he's meekly asking you to take $him inside and dance with $him on the bed. Naturally, you oblige.
-	<</replace>>
-	<<set $activeSlave.devotion += 3, $activeSlave.trust += 3>>
-	<<if ($activeSlave.toyHole == "dick" || $policies.sexualOpenness == 1) && canPenetrate($activeSlave)>>
-		<<run seX($activeSlave, "penetrative", $PC, "vaginal")>>
-		<<if canImpreg($PC, $activeSlave)>>
-			<<= knockMeUp($PC, 20, 0, $activeSlave.ID)>>
-		<</if>>
-	<<elseif canDoVaginal($activeSlave)>>
-		<<= VCheck.Vaginal($activeSlave, 1)>>
-	<<elseif canDoAnal($activeSlave)>>
-		<<= VCheck.Anal($activeSlave, 1)>>
-	<<elseif $activeSlave.boobs >= 1000>>
-		<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-	<<else>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</if>>
-	$His @@.hotpink;devotion to you@@ and @@.mediumaquamarine;trust in you@@ have increased.
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-
-<<case "sexy succubus">>
-
-<<link "Let $him eat">>
-	<<replace "#result">>
-		You tell $him $he's a good little succubus, and you're going to let $him feed. $He knows exactly what you mean, and
-		<<if $activeSlave.belly >= 300000>>
-			leans onto $his _belly stomach
-		<<else>>
-			<<if $activeSlave.belly >= 5000>>gently lowers $himself<<else>>gets<</if>> to $his knees
-		<</if>>
-		quickly, pressing $him $activeSlave.nipples nipples against your thighs and grasping your hips to give $himself leverage for some very aggressive oral. After
-		<<if $PC.dick != 0>>
-			a couple of lush sucks at each of your balls<<if $PC.vagina != -1>> and some eager nuzzling of your pussylips<</if>>, $he moves straight to a hard blowjob, deepthroating your cock and almost ramming $his head against you.<<if $PC.vagina != -1>> $He keeps $his tongue stuck out, and whenever $he gets you fully hilted, $he manages to reach your pussylips with it.<</if>> $He <<if $activeSlave.fetish == "cumslut">>doesn't have to pretend to be starving for your cum.<<else>>does a good job of acting like $he's authentically starving for your cum.<</if>> $He groans with satisfaction when you blow your load down $his gullet,
-		<<else>>
-			nuzzling $his nose against your moist cunt, $he starts to eat you out like $he's starving, sparing no time for subtlety, lapping up your female juices with evident relish. You run your fingers through $his $activeSlave.slaveName hair, telling $him $he'll have to survive on pussyjuice. $He replies, but you hold $his head hard against you as $he does, turning whatever $he says into an unintelligible, delectable mumbling into your womanhood. $He groans with satisfaction when you stiffen with orgasm, giving $him a final gush of girlcum,
-		<</if>>
-		and <<if $activeSlave.belly >= 5000>>hefts $his <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> bulk up<<else>>gets to $his feet<</if>> licking $his lips and patting $his _belly stomach.
-		<<if $activeSlave.belly >= 1500>>
-			"That wa<<s>> <<s>>uch a big meal <<Master>>, look how full it made me!" $He teases, pretending $his
-			<<if $activeSlave.bellyPreg >= 1500>>
-				gravid belly is filled with your fluids.
-			<<elseif $activeSlave.bellyImplant >= 1500>>
-				distended belly is filled with your fluids.
-			<<else>>
-				wobbling, <<print $activeSlave.inflationType>>-filled belly is filled with your fluids.
-			<</if>>
-			<<if $PC.balls >= 30>>
-				Seeing as $he took the entirety of your inhuman load, there is some truth to $his words.
-			<</if>>
-		<</if>>
-		$He's obviously @@.mediumaquamarine;becoming more comfortable@@ playing the part of a vampiric sex
-		<<if ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishStrength > 95)>>
-			demon, and it's a role the incorrigible cumslut @@.hotpink;loves.@@
-			<<set $activeSlave.devotion += 2>>
-		<<elseif ($activeSlave.fetish == "cumslut")>>
-			demon, and it's a role that @@.lightcoral;reinforces $his oral fixation.@@
-			<<set $activeSlave.fetishStrength += 4>>
-		<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-			demon, and the role @@.lightcoral;focuses $his attention on $his mouth.@@
-			<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "cumslut">>
-		<<else>>
-			demon.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<<if canDoVaginal($activeSlave) && ($PC.dick != 0)>>
-	<br><<link "Feed $him">>
-		<<replace "#result">>
-			<<setSpokenPlayerPronouns $activeSlave>>
-			You tell $him $he's a good little succubus, and you're going to feed $him.
-			<<if $activeSlave.boobs > 2000>>
-				Reaching up under $his breasts for the top edge of $his outfit
-			<<else>>
-				Grabbing $his outfit's top edge
-			<</if>>
-			and seizing $him behind a knee with your other hand, you sling $him across
-			<<if $activeSlave.belly >= 300000 || $activeSlave.weight > 190>>
-				an unfortunate nearby tabletop. Once the table finishes its creaking and promises to hold $his weight, $he
-			<<else>>
-				a convenient tabletop nearby. $He
-			<</if>>
-			spreads $his legs for you, smiling with anticipation, $his
-			<<if $activeSlave.vaginaLube > 0>>
-				cunt already soaking wet.
-			<<elseif $activeSlave.labia > 0>>
-				prominent petals swollen with arousal.
-			<<elseif $activeSlave.clit > 0>>
-				big bitch button stiff with arousal.
-			<<else>>
-				cunt flushing with arousal.
-			<</if>>
-			$He reaches down around $his own ass and spreads $his pussy for you, only releasing $his fingertip grip on $his labia when $he feels you hilt yourself inside $his
-			<<if $activeSlave.vagina > 2>>
-				cavernous
-			<<elseif $activeSlave.vagina > 1>>
-				comfortable
-			<<elseif $activeSlave.vagina > 0>>
-				caressing
-			<<else>>
-				needy
-			<</if>>
-			channel.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-			You're here to rut, not make love, and you give it to $him hard, forcing <<if $activeSlave.voice >= 3>>high squeals<<else>>animal grunts<</if>> out of $him. $He climaxes strongly, and the glorious feeling finishes you as well, bringing rope after rope of your cum jetting into $him. $He groans at the feeling, and as $he <<if $activeSlave.belly >= 5000 || $activeSlave.weight > 190>>slowly <</if>>gets to $his feet $he uses a hand to transfer a <<if canTaste($activeSlave)>>taste<<else>>bit<</if>> of the mixture of your seed and <<if $PC.vagina != -1>>both of your<<else>>$his<</if>> pussyjuice to $his mouth.
-			<<if $activeSlave.belly >= 750000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> like I'm going to bur<<s>>t! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He groans, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger. "<<Master>>! They won't <<s>>top! Oh... <<S>>o full... I can't <<s>>top con<<c>>eiving!" $He rolls onto $his back and clutches $his absurd stomach. "<<S>>o tight! <<S>>o full! <<S>>o Good! I need more! Oh, <<Master>>..." $He may be getting a little too into the fantasy.
-				<<if $activeSlave.broodmother == 2 && $activeSlave.preg > 37>>
-					A gush of fluid flows from $his pussy, snapping $him out of $his roleplay. "<<Master>>! I need... One'<<s>> coming now!" You rub $his contracting stomach, enjoying the feeling of the life within shifting to take advantage of the free space. You sigh and lean down, the vessel of your spawn needs help after pinning $himself in such a compromising position. Holding $his belly clear of $his crotch, you watch $him steadily push out $his child before spasming with orgasm and freeing it effortlessly into the world. After collecting it for a servant to handle, you help the exhausted $girl back to $his feet. $He thanks you sincerely for the assist before going to clean $himself up. You barely have time to turn away before another splash catches your attention. "<<Master>>... Another'<<s>>, mmmmh, coming..."
-				<</if>>
-			<<elseif $activeSlave.belly >= 600000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> like I'm going to bur<<s>>t! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He teases, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger.
-			<<elseif $activeSlave.belly >= 450000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> <<s>>o good! <<S>>o many... <<Master>> <<s>>ure i<<s>> potent! I hope <<heP>> can handle them all!" $He teases, cradling $his _belly belly and pretending to be forced to the ground by $his pregnancy growing ever larger.
-			<<elseif $activeSlave.belly >= 300000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me... Oh god, it feel<<s>> <<s>>o good! I feel them moving! They're ready to come out <<Master>>!" $He teases, cradling $his _belly belly and pretending it just grew that huge.
-			<<elseif $activeSlave.belly >= 150000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you! There'<<s>> <<s>>o many in me, look how big I'm getting!" $He teases, cradling $his _belly belly and pretending it just rapidly became that large.
-			<<elseif $activeSlave.belly >= 5000>>
-				"Oh <<Master>>! I'm <<s>>welling <<s>>o fast with imp<<s>> for you!" $He teases, cradling $his _belly belly and pretending it just grew that big.
-			<<else>>
-				"Oh <<Master>>! I feel it! Your <<s>>eed is being devoured by my eggs! I can't wait to <<s>>ee how happy they make you!" $He teases, rubbing $his belly and pretending to conceive.
-			<</if>>
-			$He's obviously @@.mediumaquamarine;becoming more comfortable@@ playing the part of a sex demon whose hunger knows no
-			<<set $activeSlave.trust += 4>>
-			<<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishStrength > 95)>>
-				end, and it's a role the pregnancy fetishist @@.hotpink;loves.@@
-				<<set $activeSlave.devotion += 2>>
-			<<elseif ($activeSlave.fetish == "pregnancy")>>
-				end, and it's a role that @@.lightcoral;reinforces $his love of insemination.@@
-				<<set $activeSlave.fetishStrength += 4>>
-			<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-				end, and the role @@.lightcoral;focuses $his attention on insemination.@@
-				<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "pregnancy">>
-			<<else>>
-				end.
-			<</if>>
-		<</replace>>
-	<</link>><<if $activeSlave.vagina == 0>> //This option will take $his virginity//<</if>>
-<</if>>
-<<if canDoAnal($activeSlave) && ($activeSlave.anus > 0) && ($PC.dick != 0)>>
-	<br><<link "Fuck $him without feeding $him">>
-		<<replace "#result">>
-			<<setSpokenPlayerPronouns $activeSlave>>
-			You tell $him $he's a good little succubus. Thinking $he understands, $he
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				turns and hugs the nearest wall,
-				<<if $activeSlave.belly >= 300000>>
-					sliding $his _belly belly down it until it parts $his legs. $He shuffles onto it to offer you $his needy cunt.
-				<<else>>
-					going up on tiptoe and cocking $his hips to offer you $his needy cunt.
-				<</if>>
-				$He moans as your dick
-				<<if $activeSlave.vagina > 2>>
-					enters $his big cunt.
-				<<elseif $activeSlave.vagina > 1>>
-					fills $his wet cunt.
-				<<else>>
-					slides slowly inside $his tight cunt.
-				<</if>>
-				As you fuck $him, you ask $him how succubi feed. "W-well," $he gasps, struggling to gather $his wits,
-			<<else>>
-				<<if $activeSlave.belly >= 300000>>
-					leans onto $his _belly belly
-				<<else>>
-					gets down on $his knees
-				<</if>>
-				and starts to suck you off. $He deepthroats you eagerly, stretching to tickle your balls with $his tongue as $he gets you all the way in, and then shifting a hand to roll them around as $he sucks. As $he blows you, you ask $him how succubi feed. "Well," $he gasps, popping your dickhead free of $his mouth and replacing the sucking with a stroking hand,
-			<</if>>
-			"<<Master>>, they can eat a _womanP'<<s>> e<<ss>>en<<c>>e by <<s>>wallowing _hisP cum or getting _himP to ejaculate in<<s>>ide their pu<<ss>>ie<<s>>."
-			<br><br>
-			You ask $him whether $he would like to feed off you. "Oh ye<<s>> <<Master>>, plea<<s>>e. Plea<<s>>e feed me," $he begs. Too bad, you tell $him; $he gets to go hungry. After all, succubi can't feed using their butts.
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				You withdraw from $his cunt and stuff your cock up $his ass without pausing or softening your thrusting at all.
-			<<else>>
-				You pull $him to $his feet by the hair, spin $him around, shove $him up against the wall, and stuff your cock up $his ass.
-			<</if>>
-			<<if $activeSlave.anus > 2>>
-				It's not like $his experienced butt can't take an assraping, but
-			<<elseif $activeSlave.anus > 1>>
-				$His practiced ass relaxes and accommodates your dick, but
-			<<else>>
-				$His tight asshole spasms with pain as it stretches to accommodate you, and
-			<</if>>
-			$he whines at your sudden aggression, wiggling within your dominating grip. You fill $his ass with cum as $he struggles, still playing $his part, begging you not to cum in $his bottom, since succubi can't live on buttsex.
-			<<set $activeSlave.trust += 4>>
-			<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishStrength > 95)>>
-				It's a role the submissive slut @@.hotpink;loves.@@
-				<<set $activeSlave.devotion += 2>>
-			<<elseif ($activeSlave.fetish == "submissive")>>
-				It's a role that @@.lightcoral;reinforces $his submissive streak.@@
-				<<set $activeSlave.fetishStrength += 4>>
-			<<elseif (($activeSlave.fetishStrength <= 95) || ($activeSlave.fetishKnown == 0)) && (random(0,1) == 0)>>
-				The role @@.lightcoral;focuses $his attention on submission.@@
-				<<set $activeSlave.fetishStrength = 10, $activeSlave.fetishKnown = 1, $activeSlave.fetish = "submissive">>
-			<<else>>
-				$He @@.hotpink;plays the role well.@@
-			<</if>>
-			<<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-			<<else>>
-				<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-			<</if>>
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</replace>>
-	<</link>>
-<</if>>
-
-<<case "dick wringing">>
-
-<<link "Address $his problem together">>
-	<<replace "#result">>
-		You step in and give $him a quick kiss on the lips, telling $him you'd be happy to. $He was confident you would, but the tenderness makes $his breath catch a little. You take $him by $his
-		<<if $activeSlave.weight > 130>>
-			fat
-		<<elseif $activeSlave.weight > 95>>
-			chubby
-		<<elseif $activeSlave.muscles > 30>>
-			strong
-		<<elseif $activeSlave.shoulders < 0>>
-			pretty little
-		<<elseif $activeSlave.shoulders > 1>>
-			broad
-		<<else>>
-			feminine
-		<</if>>
-		shoulders and keep kissing $him, steering $him backwards into your office. $He gets the idea and cooperates as best $he can, giggling <<if $activeSlave.voice == 0>>mutely<<else>>cutely<</if>> into your mouth as $his hot and increasingly horny body bumps against your own.
-		<br><br>
-		When $his
-		<<if $activeSlave.butt > 12>>
-			monumental ass
-		<<elseif $activeSlave.butt > 7>>
-			titanic ass
-		<<elseif $activeSlave.butt > 4>>
-			big butt
-		<<else>>
-			cute rear
-		<</if>>
-		touches the edge of your desk, the
-		<<if $activeSlave.height > 180>>
-			tall $desc leans back
-		<<elseif $activeSlave.height > 155>>
-			$desc reclines
-		<<else>>
-			short $desc hops up
-		<</if>>
-		to lie across it, using a hand to lay $his inhumanly big dick
-		<<if $activeSlave.belly > 10000>>
-			onto $his _belly <<if $activeSlave.bellyPreg > 0>>pregnant <</if>>belly.
-		<<elseif $activeSlave.weight > 160>>
-			across $his gut.
-		<<elseif $activeSlave.boobs > 5000>>
-			in the warm canyon formed by $his inhumanly big boobs.
-		<<elseif $activeSlave.weight > 95>>
-			across $his soft belly.
-		<<elseif $activeSlave.belly > 1500>>
-			over $his _belly <<if $activeSlave.bellyPreg > 0>>pregnant <</if>>belly.
-		<<elseif $activeSlave.muscles > 30>>
-			across $his ripped abs.
-		<<elseif $activeSlave.weight > 10>>
-			across $his plush stomach.
-		<<else>>
-			up $his stomach.
-		<</if>>
-		$He spreads $his legs as wide as they'll go, and reaches down to spread $his buttocks even wider, offering you $his
-		<<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>>
-			holes.
-		<<elseif canDoVaginal($activeSlave)>>
-			pussy.
-		<<else>>
-			asshole.
-		<</if>>
-		$He <<if $activeSlave.voice == 0>>tries to groan<<else>>groans<</if>> with anticipation of the coming relief as you slide <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> past $his
-		<<if canDoVaginal($activeSlave)>>
-			pussylips and inside $his womanhood.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			sphincter and inside $his asspussy.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		<br><br>
-		It doesn't take long. $His <<if $activeSlave.scrotum == 0>>invisible but overfull balls<<else>>balls tighten and<</if>> shoot cum into $his soft python of a dick, but not a drop appears at its tip. Gasping at the mixed relief and discomfort, $he lets $his butt go and wriggles around to grab $his dick around its base with both hands. $He squeezes it from base to tip to bring out its contents. $He's so huge that $he's able to reach down with $his lips and get $his cockhead into $his mouth, the meat filling it entirely. $He sucks industriously, swallowing $his own load. $He was just trying to relieve the pressure, but the added stimulation brings $him to climax again. Silenced by $his own dickhead, $he shudders deliciously and starts over, wringing more cum into $his own mouth. You change angles, bringing the hard head of <<if $PC.dick != 0>>your own penis<<else>>your phallus<</if>> against $his prostate and forcing an agonizing third climax.
-		<br><br>
-		$He's so discombobulated by this that $he goes limp, offering no resistance as you extract yourself, <<if $PC.dick != 0>>straddle $his torso, and press your dick inside $his mouth to climax there, adding your own ejaculate<<else>>slip out of the harness with the ease of long practice, and straddle $his face so that your climax adds a good quantity of your pussyjuice<</if>> to everything $he's already gotten down<<if $PC.vagina != -1>><<if $PC.dick != 0>> and leaving quite a lot of your pussyjuice on $his chin<</if>><</if>>. When you finally release $him, $he slithers down to the floor, utterly spent.
-		<<if !canTalk($activeSlave)>>
-			$He raises a shaky hand to @@.mediumaquamarine;gesture thanks.@@
-		<<elseif SlaveStatsChecker.checkForLisp($activeSlave)>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he lisps weakly.
-		<<else>>
-			"@@.mediumaquamarine;Thank you,@@ <<Master>>," $he murmurs in a tiny voice.
-		<</if>>
-		<<set $activeSlave.trust += 4>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<br><<link "Use $his trouble to dominate $him">>
-	<<replace "#result">>
-		You step in and trace a <<if $PC.title == 1>>strong<<else>>feminine<</if>> hand across $his lips before inserting two fingers into $his mouth. $He looks puzzled, but obediently begins to suck on your fingers. You use your other hand to explore $his body, titillating the heavily aroused $desc until $he's on the verge of orgasm. Without warning, you place an elastic band around the slave's dickhead. $He writhes with discomfort, but knows better than to protest. It's tight, but not agonizingly so. $He'll be able to cum, but not a drop will get out. Grabbing $him by a nipple<<if $activeSlave.nipples == "fuckable">>cunt<</if>>, you pull $him down to $his knees, enjoying the motion of $his body as $he wriggles with the discomfort of being tugged this way, the uncomfortable thing squeezing the tip of $his cock, and the suspicion that this is going to be tough.
-		<br><br>
-		Once $he's in position, you
-		<<if $activeSlave.butt > 12>>
-			struggle to wrap your arms around $his bountiful buttcheeks,
-		<<elseif $activeSlave.butt > 7>>
-			heft $his ridiculous buttcheeks possessively,
-		<<elseif $activeSlave.butt > 4>>
-			give $his huge ass a possessive squeeze,
-		<<else>>
-			run your hands across $his bottom,
-		<</if>>
-		and then shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>>
-		<<if canDoVaginal($activeSlave)>>
-			inside $his cunt.
-			<<= VCheck.Vaginal($activeSlave, 1)>>
-		<<else>>
-			up $his butt.
-			<<= VCheck.Anal($activeSlave, 1)>>
-		<</if>>
-		$His cock is so long that it drags along the floor as you pound
-		<<if $activeSlave.belly >= 300000>>
-			$him against $his _belly dome of a stomach.
-		<<elseif $activeSlave.boobs > 12000>>
-			$him, $his enormous tits serving as a cushion for $his torso to rest against.
-		<<elseif $activeSlave.boobs > 7000>>
-			$him, accompanied by the nipples that cap $his absurd boobs.
-		<<else>>
-			$him.
-		<</if>>
-		<br><br>
-		$He's so pent up that $he reaches $his first climax quickly, filling $his capped dick with cum. $He <<if $activeSlave.voice == 0>>tries to moan<<else>>moans<</if>> at the combination of relief and pressure inside $his dick, and then slumps a little when $he feels the <<if $PC.dick != 0>>penis<<else>>hard phallus<</if>> inside $him fuck $him even harder, forcing $him towards a second orgasm. And after that one, a third. And a fourth.
-		<br><br>
-		When you finally climax yourself, you stand, leaving $him writhing at your feet with $his huge soft cock positively pressurized. Considering the situation, you kneel down at $his side, deciding what to do. Stroking $him in a mockery of reassurance, you grab $his agonized member, producing a <<if $activeSlave.voice == 0>>gaping, silent scream<<else>>little shriek<</if>>.
-		<<if $activeSlave.toyHole == "dick" && ($PC.preg == 0 || $PC.vagina == 0)>>
-			You maneuver the massive thing into your own <<if $PC.preg == 0 && $PC.vagina != -1>>pussy<<else>>asshole<</if>>, slide a finger in alongside the monstrous thing as $he <<if $activeSlave.voice == 0>>moans with expectation<<else>>begs abjectly to unleash $his<</if>>, and pop the elastic off. You get to watch $his face as $he floods your <<if $PC.preg == 0 && $PC.vagina != -1>>womanhood<<else>>bowels<</if>> with cum, your stomach taking on a distinctive swell as $his pent-up load empties into you.
-			<<if $PC.vagina != -1>>
-				<<run seX($activeSlave, "penetrative", $PC, "vaginal")>>
-			<<else>>
-				<<run seX($activeSlave, "penetrative", $PC, "anal")>>
-			<</if>>
-			<<if canImpreg($PC, $activeSlave)>>
-				<<= knockMeUp($PC, 50, 0, $activeSlave.ID)>>
-			<</if>>
-		<<else>>
-			You maneuver the massive thing inside the slave's own well-fucked <<if $activeSlave.vagina > -1>>pussy<<else>>asshole<</if>>, and then slide fingers in alongside the monstrous thing as $he <<if $activeSlave.voice == 0>>cries desperately<<else>>begs abjectly for mercy<</if>>. Popping the elastic off, you get to watch $his face as $he floods $his own <<if $activeSlave.vagina > -1>>womanhood<<else>>bowels<</if>> with cum.
-			<<if canDoVaginal($activeSlave)>>
-				<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-				<<if canGetPregnant($activeSlave) && canBreed($activeSlave, $activeSlave) && $activeSlave.vasectomy != 1>> /* can't miss the opportunity to knock $himself up */
-					<<run knockMeUp($activeSlave, 20, 0, $activeSlave.ID)>>
-				<</if>>
-			<<else>>
-				<<run seX($activeSlave, "anal", $PC, "penetrative")>>
-			<</if>>
-		<</if>>
-		The cum pressurization brought $him almost to half-hardness, and as this effect diminishes, $his dick slides out again, releasing a lewd torrent of cum. $He cries with overstimulation, relief, pain, and humiliation, @@.hotpink;groveling below you@@ in utter subjugation.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-
 <<case "fucktoy tribbing">>
 
 <<link "Make love to $him">>
diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw
deleted file mode 100644
index 454736bbac2e94feb636d1d38777c65718e819c9..0000000000000000000000000000000000000000
--- a/src/uncategorized/manageArcology.tw
+++ /dev/null
@@ -1,565 +0,0 @@
-:: Manage Arcology [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "The X-Series Arcology">>
-
-<<if $cheatMode == 1>>
-	<div class="cheat-menu">[[Cheat Edit Arcology|MOD_Edit Arcology Cheat][$cheater = 1]]</div>
-<</if>>
-
-<div>
-	<span id="building"></span>
-	<<script>>
-		$(document).one(':passageend', () => {
-			$('#building').append(
-				V.building.render(),
-			);
-		});
-	<</script>>
-	<div id="arc-desc"></div>
-	<<script>>
-		$(document).one(':passageend', () => {
-			$('#arc-desc').append(
-				App.Desc.playerArcology(App.UI.DOM.combineNodes("| ",
-					App.UI.DOM.passageLink("Hide", "Main", () => {V.seeArcology = 0})))
-			);
-		});
-	<</script>>
-</div>
-
-<h2>Arcology Ownership</h2>
-
-<p>
-	<div>
-		<<run App.Arcology.updateOwnership()>>
-		<<includeDOM ownershipReport(false)>>
-	</div>
-</p>
-
-<<if FutureSocieties.availCredits() > 0>>
-	<p class="noteworthy">
-		$arcologies[0].name's society is ready to begin accepting a new societal direction.
-	</p>
-<</if>>
-
-<h2>Construction</h2>
-
-<p>
-	<div>
-	<<if $arcologyUpgrade.drones != 1>>
-		<span class="note">
-			The first major upgrade needed is the installation of a drone security system so higher-class citizens will feel safe and protected should they choose to immigrate. This upgrade will cost <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>>.
-		</span>
-		<<link "Install drone security system" "Manage Arcology">>
-			<<run cashX(-Math.trunc(5000*$upgradeMultiplierArcology), "capEx")>>
-			<<set $arcologyUpgrade.drones = 1, $PC.skill.engineering += 1>>
-			<<if $secExpEnabled > 0>>
-				<<set $SecExp.units.bots = App.SecExp.unit.gen("bots")>>
-			<</if>>
-		<</link>>
-	<<elseif $arcologyUpgrade.hydro != 1>>
-		<span class="note">
-			The next major upgrade needed is the installation of a better water reclamation system so your residents will have access to cheaper water and hydroponically grown food. This upgrade will cost <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>>.
-		</span>
-		[[Upgrade water reclamation system|Manage Arcology][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx"), $arcologyUpgrade.hydro = 1, $PC.skill.engineering += 1]]
-	<<elseif $arcologyUpgrade.apron != 1>>
-		<span class="note">
-			The next major upgrade needed is the installation of a broader apron at the bottom of the arcology to increase its surface area and gather more solar energy. Right now, tenants that use a lot of power have to import it from outside. This upgrade will cost <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology))>>.
-		</span>
-		[[Install solar apron|Manage Arcology][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "capEx"), $arcologyUpgrade.apron = 1, $PC.skill.engineering += 1]]
-	<<elseif $arcologyUpgrade.grid != 1>>
-		<span class="note">
-			The next major upgrade needed is an improvement of the arcology's electrical transmission lines to make efficient use of the additional power from the solar apron. This upgrade will cost <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology))>>.
-		</span>
-		[[Upgrade transmission lines|Manage Arcology][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology)), "capEx"), $arcologyUpgrade.grid = 1, $PC.skill.engineering += 1]]
-	<<else>>
-		<span class="note">
-			The arcology's public areas are fully upgraded.
-		</span>
-		<<includeDOM App.Arcology.upgrades($building)>>
-	<</if>>
-	</div>
-
-	<div>
-	<<if $weatherCladding == 0>>
-		<span class="note">
-			Extreme weather is becoming common worldwide. The arcology's exterior can be hardened to reduce damage in case of heavy weather, but this will reduce its beauty somewhat and will cost <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology))>>.
-			Your citizens are
-			<<if $weatherAwareness == 0>>
-				likely to disapprove of this measure as alarmism.
-			<<else>>
-				<span class="noteworthy">concerned that this measure has not been taken already.</span>
-			<</if>>
-		</span>
-		[[Apply weather cladding|Manage Arcology][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology)), "capEx"), $weatherCladding = 1, $PC.skill.engineering += 1]]
-	<<elseif $weatherCladding == 1 && $building.sections.length > 0>>
-		The arcology's exterior is jacketed with unsightly but sturdy weather cladding. Your arcology is so prosperous that remodeling the cladding into something beautiful is within the realm of possibility. This massive project will cost <<print cashFormat(Math.trunc(3500000*$upgradeMultiplierArcology))>> and without a doubt render your arcology one of the wonders of the world.
-		[[Remodel weather cladding|Manage Arcology][cashX(forceNeg(Math.trunc(3500000*$upgradeMultiplierArcology)), "capEx"), $weatherCladding = 2, $PC.skill.engineering += 1]]
-	<<elseif $weatherCladding == 1>>
-		<span class="note">
-			The arcology's exterior is jacketed with unsightly but sturdy weather cladding.
-		</span>
-	<<elseif $weatherCladding == 2>>
-		<span class="note">
-			The arcology's exterior is jacketed with gorgeously sculpted and fully functional weather cladding.
-		</span>
-	<</if>>
-	</div>
-
-	<div>
-	<<if $FCTV.receiver > -1 && !$FCTV.weekEnabled>>
-		<<set _noSub = Math.trunc(25000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
-		<<set _lightSub = Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
-		<<set _heavySub = Math.trunc(10000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
-
-		You have not installed an FCTV receiver.
-		Installing this receiver yourself will cost <<print cashFormat(_noSub)>>.
-		You can have your citizens pay for the fiber optic upgrades, reducing the cost to <<print cashFormat(_lightSub)>>.
-		You can also have them heavily subsidize installation, they will be upset about it, but it will only cost <<print cashFormat(_heavySub)>>.
-
-		<<link "No subsidy" "Manage Arcology">>
-			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
-			<<run FCTV.initChannels()>>
-			<<run cashX(forceNeg(_noSub), "capEx")>>
-			<<run repX(500, "capEx")>>
-		<</link>>
-		|
-		<<link "Light subsidy" "Manage Arcology">>
-			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
-			<<run FCTV.initChannels()>>
-			<<run cashX(forceNeg(_lightSub), "capEx")>>
-			/* No rep change */
-		<</link>>
-		|
-		<<link "Heavy subsidy" "Manage Arcology">>
-			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
-			<<run FCTV.initChannels()>>
-			<<run cashX(forceNeg(Math.trunc(_heavySub), "capEx"))>>
-			<<run repX(-1500, "capEx")>>
-		<</link>>
-	<<elseif ($FCTV.receiver == 3)>>
-		You have installed the FCTV receiver and have access to the full range of FCTV's programs. High viewership rates amongst your citizens makes it easier to pursue your societal goals.
-	<<elseif ($FCTV.receiver == 2)>>
-		You have installed the FCTV receiver and have access to the full range of FCTV's programs. Decent viewership rates amongst your citizens makes it somewhat easier to pursue your societal goals.
-	<<elseif ($FCTV.receiver == 1)>>
-		You have installed the FCTV receiver and have access to the full range of FCTV's programs. Low viewership rates amongst your citizens limits the impact of FCTV on your societal goals.
-	<</if>>
-	</div>
-
-	<<if ($PC.skill.engineering >= 100) || ($PC.career == "arcology owner")>>
-		<div class="note">
-			Arcology upgrades are less expensive due to your
-			<span class="player skill">
-				<<if $PC.career == "arcology owner">>experience in the Free Cities<<else>>arcology engineering training<</if>>.
-			</span>
-		</div>
-	<</if>>
-</p>
-
-<<if $secExpEnabled == 0>>
-	<<if $weatherAwareness > 0>>
-		<p>
-		<<if $antiWeatherFreeze == 0>>
-			The extreme weather hurts your arcology's ability to function. Reinforcing your passenger terminals increase the weather range at which they can operate.
-			<div>
-				Reinforcing passenger terminals costs <<print cashFormat(50000)>> and increase upkeep. [[Reinforce|Manage Arcology][$antiWeatherFreeze = 1, cashX(-50000, "capEx")]]
-			</div>
-		<<elseif $antiWeatherFreeze == 1>>
-			You have reinforced your passenger terminals to function even during bad weather. You can invest into all-weather transportation to remain functional no matter what.
-			<div>
-				Investing in all-weather transportation costs <<print cashFormat(100000)>> and increase upkeep. [[Invest|Manage Arcology][$antiWeatherFreeze = 2, cashX(-100000, "capEx")]]
-			</div>
-		<<elseif $antiWeatherFreeze == 2>>
-			Your arcology's passenger terminals remain fully operational even during the most extreme weather.
-		<</if>>
-		</p>
-	<</if>>
-<</if>>
-
-<<if $secExpEnabled > 0>>
-	<h2>Security</h2>
-
-	<p>
-		<div>
-		<<if !$SecExp.buildings.propHub>>
-			[[Set up the propaganda Hub|Manage Arcology][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), App.SecExp.propHub.Init(), $PC.skill.engineering += 1, $PC.skill.hacking += 1]]
-			<span class="detail">
-				Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.
-				<div class="indent">Building specialized in the management of authority.</div>
-			</span>
-		<<else>>
-			The [[Propaganda Hub|propagandaHub]] is ready to manipulate reality on your command.
-		<</if>>
-		</div>
-
-		<div>
-		<<if !$SecExp.buildings.secHub>>
-			[[Set up the security headquarters|Manage Arcology][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), App.SecExp.secHub.Init(), $PC.skill.engineering += 1, $PC.skill.hacking += 1]]
-			<span class="detail">
-				Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.
-				<div class="indent">Building specialized in the management of security and crime.</div>
-			</span>
-		<<else>>
-			The [[security HQ|securityHQ]] is constantly working to protect your arcology.
-		<</if>>
-		</div>
-
-		<div>
-		<<if !$SecExp.buildings.barracks>>
-			[[Set up the barracks|Manage Arcology][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "capEx"), App.SecExp.barracks.Init(), $PC.skill.engineering += 1]]
-			<span class="detail">
-				Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>>
-				<div class="indent">Building specialized in the management of armed forces.</div>
-			</span>
-		<<else>>
-			The [[barracks|secBarracks]] patiently await your orders.
-		<</if>>
-		</div>
-
-		<div>
-		<<if !$SecExp.buildings.riotCenter && $SecExp.settings.rebellion.enabled == 1>>
-			[[Set up the riot control center|Manage Arcology][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "capEx"), App.SecExp.riotCenter.Init(), $PC.skill.engineering += 1]]
-			<span class="detail">
-				Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>>
-				<div class="indent">Building specialized in the management and suppression of rebellions.</div>
-			</span>
-		<<elseif $SecExp.settings.rebellion.enabled == 1>>
-			The [[Riot Control Center|riotControlCenter]] stands ready for action.
-		<</if>>
-		</div>
-	</p>
-<</if>>
-
-<<if $difficultySwitch == 1>>
-	<h2>Disaster Response</h2>
-
-	<p>
-		<<if $econWeatherDamage > 0>>
-			The recent terrible weather has damaged the local infrastructure. It is <span class="warning">reducing the local economy score by <<print $econWeatherDamage>>.</span>
-			<div>
-			<<if $disasterResponse == 0>>
-				Locals will do their best to repair the damage on their own, but setting up a disaster response unit will improve the recovery of infrastructure critical for keeping goods, people and information flowing smoothly in and out of your arcology.
-				<div>
-					Creating the unit will cost <<print cashFormat(50000)>> and incur upkeep. [[Create Disaster Response Unit|Manage Arcology][cashX(-50000, "capEx"), $disasterResponse = 1]]
-				</div>
-			<<elseif $disasterResponse == 1>>
-				You are sending your disaster response unit to repair critical infrastructure. They are doing what they can.
-				<div>
-					The unit can be made more effective with an additional investment of <<print cashFormat(100000)>>. This will also increase upkeep. [[Improve Disaster Response Unit|Manage Arcology][cashX(-100000, "capEx"), $disasterResponse = 2]]
-				</div>
-			<<else>>
-				Your highly capable disaster response unit is rapidly repairing the weather damage.
-			<</if>>
-			</div>
-		<<elseif $disasterResponse > 0>>
-			Your disaster response unit is idle. It will not cost you any upkeep this week.
-		<</if>>
-	</p>
-<</if>>
-
-<<if $foodMarket > 0>>
-	<h2>Food Management</h2>
-	<<includeDOM App.UI.foodMarket()>>
-<</if>>
-
-<h2>Sexual Service Policies</h2>
-
-<p>
-	<div>
-		If so desired, your assistant can help you manipulate the business environment within your arcology.
-	</div>
-	<div>
-		Currently outside parties are providing <<print $NPCMarketShare.lowerClass/10>>%, <<print $NPCMarketShare.middleClass/10>>%, <<print $NPCMarketShare.upperClass/10>>% and <<print $NPCMarketShare.topClass/10>>% of the sexual services for the lower, middle, upper and top class respectively.
-	</div>
-</p>
-
-<p>
-	<div>
-	<<if $sexSubsidies.lowerClass == 0>>
-		You can provide a minor subsidy for those selling sexual services to the lower class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 1]]
-	<<elseif $sexSubsidies.lowerClass == 1>>
-		You are providing a minor subsidy for those selling sexual services to the lower class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Cancel Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 0]] | [[Moderate Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 2]]
-	<<elseif $sexSubsidies.lowerClass == 2>>
-		You are providing a moderate subsidy for those selling sexual services to the lower class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 1]] | [[Substantial Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 3]]
-	<<elseif $sexSubsidies.lowerClass == 3>>
-		You are providing a substantial subsidy for those selling sexual services to the lower class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Moderate Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 2]] | [[Gratuitous Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 4]]
-	<<else>>
-		You are providing a gratuitous subsidy for those selling sexual services to the lower class. <span class="note">Upkeep is relative to the amount of sex provided by other parties</span> [[Substantial Subsidy|Manage Arcology][$sexSubsidies.lowerClass = 3]]
-	<</if>>
-	</div>
-	<div>
-	<<if $sexSupplyBarriers.lowerClass == 0>>
-		You can make things more difficult for those supplying sexual services in the lower class segment if you are willing to spend 1000 reputation and pay a flat upkeep of <span class="cash"><<print cashFormat(1000)>>.</span> <<if $rep > 1000>>[[Create Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 1, repX(-1000, "subsidiesAndBarriers")]] <<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.lowerClass == 1>>
-		You have forced some unneeded bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(5000)>>.</span> <<if $rep > 1000>>[[Abolish Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 0, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 2, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.lowerClass == 2>>
-		You have forced considerable bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(20000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 1, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.lowerClass == 3>>
-		You have forced stifling bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(60000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 2, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 4, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<else>>
-		You have forced suffocating bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.lowerClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<</if>>
-	</div>
-</p>
-
-<p>
-	<div>
-	<<if $sexSubsidies.middleClass == 0>>
-		You can provide a minor subsidy for those selling sexual services to the middle class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.middleClass = 1]]
-	<<elseif $sexSubsidies.middleClass == 1>>
-		You are providing a minor subsidy for those selling sexual services to the middle class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Cancel Subsidy|Manage Arcology][$sexSubsidies.middleClass = 0]] | [[Moderate Subsidy|Manage Arcology][$sexSubsidies.middleClass = 2]]
-	<<elseif $sexSubsidies.middleClass == 2>>
-		You are providing a moderate subsidy for those selling sexual services to the middle class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.middleClass = 1]] | [[Substantial Subsidy|Manage Arcology][$sexSubsidies.middleClass = 3]]
-	<<elseif $sexSubsidies.middleClass == 3>>
-		You are providing a substantial subsidy for those selling sexual services to the middle class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Moderate Subsidy|Manage Arcology][$sexSubsidies.middleClass = 2]] | [[Gratuitous Subsidy|Manage Arcology][$sexSubsidies.middleClass = 4]]
-	<<else>>
-		You are providing a gratuitous subsidy for those selling sexual services to the middle class. <span class="note">Upkeep is relative to the amount of sex provided by other parties</span> [[Substantial Subsidy|Manage Arcology][$sexSubsidies.middleClass = 3]]
-	<</if>>
-	</div>
-	<div>
-	<<if $sexSupplyBarriers.middleClass == 0>>
-		You can make things more difficult for those supplying sexual services in the middle class segment if you are willing to spend 1000 reputation and pay a flat upkeep of <span class="cash"><<print cashFormat(1000)>>.</span> <<if $rep > 1000>>[[Create Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 1, repX(-1000, "subsidiesAndBarriers")]] <<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.middleClass == 1>>
-		You have forced some unneeded bureaucracy on those selling sexual services to the middle class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(5000)>>.</span> <<if $rep > 1000>>[[Abolish Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 0, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 2, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.middleClass == 2>>
-		You have forced considerable bureaucracy on those selling sexual services to the middle class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(20000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 1, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.middleClass == 3>>
-		You have forced stifling bureaucracy on those selling sexual services to the middle class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(60000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 2, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 4, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<else>>
-		You have forced suffocating bureaucracy on those selling sexual services to the middle class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.middleClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<</if>>
-	</div>
-</p>
-
-<p>
-	<div>
-	<<if $sexSubsidies.upperClass == 0>>
-		You can provide a minor subsidy for those selling sexual services to the upper class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.upperClass = 1]]
-	<<elseif $sexSubsidies.upperClass == 1>>
-		You are providing a minor subsidy for those selling sexual services to the upper class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Cancel Subsidy|Manage Arcology][$sexSubsidies.upperClass = 0]] | [[Moderate Subsidy|Manage Arcology][$sexSubsidies.upperClass = 2]]
-	<<elseif $sexSubsidies.upperClass == 2>>
-		You are providing a moderate subsidy for those selling sexual services to the upper class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.upperClass = 1]] | [[Substantial Subsidy|Manage Arcology][$sexSubsidies.upperClass = 3]]
-	<<elseif $sexSubsidies.upperClass == 3>>
-		You are providing a substantial subsidy for those selling sexual services to the upper class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Moderate Subsidy|Manage Arcology][$sexSubsidies.upperClass = 2]] | [[Gratuitous Subsidy|Manage Arcology][$sexSubsidies.upperClass = 4]]
-	<<else>>
-		You are providing a gratuitous subsidy for those selling sexual services to the upper class. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Substantial Subsidy|Manage Arcology][$sexSubsidies.upperClass = 3]]
-	<</if>>
-	</div>
-	<div>
-	<<if $sexSupplyBarriers.upperClass == 0>>
-		You can make things more difficult for those supplying sexual services in the upper class segment if you are willing to spend 1000 reputation and pay a flat upkeep of <span class="cash"><<print cashFormat(1000)>>.</span> <<if $rep > 1000>>[[Create Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 1, repX(-1000, "subsidiesAndBarriers")]] <<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.upperClass == 1>>
-		You have forced some unneeded bureaucracy on those selling sexual services to the upper class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(5000)>>.</span> <<if $rep > 1000>>[[Abolish Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 0, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 2, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough</span><</if>>
-	<<elseif $sexSupplyBarriers.upperClass == 2>>
-		You have forced considerable bureaucracy on those selling sexual services to the upper class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(20000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 1, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.upperClass == 3>>
-		You have forced stifling bureaucracy on those selling sexual services to the upper class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(60000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 2, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 4, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<else>>
-		You have forced suffocating bureaucracy on those selling sexual services to the upper class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.upperClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<</if>>
-	</div>
-</p>
-
-<p>
-	<div>
-	<<if $sexSubsidies.topClass == 0>>
-		You can provide a minor subsidy for those selling sexual services to the millionaires. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.topClass = 1]]
-	<<elseif $sexSubsidies.topClass == 1>>
-		You are providing a minor subsidy for those selling sexual services to the millionaires. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Cancel Subsidy|Manage Arcology][$sexSubsidies.topClass = 0]] | [[Moderate Subsidy|Manage Arcology][$sexSubsidies.topClass = 2]]
-	<<elseif $sexSubsidies.topClass == 2>>
-		You are providing a moderate subsidy for those selling sexual services to the millionaires. <span class="note">Upkeep is relative to the amount of sex provided by other parties.</span> [[Minor Subsidy|Manage Arcology][$sexSubsidies.topClass = 1]] | [[Substantial Subsidy|Manage Arcology][$sexSubsidies.topClass = 3]]
-	<<elseif $sexSubsidies.topClass == 3>>
-		You are providing a substantial subsidy for those selling sexual services to the millionaires. <span class="note">Upkeep is relative to the amount of sex provided by other parties</span> [[Moderate Subsidy|Manage Arcology][$sexSubsidies.topClass = 2]] | [[Gratuitous Subsidy|Manage Arcology][$sexSubsidies.topClass = 4]]
-	<<else>>
-		You are providing a gratuitous subsidy for those selling sexual services to the millionaires. <span class="note">Upkeep is relative to the amount of sex provided by other parties</span> [[Substantial Subsidy|Manage Arcology][$sexSubsidies.topClass = 3]]
-	<</if>>
-	</div>
-	<div>
-	<<if $sexSupplyBarriers.topClass == 0>>
-		You can make things more difficult for those supplying sexual services in the millionaires segment if you are willing to spend 1000 reputation and pay a flat upkeep of <span class="cash"><<print cashFormat(1000)>>.</span> <<if $rep > 1000>>[[Create Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 1, repX(-1000, "subsidiesAndBarriers")]] <<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.topClass == 1>>
-		You have forced some unneeded bureaucracy on those selling sexual services to the millionaires making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(5000)>>.</span> <<if $rep > 1000>>[[Abolish Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 0, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 2, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<elseif $sexSupplyBarriers.topClass == 2>>
-		You have forced considerable bureaucracy on those selling sexual services to the millionaires making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(20000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 1, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough</span><</if>>
-	<<elseif $sexSupplyBarriers.topClass == 3>>
-		You have forced stifling bureaucracy on those selling sexual services to the millionaires making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of <span class="cash"><<print cashFormat(60000)>>.</span> <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 2, repX(-1000, "subsidiesAndBarriers")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 4, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough.</span><</if>>
-	<<else>>
-		You have forced suffocating bureaucracy on those selling sexual services to the millionaires making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriers.topClass = 3, repX(-1000, "subsidiesAndBarriers")]]<<else>><span class="note">You are not reputable enough</span><</if>>
-	<</if>>
-	</div>
-</p>
-
-<h2>Population and Rent</h2>
-
-<p>
-	<<print $arcologies[0].name>> is home to the following;
-	<<set _percACitizens = Math.trunc(($ACitizens / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_percASlaves = Math.trunc(($ASlaves / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_percLowerClass = Math.trunc(($lowerClass / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_percMiddleClass = Math.trunc(($middleClass / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_percUpperClass = Math.trunc(($upperClass / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_percTopClass = Math.trunc(($topClass / ($ACitizens + $ASlaves)) * 1000) / 10,
-	_rentLowerClass = Math.trunc($rent.lowerClass * (1 + (5 - $baseDifficulty) / 20) / 0.25) / 100,
-	_rentMiddleClass = Math.trunc($rent.middleClass * (1 + (5 - $baseDifficulty) / 20) / 0.25) / 100,
-	_rentUpperClass = Math.trunc($rent.upperClass * (1 + (5 - $baseDifficulty) / 20) / 25),
-	_rentTopClass = Math.trunc($rent.topClass * (1 + (5 - $baseDifficulty) / 20) / 25)>>
-	<div>
-	Lower Class Citizens | $lowerClass | <<print _percLowerClass>>% | Rent <span class="cash"><<print cashFormat(_rentLowerClass)>></span>
-	<<if $rent.lowerClass > $rentDefaults.lowerClass * 1.5>>
-		<span class="note">Very High</span> | [[Decrease|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass * 1.5, $rentEffectL = 0.94, $whoreBudget.lowerClass *= 9 / 8]]
-	<<elseif $rent.lowerClass > $rentDefaults.lowerClass>>
-		<span class="note">High</span> | [[Increase|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass * 2, $rentEffectL = 0.85, $whoreBudget.lowerClass *= 8 / 9]] | [[Decrease|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass, $rentEffectL = 1, $whoreBudget.lowerClass *= 10 / 9]]
-	<<elseif $rent.lowerClass > $rentDefaults.lowerClass * 0.5>>
-		<span class="note">Average</span> | [[Increase|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass * 1.5, $rentEffectL = 0.94, $whoreBudget.lowerClass *= 9 / 10]] | [[Decrease|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass * 0.5, $rentEffectL = 1.04, $whoreBudget.lowerClass *= 11 / 10]]
-	<<elseif $rent.lowerClass > 0>>
-		<span class="note">Low</span> | [[Increase|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass, $rentEffectL = 1, $whoreBudget.lowerClass *= 10 / 11]] | [[Free Rent|Manage Arcology][$rent.lowerClass = 0, $rentEffectL = 1.1, $whoreBudget.lowerClass *= 12 / 11]]
-	<<else>>
-		<span class="note">Free</span> | [[Increase|Manage Arcology][$rent.lowerClass = $rentDefaults.lowerClass * 0.5, $rentEffectL = 1.04, $whoreBudget.lowerClass *= 11 / 12]]
-	<</if>>
-	</div>
-	<div>
-	Middle Class Citizens | $middleClass | <<print _percMiddleClass>>% | Rent <span class="cash"><<print cashFormat(_rentMiddleClass)>></span>
-	<<if $rent.middleClass > $rentDefaults.middleClass * 1.5>>
-		<span class="note">Very High</span> | [[Decrease|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass * 1.5, $rentEffectM = 0.94, $whoreBudget.middleClass *= 9 / 8]]
-	<<elseif $rent.middleClass > $rentDefaults.middleClass>>
-		<span class="note">High</span> | [[Increase|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass * 2, $rentEffectM = 0.85, $whoreBudget.middleClass *= 8 / 9]] | [[Decrease|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass, $rentEffectM = 1, $whoreBudget.middleClass *= 10 / 9]]
-	<<elseif $rent.middleClass > $rentDefaults.middleClass * 0.5>>
-		<span class="note">Average</span> | [[Increase|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass * 1.5, $rentEffectM = 0.94, $whoreBudget.middleClass *= 9 / 10]] | [[Decrease|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass * 0.5, $rentEffectM = 1.04, $whoreBudget.middleClass *= 11 / 10]]
-	<<elseif $rent.middleClass > 0>>
-		<span class="note">Low</span> | [[Increase|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass, $rentEffectM = 1, $whoreBudget.middleClass *= 10 / 11]] | [[Free Rent|Manage Arcology][$rent.middleClass = 0, $rentEffectM = 1.1, $whoreBudget.middleClass *= 12 / 11]]
-	<<else>>
-		<span class="note">Free</span> | [[Increase|Manage Arcology][$rent.middleClass = $rentDefaults.middleClass * 0.5, $rentEffectM = 1.04, $whoreBudget.middleClass *= 11 / 12]]
-	<</if>>
-	</div>
-	<div>
-	Upper Class Citizens | $upperClass | <<print _percUpperClass>>% | Rent <span class="cash"><<print cashFormat(_rentUpperClass)>></span>
-	<<if $rent.upperClass > $rentDefaults.upperClass * 1.5>>
-		<span class="note">Very High</span> | [[Decrease|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass * 1.5, $rentEffectU = 0.94, $whoreBudget.upperClass *= 9 / 8]]
-	<<elseif $rent.upperClass > $rentDefaults.upperClass>>
-		<span class="note">High</span> | [[Increase|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass * 2, $rentEffectU = 0.85, $whoreBudget.upperClass *= 8 / 9]] | [[Decrease|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass, $rentEffectU = 1, $whoreBudget.upperClass *= 10 / 9 ]]
-	<<elseif $rent.upperClass > $rentDefaults.upperClass * 0.5>>
-		<span class="note">Average</span> | [[Increase|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass * 1.5, $rentEffectU = 0.94, $whoreBudget.upperClass *= 9 / 10]] | [[Decrease|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass * 0.5, $rentEffectU = 1.04, $whoreBudget.upperClass *= 11 / 10]]
-	<<elseif $rent.upperClass > 0>>
-		<span class="note">Low</span> | [[Increase|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass, $rentEffectU = 1, $whoreBudget.upperClass *= 10 / 11]] | [[Free Rent|Manage Arcology][$rent.upperClass = 0, $rentEffectU = 1.1, $whoreBudget.upperClass *= 12 / 11]]
-	<<else>>
-		<span class="note">Free</span> | [[Increase|Manage Arcology][$rent.upperClass = $rentDefaults.upperClass * 0.5, $rentEffectU = 1.04, $whoreBudget.upperClass *= 11 / 12]]
-	<</if>>
-	</div>
-	<div>
-	Millionaires | $topClass | <<print _percTopClass>>% | Rent <span class="cash"><<print cashFormat(_rentTopClass)>></span>
-	<<if $rent.topClass > $rentDefaults.topClass * 1.5>>
-		<span class="note">Very High</span> | [[Decrease|Manage Arcology][$rent.topClass = $rentDefaults.topClass * 1.5, $rentEffectT = 0.94, $whoreBudget.topClass *= 9 / 8]]
-	<<elseif $rent.topClass > $rentDefaults.topClass>>
-		<span class="note">High</span> | [[Increase|Manage Arcology][$rent.topClass = $rentDefaults.topClass * 2, $rentEffectT = 0.85, $whoreBudget.topClass *= 8 / 9]] | [[Decrease|Manage Arcology][$rent.topClass = $rentDefaults.topClass, $rentEffectT = 1, $whoreBudget.topClass *= 10 / 9]]
-	<<elseif $rent.topClass > $rentDefaults.topClass * 0.5>>
-		<span class="note">Average</span> | [[Increase|Manage Arcology][$rent.topClass = $rentDefaults.topClass * 1.5, $rentEffectT = 0.94, $whoreBudget.topClass *= 9 / 10]] | [[Decrease|Manage Arcology][$rent.topClass = $rentDefaults.topClass * 0.5, $rentEffectT = 1.04, $whoreBudget.topClass *= 11 / 10]]
-	<<elseif $rent.topClass > 0>>
-		<span class="note">Low</span> | [[Increase|Manage Arcology][$rent.topClass = $rentDefaults.topClass, $rentEffectT = 1, $whoreBudget.topClass *= 10 / 11]] | [[Free Rent|Manage Arcology][$rent.topClass = 0, $rentEffectT = 1.1, $whoreBudget.topClass *= 12 / 11]]
-	<<else>>
-		<span class="note">Free</span> | [[Increase|Manage Arcology][$rent.topClass = $rentDefaults.topClass * 0.5, $rentEffectT = 1.04, $whoreBudget.topClass *= 11 / 12]]
-	<</if>>
-	</div>
-	<div>
-		Slaves | $ASlaves | <<print _percASlaves>>%
-	</div>
-</p>
-
-<h2>Language</h2>
-
-<p>
-	The lingua franca of the arcology is <strong>$language</strong>.
-	<<link "Language options">><<set $seed = $language>><<goto "Change Language">><</link>>
-</p>
-
-<h2>Special Arcology Upgrades</h2>
-
-<p class="indent">
-	<<if ($personalArms == 0) && ($mercenaries == 0) && ($assistant.personality <= 0)>>
-		<span class="note">$arcologies[0].name has no special upgrades.</span>
-	<</if>>
-
-	<<if ($personalArms == 1)>>
-		You own a prototype powered exoskeleton that mounts armor and a smart mortar system, and has rifles mounted into its forearms.
-	<<elseif ($personalArms > 1)>>
-		You own a prototype powered exoskeleton that mounts armor and a smart mortar system, and has rifles mounted into its forearms. Furthermore, your security drones can rearm with small-caliber guns if necessary.
-	<</if>>
-
-	<<if ($mercenaries > 0)>>
-		<<if ($mercenaries == 1)>>
-			A squad of mercenaries is permanently quartered in $arcologies[0].name. They are grim men and women, heavily armed and armored.
-		<<elseif ($mercenaries < 5)>>
-			A full platoon of mercenaries is permanently quartered in $arcologies[0].name. They are grim men and women, heavily armed and armored.
-		<<elseif ($mercenaries >= 5)>>
-			You have permanently settled a full company of mercenaries in $arcologies[0].name as your $mercenariesTitle. They are grim men and women who appreciate their luxurious life here and train hard to keep their skills with their prototype armor sharp.
-		<</if>>
-	<</if>>
-
-	<<if $assistant.personality > 0>>
-		<<setAssistantPronouns>>
-		<<= capFirstChar($assistant.name)>> is using an alternative personality setting, speaking in a sultry, sexual voice, and talking as though the penthouse's sex toys are _hisA body.
-		<<if $assistant.personality > 1>>
-			_HeA also has charge of all smart piercings in the arcology, and is using _hisA adaptations to sexual duties to improve their effectiveness.
-		<</if>>
-	<</if>>
-</p>
-
-<p>
-	Your slaves have participated in approximately <<print num($oralTotal+$vaginalTotal+$analTotal)>> sexual encounters: <<print num($oralTotal)>> primarily oral, <<print num($vaginalTotal)>> vanilla, <<print num($mammaryTotal)>> mammary, <<print num($analTotal)>> anal, and <<print num($penetrativeTotal)>> with the slave penetrating another. They have produced about <<print num($milkTotal)>> liters of marketable milk, <<if $seeDicks != 0>>about <<print num($cumTotal)>> deciliters of marketable cum, <</if>>and have given birth <<print num($birthsTotal)>> times.
-
-	<<if $abortionsTotal > 0 && $miscarriagesTotal > 0>>
-		They have had a total of <<print num($abortionsTotal)>> abortions and <<print num($miscarriagesTotal)>> miscarriages.
-	<<elseif $abortionsTotal > 0>>
-		They have had a total of <<print num($abortionsTotal)>> abortions.
-	<<elseif $miscarriagesTotal > 0>>
-		They have had a total of <<print num($miscarriagesTotal)>> miscarriages.
-	<</if>>
-
-	<<if $fuckdollsSold > 0>>
-		$fuckdollsSold mindbroken arcade slaves have been converted into Fuckdolls and sold.
-	<</if>>
-</p>
-
-<<if $pitFightsTotal > 0 && $pitKillsTotal > 0>>
-	<p>
-	$arcologies[0].name has hosted <<print num ($pitFightsTotal)>> pit fights, and <<print num ($pitKillsTotal)>> slaves have died in your pit.
-	</p>
-<<elseif $pitFightsTotal > 0>>
-	<p>
-	$arcologies[0].name has hosted <<print num ($pitFightsTotal)>> pit fights.
-	</p>
-<</if>>
-
-<<if $secExpEnabled > 0>>
-	<<set _countBattles = $SecExp.battles.victories + $SecExp.battles.losses>>
-	<<set _countRebellions = $SecExp.rebellions.victories + $SecExp.rebellions.losses>>
-	<p>
-	<<if $SF.Toggle === 0||$SF.Active === 0>>
-		Your army counts <<print num(App.SecExp.Manpower.employedOverall)>> total soldiers.
-	<<elseif $SF.Toggle && $SF.Active >= 1>>
-		Your army counts <<print num(App.SecExp.Manpower.employedOverall + $SF.ArmySize)>> total soldiers of which <<print num($SF.ArmySize)>> under the special force command and the rest under your direct control.
-	<</if>>
-	<<if $SecExp.settings.battle.enabled === 1 && _countBattles > 0>>
-		Your troops were involved in <<print num(_countBattles)>> battles of which <<print num($SecExp.battles.major)>> were major engagements.
-		<<if _countBattles === $SecExp.battles.victories>>
-			You won all of them.
-		<<elseif _countBattles === $SecExp.battles.losses>>
-			You won none of them.
-		<<else>>
-			You won <<print num($SecExp.battles.victories)>> of them, while the enemy managed to gain the upper hand in the other <<print num($SecExp.battles.losses)>>.
-		<</if>>
-		During all battles you lost a total of <<print num(App.SecExp.unit.list().slice(1).reduce((acc, cur) => acc + V.SecExp.units[cur].dead, 0))>> men, while scoring a total of <<print num($SecExp.core.totalKills)>> kills.
-	<</if>>
-	<<if $SecExp.settings.rebellion.enabled === 1 && _countRebellions > 0>>
-		Your arcology was involved in <<print num(_countRebellions)>> rebellions. You won <<print num($SecExp.rebellions.victories)>> of them, while the rebels defeated your forces in <<print num($SecExp.rebellions.losses)>>.
-	<</if>>
-	</p>
-<</if>>
-
-<p>
-	Your arcology is named <<textbox "$arcologies[0].name" $arcologies[0].name "Manage Arcology">>
-</p>
-
-<<if $experimental.dinnerParty == 1 && $seeExtreme == 1>>
-	<p>
-		[[Host Dinner Party|Dinner Party Preparations]]
-	</p>
-<</if>>
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/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw
index 2a7f886f4f6978a4d68fb79ef2a3a128df88e2b9..e695af39f7418a386a2146ed44d4222b1f6d663e 100644
--- a/src/uncategorized/randomNonindividualEvent.tw
+++ b/src/uncategorized/randomNonindividualEvent.tw
@@ -32,15 +32,16 @@
 		<<set $events.push("REFI")>>
 	<</for>>
 	<<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>>
-	<</if>>
-	<<set $events = $events.concat(_recruitEvents).concat(App.Events.getNonindividualEventsPassageList())>>
 	<<if $debugMode > 0 && $debugModeEventSelection > 0>>
+		<<set $events = $events.concat(_recruitEvents).concat(App.Events.getNonindividualEventsPassageList())>>
 		<<goto "random event select">>
 	<<else>>
+		<<set _maxRecruitNumber = Math.min(10, Math.floor($events.length/4) + 1)>>
+		<<if _maxRecruitNumber < _recruitEvents.length>>
+			<<set _recruitEvents.shuffle()>>
+			<<set _recruitEvents.length = _maxRecruitNumber>>
+		<</if>>
+		<<set $events = $events.concat(_recruitEvents).concat(App.Events.getNonindividualEventsPassageList())>>
 		<<goto "random event roll">>
 	<</if>>
 <</if>> /* CLOSES SLAVE SELECT */