diff --git a/devNotes/usefulJSFunctionDocumentation.md b/devNotes/usefulJSFunctionDocumentation.md
index e67ded88ad0348b7382b6bf5888169ccc0141df7..54fd65dad61acfd9ad0cb4fe1eb5319641ee934c 100644
--- a/devNotes/usefulJSFunctionDocumentation.md
+++ b/devNotes/usefulJSFunctionDocumentation.md
@@ -438,5 +438,7 @@ releaseRestricted // returns true if the slave has some kind of rule limiting th
 
  SkillIncrease() // Depreciates the SugarCube functions.
 
- disobedience // Returns a 0-100 value indicating likelihood of a slave ignoring the rules.
+ disobedience() // Returns a 0-100 value indicating likelihood of a slave ignoring the rules.
+
+ penetrativeSocialUse() // Returns the percentage (0-100) of the social acceptance of the slaves penetrating citizens.
 ```
diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index 260c8ca2306ff90ef65b3d9e037e73746de1b03a..39b4363ca4b30b8bb401f4a165bd6bf845103340 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -32,20 +32,13 @@ declare global {
 		//#region SlaveState types
 		namespace Rules {
 			type Living = "spare" | "normal" | "luxurious";
-			type Rest = "none" | "cruel" | "restrictive" | "permissive" | "mandatory";
-			type Mobility = "restrictive" | "permissive";
-			type Speech = "restrictive" | "permissive" | "accent elimination" | "language lessons";
-			type Relationship = "restrictive" | "just friends" | "permissive";
-			type Lactation = "none" | "induce" | "maintain";
-			type Punishment = "confinement" | "whipping" | "chastity" | "situational";
-			type Reward = "relaxation" | "drugs" | "orgasm" | "situational" | "confinement";
-
 			interface LivingFreezed extends Record<string, Living> {
 				LUXURIOUS: 'luxurious';
 				NORMAL: 'normal';
 				SPARE: 'spare';
 			}
 
+			type Rest = "none" | "cruel" | "restrictive" | "permissive" | "mandatory";
 			interface RestFreezed extends Record<string, Rest> {
 				NONE: "none";
 				MIN: "cruel";
@@ -53,6 +46,13 @@ declare global {
 				MAX: "permissive";
 				MANDATORY: "mandatory";
 			}
+
+			type Mobility = "restrictive" | "permissive";
+			type Speech = "restrictive" | "permissive" | "accent elimination" | "language lessons";
+			type Relationship = "restrictive" | "just friends" | "permissive";
+			type Lactation = "none" | "induce" | "maintain";
+			type Punishment = "confinement" | "whipping" | "chastity" | "situational";
+			type Reward = "relaxation" | "drugs" | "orgasm" | "situational" | "confinement";
 		}
 
 		type Assignment =
@@ -73,7 +73,6 @@ declare global {
 			'choose her own job' |
 			// Pseudo-jobs
 			'@Lurcher' | '@Pit' | "@Arena" | '@be imported' | '@lay in tank';
-
 		interface AssignmentFreeze extends Record<string, Assignment> {
 			// Penthouse Assignments
 			REST: 'rest';
@@ -131,7 +130,6 @@ declare global {
 
 		type Fetish = WithNone<"mindbroken" | "submissive" | "cumslut" | "humiliation" | "buttslut" | "boobs" | "sadist" |
 			"masochist" | "dom" | "pregnancy" | "bestiality">;
-
 		interface FetishFreeze extends Record<string, Fetish> {
 			NONE: "none";
 			MINDBROKEN: "mindbroken";
@@ -159,6 +157,18 @@ declare global {
 			| "devout" // resistance through religious faith
 			| "liberated" // believes slavery is wrong
 		>;
+		interface BehavioralFlawFreeze extends Record<string, BehavioralFlaw> {
+			NONE: "none";
+			ARROGANT: "arrogant";
+			BITCHY: "bitchy";
+			ODD: "odd";
+			HATESMEN: "hates men";
+			HATESWOMEN: "hates women";
+			GLUTTONOUS: "gluttonous";
+			ANOREXIC: "anorexic";
+			DEVOUT: "devout";
+			LIBERATED: "liberated";
+		}
 
 		type BehavioralQuirk = WithNone<
 			/** believes she has value as a slave */
@@ -179,6 +189,18 @@ declare global {
 			| "sinful"
 			/** advocates slavery */
 			| "advocate">;
+		interface BehavioralQuirkFreeze extends Record<string, BehavioralQuirk> {
+			NONE: "none";
+			CONFIDENT: "confident";
+			CUTTING: "cutting";
+			FUNNY: "funny";
+			FITNESS: "fitness";
+			ADORESWOMEN: "adores women";
+			ADORESMEN: "adores men";
+			INSECURE: "insecure";
+			SINFUL: "sinful";
+			ADVOCATE: "advocate";
+		}
 
 		type SexualFlaw = WithNone<
 			/** hates oral sex */
@@ -219,6 +241,28 @@ declare global {
 			| "breeder"
 			/** addicted to fucking animals */
 			| "animal lover">;
+		interface SexualFlawFreeze extends Record<string, SexualFlaw> {
+			NONE: "none";
+			HATESORAL: "hates oral";
+			HATESANAL: "hates anal";
+			HATESPEN: "hates penetration";
+			SHAMEFAST: "shamefast";
+			IDEAL: "idealistic";
+			REPRESSED: "repressed";
+			APATHETIC: "apathetic";
+			CRUDE: "crude";
+			JUDGEMENT: "judgemental";
+			NEGLECT: "neglectful";
+			CUMADDICT: "cum addict";
+			ANALADDICT: "anal addict";
+			ATTENTION: "attention whore";
+			BREASTEXP: "breast growth";
+			ABUSIVE: "abusive";
+			MALICIOUS: "malicious";
+			SELFHATING: "self hating";
+			BREEDER: "breeder";
+			ANIMALLOVER: "animal lover";
+		}
 
 		type SexualQuirk = WithNone<
 			/** can take a facefucking */
@@ -239,8 +283,30 @@ declare global {
 			| "unflinching"
 			/** prefers big cocks */
 			| "size queen">;
+		interface SexualQuirkFreeze extends Record<string, SexualQuirk> {
+			NONE: "none";
+			GAGFUCK: "gagfuck queen";
+			PAINAL: "painal queen";
+			STRUGGLE: "strugglefuck queen";
+			TEASE: "tease";
+			ROMANTIC: "romantic";
+			PERVERT: "perverted";
+			CARING: "caring";
+			UNFLINCHING: "unflinching";
+			SIZEQUEEN: "size queen";
+		}
 
 		type BreastShape = "normal" | "perky" | "saggy" | "torpedo-shaped" | "downward-facing" | "wide-set" | "spherical";
+		interface BreastShapeFreeze extends Record<string, BreastShape> {
+			NORMAL: "normal";
+			PERKY: "perky";
+			SAGGY: "saggy";
+			TORPEDO: "torpedo-shaped";
+			DOWNWARD: "downward-facing";
+			WIDE: "wide-set";
+			SPHERICAL: "spherical";
+		}
+
 		type Clothes = "a ball gown" | "a bimbo outfit" | "a biyelgee costume" | "a bra" | "a bunny outfit" | "a burkini" |
 			"a burqa" | "a button-up shirt" | "a button-up shirt and panties" | "a chattel habit" | "a cheerleader outfit" | "a comfortable bodysuit" |
 			"a courtesan dress" | "a cybersuit" | "a dirndl" | "a fallen nuns habit" | "a Fuckdoll suit" | "a gothic lolita dress" | "a halter top dress" |
@@ -270,9 +336,45 @@ declare global {
 			"double buns" | "chignon" | "french twist" | "crown braid" | "dutch braid" | "double dutch braid" | "pixie cut" | "bob cut";
 		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";
+		interface DietFreeze extends Record<string, Diet> {
+			HEALTHY: "healthy";
+			RESTRICTED: "restricted";
+			CORRECTIVE: "corrective";
+			MUSCLE: "muscle building";
+			FATTEN: "fattening";
+			SLIM: "slimming";
+			FEMALE: "XX";
+			MALE: "XY";
+			FUTA: "XXY";
+			CUM: "cum production";
+			CLEANSE: "cleansing";
+			FERTILITY: "fertility";
+			CALORIC: "high caloric";
+		}
+
 		type PCDiet = Diet | "exotic" | "medicinal" | "weaning";
+		interface PCDietFreeze extends Record<string, PCDiet> {
+			HEALTHY: "healthy";
+			RESTRICTED: "restricted";
+			CORRECTIVE: "corrective";
+			MUSCLE: "muscle building";
+			FATTEN: "fattening";
+			SLIM: "slimming";
+			FEMALE: "XX";
+			MALE: "XY";
+			FUTA: "XXY";
+			CUM: "cum production";
+			CLEANSE: "cleansing";
+			FERTILITY: "fertility";
+			CALORIC: "high caloric";
+			EXOTIC: "exotic";
+			MEDICINAL: "medicinal";
+			WEANING: "weaning";
+		}
+
 		type Drug = "no drugs" |
 			"breast injections" | "butt injections" | "lip injections" | "nipple enhancers" | "penis enhancement" | "testicle enhancement" |
 			"intensive breast injections" | "intensive butt injections" | "intensive penis enhancement" | "intensive testicle enhancement" |
@@ -283,6 +385,46 @@ declare global {
 			"anti-aging cream" | "appetite suppressors" | "hormone enhancers" | "hormone blockers" |
 			"penis atrophiers" | "testicle atrophiers" | "clitoris atrophiers" | "labia atrophiers" | "nipple atrophiers" | "lip atrophiers" |
 			"breast redistributors" | "butt redistributors" | "sag-B-gone" | "growth stimulants" | "stimulants";
+		interface DrugFreeze extends Record<string, Drug> {
+			NONE: "no drugs";
+			GROWBREAST: "breast injections";
+			GROWBUTT: "butt injections";
+			GROWLIP: "lip injections";
+			GROWNIPPLE: "nipple enhancers";
+			GROWPENIS: "penis enhancement";
+			GROWTESTICLE: "testicle enhancement";
+			INTENSIVEBREAST: "intensive breast injections";
+			INTENSIVEBUTT: "intensive butt injections";
+			INTENSIVEPENIS: "intensive penis enhancement";
+			INTENSIVETESTICLE: "intensive testicle enhancement";
+			FERTILITY: "fertility drugs";
+			SUPERFERTILITY: "super fertility drugs";
+			PSYCHOSUPP: "psychosuppressants";
+			PSYCHOSTIM: "psychostimulants";
+			STEROID: "steroids";
+			HYPERBREAST: "hyper breast injections";
+			HYPERBUTT: "hyper butt injections";
+			HYPERPENIS: "hyper penis enhancement";
+			HYPERTESTICLE: "hyper testicle enhancement";
+			HORMONEFEMALE: "female hormone injections";
+			HORMONEMALE: "male hormone injections";
+			PRIAPISM: "priapism agents";
+			ANTIAGE: "anti-aging cream";
+			APPETITESUPP: "appetite suppressors";
+			HORMONEENHANCE: "hormone enhancers";
+			HORMONEBLOCK: "hormone blockers";
+			ATROPHYPENIS: "penis atrophiers";
+			ATROPHYTESTICLE: "testicle atrophiers";
+			ATROPHYCLIT: "clitoris atrophiers";
+			ATROPHYLABIA: "labia atrophiers";
+			ATROPHYNIPPLE: "nipple atrophiers";
+			ATROPHYLIP: "lip atrophiers";
+			REDISTBREAST: "breast redistributors";
+			REDISTBUTT: "butt redistributors";
+			SAGBGONE: "sag-B-gone";
+			GROWTHSTIM: "growth stimulants";
+			STIM: "stimulants";
+		}
 
 		type EarWear = WithNone<"hearing aids" | "muffling ear plugs" | "deafening ear plugs">;
 		type EarShape = WithNone<"damaged" | "normal" | "pointy" | "elven" | "cow" | "robot" | "orcish" | "sheep" | "deer" | "gazelle" | "bird" | "dragon">;
@@ -291,7 +433,17 @@ declare global {
 			"slanted inwards" | "slanted outwards" | "straight";
 		type EyebrowThickness = "pencil-thin" | "thin" | "threaded" | "natural" | "tapered" | "thick" | "bushy";
 		type EyeWear = WithNone<"glasses" | "blurring glasses" | "corrective glasses" | "blurring contacts" | "corrective contacts">;
+
 		type FaceShape = "masculine" | "androgynous" | "normal" | "cute" | "sensual" | "exotic";
+		interface FaceShapeFreeze extends Record<string, FaceShape> {
+			MASC: "masculine";
+			ANDRO: "androgynous";
+			NORMAL: "normal";
+			CUTE: "cute";
+			SENSUAL: "sensual";
+			EXOTIC: "exotic";
+		}
+
 		type GenderGenes =
 			/** female */
 			"XX"
@@ -304,19 +456,74 @@ declare global {
 			/** XYY syndrome male */
 			| "XYY"
 			| "X0"
-			| "X";
+			| "X"
+			| "YY";
+		interface GenderGenesFreeze extends Record<string, GenderGenes> {
+			FEMALE: "XX";
+			MALE: "XY";
+			INVIABLE: "YY";
+		}
+
 		type GestationDrug = "slow gestation" | "speed up" | "labor suppressors";
+		interface GestationDrugFreeze extends Record<string, GestationDrug> {
+			SLOW: "slow gestation";
+			FAST: "speed up";
+			LABOR: "labor suppressors";
+		}
+
 		type HornType = WithNone<"curved succubus horns" | "backswept horns" | "cow horns" | "one long oni horn" |
 			"two long oni horns" | "small horns">;
+
 		type InflationLiquid = WithNone<"water" | "cum" | "milk" | "food" | "aphrodisiac" | "curative" | "tightener" | "urine" | "stimulant">;
+		interface InflationLiquidFreeze extends Record<string, InflationLiquid> {
+			NONE: "none";
+			WATER: "water";
+			CUM: "cum";
+			MILK: "milk";
+			FOOD: "food";
+			APHRO: "aphrodisiac";
+			CURATIVE: "curative";
+			TIGHTEN: "tightener";
+			URINE: "urine";
+			STIM: "stimulant";
+		}
+
 		type TailType = WithNone<"mod" | "combat" | "sex"| "stinger">;
 		type AppendagesType = WithNone<"mod" | "flight" | "sex" | "falcon" | "arachnid" | "kraken">;
 		type Markings = WithNone<"beauty mark" | "birthmark" | "freckles" | "heavily freckled">;
 		type TailShape = WithNone<"cat" | "leopard" | "tiger" | "jaguar" | "lion" | "dog" | "wolf" | "jackal" | "fox" | "kitsune" | "tanuki" | "raccoon" | "rabbit" | "squirrel" | "horse" | "bird" | "phoenix" | "peacock" | "raven" | "swan" | "sheep" | "cow" | "gazelle" | "deer" | "succubus" | "dragon" >;
 		type WingsShape = WithNone<"angel" | "seraph" | "demon"| "dragon" | "phoenix" | "bird"| "fairy" | "butterfly" | "moth" | "insect" | "evil" >;
+		
 		type ToyHole = "all her holes" | "mouth" | "boobs" | "pussy" | "ass" | "dick";
+		interface ToyHoleFreeze extends Record<string, ToyHole> {
+			ALL: "all her holes";
+			MOUTH: "mouth";
+			BOOBS: "boobs";
+			PUSSY: "pussy";
+			ASS: "ass";
+			DICK: "dick";
+		}
+
 		type OvaryImplantType = 0 | "fertility" | "sympathy" | "asexual";
+		interface OvaryImplantTypeFreeze extends Record<string, OvaryImplantType> {
+			NONE: 0;
+			FERTILITY: "fertility";
+			SYMPATHY: "sympathy";
+			ASEXUAL: "asexual";
+		}
+
 		type NippleShape = "huge" | "puffy" | "inverted" | "tiny" | "cute" | "partially inverted" | "fuckable" | "flat";
+		interface NippleShapeFreeze extends Record<string, NippleShape> {
+			HUGE: "huge";
+			PUFFY: "puffy";
+			INVERTED: "inverted";
+			TINY: "tiny";
+			CUTE: "cute";
+			PARTIAL: "partially inverted";
+			FUCKABLE: "fuckable";
+			FLAT: "flat";
+		}
+
 		type LactationType = 0 | 1 | 2;
 		type VaginaLubeType = 0 | 1 | 2;
 		type WombImplantType = WithNone<"restraint">;
@@ -335,6 +542,14 @@ declare global {
 			"pacific islander" | "catgirl" | "semitic" | "southern european" | "white";
 
 		type SizingImplantType = "normal" | "string" | "fillable" | "advanced fillable" | "hyper fillable";
+		interface SizingImplantTypeFreeze extends Record<string, SizingImplantType> {
+			NORMAL: "normal";
+			STRING: "string";
+			FILLABLE: "fillable";
+			ADVANCED: "advanced fillable";
+			HYPER: "hyper fillable";
+		}
+
 		type LipsImplantType = "normal";
 		type InstalledSizingImplantType = WithNone<SizingImplantType>;
 		type InstalledLipsImplantType = WithNone<LipsImplantType>;
@@ -351,6 +566,28 @@ declare global {
 
 		type SmartPiercingSetting = WithNone<"off" | "all" | "no default setting" | "random" | "women" | "men" | "vanilla" | "oral" | "anal" |
 			"boobs" | "submissive" | "humiliation" | "pregnancy" | "dom" | "masochist" | "sadist" | "anti-women" | "anti-men">;
+		interface SmartPiercingSettingFreeze extends Record<string, SmartPiercingSetting> {
+			NONE: "none";
+			OFF: "off";
+			ALL: "all";
+			NODEFAULT: "no default setting";
+			RANDOM: "random";
+			WOMEN: "women";
+			MEN: "men";
+			VANILLA: "vanilla";
+			ORAL: "oral";
+			ANAL: "anal";
+			BOOBS: "boobs";
+			SUBMISSIVE: "submissive";
+			HUMILIATION: "humiliation";
+			PREGNANCY: "pregnancy";
+			DOM: "dom";
+			MASOCHIST: "masochist";
+			SADIST: "sadist";
+			ANTIWOMEN: "anti-women";
+			ANTIMEN: "anti-men";
+		}
+
 		type TeethType = "normal" | "crooked" | "gapped" | "straightening braces" | "cosmetic braces" | "removable" | "pointy" |
 			"fangs" | "fang" | "baby" | "mixed";
 		type MinorInjury = Zeroable<"black eye" | "bad bruise" | "split lip" | "sore ass">;
@@ -373,7 +610,6 @@ declare global {
 			| 4
 			/** relationshipTarget 's slave wife */
 			| 5;
-
 		type RivalryType =
 			/** None */
 			0
@@ -383,7 +619,6 @@ declare global {
 			| 2
 			/** bitterly hates rivalryTarget */
 			| 3;
-
 		type IndentureType =
 			/** complete protection */
 			2
diff --git a/js/003-data/constants.js b/js/003-data/constants.js
index 0e0e29c0b54564406b7505b007bf520875d8fb8c..6e4eadf01bf777265ff95017de4bcb8558bc8b47 100644
--- a/js/003-data/constants.js
+++ b/js/003-data/constants.js
@@ -127,6 +127,315 @@ globalThis.Fetish = Object.freeze({
 	BESTIALITY: "bestiality",
 });
 
+/**
+ * @type {FC.BehavioralFlawFreeze}
+ * @enum {string}
+ */
+globalThis.BehavioralFlaw = Object.freeze({
+	NONE: "none",
+	ARROGANT: "arrogant",
+	BITCHY: "bitchy",
+	ODD: "odd",
+	HATESMEN: "hates men",
+	HATESWOMEN: "hates women",
+	GLUTTONOUS: "gluttonous",
+	ANOREXIC: "anorexic",
+	DEVOUT: "devout",
+	LIBERATED: "liberated",
+});
+
+/**
+ * @type {FC.BehavioralQuirkFreeze}
+ * @enum {string}
+ */
+globalThis.BehavioralQuirk = Object.freeze({
+	NONE: "none",
+	CONFIDENT: "confident",
+	CUTTING: "cutting",
+	FUNNY: "funny",
+	FITNESS: "fitness",
+	ADORESWOMEN: "adores women",
+	ADORESMEN: "adores men",
+	INSECURE: "insecure",
+	SINFUL: "sinful",
+	ADVOCATE: "advocate",
+});
+
+/**
+ * @type {FC.SexualFlawFreeze}
+ * @enum {string}
+ */
+globalThis.SexualFlaw = Object.freeze({
+	NONE: "none",
+	HATESORAL: "hates oral",
+	HATESANAL: "hates anal",
+	HATESPEN: "hates penetration",
+	SHAMEFAST: "shamefast",
+	IDEAL: "idealistic",
+	REPRESSED: "repressed",
+	APATHETIC: "apathetic",
+	CRUDE: "crude",
+	JUDGEMENT: "judgemental",
+	NEGLECT: "neglectful",
+	CUMADDICT: "cum addict",
+	ANALADDICT: "anal addict",
+	ATTENTION: "attention whore",
+	BREASTEXP: "breast growth",
+	ABUSIVE: "abusive",
+	MALICIOUS: "malicious",
+	SELFHATING: "self hating",
+	BREEDER: "breeder",
+	ANIMALLOVER: "animal lover",
+});
+
+/**
+ * @type {FC.SexualQuirkFreeze}
+ * @enum {string}
+ */
+globalThis.SexualQuirk = Object.freeze({
+	NONE: "none",
+	GAGFUCK: "gagfuck queen",
+	PAINAL: "painal queen",
+	STRUGGLE: "strugglefuck queen",
+	TEASE: "tease",
+	ROMANTIC: "romantic",
+	PERVERT: "perverted",
+	CARING: "caring",
+	UNFLINCHING: "unflinching",
+	SIZEQUEEN: "size queen",
+});
+
+/**
+ * @type {FC.BreastShapeFreeze}
+ * @enum {string}
+ */
+globalThis.BreastShape = Object.freeze({
+	NORMAL: "normal",
+	PERKY: "perky",
+	SAGGY: "saggy",
+	TORPEDO: "torpedo-shaped",
+	DOWNWARD: "downward-facing",
+	WIDE: "wide-set",
+	SPHERICAL: "spherical",
+});
+
+/**
+ * @type {FC.DietFreeze}
+ * @enum {string}
+ */
+globalThis.Diet = Object.freeze({
+	HEALTHY: "healthy",
+	RESTRICTED: "restricted",
+	CORRECTIVE: "corrective",
+	MUSCLE: "muscle building",
+	FATTEN: "fattening",
+	SLIM: "slimming",
+	FEMALE: "XX",
+	MALE: "XY",
+	FUTA: "XXY",
+	CUM: "cum production",
+	CLEANSE: "cleansing",
+	FERTILITY: "fertility",
+	CALORIC: "high caloric",
+});
+
+/**
+ * @type {FC.PCDietFreeze}
+ * @enum {string}
+ */
+globalThis.PCDiet = Object.freeze({
+	HEALTHY: "healthy",
+	RESTRICTED: "restricted",
+	CORRECTIVE: "corrective",
+	MUSCLE: "muscle building",
+	FATTEN: "fattening",
+	SLIM: "slimming",
+	FEMALE: "XX",
+	MALE: "XY",
+	FUTA: "XXY",
+	CUM: "cum production",
+	CLEANSE: "cleansing",
+	FERTILITY: "fertility",
+	CALORIC: "high caloric",
+	EXOTIC: "exotic",
+	MEDICINAL: "medicinal",
+	WEANING: "weaning",
+});
+
+// TODO
+
+/**
+ * @type {FC.DrugFreeze}
+ * @enum {string}
+ */
+globalThis.Drug = Object.freeze({
+	NONE: "no drugs",
+	GROWBREAST: "breast injections",
+	GROWBUTT: "butt injections",
+	GROWLIP: "lip injections",
+	GROWNIPPLE: "nipple enhancers",
+	GROWPENIS: "penis enhancement",
+	GROWTESTICLE: "testicle enhancement",
+	INTENSIVEBREAST: "intensive breast injections",
+	INTENSIVEBUTT: "intensive butt injections",
+	INTENSIVEPENIS: "intensive penis enhancement",
+	INTENSIVETESTICLE: "intensive testicle enhancement",
+	FERTILITY: "fertility drugs",
+	SUPERFERTILITY: "super fertility drugs",
+	PSYCHOSUPP: "psychosuppressants",
+	PSYCHOSTIM: "psychostimulants",
+	STEROID: "steroids",
+	HYPERBREAST: "hyper breast injections",
+	HYPERBUTT: "hyper butt injections",
+	HYPERPENIS: "hyper penis enhancement",
+	HYPERTESTICLE: "hyper testicle enhancement",
+	HORMONEFEMALE: "female hormone injections",
+	HORMONEMALE: "male hormone injections",
+	PRIAPISM: "priapism agents",
+	ANTIAGE: "anti-aging cream",
+	APPETITESUPP: "appetite suppressors",
+	HORMONEENHANCE: "hormone enhancers",
+	HORMONEBLOCK: "hormone blockers",
+	ATROPHYPENIS: "penis atrophiers",
+	ATROPHYTESTICLE: "testicle atrophiers",
+	ATROPHYCLIT: "clitoris atrophiers",
+	ATROPHYLABIA: "labia atrophiers",
+	ATROPHYNIPPLE: "nipple atrophiers",
+	ATROPHYLIP: "lip atrophiers",
+	REDISTBREAST: "breast redistributors",
+	REDISTBUTT: "butt redistributors",
+	SAGBGONE: "sag-B-gone",
+	GROWTHSTIM: "growth stimulants",
+	STIM: "stimulants",
+});
+
+/**
+ * @type {FC.FaceShapeFreeze}
+ * @enum {string}
+ */
+globalThis.FaceShape = Object.freeze({
+	MASC: "masculine",
+	ANDRO: "androgynous",
+	NORMAL: "normal",
+	CUTE: "cute",
+	SENSUAL: "sensual",
+	EXOTIC: "exotic",
+});
+
+/**
+ * @type {FC.GenderGenesFreeze}
+ * @enum {string}
+ */
+globalThis.GenderGenes = Object.freeze({
+	FEMALE: "XX",
+	MALE: "XY",
+	INVIABLE: "YY",
+});
+
+/**
+ * @type {FC.GestationDrugFreeze}
+ * @enum {string}
+ */
+globalThis.GestationDrug = Object.freeze({
+	SLOW: "slow gestation",
+	FAST: "speed up",
+	LABOR: "labor suppressors",
+});
+
+/**
+ * @type {FC.InflationLiquidFreeze}
+ * @enum {string}
+ */
+globalThis.InflationLiquid = Object.freeze({
+	NONE: "none",
+	WATER: "water",
+	CUM: "cum",
+	MILK: "milk",
+	FOOD: "food",
+	APHRO: "aphrodisiac",
+	CURATIVE: "curative",
+	TIGHTEN: "tightener",
+	URINE: "urine",
+	STIM: "stimulant",
+});
+
+/**
+ * @type {FC.ToyHoleFreeze}
+ * @enum {string}
+ */
+globalThis.ToyHole = Object.freeze({
+	ALL: "all her holes",
+	MOUTH: "mouth",
+	BOOBS: "boobs",
+	PUSSY: "pussy",
+	ASS: "ass",
+	DICK: "dick",
+});
+
+/**
+ * @type {FC.OvaryImplantTypeFreeze}
+ * @enum {string}
+ */
+globalThis.OvaryImplantType = Object.freeze({
+	NONE: 0,
+	FERTILITY: "fertility",
+	SYMPATHY: "sympathy",
+	ASEXUAL: "asexual",
+});
+
+/**
+ * @type {FC.NippleShapeFreeze}
+ * @enum {string}
+ */
+globalThis.NippleShape = Object.freeze({
+	HUGE: "huge",
+	PUFFY: "puffy",
+	INVERTED: "inverted",
+	TINY: "tiny",
+	CUTE: "cute",
+	PARTIAL: "partially inverted",
+	FUCKABLE: "fuckable",
+	FLAT: "flat",
+});
+
+/**
+ * @type {FC.SizingImplantTypeFreeze}
+ * @enum {string}
+ */
+globalThis.SizingImplantType = Object.freeze({
+	NORMAL: "normal",
+	STRING: "string",
+	FILLABLE: "fillable",
+	ADVANCED: "advanced fillable",
+	HYPER: "hyper fillable",
+});
+
+/**
+ * @type {FC.SmartPiercingSettingFreeze}
+ * @enum {string}
+ */
+globalThis.SmartPiercingSetting = Object.freeze({
+	NONE: "none",
+	OFF: "off",
+	ALL: "all",
+	NODEFAULT: "no default setting",
+	RANDOM: "random",
+	WOMEN: "women",
+	MEN: "men",
+	VANILLA: "vanilla",
+	ORAL: "oral",
+	ANAL: "anal",
+	BOOBS: "boobs",
+	SUBMISSIVE: "submissive",
+	HUMILIATION: "humiliation",
+	PREGNANCY: "pregnancy",
+	DOM: "dom",
+	MASOCHIST: "masochist",
+	SADIST: "sadist",
+	ANTIWOMEN: "anti-women",
+	ANTIMEN: "anti-men",
+});
+
 /**
  * @type {Readonly<{MASTERED_XP: number}>}
  */
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 8ca0cc3e28c2e4912738ec26266dfd772871eba4..6e5cb79600e70d47a8b0f59d78cb8bf7eadb2571 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -181,6 +181,7 @@ App.Data.defaultGameStateVariables = {
 	aiSamplingMethod: "DPM++ 2M SDE Karras",
 	aiSamplingSteps: 20,
 	aiStyle: 1,
+	aiRestoreFaces: true,
 	aiUpscale: true,
 	aiUpscaleScale: 1.7,
 	aiUpscaler: "SwinIR_4x",
diff --git a/js/medicine/surgery/addGenitals/addOvaries.js b/js/medicine/surgery/addGenitals/addOvaries.js
index 21bd232e743d4f716cda270e80f190ba592392c8..c76d1eae8bc9a3c6f2717950cda1b3a76259550e 100644
--- a/js/medicine/surgery/addGenitals/addOvaries.js
+++ b/js/medicine/surgery/addGenitals/addOvaries.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.AddOvaries = class extends App.Medicine.Surgery.S
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY) || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="trust inc">total faith</span> in your plans for ${his} body and <span class="devotion inc">adores you</span> for giving ${him} a gift ${he} once thought impossible. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			reaction.trust += 10;
 			reaction.devotion += 10;
@@ -36,7 +36,7 @@ App.Medicine.Surgery.Reactions.AddAnimalOvaries = class extends App.Medicine.Sur
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance of carrying an animal baby to term. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY) || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="trust inc">total faith</span> in your plans for ${his} body and <span class="devotion inc">adores you</span> for giving ${him} a gift ${he} once thought impossible. ${He} doesn't realize exactly what the surgery entailed, however — the happiness ${he} felt at first will most likely be replaced with horror once ${he} realizes the babies in ${his} womb are not human. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			reaction.trust += 10;
 			reaction.devotion += 10;
diff --git a/js/medicine/surgery/addGenitals/addProstate.js b/js/medicine/surgery/addGenitals/addProstate.js
index 431b4f1800b9d3f668e2e1ccc24458477337b83d..529ec0fccc18ab5dc23309491c4affc73058126e 100644
--- a/js/medicine/surgery/addGenitals/addProstate.js
+++ b/js/medicine/surgery/addGenitals/addProstate.js
@@ -21,7 +21,7 @@ App.Medicine.Surgery.Reactions.AddProstate = class extends App.Medicine.Surgery.
 					r.push(`squirting female`);
 				}
 				r.push(`ejaculation, since ${his} new organ is of course hooked into ${his} urethra and does its duty whenever ${he} climaxes${(slave.balls === 0) ? ` despite ${his} lack of testicles to add actual semen to ${his} copious emissions` : ``}.`);
-				if (slave.fetishKnown === 1 && slave.fetish === "buttslut") {
+				if (slave.fetishKnown === 1 && slave.fetish === 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="fetish inc">a more eager buttslut than ever.</span>`);
 					reaction.devotion += 5;
 					slave.fetishStrength = Math.clamp(slave.fetishStrength + 20, 0, 100);
