diff --git a/src/descriptions/officeDescription.js b/src/descriptions/officeDescription.js
index 8382fe23fe45a2f5cdf1863bc77bc3a33a4b55de..1ac5361673c2c037da9944e1ac77d0e49c2100d3 100644
--- a/src/descriptions/officeDescription.js
+++ b/src/descriptions/officeDescription.js
@@ -42,7 +42,7 @@ App.Desc.officeDescription = function(lastElement) {
 						} else {
 							r.push(`tiny little erection`);
 						}
-						r.push(r.pop() + ".");				
+						r.push(r.pop() + ".");
 					} else if (random(1, 3) === 1 && modeledSlave.skill.vaginal >= 100) {
 						if (modeledSlave.vagina > 3) {
 							r.push(`massive vagina`);
@@ -86,11 +86,11 @@ App.Desc.officeDescription = function(lastElement) {
 					if (random(1, 4) === 1 && modeledSlave.skill.penetrative >= 100 && canAchieveErection(modeledSlave) && penetrativeSocialUse(modeledSlave) > 70) {
 						r.push(`thrusting ${his} hips and showing off ${his}`);
 						if (modeledSlave.dick < 10) {
-							r.push(["former","tiny","little","","big","huge","gigantic","massive","truly imposing","monstrous","inhuman"][modeledSlave.dick]);
+							r.push(["former", "tiny", "little", "", "big", "huge", "gigantic", "massive", "truly imposing", "monstrous", "inhuman"][modeledSlave.dick]);
 						} else {
-							r.push(`hypertrophied`)
+							r.push(`hypertrophied`);
 						}
-						r.push(`erection.`)						
+						r.push(`erection.`);
 					} else if (random(1, 3) === 1 && modeledSlave.skill.vaginal >= 100) {
 						r.push(`lying nude on ${his} back, spreading ${his} legs to`);
 						if (modeledSlave.vagina > 3) {
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 93b6e502abe1771e64db66721e835825b2b01a8f..ac89933a907b97da30e99846fc99ae633899627f 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -109,7 +109,7 @@ App.EndWeek.penthouseReport = function() {
 				r.push(App.SlaveAssignment.recruitGirls(slave));
 				break;
 			case Job.CLINIC:
-				r.push(`is given preliminary treatement in ${V.clinicName} while ${his} bed is being prepared.`);
+				r.push(`is given preliminary treatment in ${V.clinicName} while ${his} bed is being prepared.`);
 				break;
 			case Job.CELLBLOCK:
 				r.push(`is kept in holding until ${his} cell in ${V.cellblockName} is ready.`);
diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js
index e81b0a89d2841501e1f43c3365b52450dad6e54a..3d193515fcdc33d587a35ff30ad7f60378ab7ddd 100644
--- a/src/endWeek/saLongTermEffects.js
+++ b/src/endWeek/saLongTermEffects.js
@@ -1558,13 +1558,15 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 	 *
 	 */
 	function mentalTension(slave) {
-		const attention = V.personalAttention.task === PersonalAttention.TRAINING && V.personalAttention.slaves.find((s) => s.ID === slave.ID) && !onBedRest(V.PC, true);
+		const pcTraining = V.personalAttention.task === PersonalAttention.TRAINING && !onBedRest(V.PC, true);
+		const attentionObjective = V.personalAttention.slaves.find((s) => s.ID === slave.ID)?.objective;
+
 		if (slave.behavioralFlaw === BehavioralFlaw.NONE) {
 			if (slave.trust < -20 && slave.devotion <= 50) {
 				if (random(1, 100) > 100 + slave.trust) {
 					const effect = random(1, 4);
 					r.push(`Being so afraid so constantly drives ${him} to find solace in`);
-					if (attention && ["build devotion", "health", "soften behavioral flaw", "soften sexual flaw", "learn skills"].includes(attention.objective)) {
+					if (pcTraining && ["build devotion", "health", "soften behavioral flaw", "soften sexual flaw", "learn skills"].includes(attentionObjective)) {
 						r.push(`your attention. Relying on you for <span class="devotion inc">emotional support</span> strengthens ${his} <span class="trust inc">bond</span> with ${getWrittenTitle(slave)}.`);
 						slave.devotion++;
 						slave.trust++;
@@ -1589,7 +1591,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 				if (random(1, 500) > 500 + slave.devotion) {
 					const effect = random(1, 6);
 					r.push(`Being so angry at ${his} life as a sex slave has`);
-					if (attention && ["build devotion", "health", "soften behavioral flaw", "soften sexual flaw", "learn skills"].includes(attention.objective)) {
+					if (pcTraining && ["build devotion", "health", "soften behavioral flaw", "soften sexual flaw", "learn skills"].includes(attentionObjective)) {
 						r.push(`forced ${him} to face ${his} problems with you. Lending ${him} support makes it <span class="devotion inc">a little more tolerable.</span>`);
 						slave.devotion++;
 					} else if (effect === 1) {
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index 36588d64c7a339c5de8102a7dcf520e2d0e17b3b..3737524d8de6c5fb1208dfb83382d889d6d57d20 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1327,7 +1327,7 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 			}
 		}
 		if (penetrativeSocialUse(slave) >= 20) {
-			penetrativeUse += Math.random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
+			penetrativeUse += random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
 		}
 
 		const demand = (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse);
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index 150c8189db7aefd23925e21184c78f027996877b..2b3ce62c94b73f7c9845be0b40de60292321b96a 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -1846,7 +1846,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 				increaseSkillFromCumdump(slave, "penetrative", penetrativeUse);
 			}
 		} else if (jobType === "sub") {
-			const {his2} = getPronouns(domSlave).appendSuffix('2');
+			const {his2, he2} = getPronouns(domSlave).appendSuffix('2');
 			if ((slave.rivalry === 0 || slave.rivalryTarget !== domSlave.ID) && slave.devotion > 20 && domSlave.devotion > 20) {
 				if (oralUse > 0) {
 					if (slave.skill.oral < domSlave.skill.oral) {
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index 48066543f149cf2a2dff39df484c01fc4845bc6b..8ce950c1ea212792e4afb3e983b075443cefbc63 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -1421,7 +1421,7 @@ App.SlaveAssignment.whore = function(slave) {
 			}
 		}
 		if (penetrativeSocialUse(slave) >= 20) {
-			penetrativeUse += Math.random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
+			penetrativeUse += random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
 		}
 
 		const demand = (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse);
diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js
index 921f22346a14be29a4bebf4f66d9eea869ddc6ac..5fa816c8111cbe4e318a49a496b499f8df184704 100644
--- a/src/js/extendedFamilyModeJS.js
+++ b/src/js/extendedFamilyModeJS.js
@@ -103,7 +103,7 @@ globalThis.isGrandparentP = function(granddaughter, grandparent) {
 	if (!V.showDistantRelatives) {
 		return false;
 	}
-	
+
 	return isGrandmotherP(granddaughter, grandparent) || isGrandfatherP(granddaughter, grandparent);
 };
 
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index d07db6c78662aedc92cf23be5e13b549349902e8..23275ec9d6bdd6de7fed27d6181d3ee8ffa66ab4 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -3252,7 +3252,7 @@ globalThis.adjustedPenSkill = function(slave, specific = false) {
 		}
 	}
 	return Math.clamp(skill, 0, 100);
-}
+};
 
 /**
  * Generates a new slave ID that is guaranteed to be unused
diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js
index 5673c3b2a6dfa2d45c080f6e51c33a59a61f2213..e63b7f497ecc041476e073e210712baae4267bc7 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1928,7 +1928,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				slave.balls = jsRandom(19, 30);
 				slave.scrotum = 10;
 				slave.prostate = 2;
-				slave.skill.penetration = 15;
+				slave.skill.penetrative = 15;
 				slave.weight = jsRandom(10, 30);
 				slave.waist = jsRandom(0, 100);
 				slave.muscles = jsRandom(80, 100);
diff --git a/src/npc/generate/lawCompliance.js b/src/npc/generate/lawCompliance.js
index 1701edb3182a6d17a3cb1d8e2e4b89b3f790b0f4..9a6d1f1538cceeffe00ae98a86f7bba4536a32ff 100644
--- a/src/npc/generate/lawCompliance.js
+++ b/src/npc/generate/lawCompliance.js
@@ -782,7 +782,7 @@ App.Desc.lawCompliance = function(slave, market = 0) {
 
 	function eugenicsSMRsCount() {
 		const r = [];
-		const sterilizationReasons = []
+		const sterilizationReasons = [];
 		r.push(`As soon as ${he} arrived in the slave market, ${he} was subjected to a battery of testing:`);
 		if (V.policies.SMR.eugenics.intelligenceSMR === 1) {
 			r.push(`an intelligence test,`);
diff --git a/src/npc/interaction/fFeelings.js b/src/npc/interaction/fFeelings.js
index 3f0b86f4e1a888779ef0ba24822499e497a72e6a..259aac285480b59547ca6b49c6b344393135c680 100644
--- a/src/npc/interaction/fFeelings.js
+++ b/src/npc/interaction/fFeelings.js
@@ -1850,13 +1850,13 @@ App.Interact.fFeelings = function(slave) {
 		}
 
 		function relationships() {
-			 const text = [];
+			const text = [];
 
 			if (slave.relationship > 0) {
 				const partner = getSlave(slave.relationshipTarget);
 				const {
 					He: He2, His: His2,
-					he: he2, his: his2, him: him2, daughter: daughter2, sister: sister2, mother: mother2,
+					he: he2, his: his2, him: him2, daughter: daughter2, mother: mother2,
 				} = getPronouns(partner);
 				const milf2 = ((V.diversePronouns === 1) && (partner.pronoun === App.Data.Pronouns.Kind.male)) ? `DILF` : `MILF`;
 
@@ -1905,21 +1905,17 @@ App.Interact.fFeelings = function(slave) {
 						text.push(`${Spoken(slave, `I — I'm fucking my ${daughter2},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body, I can't stop.`)}`);
 					} else if (partner.father === slave.ID) {
 						text.push(`${Spoken(slave, `I — I'm fucking my ${daughter2},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body. ${He2} looks so much like ${his2} mother, I can't stop.`)}`);
-					} else if (areSisters(slave, partner) === 1) {
-						text.push(`${Spoken(slave, `I — I'm fucking my twin ${sister2},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
-					} else if (areSisters(slave, partner) === 2) {
-						text.push(`${Spoken(slave, `I — I'm fucking my ${sister2},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
-					} else if (areSisters(slave, partner) === 3) {
-						text.push(`${Spoken(slave, `I — I'm fucking my half-${sister2},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
+					} else if (areSisters(slave, partner) > 0) {
+						const sibling = siblingTerm(slave, partner);
+						text.push(`${Spoken(slave, `I — I'm fucking my ${sibling},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
 					} else if (areCousins(slave, partner)) {
 						text.push(`${Spoken(slave, `I — I'm fucking my cousin,"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
 					} else if (isAunt(slave, partner)) {
-						const aunt = (partner.genes === "XY" && useMaleTerms)? `uncle`: `aunt`;
+						const aunt = relativeTerm(slave, partner);
 						text.push(`${Spoken(slave, `I — I'm fucking my ${aunt},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2}'s so hot, I can't stop.`)}`);
 					} else if (isAunt(partner, slave)) {
-						const niece = (partner.genes === "XY" && useMaleTerms)? `nephew`: `niece`;
+						const niece = relativeTerm(slave, partner);
 						text.push(`${Spoken(slave, `I — I'm fucking my ${niece},"`)} ${he} bursts out, blushing even harder. ${Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body, I can't stop.`)}`);
-
 					} else if ((slave.actualAge + 14) < partner.actualAge) {
 						text.push(`${Spoken(slave, `${He2}'s old enough to be my ${mother2}."`)} ${He} looks down, blushing a little harder. ${Spoken(slave, `"But I'm lucky, ${he2}'s such a hot ${milf2}.`)}`);
 					} else if ((slave.actualAge - 14) > partner.actualAge) {
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 82db30eb3d581ac85531a558716029838d9d8fb4..e910ab8f3b2118fd70bedc9b8c33dc5e442bea3d 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -2025,9 +2025,9 @@ App.StartingGirls.skills = function(slave, cheat = false) {
 	App.StartingGirls.addSet(
 		options.addOption("Penetrative sex", "penetrative", slave.skill),
 		App.Data.StartingGirls.skill);
-		if (penetrativeSocialUse() < 20) {
-			options.addComment("Penetrative skills are usually not considered valuable.");
-		}
+	if (penetrativeSocialUse() < 20) {
+		options.addComment("Penetrative skills are usually not considered valuable.");
+	}
 
 	App.StartingGirls.addSet(
 		options.addOption("Prostitution", "whoring", slave.skill),
@@ -2041,8 +2041,8 @@ App.StartingGirls.skills = function(slave, cheat = false) {
 		App.Data.StartingGirls.skill);
 
 	// skill warning
-	const totalSkill = slave.skill.whoring + slave.skill.entertainment + slave.skill.vaginal
-		+ slave.skill.penetrative + slave.skill.anal + slave.skill.oral + slave.skill.combat;
+	const totalSkill = slave.skill.whoring + slave.skill.entertainment + slave.skill.vaginal +
+		slave.skill.penetrative + slave.skill.anal + slave.skill.oral + slave.skill.combat;
 
 	if (totalSkill > 200 && !cheat) {
 		let comment = ["Starting slaves incur"];