@@ -33,7 +33,7 @@ App.Medicine.Surgery.Reactions.AddProstate = class extends App.Medicine.Surgery.
 						r.push(`is of course familiar with`);
 					}
 					r.push(`the pleasure of prostate stimulation,`);
-					if (slave.genes === "XY") {
+					if (slave.genes === GenderGenes.MALE) {
 						r.push(`not to mention having once had one ${himself},`);
 					}
 					r.push(`and ${he}'s <span class="devotion inc">duly grateful</span> that you've altered ${him} in a way that will make sexual duties more enjoyable.`);
diff --git a/js/medicine/surgery/addGenitals/asexualReproOvaries.js b/js/medicine/surgery/addGenitals/asexualReproOvaries.js
index 8822dd22f24cc51bb30f2a0f9b1cbc26fec4b054..5aa1ae8c86b5ffeffd7aceb75916916cf817d06f 100644
--- a/js/medicine/surgery/addGenitals/asexualReproOvaries.js
+++ b/js/medicine/surgery/addGenitals/asexualReproOvaries.js
@@ -67,7 +67,7 @@ App.Medicine.Surgery.Procedures.OFAsexualReproOvaries = class extends App.Medici
 				this._slave.pubertyXX = 1;
 			}
 		}
-		this._slave.ovaImplant = "asexual";
+		this._slave.ovaImplant = OvaryImplantType.ASEXUAL;
 		return this._assemble(new App.Medicine.Surgery.Reactions.AsexualReproOvaries());
 	}
 };
diff --git a/js/medicine/surgery/addGenitals/freshOvaries.js b/js/medicine/surgery/addGenitals/freshOvaries.js
index efe53de4c9fa9d63b7c0b4bff6a67e9781dc59b9..e7cc9916a7dc3256549d4a66c2b910ffd7d8e05f 100644
--- a/js/medicine/surgery/addGenitals/freshOvaries.js
+++ b/js/medicine/surgery/addGenitals/freshOvaries.js
@@ -5,7 +5,7 @@ App.Medicine.Surgery.Reactions.FreshOvaries = class extends App.Medicine.Surgery
 		const r = [];
 
 		if (slave.ovaryAge >= 45 && this._hasEmotion(slave)) {
-			if (this._strongKnownFetish(slave, "pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
+			if (this._strongKnownFetish(slave, Fetish.PREGNANCY) || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
 				r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant once more. ${He} is <span class="devotion inc">filled with joy</span> whenever ${he} thinks about the fact that ${he}'ll have the chance to feel a life growing within ${him} again. ${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 += 5;
diff --git a/js/medicine/surgery/addGenitals/immortalOvaries.js b/js/medicine/surgery/addGenitals/immortalOvaries.js
index aa0d887bb54c728cda37201f05e77054f9fe9649..8ded0916df6d80383cda5ae286ff08e0659120a8 100644
--- a/js/medicine/surgery/addGenitals/immortalOvaries.js
+++ b/js/medicine/surgery/addGenitals/immortalOvaries.js
@@ -5,7 +5,7 @@ App.Medicine.Surgery.Reactions.ImmortalOvaries = class extends App.Medicine.Surg
 		const r = [];
 
 		if (slave.ovaryAge >= 45 && this._hasEmotion(slave)) { // use same reactions as freshOvaries - slave doesn't know the difference
-			if (this._strongKnownFetish(slave, "pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
+			if (this._strongKnownFetish(slave, Fetish.PREGNANCY) || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
 				r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant once more. ${He} is <span class="devotion inc">filled with joy</span> whenever ${he} thinks about the fact that ${he}'ll have the chance to feel a life growing within ${him} again. ${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 += 5;
diff --git a/js/medicine/surgery/addGenitals/mpreg.js b/js/medicine/surgery/addGenitals/mpreg.js
index e21ed5e80ad0f5ca453d6df15f77aee4718e4296..e5121696c250c7d6a14ea9652126d15f6e83d368 100644
--- a/js/medicine/surgery/addGenitals/mpreg.js
+++ b/js/medicine/surgery/addGenitals/mpreg.js
@@ -7,7 +7,7 @@ App.Medicine.Surgery.Reactions.AddMPreg = class extends App.Medicine.Surgery.Sim
 		r.push(`${He} leaves the surgery with a certain fullness in ${his} lower abdomen, ${he} knows that, despite lacking female reproductive organs, ${he} can now become pregnant.`);
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY)) {
 			r.push(`${He} is <span class="devotion inc"> filled with joy</span> about the possibility of becoming pregnant and gleefully rubs ${his} softer 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;
diff --git a/js/medicine/surgery/assets/boobs.js b/js/medicine/surgery/assets/boobs.js
index 6dfa0e16b0add087329e4a1c53bcce6626fc642b..6501e40926bf2eb6cdf354791133280a4df02f6d 100644
--- a/js/medicine/surgery/assets/boobs.js
+++ b/js/medicine/surgery/assets/boobs.js
@@ -8,24 +8,24 @@ App.Medicine.Surgery.Reactions.BoobsGain = class extends App.Medicine.Surgery.Si
 		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") {
+		if (diff.nipples === NippleShape.CUTE && slave.nipples === NippleShape.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") {
+		} else if (diff.nipples === NippleShape.PUFFY && slave.nipples === NippleShape.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")) {
+		} else if (diff.nipples === NippleShape.FLAT && (slave.nipples === NippleShape.CUTE || slave.nipples === NippleShape.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") {
+		if (slave.boobShape !== BreastShape.SPHERICAL) {
+			if (diff.boobShape === BreastShape.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") {
+			} else if (diff.boobShape === BreastShape.NORMAL && slave.boobShape !== BreastShape.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 === 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")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 			if (hasAnyArms(slave)) {
 				r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`);
 			} else {
@@ -87,14 +87,14 @@ App.Medicine.Surgery.Reactions.BoobsLoss = class extends App.Medicine.Surgery.Si
 		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") {
+		if (slave.nipples === NippleShape.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) {
+		} else if (slave.nipples === NippleShape.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") {
+		} else if (slave.nipples === NippleShape.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") {
+		if (slave.boobShape === BreastShape.SPHERICAL) {
 			r.push(`With the removal of ${his} load bearing implants, <span class="orange">${his} breasts are left deflated and sagging.</span>`);
 		}
 
@@ -154,22 +154,22 @@ App.Medicine.Surgery.Procedures.boobImplantsProcedure = function() {
 		if (slave.areolae < 2 && Math.random() > 0.7) {
 			slave.areolae += 1;
 		}
-		if (slave.nipples === "puffy") {
+		if (slave.nipples === NippleShape.PUFFY) {
 			if (Math.random() > 0.7) {
-				slave.nipples = "cute";
+				slave.nipples = NippleShape.CUTE;
 			}
-		} else if (slave.nipples === "huge") {
+		} else if (slave.nipples === NippleShape.HUGE) {
 			if (Math.random() > 0.9) {
-				slave.nipples = "puffy";
+				slave.nipples = NippleShape.PUFFY;
 			}
-		} else if ((slave.nipples === "cute" || slave.nipples === "tiny") && (slave.boobsImplant / slave.boobs >= 0.75)) {
-			slave.nipples = "flat";
+		} else if ((slave.nipples === NippleShape.CUTE || slave.nipples === NippleShape.TINY) && (slave.boobsImplant / slave.boobs >= 0.75)) {
+			slave.nipples = NippleShape.FLAT;
 		}
-		if (slave.boobShape !== "spherical") {
+		if (slave.boobShape !== BreastShape.SPHERICAL) {
 			if (slave.boobsImplant / slave.boobs >= 0.90) {
-				slave.boobShape = "spherical";
-			} else if (slave.boobShape !== "normal" && Math.random() > 0.5) {
-				slave.boobShape = "normal";
+				slave.boobShape = BreastShape.SPHERICAL;
+			} else if (slave.boobShape !== BreastShape.NORMAL && Math.random() > 0.5) {
+				slave.boobShape = BreastShape.NORMAL;
 			}
 		}
 	};
@@ -181,15 +181,15 @@ App.Medicine.Surgery.Procedures.boobImplantsProcedure = function() {
 		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.nipples === NippleShape.HUGE) {
+			slave.nipples = NippleShape.PUFFY;
+		} else if (slave.nipples === NippleShape.FUCKABLE && slave.boobs < 500) {
+			slave.nipples = NippleShape.HUGE;
+		} else if (slave.nipples === NippleShape.FLAT) {
+			slave.nipples = NippleShape.HUGE;
 		}
-		if (slave.boobShape === "spherical") {
-			slave.boobShape = "saggy";
+		if (slave.boobShape === BreastShape.SPHERICAL) {
+			slave.boobShape = BreastShape.SAGGY;
 		}
 	};
 
diff --git a/js/medicine/surgery/assets/breastLift.js b/js/medicine/surgery/assets/breastLift.js
index ad01b89da8d8f80fdde5ed70501016571bca970c..3e1f452ab3861acac080a0119a73ad1beaa31597 100644
--- a/js/medicine/surgery/assets/breastLift.js
+++ b/js/medicine/surgery/assets/breastLift.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.BreastLift = class extends App.Medicine.Surgery.S
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 			if (hasAnyArms(slave)) {
 				r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new, perkier breasts despite the pain.`);
 			} else {
@@ -76,7 +76,7 @@ App.Medicine.Surgery.Procedures.BreastLift = class extends App.Medicine.Surgery.
 	}
 
 	apply(cheat) {
-		this._slave.boobShape = "normal";
+		this._slave.boobShape = BreastShape.NORMAL;
 		return this._assemble(new App.Medicine.Surgery.Reactions.BreastLift());
 	}
 };
diff --git a/js/medicine/surgery/assets/breastReconstruction.js b/js/medicine/surgery/assets/breastReconstruction.js
index fb4462a50ec304f4376a3858a46d14f27adc8de2..f02f0be213362d3042ad6d75bfc48e811f9d64a1 100644
--- a/js/medicine/surgery/assets/breastReconstruction.js
+++ b/js/medicine/surgery/assets/breastReconstruction.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.BreastReconstruction = class extends App.Medicine
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 			if (hasAnyArms(slave)) {
 				r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new, ${slave.boobShape} breasts despite the pain.`);
 			} else {
@@ -77,11 +77,11 @@ App.Medicine.Surgery.Procedures.BreastReconstruction = class extends App.Medicin
 
 	get name() {
 		switch (this._boobShape) {
-			case "torpedo-shaped":
+			case BreastShape.TORPEDO:
 				return "Make them torpedo-shaped";
-			case "perky":
+			case BreastShape.PERKY:
 				return "Reshape them to be perkier";
-			case "normal":
+			case BreastShape.NORMAL:
 				return "Reshape them to be more normal";
 		}
 		return "Invalid boobShape: " + this._boobShape;
diff --git a/js/medicine/surgery/assets/breastShapePreservation.js b/js/medicine/surgery/assets/breastShapePreservation.js
index e8f2ba66e049f0cd8a95683658bc4202e35a0a5f..94bdb46806ad2ba41aaa03d79be6beb01d9b08ed 100644
--- a/js/medicine/surgery/assets/breastShapePreservation.js
+++ b/js/medicine/surgery/assets/breastShapePreservation.js
@@ -26,11 +26,11 @@ App.Medicine.Surgery.Reactions.BreastShapePreservationFailure = class extends Ap
 			if (slave.areolae > 2) {
 				r.push(`The emergency mastectomy also <span class="change negative">slightly reduces ${his} massive areolae.</span>`);
 			}
-			if (slave.nipples === "huge") {
+			if (slave.nipples === NippleShape.HUGE) {
 				r.push(`The emergency mastectomy also <span class="change negative">slightly reduces ${his} massive nipples.</span>`);
-			} else if (slave.nipples === "fuckable") {
+			} else if (slave.nipples === NippleShape.FUCKABLE) {
 				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>`);
-			} else if (slave.nipples === "flat") {
+			} else if (slave.nipples === NippleShape.FLAT) {
 				r.push(`Without the ${his} massive implants forcing them flat, ${his} nipples have reverted <span class="change positive">to being huge and protruding.</span>`);
 			}
 		}
@@ -62,7 +62,7 @@ App.Medicine.Surgery.Reactions.BreastShapePreservationFailure = class extends Ap
 			areolaeAndNipples();
 			if (slave.fetish === Fetish.MINDBROKEN) {
 				r.push(`As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-			} else if (slave.sexualFlaw === "breast growth") {
+			} else if (slave.sexualFlaw === SexualFlaw.BREASTEXP) {
 				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 {
@@ -72,7 +72,7 @@ App.Medicine.Surgery.Reactions.BreastShapePreservationFailure = class extends Ap
 				r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="mindbreak">Your apparent 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(`It broke ${his} mind.`);
-			} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
+			} else if (this._strongKnownFetish(slave, Fetish.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 {
@@ -127,7 +127,7 @@ App.Medicine.Surgery.Reactions.BreastShapePreservationFailure = class extends Ap
 			areolaeAndNipples();
 			if (slave.fetish === Fetish.MINDBROKEN) {
 				r.push(`As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`);
-			} else if (slave.sexualFlaw === "breast growth") {
+			} else if (slave.sexualFlaw === SexualFlaw.BREASTEXP) {
 				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 {
@@ -137,7 +137,7 @@ App.Medicine.Surgery.Reactions.BreastShapePreservationFailure = class extends Ap
 				r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="mindbreak">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(`It broke ${his} mind.`);
-			} else if (this._strongKnownFetish(slave, "boobs") && slave.devotion <= 20) {
+			} else if (this._strongKnownFetish(slave, Fetish.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 {
@@ -225,12 +225,12 @@ App.Medicine.Surgery.Procedures.BreastShapePreservation = class extends App.Medi
 			if (this._slave.areolae > 2) {
 				this._slave.areolae -= 1;
 			}
-			if (this._slave.nipples === "huge") {
-				this._slave.nipples = "puffy";
-			} else if (this._slave.nipples === "fuckable") {
-				this._slave.nipples = "huge";
-			} else if (this._slave.nipples === "flat") {
-				this._slave.nipples = "huge";
+			if (this._slave.nipples === NippleShape.HUGE) {
+				this._slave.nipples = NippleShape.PUFFY;
+			} else if (this._slave.nipples === NippleShape.FUCKABLE) {
+				this._slave.nipples = NippleShape.HUGE;
+			} else if (this._slave.nipples === NippleShape.FLAT) {
+				this._slave.nipples = NippleShape.HUGE;
 			}
 			return this._assemble(new App.Medicine.Surgery.Reactions.BreastShapePreservationFailure());
 		} else {
diff --git a/js/medicine/surgery/assets/butt.js b/js/medicine/surgery/assets/butt.js
index 4fe495f21a486329c6f3a092a5ad8fee1b79bdbc..719ad3c0c91fe6371001e0dac829547450a9e375 100644
--- a/js/medicine/surgery/assets/butt.js
+++ b/js/medicine/surgery/assets/butt.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.ButtGain = class extends App.Medicine.Surgery.Sim
 
 		if (slave.fetish === 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")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.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;
diff --git a/js/medicine/surgery/assets/fatGraft.js b/js/medicine/surgery/assets/fatGraft.js
index 0686c587788e5cc00b42265dbcd01d7f462e7bb7..3518597a655d0c025fc82866c97c8487a7d9cfa9 100644
--- a/js/medicine/surgery/assets/fatGraft.js
+++ b/js/medicine/surgery/assets/fatGraft.js
@@ -16,7 +16,7 @@ App.Medicine.Surgery.Reactions.FatGraft = class extends App.Medicine.Surgery.Sim
 
 		if (slave.fetish === 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>`);
-		} else if (slave.behavioralFlaw === "anorexic") {
+		} else if (slave.behavioralFlaw === BehavioralFlaw.ANOREXIC) {
 			if (canSee(slave)) {
 				r.push(`${He} looks over ${his} new thin figure experimentally`);
 			} else {
@@ -30,7 +30,7 @@ App.Medicine.Surgery.Reactions.FatGraft = class extends App.Medicine.Surgery.Sim
 						slave.areolae += 1;
 					}
 				}
-				if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+				if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 					if (hasAnyArms(slave)) {
 						r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`);
 					} else {
@@ -49,7 +49,7 @@ App.Medicine.Surgery.Reactions.FatGraft = class extends App.Medicine.Surgery.Sim
 				}
 			}
 			if (this.buttFat > 0) {
-				if (slave.devotion > 20 && this._strongKnownFetish(slave, "buttslut")) {
+				if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.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.`);
 					reaction.trust += 4;
 					reaction.devotion += 4;
@@ -73,7 +73,7 @@ App.Medicine.Surgery.Reactions.FatGraft = class extends App.Medicine.Surgery.Sim
 						slave.areolae += 1;
 					}
 				}
-				if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+				if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 					if (hasAnyArms(slave)) {
 						r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`);
 					} else {
@@ -91,7 +91,7 @@ App.Medicine.Surgery.Reactions.FatGraft = class extends App.Medicine.Surgery.Sim
 				}
 			}
 			if (this.buttFat > 0) {
-				if (slave.devotion > 20 && this._strongKnownFetish(slave, "buttslut")) {
+				if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.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.`);
 					reaction.trust += 4;
 					reaction.devotion += 4;
diff --git a/js/medicine/surgery/assets/mastectomy.js b/js/medicine/surgery/assets/mastectomy.js
index e0579208b06e6fd99214490d63271fe1b576c2e4..d68255a23fa1b432ca1d728a17bbf9d476432997 100644
--- a/js/medicine/surgery/assets/mastectomy.js
+++ b/js/medicine/surgery/assets/mastectomy.js
@@ -4,17 +4,17 @@ App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.S
 		const {his} = getPronouns(slave);
 		const r = [];
 
-		if (slave.boobShape === "saggy") {
+		if (slave.boobShape === 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>`);
 		}
 		if (slave.areolae > 2) {
 			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive areolae.</span>`);
 		}
-		if (slave.nipples === "huge") {
+		if (slave.nipples === NippleShape.HUGE) {
 			r.push(`The breast reduction surgery also <span class="orange">slightly reduces ${his} massive nipples.</span>`);
-		} else if (slave.nipples === "flat") {
+		} else if (slave.nipples === NippleShape.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") {
+		} else if (slave.nipples === NippleShape.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>`);
 		}
 
@@ -38,7 +38,7 @@ App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.S
 
 		if (slave.fetish === 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") {
+		} else if (slave.sexualFlaw === SexualFlaw.BREASTEXP) {
 			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 {
@@ -64,7 +64,7 @@ App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.S
 			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) {
+		} else if (this._strongKnownFetish(slave, Fetish.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 {
@@ -130,7 +130,7 @@ App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.S
 
 		if (slave.fetish === 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") {
+		} else if (slave.sexualFlaw === SexualFlaw.BREASTEXP) {
 			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 {
@@ -156,7 +156,7 @@ App.Medicine.Surgery.Reactions.Mastectomy = class extends App.Medicine.Surgery.S
 			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) {
+		} else if (this._strongKnownFetish(slave, Fetish.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 {
@@ -227,18 +227,18 @@ App.Medicine.Surgery.Procedures.Mastectomy = class extends App.Medicine.Surgery.
 	get changeValue() { return 300 - this._slave.boobs; }
 
 	apply(cheat) {
-		if (this._slave.boobShape === "saggy") {
-			this._slave.boobShape = "perky";
+		if (this._slave.boobShape === BreastShape.SAGGY) {
+			this._slave.boobShape = BreastShape.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";
+		if (this._slave.nipples === NippleShape.HUGE) {
+			this._slave.nipples = NippleShape.PUFFY;
+		} else if (this._slave.nipples === NippleShape.FLAT) {
+			this._slave.nipples = NippleShape.HUGE;
+		} else if (this._slave.nipples === NippleShape.FUCKABLE) {
+			this._slave.nipples = NippleShape.HUGE;
 		}
 		this._slave.boobs = 300;
 
diff --git a/js/medicine/surgery/face/face.js b/js/medicine/surgery/face/face.js
index b55a4a465e45db3396ec7c8215a45e929ab43941..9d03fda5cdb20103071d59396a7e0f51e0e86c31 100644
--- a/js/medicine/surgery/face/face.js
+++ b/js/medicine/surgery/face/face.js
@@ -53,9 +53,9 @@ App.Medicine.Surgery.Procedures.FaceShape = class extends App.Medicine.Surgery.P
 	}
 
 	get name() {
-		if (this.targetShape === "androgynous" && this._slave.faceShape === "masculine") {
+		if (this.targetShape === FaceShape.ANDRO && this._slave.faceShape === FaceShape.MASC) {
 			return `Soften to androgynous`;
-		} else if (this.targetShape === "normal") {
+		} else if (this.targetShape === FaceShape.NORMAL) {
 			return `Make conventionally feminine`;
 		} else {
 			return capFirstChar(this.targetShape);
diff --git a/js/medicine/surgery/face/lips.js b/js/medicine/surgery/face/lips.js
index 2cb29c85885a1c623572e542bd283017754079d5..68d48bed65fb5f78a0adb73e1c3e7a2d6581bf7d 100644
--- a/js/medicine/surgery/face/lips.js
+++ b/js/medicine/surgery/face/lips.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Lips = class extends App.Medicine.Surgery.SimpleR
 
 		if (slave.fetish === 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")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.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="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;
diff --git a/js/medicine/surgery/genitals/anus.js b/js/medicine/surgery/genitals/anus.js
index ab7745dfe088ae63d8927f8f76eacfc0b33b247b..d7f13d0fa7a44a2b90a5dfda41b1f605893ad096 100644
--- a/js/medicine/surgery/genitals/anus.js
+++ b/js/medicine/surgery/genitals/anus.js
@@ -7,7 +7,7 @@ App.Medicine.Surgery.Reactions.Anus = class extends App.Medicine.Surgery.SimpleR
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			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")) {
+			if (this._strongKnownFetish(slave, Fetish.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="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;
diff --git a/js/medicine/surgery/genitals/chop.js b/js/medicine/surgery/genitals/chop.js
index bed9a07093a4f0b0b46aaed51b19ef82bcf85097..faf50683fd1a9030673554227ec6009af8cdfda0 100644
--- a/js/medicine/surgery/genitals/chop.js
+++ b/js/medicine/surgery/genitals/chop.js
@@ -8,14 +8,14 @@ App.Medicine.Surgery.Reactions.Chop = class extends App.Medicine.Surgery.SimpleR
 			r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though.`);
 		} else if (slave.vagina === -1) {
 			r.push(`Of course, ${he} already realized while exiting that something very dear to ${him} has been taken away.`);
-			if (slave.devotion > 50 && slave.sexualFlaw === "self hating") {
+			if (slave.devotion > 50 && slave.sexualFlaw === SexualFlaw.SELFHATING) {
 				r.push(`Strong emotions play out on ${his} face as ${he} experiences a watershed in ${his} life of sexual slavery, perhaps the most radical one ${he}'ll ever experience. ${He} loves you with all ${his} being, and truly hates ${himself}. ${He} finds ${himself} in an emotional place where ${he}'s willing to accept having had you cut ${his} dick off. ${He} knows ${he}'s a worthless piece of trash, and realizes that if you feel like trimming useless bits off ${him}, that's your prerogative. In moments, ${he}'s confirmed in <span class="devotion inc">total, final, fanatical submission to your will.</span> It's almost frightening.`);
 				reaction.devotion += 50;
-			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === "buttslut") {
+			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === Fetish.BUTTSLUT) {
 				r.push(`${He}'s such a complete buttslut, though, that ${he} finds ${he} doesn't really care. ${He} never really paid much attention to ${his} own dick; for ${him}, sex is about the phalli that get rammed up ${his} ass. And you didn't take that from ${him}. If anything, ${he}'s <span class="trust inc">reassured</span> by the implicit promise that ${he}'ll never be anything but a butthole slut, and of course is forced even further into <span class="devotion inc">submission to your will.</span>`);
 				reaction.devotion += 8;
 				reaction.trust += 8;
-			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === "cumslut") {
+			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === Fetish.CUMSLUT) {
 				r.push(`${He}'s such an oral slut, though, that ${he} finds ${he} doesn't really care. ${He} never really paid much attention to ${his} dick; for ${him}, sex is about what ${he} gets to suck. As far as ${he}'s concerned, you've simply confirmed that ${his} most important hole is the one in ${his} face. If anything, ${he}'s <span class="trust inc">reassured</span> by the implicit promise that ${he}'ll never be anything more than a nice inviting facepussy, and of course, ${he}'s forced even further into <span class="devotion inc">submission to your will.</span>`);
 				reaction.devotion += 8;
 				reaction.trust += 8;
diff --git a/js/medicine/surgery/genitals/fertility.js b/js/medicine/surgery/genitals/fertility.js
index 6be9bebc6aa49ce1da1225048c8a61fbafc941be..e421107cee4fd815bde80f5bd4b755643592632e 100644
--- a/js/medicine/surgery/genitals/fertility.js
+++ b/js/medicine/surgery/genitals/fertility.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Fertility = class extends App.Medicine.Surgery.Si
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY) || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant. ${He} is <span class="devotion inc">filled with joy</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${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 += 5;
diff --git a/js/medicine/surgery/genitals/geld.js b/js/medicine/surgery/genitals/geld.js
index 8b63437ce536398055b3cfd4a21c0a2722ecf1b8..eb1c9bbee8ade80478e9a866e3a184fcbe58c328 100644
--- a/js/medicine/surgery/genitals/geld.js
+++ b/js/medicine/surgery/genitals/geld.js
@@ -47,10 +47,10 @@ App.Medicine.Surgery.Procedures.Geld = class extends App.Medicine.Surgery.Proced
 		this._slave.ballType = "human";
 		this._slave.scrotum = 0;
 		this._slave.vasectomy = 0;
-		if (this._slave.drugs === "testicle enhancement" ||
-			this._slave.drugs === "hyper testicle enhancement" ||
-			this._slave.drugs === "testicle atrophiers") {
-			this._slave.drugs = "no drugs";
+		if (this._slave.drugs === Drug.GROWTESTICLE ||
+			this._slave.drugs === Drug.HYPERTESTICLE ||
+			this._slave.drugs === Drug.ATROPHYTESTICLE) {
+			this._slave.drugs = Drug.NONE;
 		}
 		return this._assemble(new App.Medicine.Surgery.Reactions.Geld());
 	}
diff --git a/js/medicine/surgery/genitals/insemination.js b/js/medicine/surgery/genitals/insemination.js
index 311eeb6691b63017ce3fd0fdfd3bc021749a60a3..a021662315b9c768f26e68bbb5b1b7a2e25ed90c 100644
--- a/js/medicine/surgery/genitals/insemination.js
+++ b/js/medicine/surgery/genitals/insemination.js
@@ -22,7 +22,7 @@ App.Medicine.Surgery.Reactions.Insemination = class extends App.Medicine.Surgery
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} leaves the surgery with a certain warmth in ${his} lower abdomen, ${he} knows that ${he} has been impregnated.`);
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY)) {
 			if (canSee(slave)) {
 				r.push(`Since the surgery required only a local anesthetic, ${he} remained fully aware throughout the procedure. From the selection of the sperm, to its introduction to ${his} waiting ${(slave.pregType > 1) ? `eggs` : `egg`}, ${he} was eagerly watching.`);
 			} else {
diff --git a/js/medicine/surgery/genitals/maleToFemale.js b/js/medicine/surgery/genitals/maleToFemale.js
index 3bf4129aabba6d328b43c4fc550b4014155111c6..84dbf6366fb469896b6eb13a390a96ff72ec6f93 100644
--- a/js/medicine/surgery/genitals/maleToFemale.js
+++ b/js/medicine/surgery/genitals/maleToFemale.js
@@ -58,10 +58,10 @@ App.Medicine.Surgery.Procedures.MaletoFemale = class extends App.Medicine.Surger
 		this._slave.vasectomy = 0;
 		this._slave.vagina = 0;
 		this._slave.preg = -2;
-		if (this._slave.drugs === "testicle enhancement" ||
-			this._slave.drugs === "hyper testicle enhancement" ||
-			this._slave.drugs === "testicle atrophiers") {
-			this._slave.drugs = "no drugs";
+		if (this._slave.drugs === Drug.GROWTESTICLE ||
+			this._slave.drugs === Drug.HYPERTESTICLE ||
+			this._slave.drugs === Drug.ATROPHYTESTICLE) {
+			this._slave.drugs = Drug.NONE;
 		}
 		return this._assemble(new App.Medicine.Surgery.Reactions.MaletoFemale());
 	}
diff --git a/js/medicine/surgery/genitals/mpregRemoved.js b/js/medicine/surgery/genitals/mpregRemoved.js
index 19ae2650acbae8215e221a28d6b7154652e06b6d..319dbf22562f114b3d037fb755240856538df8ce 100644
--- a/js/medicine/surgery/genitals/mpregRemoved.js
+++ b/js/medicine/surgery/genitals/mpregRemoved.js
@@ -22,7 +22,7 @@ App.Medicine.Surgery.Procedures.RemoveMPreg = class extends App.Medicine.Surgery
 
 	apply(cheat) {
 		this._slave.mpreg = 0;
-		this._slave.ovaImplant = 0;
+		this._slave.ovaImplant = OvaryImplantType.NONE;
 		this._slave.wombImplant = "none";
 		return this._assemble(new App.Medicine.Surgery.Reactions.MPregRemoved());
 	}
diff --git a/js/medicine/surgery/genitals/noneToFemale.js b/js/medicine/surgery/genitals/noneToFemale.js
index 1ab3bd9e144d95abcc8660bdbc65b0d91cfecaa2..5d1373eaace60c79abd4ba218768d2bc8a8a2a71 100644
--- a/js/medicine/surgery/genitals/noneToFemale.js
+++ b/js/medicine/surgery/genitals/noneToFemale.js
@@ -8,7 +8,7 @@ App.Medicine.Surgery.Reactions.NoneToFemale = class extends App.Medicine.Surgery
 			r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`);
 		} else if (slave.devotion > 50) {
 			r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. ${He} can only be happy that ${he}`);
-			if (slave.genes === "XX") {
+			if (slave.genes === GenderGenes.FEMALE) {
 				r.push(`once again has a vagina and now has a means of release again.`);
 			} else {
 				r.push(`now has a hole other than ${his} anus to pleasure ${himself} with.`);
@@ -17,7 +17,7 @@ App.Medicine.Surgery.Reactions.NoneToFemale = class extends App.Medicine.Surgery
 			reaction.devotion += 4;
 		} else if (slave.devotion > 20) {
 			r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. ${He} didn't expect`);
-			if (slave.genes === "XX") {
+			if (slave.genes === GenderGenes.FEMALE) {
 				r.push(`to ever have a pussy again,`);
 			} else {
 				r.push(`to be given a hole other than ${his} anus,`);
@@ -33,7 +33,7 @@ App.Medicine.Surgery.Reactions.NoneToFemale = class extends App.Medicine.Surgery
 			reaction.devotion -= 5;
 		} else {
 			r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. ${He} didn't expect`);
-			if (slave.genes === "XX") {
+			if (slave.genes === GenderGenes.FEMALE) {
 				r.push(`to ever have a pussy again,`);
 			} else {
 				r.push(`to be given a hole other than ${his} anus,`);
diff --git a/js/medicine/surgery/genitals/ovaImplantChanged.js b/js/medicine/surgery/genitals/ovaImplantChanged.js
index 68ce685b0e7538639b9638e542cd98d1d6f800ce..553f1eb26033106c23a105c48c2dcfa6342741a7 100644
--- a/js/medicine/surgery/genitals/ovaImplantChanged.js
+++ b/js/medicine/surgery/genitals/ovaImplantChanged.js
@@ -32,7 +32,7 @@ App.Medicine.Surgery.Procedures.RemoveOvaImplant = class extends App.Medicine.Su
 	}
 
 	apply(cheat) {
-		this._slave.ovaImplant = 0;
+		this._slave.ovaImplant = OvaryImplantType.NONE;
 		return this._assemble(new App.Medicine.Surgery.Reactions.OvaImplantChanged());
 	}
 };
@@ -49,9 +49,9 @@ App.Medicine.Surgery.Procedures.InstallOvaImplant = class extends App.Medicine.S
 
 	get name() {
 		switch (this.type) {
-			case "fertility":
+			case OvaryImplantType.FERTILITY:
 				return "Install fertility implants";
-			case "sympathy":
+			case OvaryImplantType.SYMPATHY:
 				return "Install sympathetic ovulation implants";
 			default:
 				throw new Error("Invalid OvaryImplantType: " + this.type);
diff --git a/js/medicine/surgery/genitals/preg.js b/js/medicine/surgery/genitals/preg.js
index efbb4f4eac0dce200235df06cc80f044dd5e78ba..a1c108538d277a12247a8affe8a9699ed2f6718b 100644
--- a/js/medicine/surgery/genitals/preg.js
+++ b/js/medicine/surgery/genitals/preg.js
@@ -7,7 +7,7 @@ App.Medicine.Surgery.Reactions.Preg = class extends App.Medicine.Surgery.SimpleR
 		r.push(`${He} leaves the surgery with a certain warmth in ${his} lower abdomen, ${he} knows that ${he} has been impregnated.`);
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY)) {
 			r.push(`${He} is <span class="devotion inc"> filled with joy</span> about being swollen with life and gleefully rubs ${his} soon to be huge 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;
diff --git a/js/medicine/surgery/genitals/preg1hack.js b/js/medicine/surgery/genitals/preg1hack.js
index aa51225f92cbbae5b9f054b543e15c172c404b52..49df5476329d91d874c3400bb8c77cdb6d39fab7 100644
--- a/js/medicine/surgery/genitals/preg1hack.js
+++ b/js/medicine/surgery/genitals/preg1hack.js
@@ -11,7 +11,7 @@ App.Medicine.Surgery.Reactions.Preg1Hack = class extends App.Medicine.Surgery.Si
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			/* nothing*/
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.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="health dec">${his} health has been slightly affected.</span>`);
 			reaction.trust += 4;
 			reaction.devotion += 10;
diff --git a/js/medicine/surgery/genitals/pregRemove.js b/js/medicine/surgery/genitals/pregRemove.js
index 54ed79a884cc99137b9f94fd3858fc0551e770cf..8ed5c2e3f4579aab49ceddeb90ea69f8bdb7b8a8 100644
--- a/js/medicine/surgery/genitals/pregRemove.js
+++ b/js/medicine/surgery/genitals/pregRemove.js
@@ -7,7 +7,7 @@ App.Medicine.Surgery.Reactions.PregRemove = class extends App.Medicine.Surgery.S
 		r.push(`${He} leaves the surgery with a certain soreness and minor pain in ${his} lower abdomen, ${he} knows that ${his} days as broodmother are finished.`);
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY)) {
 			r.push(`${He} is <span class="trust dec">filled with despair</span> about missing being swollen with life and rubs ${his} flat belly with <span class="devotion dec">sorrow.</span> Only one fact slightly soothes ${him} and allows ${him} to remain sane — at least ${he} will not become infertile and still can get pregnant naturally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 			reaction.trust -= 10;
 			reaction.devotion -= 30;
diff --git a/js/medicine/surgery/genitals/prostate.js b/js/medicine/surgery/genitals/prostate.js
index 0e3a308733e53e30aa5a70ab81201f6ea72c9911..3bb4e140c5c457aa7b9703d62bb971dad5ee8613 100644
--- a/js/medicine/surgery/genitals/prostate.js
+++ b/js/medicine/surgery/genitals/prostate.js
@@ -9,7 +9,7 @@ App.Medicine.Surgery.Reactions.Prostate = class extends App.Medicine.Surgery.Sim
 			if (slave.devotion > 50) {
 				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")) {
+				} else if (this._strongKnownFetish(slave, Fetish.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="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 {
@@ -20,7 +20,7 @@ App.Medicine.Surgery.Reactions.Prostate = class extends App.Medicine.Surgery.Sim
 				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}. Not knowing what you did, <span class="trust dec">${he}'s afraid,</span> realizing that you can toy with ${his} internal makeup at a whim.`);
 					reaction.trust -= 5;
-				} else if (this._strongKnownFetish(slave, "buttslut")) {
+				} else if (this._strongKnownFetish(slave, Fetish.BUTTSLUT)) {
 					r.push(`${He} realizes that ${his} prostate's gone the first time ${he} takes it up the butt, though. The buttslut is crushed, and <span class="devotion dec">infuriated,</span> because in effect you've taken ${his} favorite pastime away from ${him}. For now, ${he} defiantly does ${his} best to keep orgasming to anal, but it remains to be seen whether ${he} can maintain ${his} enthusiasm.`);
 					reaction.devotion -= 10;
 				} else {
diff --git a/js/medicine/surgery/genitals/sterilize.js b/js/medicine/surgery/genitals/sterilize.js
index 1c7f4984b2ecb401f249d7bdbac4624c1a2c4c23..8e822bd5c0951e39eae615acdd52a3798be827a6 100644
--- a/js/medicine/surgery/genitals/sterilize.js
+++ b/js/medicine/surgery/genitals/sterilize.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Sterilize = class extends App.Medicine.Surgery.Si
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to know that ${he}'ll never have a child now. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (this._strongKnownFetish(slave, "pregnancy")) {
+		} else if (this._strongKnownFetish(slave, Fetish.PREGNANCY)) {
 			r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have a child. ${He} is <span class="devotion dec">filled with grief</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, finally and forever, beyond ${him}. 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 -= 20;
@@ -56,7 +56,7 @@ App.Medicine.Surgery.Procedures.Oophorectomy = class extends App.Medicine.Surger
 
 	apply(cheat) {
 		this._slave.ovaries = 0;
-		this._slave.ovaImplant = 0;
+		this._slave.ovaImplant = OvaryImplantType.NONE;
 		this._slave.wombImplant = "none";
 		return this._assemble(new App.Medicine.Surgery.Reactions.Sterilize());
 	}
diff --git a/js/medicine/surgery/genitals/vaginalRemoval.js b/js/medicine/surgery/genitals/vaginalRemoval.js
index 81305924440556a97aefd3f15b3d90f0baf37b11..1fab2e1833e8beb55068fd0a97acff8280c14c84 100644
--- a/js/medicine/surgery/genitals/vaginalRemoval.js
+++ b/js/medicine/surgery/genitals/vaginalRemoval.js
@@ -8,14 +8,14 @@ App.Medicine.Surgery.Reactions.VaginaRemoval = class extends App.Medicine.Surger
 			r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though.`);
 		} else if (slave.dick === 0) {
 			r.push(`Of course, ${he} already realized while exiting that something very dear to ${him} has been taken away.`);
-			if (slave.devotion > 50 && slave.sexualFlaw === "self hating") {
+			if (slave.devotion > 50 && slave.sexualFlaw === SexualFlaw.SELFHATING) {
 				r.push(`Strong emotions play out on ${his} face as ${he} experiences a watershed in ${his} life of sexual slavery, perhaps the most radical one ${he}'ll ever experience. ${He} loves you with all ${his} being, and truly hates ${himself}. ${He} finds ${himself} in an emotional place where ${he}'s willing to accept having ${his} womanhood torn out. ${He} knows ${he}'s a worthless piece of trash, and realizes that if you feel like removing the parts of ${his} body that can feel sexual pleasure, that's your prerogative. In moments, ${he}'s confirmed in <span class="devotion inc">total, final, fanatical submission to your will.</span> It's almost frightening.`);
 				reaction.devotion += 50;
-			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === "buttslut") {
+			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === Fetish.BUTTSLUT) {
 				r.push(`${He}'s such a complete buttslut, though, that ${he} finds ${he} doesn't really care. ${He} never really paid much attention to ${his} front hole; it got wet when ${he} got buttfucked, but that was mostly useful to provide a little lube for phalli that fucked it before switching to ${his} ass. If anything, ${he}'s <span class="trust inc">reassured</span> by the implication that ${his} asshole is all that matters about ${him}, and of course is forced even further into <span class="devotion inc">submission to your will.</span>`);
 				reaction.devotion += 8;
 				reaction.trust += 8;
-			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === "cumslut") {
+			} else if (slave.devotion > 20 && slave.fetishKnown === 1 && slave.fetishStrength > 95 && slave.fetish === Fetish.CUMSLUT) {
 				r.push(`${He}'s such an oral slut, though, that ${he} finds ${he} doesn't really care. ${He} viewed ${his} pussy as a nice place for stimulation while ${he} licked, blew, and sucked; if ${he} has to learn to get off from throat stimulation ${he} will. As far as ${he}'s concerned, you've simply confirmed that ${his} most important hole is the one in ${his} face. If anything, ${he}'s <span class="trust inc">reassured</span> by the implication that ${his} real pussy has always been the one in the middle of ${his} face, and of course, ${he}'s forced even further into <span class="devotion inc">submission to your will.</span>`);
 				reaction.devotion += 8;
 				reaction.trust += 8;
diff --git a/js/medicine/surgery/hair/hairRemoval.js b/js/medicine/surgery/hair/hairRemoval.js
index 316ba4e633871d0a5601a4048d3900a2936073b9..b6bfecdfc774b0154c9d0c582ea743258607a695 100644
--- a/js/medicine/surgery/hair/hairRemoval.js
+++ b/js/medicine/surgery/hair/hairRemoval.js
@@ -19,7 +19,7 @@ App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.
 			reaction.longReaction.push(r);
 			r = [];
 			if (slave.devotion > 50) {
-				if (slave.fetish === "humiliation" && slave.fetishStrength > 50) {
+				if (slave.fetish === Fetish.HUMILIATION && slave.fetishStrength > 50) {
 					r.push(`${He} is <span class="devotion inc">turned on</span> by how humiliating this is for ${him} and <span class="trust inc">can't wait</span> for the next time you decide to show ${him} off.`);
 					reaction.trust += 5;
 					reaction.devotion += 5;
@@ -27,7 +27,7 @@ App.Medicine.Surgery.Reactions.HairRemoval = class extends App.Medicine.Surgery.
 					r.push(`${He} is very devoted to you so ${his} new condition doesn't affect ${him} as much as it would other slaves.`);
 				}
 			} else if (slave.devotion >= -20) {
-				if (slave.fetish === "humiliation" && slave.fetishStrength > 50) {
+				if (slave.fetish === Fetish.HUMILIATION && slave.fetishStrength > 50) {
 					r.push(`${He} is both <span class="devotion inc">turned on</span> and <span class="trust dec">horrified</span> by this humiliation.`);
 					reaction.trust -= 5;
 					reaction.devotion += 5;
diff --git a/js/medicine/surgery/liposuction/liposuction.js b/js/medicine/surgery/liposuction/liposuction.js
index dfc70daa6e90ea916e65e130968226917f4f8941..b99928e2edb263c7d37a8c3adb54094614fbedc5 100644
--- a/js/medicine/surgery/liposuction/liposuction.js
+++ b/js/medicine/surgery/liposuction/liposuction.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Liposuction = class extends App.Medicine.Surgery.
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} notices that ${he} is quite lighter than ${he} used to be. As with all surgeries, <span class="health dec">${his} health has been affected.</span>`);
-		} else if (slave.behavioralFlaw === "anorexic") {
+		} else if (slave.behavioralFlaw === BehavioralFlaw.ANOREXIC) {
 			if (canSee(slave)) {
 				r.push(`${He} looks over ${his} new thin figure experimentally`);
 			} else {
diff --git a/js/medicine/surgery/liposuction/ribs.js b/js/medicine/surgery/liposuction/ribs.js
index 15b69717fd221b50854fb3e0bd2eb8b0e36661e6..e4c5c519fab88a5287f4c7fdc84380358ca3471e 100644
--- a/js/medicine/surgery/liposuction/ribs.js
+++ b/js/medicine/surgery/liposuction/ribs.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Ribs = class extends App.Medicine.Surgery.SimpleR
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause is ${his} new extremely narrow waist. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`);
-		} else if (slave.behavioralFlaw === "anorexic") {
+		} else if (slave.behavioralFlaw === BehavioralFlaw.ANOREXIC) {
 			r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, and when ${he}`);
 			if (canSee(slave)) {
 				r.push(`looks at you, you see awe in ${his} eyes.`);
diff --git a/js/medicine/surgery/liposuction/waist.js b/js/medicine/surgery/liposuction/waist.js
index 84c4202e6c7ace2b0995910750602f5bd5f52fd4..2d1cd59fc6d06e9fbadfadd96f4b0ebb9734c294 100644
--- a/js/medicine/surgery/liposuction/waist.js
+++ b/js/medicine/surgery/liposuction/waist.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Waist = class extends App.Medicine.Surgery.Simple
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`While ${he} notices how sore ${his} waist is, ${he} fails to find the reason why. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`);
-		} else if (slave.behavioralFlaw === "anorexic") {
+		} else if (slave.behavioralFlaw === BehavioralFlaw.ANOREXIC) {
 			if (canSee(slave)) {
 				r.push(`${He} looks over ${his} new waist experimentally`);
 			} else {
diff --git a/js/medicine/surgery/nipples/areolae.js b/js/medicine/surgery/nipples/areolae.js
index 966fd7303a0c70507b4f35c900481b04c3add60f..ff0d3d8f734be0f9591f4b9d3df0e10dc6b738ba 100644
--- a/js/medicine/surgery/nipples/areolae.js
+++ b/js/medicine/surgery/nipples/areolae.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.Areolae = class extends App.Medicine.Surgery.Simp
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} shows little reaction to ${his} altered nipples. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 			if (hasAnyArms(slave)) {
 				r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new nipples despite the pain.`);
 			} else {
@@ -69,7 +69,7 @@ App.Medicine.Surgery.Procedures.RestoreNipples = class extends App.Medicine.Surg
 	}
 
 	apply(cheat) {
-		this._slave.nipples = "huge";
+		this._slave.nipples = NippleShape.HUGE;
 		return this._assemble(new App.Medicine.Surgery.Reactions.Areolae());
 	}
 };
diff --git a/js/medicine/surgery/nipples/nippleCunts.js b/js/medicine/surgery/nipples/nippleCunts.js
index 53251d3ca906151e56542a47fb4c9ea0030e338a..8220bb88f893429edfeb03dc48a9888cc13e8d51 100644
--- a/js/medicine/surgery/nipples/nippleCunts.js
+++ b/js/medicine/surgery/nipples/nippleCunts.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.NippleCunts = class extends App.Medicine.Surgery.
 
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			r.push(`${He} shows no reaction to ${his} altered nipples. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
-		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, "boobs")) {
+		} else if (slave.devotion > 20 && this._strongKnownFetish(slave, Fetish.BOOBS)) {
 			if (hasAnyArms(slave)) {
 				r.push(`${He}'s barely out of the surgery before ${he}'s experimentally probing ${his} new nipples despite the pain.`);
 			} else {
@@ -74,7 +74,7 @@ App.Medicine.Surgery.Procedures.NippleCunts = class extends App.Medicine.Surgery
 	}
 
 	apply(cheat) {
-		this._slave.nipples = "fuckable";
+		this._slave.nipples = NippleShape.FUCKABLE;
 		this._slave.piercing.nipple.weight = 0;
 		return this._assemble(new App.Medicine.Surgery.Reactions.NippleCunts());
 	}
diff --git a/js/medicine/surgery/structural/amputation.js b/js/medicine/surgery/structural/amputation.js
index efc3f2b4a56183fe70725f0b4cd522fb46b20f6a..cba0ef7fa6820be29696abb7d371c97b1b87b07e 100644
--- a/js/medicine/surgery/structural/amputation.js
+++ b/js/medicine/surgery/structural/amputation.js
@@ -216,7 +216,7 @@ App.Medicine.Surgery.Reactions.Amputate = class extends App.Medicine.Surgery.Sim
 		const reaction = super.outro(slave, diff, previousReaction);
 		const {He, him} = getPronouns(slave);
 
-		if (slave.behavioralFlaw === "arrogant") {
+		if (slave.behavioralFlaw === BehavioralFlaw.ARROGANT) {
 			const r = `<span class="flaw break">${He} can hardly be arrogant relying on others to feed, bathe and carry ${him}.</span>`;
 			if (reaction.longReaction.length > 0) {
 				reaction.longReaction.last()
@@ -224,7 +224,7 @@ App.Medicine.Surgery.Reactions.Amputate = class extends App.Medicine.Surgery.Sim
 			} else {
 				reaction.longReaction.push([r]);
 			}
-			slave.behavioralFlaw = "none";
+			slave.behavioralFlaw = BehavioralFlaw.NONE;
 		}
 
 		return reaction;
diff --git a/js/medicine/surgery/voice/mute.js b/js/medicine/surgery/voice/mute.js
index ba9062fcb60448e6ece070de6e36f46001eee4dc..05496f48682a922114f166a7f7e0df9348bbf3e5 100644
--- a/js/medicine/surgery/voice/mute.js
+++ b/js/medicine/surgery/voice/mute.js
@@ -39,7 +39,7 @@ App.Medicine.Surgery.Reactions.Mute = class extends App.Medicine.Surgery.SimpleR
 		const reaction = super.outro(slave, diff, previousReaction);
 		const {He} = getPronouns(slave);
 
-		if (slave.behavioralFlaw === "bitchy") {
+		if (slave.behavioralFlaw === BehavioralFlaw.BITCHY) {
 			const r = `<span class="green">${He} can hardly make sharp remarks without a voice.</span>`;
 			if (reaction.longReaction.length > 0) {
 				reaction.longReaction.last()
@@ -47,7 +47,7 @@ App.Medicine.Surgery.Reactions.Mute = class extends App.Medicine.Surgery.SimpleR
 			} else {
 				reaction.longReaction.push([r]);
 			}
-			slave.behavioralFlaw = "none";
+			slave.behavioralFlaw = BehavioralFlaw.NONE;
 		}
 
 		return reaction;
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 58a782688c42dc32cc27f25e15b01efbd72deeaa..39138692d1fe73c0d7b0cd6078b070241a3ef5f3 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ 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.27",
 	commitHash: null,
-	release: 1210, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1211, // 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/art/genAI/stableDiffusion.js b/src/art/genAI/stableDiffusion.js
index ad68711605613fe8d2e4dd86dfc5982376ec8e21..21fd3bc4cd8bd514e3ffa825dc27f9b10bd8e6fd 100644
--- a/src/art/genAI/stableDiffusion.js
+++ b/src/art/genAI/stableDiffusion.js
@@ -14,6 +14,7 @@ App.Art.GenAI.StableDiffusionSettings = class {
 	 * @param {number} [cfg_scale=5.5]
 	 * @param {number} [width=512]
 	 * @param {number} [height=768]
+	 * @param {boolean} [restore_faces=true] Whether to use a model to restore faces or not
 	 * @param {string} [negative_prompt=""]
 	 * @param {string[]} [override_settings=["Discard penultimate sigma: True"]]
 	 */
@@ -35,6 +36,7 @@ App.Art.GenAI.StableDiffusionSettings = class {
 		width = 512,
 		height = 768,
 		negative_prompt = "",
+		restore_faces = true,
 		override_settings = {
 			"always_discard_next_to_last_sigma": true,
 		},
@@ -59,6 +61,7 @@ App.Art.GenAI.StableDiffusionSettings = class {
 		this.width = width;
 		this.height = height;
 		this.negative_prompt = negative_prompt;
+		this.restore_faces = restore_faces
 		this.override_strings = override_settings;
 		this.override_settings_restore_afterwards = true;
 	}
@@ -208,6 +211,7 @@ App.Art.GenAI.StableDiffusionClient = class {
 			seed: slave.natural.artSeed,
 			steps: V.aiSamplingSteps,
 			width: V.aiWidth,
+			restore_faces: V.aiRestoreFaces
 		});
 
 		return settings;
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index ff9cde8ae1aadf9ba8543287db785ad65c156662..4b54d8ea9865c014399385bf60cee20854eb4720 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -366,7 +366,7 @@ App.Update.globalVariables = function(node) {
 		if (typeof V.UI.slaveSummary.abbreviation.beauty === "undefined") {
 			V.UI.slaveSummary.abbreviation.beauty = 0;
 		}
-		
+
 		if (typeof V.UI.compressSocialEffects !== "number") {
 			V.UI.compressSocialEffects = 0;
 		}
diff --git a/src/endWeek/economics/neighborsDevelopment.js b/src/endWeek/economics/neighborsDevelopment.js
index fd871452e197d4add8c7c435ff4f37b8f00d774f..11ff98b8bfdcff5cd73c839356e79cb60a121acf 100644
--- a/src/endWeek/economics/neighborsDevelopment.js
+++ b/src/endWeek/economics/neighborsDevelopment.js
@@ -2546,7 +2546,7 @@ App.EndWeek.neighborsDevelopment = function() {
 					}
 
 					for (const candidate of validFSes) {
-						if (arc2[candidate] > random(0, 200) - influenceBonus) {
+						if (arc2[candidate] > Math.max(0, random(0, 200) - influenceBonus)) {
 							// equal weight by default (at normal difficulty, or the arc is neither player nor rival)
 							usableCandidates.push({arc2, candidate});
 							if (arc2.direction === 0) {
diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js
index db0a35117902ee3baa92574b25e2914e516ef2b7..92a8d5323598f6b9376b0ef8a7e658d84f8fe05a 100644
--- a/src/endWeek/economics/reputation.js
+++ b/src/endWeek/economics/reputation.js
@@ -978,9 +978,9 @@ App.EndWeek.reputation = function() {
 	}
 	if (V.rapedThisWeek) {
 		let rapeFameDec = 25 + V.rapedThisWeek * 75;
-		r.push(`There's ${V.PC.degeneracy ? "also " : ""}a rumor you've been raped${V.PC.counter.raped ? " again" : ""}.`);
+		r.push(`There's ${V.PC.degeneracy ? "also " : ""}a <span class="red">rumor you've been raped${V.PC.counter.raped ? " again" : ""}.</span>`);
 		if (V.rep < 3000) {
-			r.push(`Since you are almost unknown, the rumor goes almost unnoticed.`);
+			r.push(`Since you are almost unknown, the rumor goes nearly unnoticed.`);
 			rapeFameDec *= V.rep / 10000;
 		} else if (V.rep < 6000) {
 			r.push(`Since you are not very well known, the rumor goes quite unnoticed.`);
@@ -989,7 +989,10 @@ App.EndWeek.reputation = function() {
 			r.push(`Since you are not well known, the rumor does not have much impact.`);
 			rapeFameDec *= V.rep / 10000;
 		}
-		if (FutureSocieties.isActive("FSAntebellumRevivalist")) {
+		if (V.arcologies[0].FSChattelReligionistLaw === 1) {
+			r.push(`The Prophet has been sullied, and this is a sacrilege.`);
+			rapeFameDec *= 1.2;
+		} else if (FutureSocieties.isActive("FSAntebellumRevivalist")) {
 			if (V.SecExp.edicts.weaponsLaw > 0) {
 				r.push(`Your citizens are relieved that they are allowed to bear arms to defend themselves against possible attacks.`);
 				rapeFameDec *= .8;
@@ -1007,17 +1010,18 @@ App.EndWeek.reputation = function() {
 			r.push(`All things considered, your citizens hope that at least you have become pregnant.`);
 			rapeFameDec *=.9;
 		}
-		if (V.arcologies[0].FSChattelReligionistLaw === 1) {
-			r.push(`The Prophet has been sullied, and this is a sacrilege.`);
-			rapeFameDec *= 1.2;
-		}
-		if (V.arcologyUpgrade.drone !== 1) {
+		if (V.arcologyUpgrade.drones !== 1) {
 			r.push(`The lack of security is scaring people.`);
 			rapeFameDec *= 1.3;
 		}
-		if (V.policies.sexualOpenness === 1 && FutureSocieties.isActive("FSNull")) {
-			r.push(`Since you have shown interest in being penetrated, many people think that it's not a real rape, that you are role-playing with some friend.`);
-			rapeFameDec *= .5;
+		if (V.policies.sexualOpenness === 1) {
+			if (FutureSocieties.isActive("FSNull")) {
+				r.push(`Since you have shown interest in being penetrated, many people think that it's not a real rape, that you've been role-playing with some friend.`);
+				rapeFameDec *= .4;
+			} else {
+				r.push(`Since you have shown interest in being penetrated, many people think that you are asking for it and do not give it much importance.`);
+				rapeFameDec *= .6;
+			}
 		}
 		rapeFameDec = Math.clamp(Math.floor(rapeFameDec), 0, 250);
 		repX(forceNeg(rapeFameDec), "PCactions");
diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index 7239f23cdd27d8662d4db3b52d1011722e995b27..87965621ac592c5a2358b32c16004c2fb2929ee6 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -36,6 +36,9 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 
 	function pregnancyDiscovery() {
 		// Add passive discovery to this once periods are added
+		if (PC.preg === PC.pregData.normalBirth / 8 && PC.pregSource > 0) { 
+			actX(findFather(V.PC.pregSource), "PCKnockedUp");
+		}
 		if (PC.bellyFluid > 2000) {
 			if (PC.inflation > 1) {
 				r.push(`While trying to inflate yourself with ${PC.inflationType}, you discover that you can't hold more <span class="noteworthy">two liters</span> without feeling seriously ill.`);
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 3371877f746fa07add20a97b649706cb0cba3eba..0e869291acb22c75086ddc84f42130fa4aae8462 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -1,7 +1,7 @@
 App.EndWeek.penthouseReport = function() {
 	const el = document.createElement("p");
 
-	const penthouseSlaves = V.slaves.filter(s => assignmentVisible(s) || !App.EndWeek.saVars.slaveCheckedIn.contains(s.ID));
+	const penthouseSlaves = V.slaves.filter(s => assignmentVisible(s) || !App.EndWeek.saVars.slaveCheckedIn.includes(s.ID));
 	const HGSuiteSlaves = App.Utils.jobForAssignment(Job.HEADGIRLSUITE).employees();
 	const hgSlave = HGSuiteSlaves.length > 0 ? App.SlaveAssignment.reportSlave(HGSuiteSlaves[0]) : null;
 	const HGTrainSlavesIDs = slavesToTrain();
@@ -56,7 +56,7 @@ App.EndWeek.penthouseReport = function() {
 	function fullReport(slave) {
 		const el = new DocumentFragment();
 		const {
-			He, His,
+			He, His, his,
 			he, him,
 		} = getPronouns(slave);
 		let r = [];
diff --git a/src/endWeek/saLiveWithHG.js b/src/endWeek/saLiveWithHG.js
index a3c2c04ea03daa1ad8393c789989e1c950e43bf6..a1bdedfdba27455214cffeb06ac3250a0654064d 100644
--- a/src/endWeek/saLiveWithHG.js
+++ b/src/endWeek/saLiveWithHG.js
@@ -1499,13 +1499,13 @@ App.SlaveAssignment.liveWithHG = function saliveWithHG(slave) {
 	 */
 	function slaveReport(slave, el) {
 		if (V.showEWD !== 0 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
-			/* App.SlaveAssignment.choosesOwnClothes(slave) */
-			App.SlaveAssignment.individualSlaveReport(slave);
-			App.SlaveAssignment.devotion(slave);
-		} else {
 			/* App.SlaveAssignment.choosesOwnClothes(slave) */
 			App.Events.addNode(el, App.SlaveAssignment.individualSlaveReport(slave), "div", "indent");
 			App.Events.addNode(el, [App.SlaveAssignment.devotion(slave)], "div", "indent");
+		} else {
+			/* App.SlaveAssignment.choosesOwnClothes(slave) */
+			App.SlaveAssignment.individualSlaveReport(slave);
+			App.SlaveAssignment.devotion(slave);
 		}
 	}
 };
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 4f7ac6dc5b743be0e107c9e88c79119ddb307185..060c058e64ef877b99aec0443009b812a4b0d1d0 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -53,8 +53,26 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 	function pregnancyDiscovery(slave) {
 		if (slave.preg === slave.pregData.normalBirth / 8) { /* BAD design - with speed control drugs and animal pregnancy 5th week can be not integer value, and block will be skipped as it's will be not strict == */
 			// Perhaps a specific value assigned to the pregData? Only human will need to do it.
-			if (slave.pregSource === -1) {
+			if (slave.womb[slave.womb.length - 1].motherID === -1) { // if the PC is the real mother (transferred the ova)
+				if (slave.womb[slave.womb.length - 1].fatherID > 0) {
+					actX(findFather(slave.womb[slave.womb.length - 1].fatherID), "PCKnockedUp");
+				}
+			} else if (slave.womb[slave.womb.length - 1].motherID !== slave.ID) { // if another slave is the real mother (transferred the ova)
+				if (slave.womb[slave.womb.length - 1].fatherID === -1) { // if PC is the father
+					V.PC.counter.slavesKnockedUp++;
+					let realMommy = findFather(slave.womb[slave.womb.length - 1].motherID);
+					if (realMommy) {
+						realMommy.counter.timesBred++;
+					}
+				} else if (slave.womb[slave.womb.length - 1].fatherID > 0) {
+					let babyDaddy = findFather(slave.womb[slave.womb.length - 1].fatherID);
+					if (babyDaddy) {
+						babyDaddy.counter.slavesKnockedUp++;
+					}
+				}
+			} else if (slave.pregSource === -1) {
 				V.PC.counter.slavesKnockedUp++;
+				slave.counter.timesBred++;
 			} else if (slave.pregSource > 0) {
 				let babyDaddy = findFather(slave.pregSource);
 				if (babyDaddy) {
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index c9d09103e0d8ddb973624069cfe97346c18dc2d9..4cffe9946e0e46302e0baf7aa2905193bc2eccaf 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -1846,7 +1846,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 						r.push(`${domName} is better at oral than ${subName} and lets ${him} in on some of ${his2} techniques.`);
 						r.push(slaveSkillIncrease('oral', slave, (Math.floor(oralUse + Math.floor(slave.intelligence + slave.intelligenceImplant) / 32))));
 					} else if (slave.skill.oral < 30) {
-						r.push(slaveSkillIncrease('vaginal', slave, (Math.floor((vaginalUse / 4) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
+						r.push(slaveSkillIncrease('oral', slave, (Math.floor((oralUse / 4) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
 					}
 				}
 				if (vaginalUse > 0) {
@@ -1862,7 +1862,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 						r.push(`${domName} is more familiar with anal sex than ${subName} is and lets some of ${his2} skill rub off on ${him}.`);
 						r.push(slaveSkillIncrease('anal', slave, (Math.floor(analUse + Math.floor(slave.intelligence + slave.intelligenceImplant) / 32))));
 					} else if (slave.skill.anal < 30) {
-						r.push(slaveSkillIncrease('vaginal', slave, (Math.floor((vaginalUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
+						r.push(slaveSkillIncrease('anal', slave, (Math.floor((analUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
 					}
 				}
 			}
diff --git a/src/events/RE/reArcologyInspection.js b/src/events/RE/reArcologyInspection.js
index fe07de7a95a7bd8ff141a311d70041d6ec878248..5d96fe3a5cd8fb00dfd762c4fd5a3a0d20de88fc 100644
--- a/src/events/RE/reArcologyInspection.js
+++ b/src/events/RE/reArcologyInspection.js
@@ -165,7 +165,6 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 			} else {
 				t.push(`Your poor reputation can only help ${arcology.name} so much, though.`);
 			}
-			// @ts-ignore - we know that it's already adopted
 			arcology[fs] += Math.trunc(V.rep / 1000);
 			return t;
 		}
diff --git a/src/events/REFS/refsAntebellumArtifact.js b/src/events/REFS/refsAntebellumArtifact.js
index c22196f1051bf6147e651aa90f1d4861730dd196..32aefa2d3d26cea8ef3abd5e640b7161487e088f 100644
--- a/src/events/REFS/refsAntebellumArtifact.js
+++ b/src/events/REFS/refsAntebellumArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsAntebellumArtifact = class refsAntebellumArtifact extends App.Eve
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSAntebellumRevivalist = Math.clamp(V.arcologies[0].FSAntebellumRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["antebellum"];
diff --git a/src/events/REFS/refsArabianArtifact.js b/src/events/REFS/refsArabianArtifact.js
index 1b8a606777c0f30fa68b38ffca6f2ba15d01fb33..57bdf0e57ce92aa6fdf163033fd08f3ce6c70105 100644
--- a/src/events/REFS/refsArabianArtifact.js
+++ b/src/events/REFS/refsArabianArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsArabianArtifact = class refsArabianArtifact extends App.Events.Ba
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSArabianRevivalist = Math.clamp(V.arcologies[0].FSArabianRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["arabian"];
diff --git a/src/events/REFS/refsAztecArtifact.js b/src/events/REFS/refsAztecArtifact.js
index fd2e9b228a5a4a2c47325344c5f8508abd06b5b5..12a0b3c8edb48f2514e57bc65276c7febb57c4e2 100644
--- a/src/events/REFS/refsAztecArtifact.js
+++ b/src/events/REFS/refsAztecArtifact.js
@@ -27,7 +27,6 @@ App.Events.refsAztecArtifact = class refsAztecArtifact extends App.Events.BaseEv
 		function buy() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSAztecRevivalist = Math.clamp(V.arcologies[0].FSAztecRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["aztec"];
diff --git a/src/events/REFS/refsChineseArtifact.js b/src/events/REFS/refsChineseArtifact.js
index b69ca748034901cc6a192f4b5f3944f721a36604..42f1943ac688346aa0f7248eccf93d13c080d0dc 100644
--- a/src/events/REFS/refsChineseArtifact.js
+++ b/src/events/REFS/refsChineseArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsChineseArtifact = class refsChineseArtifact extends App.Events.Ba
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSChineseRevivalist = Math.clamp(V.arcologies[0].FSChineseRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["chinese"];
diff --git a/src/events/REFS/refsEdoArtifact.js b/src/events/REFS/refsEdoArtifact.js
index 1a702ce3a45629e00e1224b82be117adb0919870..a8824d5ce674c11e2f4184da95a898a8378410d3 100644
--- a/src/events/REFS/refsEdoArtifact.js
+++ b/src/events/REFS/refsEdoArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsEdoArtifact = class refsEdoArtifact extends App.Events.BaseEvent
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSEdoRevivalist = Math.clamp(V.arcologies[0].FSEdoRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["edo"];
diff --git a/src/events/REFS/refsEgyptianArtifact.js b/src/events/REFS/refsEgyptianArtifact.js
index dd5da516d708158ded9333d99326cd293d065795..ae8535ddf693bfcd288cf1cfad36087b390d5806 100644
--- a/src/events/REFS/refsEgyptianArtifact.js
+++ b/src/events/REFS/refsEgyptianArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsEgyptianArtifact = class refsEgyptianArtifact extends App.Events.
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSEgyptianRevivalist = Math.clamp(V.arcologies[0].FSEgyptianRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["egyptian"];
diff --git a/src/events/REFS/refsRomanArtifact.js b/src/events/REFS/refsRomanArtifact.js
index 1c5d57cc88f805c945bf78577e6637d209197f22..2e39d08c7d2d91a038e989ed65ca7ba5da440505 100644
--- a/src/events/REFS/refsRomanArtifact.js
+++ b/src/events/REFS/refsRomanArtifact.js
@@ -28,7 +28,6 @@ App.Events.refsRomanArtifact = class refsRomanArtifact extends App.Events.BaseEv
 		function display() {
 			repX(5000, "event");
 			cashX(-cost, "event");
-			// @ts-ignore - event gating prevents reported type problem
 			V.arcologies[0].FSRomanRevivalist = Math.clamp(V.arcologies[0].FSRomanRevivalist + 10, 0, 100);
 			if (!V.eventResults.artifactsBought) {
 				V.eventResults.artifactsBought = ["roman"];
diff --git a/src/events/RESS/review/hormoneDysfunction.js b/src/events/RESS/review/hormoneDysfunction.js
index e7564e4f031fd4654222f39c797fd127d3d056c5..529401c84155f8a1a79d4f16c597f162f1a6e091 100644
--- a/src/events/RESS/review/hormoneDysfunction.js
+++ b/src/events/RESS/review/hormoneDysfunction.js
@@ -79,7 +79,7 @@ App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Eve
 			}
 			r.push(`and the same limp dick as before. <span class="devotion dec">It's frustrating for ${him}.</span>`);
 			eventSlave.devotion -= 2;
-			if (eventSlave.clitSetting !== eventSlave.fetish) {
+			if (!smartPiercingReinforcesFetish(eventSlave)) {
 				r.push(`But, ${he} slowly <span class="fetish gain">accepts ${his} new role as a submissive little sex toy.</span>`);
 				eventSlave.fetishStrength = 65;
 				eventSlave.fetishKnown = 1;
@@ -107,7 +107,7 @@ App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Eve
 			r.push(`${He} doesn't climax to anal then, or the next time you assfuck ${him}, or the time after that; but some time later a long buttsex session ends when ${he} gives a little shake and a whimper and dribbles a pathetic squirt of cum from ${his} still-limp dick. By the end of the week <span class="mediumaquamarine">${he}'s smiling trustingly</span> and offering you ${his} butt every chance ${he} gets.`);
 			r.push(VCheck.Anal(eventSlave, 10));
 			eventSlave.trust += 4;
-			if (eventSlave.clitSetting !== eventSlave.fetish) {
+			if (!smartPiercingReinforcesFetish(eventSlave)) {
 				r.push(`<span class="fetish gain">${He}'s become a confirmed anal addict.</span>`);
 				eventSlave.fetishStrength = 65;
 				eventSlave.fetishKnown = 1;
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index afe1388f54b1a440f0fc6a9febe1c5b7387725e4..70dfac0c18b12b451e6783abf92a0b1e1cf60030 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -16,6 +16,7 @@ App.Intro.acquisition = function() {
 	SetBellySize(V.PC);
 
 	parentSetup();
+	PCChildrenCount();
 	inbreedingCalc();
 	if (V.plot === 1 && V.neighboringArcologies > 0) {
 		V.arcologies.reduce((acc, val) => (val.direction !== 0 && val.prosperity > acc.prosperity) ? val : acc, V.arcologies[1]).rival = 1;
@@ -422,6 +423,37 @@ App.Intro.acquisition = function() {
 		V.slaves.forEach(checkMissingParents);
 	}
 
+	function PCChildrenCount() {
+		let PCPregnancies = [];
+		let SPregnancies = [];
+		let birthData = "";
+		V.slaves.forEach(function(s) {
+			PCPregnancies = [];
+			SPregnancies = [];
+			V.slaves.filter(s0 => s0.newGamePlus === 0).forEach(function(s1) {
+				if (s1.father === s.ID && s1.mother === -1) {
+					birthData = s1.actualAge + " " + s1.birthWeek + " " + s1.father;
+					if (!PCPregnancies.includes(birthData)) {
+						PCPregnancies.push(birthData);
+					}
+					s.counter.PCChildrenFathered++;
+					V.PC.counter.birthDegenerate++;
+				}
+				if (s1.father === -1 && s1.mother === s.ID) {
+					birthData = s1.actualAge + " " + s1.birthWeek + " " + s1.mother;
+					if (!SPregnancies.includes(birthData)) {
+						SPregnancies.push(birthData);
+					}
+					s.counter.PCChildrenBeared++;
+					V.PC.counter.slavesFathered;
+				}
+			})
+			s.counter.PCKnockedUp += PCPregnancies.length;
+			s.counter.birthsTotal += SPregnancies.length;
+			s.counter.timesBred += SPregnancies.length;
+			V.PC.counter.slavesKnockedUp += SPregnancies.length;
+		})
+	}
 
 	function inbreedingCalc() {
 		const coeffSlaves = [];
diff --git a/src/events/nonRandom/pDefenseFears.js b/src/events/nonRandom/pDefenseFears.js
index e103684944ecb3333ed399b11f08ef0ce351cb74..39324e87fb33ea024538002f27f9adb7fc909d77 100644
--- a/src/events/nonRandom/pDefenseFears.js
+++ b/src/events/nonRandom/pDefenseFears.js
@@ -20,7 +20,7 @@ App.Events.PDefenseFears = class PDefenseFears extends App.Events.BaseEvent {
 		choices.push(new App.Events.Result(`Install a full platoon by subscription`, subscription));
 		choices.push(
 			new App.Events.Result(
-				`Install a full platoon at your expense`, yourExpense, `This will cost ${cashFormat(10000)} and ${(V.PC.skill.warfare >= 100 || V.PC.career === "arcology owner") ? `some upkeep, <span class="skill player">reduced by your mercenary contacts</span>` : `incur significant upkeep costs`}`
+				`Install a full platoon at your expense`, yourExpense, App.Events.makeNode([`This will cost ${cashFormat(10000)} and ${(V.PC.skill.warfare >= 100 || V.PC.career === "arcology owner") ? `some upkeep, <span class="skill player">reduced by your mercenary contacts</span>` : `incur significant upkeep costs`}`])
 			)
 		);
 		choices.push(new App.Events.Result(`Refuse to quarter so many troops in your arcology`, plead3rd));
diff --git a/src/events/reRecruit/MTFSE.js b/src/events/reRecruit/MTFSE.js
index beddc3a3b620006b94e0da88a76620631daa0dec..dd21b5ac2967d10cac44a2603d4bb67cf943c9b0 100644
--- a/src/events/reRecruit/MTFSE.js
+++ b/src/events/reRecruit/MTFSE.js
@@ -64,7 +64,6 @@ App.Events.recMTFSE = class recMTFSE extends App.Events.BaseEvent {
 			slave.boobsImplantType = "normal";
 			slave.boobs = slave.boobsImplant + 150;
 			slave.vagina = 0;
-			slave.skill.vaginal = 0;
 			slave.ovaries = 0;
 			slave.preg = 0;
 			slave.anus = 0;
diff --git a/src/events/reRecruit/femaleSE.js b/src/events/reRecruit/femaleSE.js
index f83494201a9d934f1ee75d6538134ce7ff5cef6d..4694a1587b034394b6d29b2b452a46584db97b31 100644
--- a/src/events/reRecruit/femaleSE.js
+++ b/src/events/reRecruit/femaleSE.js
@@ -64,7 +64,6 @@ App.Events.recFemaleSE = class recFemaleSE extends App.Events.BaseEvent {
 			slave.boobs = random(2, 6) * 100;
 			slave.natural.boobs = slave.boobs;
 			slave.vagina = 0;
-			slave.skill.vaginal = 0;
 			slave.labia = random(0, 1);
 			slave.clit = 0;
 			slave.ovaries = 1;
diff --git a/src/events/reRecruit/tgAddict.js b/src/events/reRecruit/tgAddict.js
index 948989b1880cac17981a1528eab8f2fe7d905e83..fc730562f6a73878ec8d890c770ec41448cbb837 100644
--- a/src/events/reRecruit/tgAddict.js
+++ b/src/events/reRecruit/tgAddict.js
@@ -72,7 +72,6 @@ App.Events.recTgAddict = class recTgAddict extends App.Events.BaseEvent {
 			slave.balls = 0;
 			slave.face = 0;
 			slave.preg = -2;
-			slave.skill.vaginal = 0;
 			return slave;
 		}
 	}
diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js
index de05d6eb0c7d000eeec9fa668fd56a03989a3cc2..a3ab741776f057bd3e2e330851e574e6eaf81c85 100644
--- a/src/events/scheduled/sePlayerBirth.js
+++ b/src/events/scheduled/sePlayerBirth.js
@@ -100,6 +100,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				if (babyDaddy) {
 					slavesLength++;
 					babies.push(String(babyDaddy.slaveName));
+					actX(babyDaddy, "PCChildrenFathered");
 				} else {
 					others++;
 					babies.push("some guy");
diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js
index 4a827f25451566ce855d65d9585c6c0bcab898b2..785b4dfd1343da09b8116125164225e7422feac0 100644
--- a/src/futureSocieties/fsPassage.js
+++ b/src/futureSocieties/fsPassage.js
@@ -675,7 +675,7 @@ App.UI.fsPassage = function() {
 							}
 						)
 					);
-					r.push(`gender traditionalism, including a societal preference for feminine slaves ${(V.seePreg !== 0) ? ` and support for slave pregnancy` : ``}.`);
+					r.push(`is a societal preference for feminine slaves ${(V.seePreg !== 0) ? ` and support for slave pregnancy` : ``}.`);
 					r.push(evaluation("FSGenderFundamentalist"));
 				} else {
 					/* <span class="note"><span style="font-weight:Bold">Gender traditionalism:</span> a societal preference for feminine slaves
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index 494e66f38ba0120d98cef2fc3bf727723c052176..2d7b21e833c59b1c0687ffbcdf272007a9378a6c 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -1277,6 +1277,9 @@ App.UI.artOptions = function() {
 					.addComment("The height of the image.");
 				options.addOption("Width", "aiWidth").showTextBox()
 					.addComment("The width of the image.");
+				options.addOption("Restore Faces", "aiRestoreFaces")
+					.addValue("Enabled", true).on().addValue("Disabled", false).off()
+					.addComment("Use a model to restore the faces after the image has been generated.");
 				options.addOption("Upscaling/highres fix", "aiUpscale")
 					.addValue("Enabled", true).on().addValue("Disabled", false).off()
 					.addComment("Use AI upscaling to produce higher-resolution images. Significantly increases both time to generate and image quality.");
diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 88701507d46114d4acd8a46931b40fc1b079d13f..c63f9e9b5f7ba5db803a462d01a3da0eaabc383c 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -79,7 +79,7 @@ globalThis.walkPast = (function() {
 				case "fSuckDick":
 					if (activeSlave.belly < 150000) {
 						if (activeSlave.dick > 0 && !activeSlave.chastityPenis && (V.policies.sexualOpenness === 1 || activeSlave.toyHole === "dick") && V.experimental.interactions) {
-							watchArray.push(suckDickWatch);
+							output += suckDickWatch(activeSlave);
 						} else {
 							return;
 						}
diff --git a/src/interaction/siCustom.js b/src/interaction/siCustom.js
index ac0fd2b8469eb77fba0615bcdc27746521c5975d..21fb5d5ff2e54905806d0382598e78c3de5e76a6 100644
--- a/src/interaction/siCustom.js
+++ b/src/interaction/siCustom.js
@@ -432,7 +432,7 @@ App.UI.SlaveInteract.custom = function(slave, refresh) {
 					)
 				);
 			}
-			if (V.arcologies[0].FSDegradationist > -1) {
+			if (FutureSocieties.isActive('FSDegradationist')) {
 				linkArray.push(
 					App.UI.DOM.link(
 						`Give ${him} a degrading full name`,
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 1c800a4173aeecc749d89c3620ba177f3663e433..71768aea972994ce9096bed1b6bdc022af9f0011 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -2772,6 +2772,7 @@ globalThis.DefaultRules = function(slave) {
 					fetish = either("vanilla", "oral", "anal", "boobs", "submissive", "dom", "humiliation", "pregnancy", "masochist", "sadist");
 				}
 				// check if already full fetish
+				// FIXME - this is wrong for some cases; see smartPiercingReinforcesFetish
 				if (slave.fetish !== fetish || slave.fetishStrength < 100) {
 					// Set the smart thingy to the correct fetish
 					if (slave.clitSetting !== fetish) {
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index 3db6da789e1192330e008304565e8bc77676c734..559a2ca3178acf5f54d92fe76ae00893c33d4e23 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -334,6 +334,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 		for (const baby of babiesBeingBorn) {
 			if (baby.fatherID === -1) {
 				V.PC.counter.slavesFathered++;
+				slave.counter.PCChildrenBeared++;
 			} else if (baby.fatherID > 0) {
 				const babyDaddy = findFather(baby.fatherID);
 				if (babyDaddy) {
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index aa2cdc3d0e5fa5a10ef804715e757f86c7c9b958..ff6decf3ba44f75de203e9a9d7d1a6cfa7848fd7 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -437,9 +437,7 @@ App.UI.SlaveSummaryImpl = function() {
 					return value + spData.setting.all;
 				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
 					return value + spData.setting.none;
-				} else if (((slave.fetish !== Fetish.NONE) && (slave.clitSetting === "vanilla"))) {
-					return value + spData.setting.vanilla;
-				} else if (slave.fetishStrength <= 95 || slave.fetish !== slave.clitSetting) {
+				} else if (slave.fetishStrength <= 95 || !smartPiercingReinforcesFetish(slave)) {
 					const s = value + spData.setting[slave.clitSetting];
 					if (s) {
 						return s;
diff --git a/src/js/utilsMisc.js b/src/js/utilsMisc.js
index b2568d2b418060d09c0965d7090d1f3b29583964..44f25d926327af791496ea566b1f5bbe0e1708b5 100644
--- a/src/js/utilsMisc.js
+++ b/src/js/utilsMisc.js
@@ -393,4 +393,65 @@ globalThis.weightedRandom = function(values) {
 	return null;
 };
 
+/**
+ * Returns the percentage (0-100) of the social acceptance of the slaves penetrating citizens. Accepts a slave as argument.
+ * 
+ * @param {FC.SlaveState} slave 
+ * @returns {number}
+ */
+globalThis.penetrativeSocialUse = function(slave = null) {
+	let total = 0;
+	if (V.policies.sexualOpenness) {
+		total += 40 + 20 * (Math.clamp(V.rep - 5000, 0, 12000) / 12000); // penetrative campaign, related to reputation, (40 to 60)
+	}
+	total += V.LDE.schoolPresent * 3 + V.TGA.schoolPresent * 3 + V.TFS.schoolPresent * 10; // slave schools focused on penises
+	total += FutureSocieties.isActive("FSGenderRadicalist") ? 25 : 0;
+	total += [0, 15, 20, 0, 5][V.arcologies[0].FSGenderRadicalistLawFuta]; // 15 futas, 20 big dicks & balls, 5 small dicks
+	total += FutureSocieties.isActive("FSNull") ? 15 : 0;
+	total += V.arcologies[0].FSRepopulationFocusLaw * 10;
+
+	total -= FutureSocieties.isActive("FSGenderFundamentalist") ? 25 : 0;
+	total -= V.arcologies[0].FSGenderFundamentalistSMR ? 30 : 0;
+	total -= FutureSocieties.isActive("FSEdoRevivalist") ? 10 : 0;
+	total -= FutureSocieties.isActive("FSArabianRevivalist") ? 10 : 0;
+	total -= FutureSocieties.isActive("FSChineseRevivalist") ? 10 : 0;
+	total -= FutureSocieties.isActive("FSRestart") ? 25 : 0;
+	total -= V.arcologies[0].FSRestartSMR ? 30 : 0;
+	total -= FutureSocieties.isActive("FSAztecRevivalist") ? 10 : 0;
+	total -= FutureSocieties.isActive("FSNeoImperialist") ? 10 : 0;
+	total -= FutureSocieties.isActive("FSAntebellumRevivalist") ? 10 : 0;
+
+	total = Math.clamp(total, 0, 100);
+
+	if (slave && asSlave(slave)) {
+		total += slave.toyHole === "dick" ? 5 : 0;
+		// total += (slave.skill.penetrative / 10);
+		if (FutureSocieties.isActive("FSSupremacist")) {
+			total += V.arcologies[0].FSSupremacistRace === slave.race ? 10 : -20;
+		}
+		if (FutureSocieties.isActive("FSSubjugationist")) {
+			total += V.arcologies[0].FSSubjugationistRace === slave.race ? 20 : 0;
+		}
+	}
 
+	let haveDick =V.slaves.filter(s => s.dick > 0).length;
+	if (haveDick) {
+		let withDick = (haveDick / V.slaves.length); // percentage of slaves with dicks
+		total += withDick > .2 ? 15 * withDick : 0;
+		let toyHole = V.slaves.filter(s => s.toyHole === "dick").length;
+		total += 10 * (toyHole / haveDick);
+		/* let penetrativeAverage = 0;
+		V.slaves.filter(s => s.dick > 0).forEach(s1 => {
+			penetrativeAverage += s1.skill.penetrative;
+		});
+		total += (penetrativeAverage / haveDick) * .1; */
+	}
+	if (V.seeDicks === 0 && total > 0) {
+		total *= .6;
+	} else if (V.seeDicks > 25) {
+		total += V.seeDicks < 75 ? V.seeDicks * .10 : V.seeDicks * .08;
+	}
+
+	total = Math.clamp(Math.floor(total), 0, 100);
+	return total;
+}
diff --git a/src/js/utilsPC.js b/src/js/utilsPC.js
index 1e4a468784deff28bd6dc1392c872d4c19fc24ab..f97828b82069982ca7364e4aad0646f24b4d0cc1 100644
--- a/src/js/utilsPC.js
+++ b/src/js/utilsPC.js
@@ -1107,7 +1107,7 @@ globalThis.PCPenetrationWarning = function(holes = "vaginal first", escape = fal
 		result += `WARNING# This option ${action} take your ${virgins[0]} virginity.`;
 	}
 	return result;
-}
+};
 
 /** Returns "true" if the player can be receptive to penetration, even if the sexualOpenness policy is not adopted. This function should only be used to offer options to the player, it does not imply true willingness.
  * @param {any} [penetrator = null]  If a slave is passed as an argument, it also takes into account if slave.toyHole is "dick".
@@ -1134,7 +1134,7 @@ globalThis.isPlayerReceptive = function(penetrator = null) {
 		return true; // forcedFertDrugs influence the behavior of the player, who unconsciously wants to be fertilized
 	}
 	return false;
-}
+};
 
 /** Determine if the player favors masturbation over sex.
  * Currently not used much, but will be used more with the addition of new .pregMoods
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 279c3d5d888de1dc804d70b315d065a2b4a787e9..f7daea8b6724d96b517516c9abdf2c3717fc21c6 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -1583,7 +1583,7 @@ globalThis.fetishChangeChance = function(slave) {
 	let fetish = (slave.fetishStrength / 4);
 	let sex = 0;
 
-	if (slave.clitSetting !== slave.fetish && !('fetishChanged' in slave && slave.fetishChanged === 1)) {
+	if (!smartPiercingReinforcesFetish(slave) && !('fetishChanged' in slave && slave.fetishChanged === 1)) {
 		// fetish should be more uncertain leading towards puberty and then steadily become more set in stone afterwards
 		if (slave.balls) {
 			if (V.potencyAge >= slave.actualAge) {
@@ -3414,3 +3414,22 @@ globalThis.ChattelReligionistClothingPass = function(outfit) {
 		return fsLovesClothes;
 	}
 };
+
+/** Checks whether a slave's smart piercing is reinforcing a particular fetish
+ * You must use this function rather than comparing directly because some of the enumerated values don't match (i.e. "anal" reinforces "buttslut")
+ * @param {App.Entity.SlaveState} slave
+ * @param {FC.Fetish} [fetish] if unspecified, uses the slave's current fetish
+ */
+globalThis.smartPiercingReinforcesFetish = function(slave, fetish = slave.fetish) {
+	switch (slave.clitSetting) {
+		case SmartPiercingSetting.VANILLA:
+			return fetish === Fetish.NONE;
+		case SmartPiercingSetting.ANAL:
+			return fetish === Fetish.BUTTSLUT;
+		case SmartPiercingSetting.ORAL:
+			return fetish === Fetish.CUMSLUT;
+		case SmartPiercingSetting.NONE:
+			return false; // SP "none" is "no sex", not fetish "none", which is SP "vanilla"
+	}
+	return slave.clitSetting === fetish; // all the other ones are supposed to match
+};
diff --git a/src/markets/specificMarkets/eliteSlave.js b/src/markets/specificMarkets/eliteSlave.js
index 24ab9b44b0d9c8d643248fe70db4a79ce2a8a0ac..8f7d04147b04235878353807f46d16d6ce9a9075 100644
--- a/src/markets/specificMarkets/eliteSlave.js
+++ b/src/markets/specificMarkets/eliteSlave.js
@@ -214,6 +214,7 @@ App.Markets["Elite Slave"] = function() {
 			slave.balls = random(2, 10);
 			slave.scrotum = slave.balls;
 			slave.prostate = either(1, 2, 3);
+			slave.vasectomy = 1;
 		}
 		slave.makeup = 2;
 		slave.nails = 1;
diff --git a/src/markets/specificMarkets/householdLiquidator.js b/src/markets/specificMarkets/householdLiquidator.js
index 4d2ad2477d4b8e177de66dd23a2038fc1ccf971d..045ff413b9371ec5f3f84eadd6049a93bb433472 100644
--- a/src/markets/specificMarkets/householdLiquidator.js
+++ b/src/markets/specificMarkets/householdLiquidator.js
@@ -108,7 +108,7 @@ App.Markets["Household Liquidator"] = function() {
 			cost: 0
 		};
 		for (const slave of slaves) {
-			const complianceText = App.Desc.lawCompliance(slave, "Household Liquidator")
+			const complianceText = App.Desc.lawCompliance(slave, "Household Liquidator");
 			bundle.slaves.push(slave);
 			bundle.text.set(slave.ID, complianceText);
 		}
diff --git a/src/npc/children/customizeChild.tw b/src/npc/children/customizeChild.tw
index 1d98f6f12d525847e462cbbf6cb8440014586d73..bcfac5c1a3e83f4ef593d378a175be29160de550 100644
--- a/src/npc/children/customizeChild.tw
+++ b/src/npc/children/customizeChild.tw
@@ -177,7 +177,7 @@ You may enter custom descriptors for the child's hair color, hair style, tattoos
 			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<</if>>
-	<<if $arcologies[0].FSDegradationist > -1>>
+	<<if $arcologies[0].FSDegradationist != null>>
 		| <<link "Give $him a degrading full name">>
 			<<run DegradingName($activeChild)>>
 			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index 7f5ae17830966b9f760796471dfb19afd185f853..89ebd2beddb6fcfb91895a2826c22d7fab0dcaba 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -1390,7 +1390,8 @@ App.Desc.sexualHistory = function(slave) {
 		r += `${He} has had a total of ${numberWithPluralOne(slave.counter.miscarriages, "miscarriage")}. `;
 	}
 
-	if (slave.counter.slavesKnockedUp > 0 || slave.counter.slavesFathered > 0 || slave.counter.PCKnockedUp > 0 || slave.counter.PCChildrenFathered > 0) {
+	if (slave.counter.slavesKnockedUp > 0 || slave.counter.slavesFathered > 0 || slave.counter.PCKnockedUp > 0) {
+		let PCChildrenFatheredCount = V.slaves.filter(s => s.father === slave.ID && s.mother === -1).length; // The slave is also the father of the children transferred from the PC's womb to other slave's one.
 		r += `<span class="relationship">`;
 		if (slave.counter.slavesKnockedUp > 0) {
 			r += `${He}'s knocked up ${numberWithPluralOne(slave.counter.slavesKnockedUp, "other slave girl")} `;
@@ -1407,8 +1408,8 @@ App.Desc.sexualHistory = function(slave) {
 				r += ` and is the father of ${slave.counter.PCChildrenFathered} of your children`;
 			}
 			r += `. `;
-		} else if (slave.counter.PCChildrenFathered > 0) {
-			r += `${He}'s the father of ${slave.counter.PCChildrenFathered} of your children.`;
+		} else if (PCChildrenFatheredCount > 0) {
+			r += `${He}'s the father of ${PCChildrenFatheredCount} of your children.`;
 		}
 		r += `</span>`;
 	}
diff --git a/src/npc/generate/newChildIntro.js b/src/npc/generate/newChildIntro.js
index be188e048c9f153d62d1957a44e7e43b2d09b165..189871626eb74a71b3a317736c8d3b2ad6b76f1c 100644
--- a/src/npc/generate/newChildIntro.js
+++ b/src/npc/generate/newChildIntro.js
@@ -16,7 +16,25 @@ App.UI.newChildIntro = function(slave) {
 
 	r = [];
 
-	r.push(`You completed the legalities before heading to ${V.incubator.name}, knowing the tank will release ${him} on your approach, and instruct ${V.assistant.name} to notify the new ${girl}'s parents to meet you in your office. As the tank exhumes the disoriented ${girl},`);
+	let tempParents = "";
+
+	r.push(`You completed the legalities before heading to ${V.incubator.name}, knowing the tank will release ${him} on your approach,`);
+
+	if (tempMom.ID === V.PC.ID && tempDad.ID === V.PC.ID) {
+	} else if (tempMom.ID === V.PC.ID) {
+		tempParents = "father";
+	} else if (tempDad.ID === V.PC.ID) {
+		tempParents = "mother";
+	} else {
+		tempParents = "parents";
+	}
+
+	if (tempParents !== "") {
+		r.push(`and instruct ${V.assistant.name} to notify the new ${girl}'s ${tempParents} to meet you in your office.`);
+	}
+
+	r.push(`As the tank exhumes the disoriented ${girl},`);
+
 	if (slave.preg > 0) {
 		/* Unused for now. Fetal development would be accelerated as well. As a result, the released slave would be shocking to see in such a state. */
 		if (slave.geneticQuirks.progeria) {
diff --git a/src/npc/infants/customizeInfant.tw b/src/npc/infants/customizeInfant.tw
index 6253ff877f3ceb75d6778f84dcd71f6f402ff22f..69f1f19e829449129fef2aa4436faaf43d1033c9 100644
--- a/src/npc/infants/customizeInfant.tw
+++ b/src/npc/infants/customizeInfant.tw
@@ -106,7 +106,7 @@ Change $his surname:
 <<elseif $arcologies[0].FSEdoRevivalist != null>>
 	| <<link "Give $him a random full feudal Japanese name">><<set $activeChild.slaveName = setup.edoSlaveNames.random(), $activeChild.slaveSurname = setup.edoSlaveSurnames.random()>><</link>>
 <</if>>
-<<if $arcologies[0].FSDegradationist > -1>>
+<<if $arcologies[0].FSDegradationist != null>>
 	| <<link "Give $him a degrading full name">><<run DegradingName($activeChild)>><</link>>
 <</if>>
 */
diff --git a/src/npc/interaction/fAbuse.js b/src/npc/interaction/fAbuse.js
index 1996fea984aa0cfdfdd3dc1f54252aef391f10ee..291d8edb19332bf3eeea406a318f0c7ee74009b2 100644
--- a/src/npc/interaction/fAbuse.js
+++ b/src/npc/interaction/fAbuse.js
@@ -754,7 +754,7 @@ App.Interact.fAbuse = function(slave) {
 		}
 	}
 	if (random(1, 100) > (50+slave.devotion+slave.trust) && slave.assignment !== Job.BODYGUARD) {
-		if (slave.fetish !== Fetish.MINDBROKEN && slave.fetishKnown === 0 && slave.clitSetting !== slave.fetish) {
+		if (slave.fetish !== Fetish.MINDBROKEN && slave.fetishKnown === 0 && !smartPiercingReinforcesFetish(slave)) {
 			r.push(`${His} acceptance of your abuse has twisted ${his}`);
 			if (random(1, 2) === 1 && slave.fetish !== "submissive") {
 				r.push(`<span class="lightcoral">sexuality towards submissiveness.</span>`);
diff --git a/src/player/electiveSurgery.js b/src/player/electiveSurgery.js
index f02ff1e34667aca5d6ab4a79f28f3d37a4cf8b16..24dad4d6795c2e96b36387beee919f50be06152a 100644
--- a/src/player/electiveSurgery.js
+++ b/src/player/electiveSurgery.js
@@ -715,7 +715,7 @@ App.UI.electiveSurgery = function() {
 				V.PC.newVag = 1;
 				cashX(forceNeg(applyDiscount(15000)), "PCmedical");
 			}));
-			if (V.PC.preg === 0) {
+			if (V.PC.preg <= 0) {
 				linkArray.push(surgeryLink("Get a tight virgin vagina", "tightPussy", () => {
 					V.PC.vagina = 0;
 					V.PC.newVag = 1;
@@ -729,7 +729,7 @@ App.UI.electiveSurgery = function() {
 				}))
 			};
 		} else if (V.PC. vagina > 0) {
-			if (V.PC.preg === 0) {
+			if (V.PC.preg <= 0) {
 				r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. I can give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}.</span> No one will notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.PC.counter.raped > 0 ? " and abused" : ""}, it will be a perfect work of craftsmanship. The surgery will also serve to make your duct narrow like"`);
 				if (V.PC.physicalAge < 13 || V.PC.actualAge < 13) {
 					r.push("a child like you is supposed to have.");
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 346839ccc535d8c9aac0eba9a75401bc8bbf9518..a5e9cf3c30776c248ab9aac429758b08d2fa83c2 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -461,8 +461,11 @@ App.UI.managePersonalAffairs = function() {
 			if (PC.counter.birthClient > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthClient)} from clients you've slept with.`);
 			}
-			if (PC.counter.birthDegenerate > 0) {
-				App.UI.DOM.appendNewElement("li", list, `${PC.counter.birthDegenerate} bastard ${PC.counter.birthDegenerate > 1 ? `babies` : `baby`} from getting fucked by slaves.`);
+			if (PC.counter.birthFutaSis > 0) {
+				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthFutaSis)} from sex with the Futanary Sisters.`);
+			}
+			if (PC.counter.birthClient > 0) {
+				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthRape)} after being raped by an unknown person.`);
 			}
 			if (PC.counter.birthArcOwner > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthArcOwner)} from your time with male arcology owners.`);
@@ -470,8 +473,8 @@ App.UI.managePersonalAffairs = function() {
 			if (PC.counter.birthCitizen > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthCitizen)} from sex with arcology citizens.`);
 			}
-			if (PC.counter.birthOther > 0) {
-				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthOther)} from sources you can't quite recall.`);
+			if (PC.counter.birthDegenerate > 0) {
+				App.UI.DOM.appendNewElement("li", list, `${PC.counter.birthDegenerate} bastard ${PC.counter.birthDegenerate > 1 ? `babies` : `baby`} from getting fucked by slaves.`);
 			}
 			if (PC.counter.birthSelf > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthSelf)} that ${PC.counter.birthSelf > 1 ? `are` : `is`} literally all you.`);
@@ -479,6 +482,9 @@ App.UI.managePersonalAffairs = function() {
 			if (PC.counter.birthLab > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthLab)} specially designed in the lab.`);
 			}
+			if (PC.counter.birthOther > 0) {
+				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthOther)} from sources you can't quite recall.`);
+			}
 
 			return birthsDiv;
 		}
@@ -537,6 +543,7 @@ App.UI.managePersonalAffairs = function() {
 				[-6, `members of the Societal Elite`],
 				[-8, `your animals`],
 				[-9, `members of the Futanari Sisters`],
+				[-10, `rapists`],
 			]);
 
 			for (const [ID, name] of partners) {