diff --git a/src/endWeek/reports/brothelReport.js b/src/endWeek/reports/brothelReport.js
index b6fc41d5978ae6b8d19ee85cf1be426968953bf4..1d4f23f32323912d5fdf353613cc773fcc72d147 100644
--- a/src/endWeek/reports/brothelReport.js
+++ b/src/endWeek/reports/brothelReport.js
@@ -111,7 +111,14 @@ App.EndWeek.brothelReport = function() {
 				r.push(`${He} is a clever manager.`);
 			}
 			if (S.Madam.dick > 2 && canPenetrate(S.Madam)) {
-				r.push(`${His} turgid dick helps ${him} manage the bitches.`);
+				if (S.Madam.skill.penetrative > 90) {
+					r.push(`${His} skilled dick incentivizes the bitches to behave.`);
+				} else if (S.Madam.skill.penetrative > 10) {
+					r.push(`${His} turgid dick helps ${him} manage the bitches.`);
+				} else {
+					r.push(`${He} tries to use ${his} turgid cock to keep the bitches in line, but ${his} lack of skill only leaves them off kilter.`);
+				}
+				slaveSkillIncrease('penetrative', S.Madam, 2);
 			}
 			App.Events.addParagraph(el, r);
 
diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js
index d6b0b9326cecc6cd5d753bed9b74266e57d339b8..040234e7dff8fe3d92a9e672081a31ae883af4da 100644
--- a/src/endWeek/reports/cellblockReport.js
+++ b/src/endWeek/reports/cellblockReport.js
@@ -117,6 +117,7 @@ App.EndWeek.cellblockReport = function() {
 			trustMalus++;
 			idleBonus++;
 			r.push(`${His} molestation of the prisoners is more varied and effective because ${he} has a dick to fuck them with.`);
+			slaveSkillIncrease('penetrative', S.Wardeness, 2);
 		}
 		if (S.Wardeness.muscles > 35) {
 			devBonus++;
diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js
index 57c1352659e3ef332be297d3d21034bdabfd5add..07c87179dc38512d2c312d72f5b7227ce24c375a 100644
--- a/src/endWeek/reports/dairyReport.js
+++ b/src/endWeek/reports/dairyReport.js
@@ -271,9 +271,18 @@ App.EndWeek.dairyReport = function() {
 			r.push(slaveSkillIncrease('milkmaid', S.Milkmaid, skillIncrease));
 		}
 		if (prostateStim === 1) {
-			r.push(`${He} uses ${his} turgid cock to give prostate stimulation to slaves that need help ejaculating.`);
+			if (S.Milkmaid.skill.penetrative > 90) {
+				r.push(`${He} uses ${his} turgid cock and masterful technique to milk each slave's prostate dry.`);
+			} else if (S.Milkmaid.skill.penetrative > 10) {
+				r.push(`${He} uses ${his} turgid cock to give prostate stimulation to slaves that need help ejaculating.`);
+			} else {
+				r.push(`${He} tries to use ${his} turgid cock to give prostate stimulation and help slaves ejaculate, but has no idea where ${he} needs to aim to do so.`);
+			}
 			S.Milkmaid.need -= 50;
 		}
+		if (milkmaidImpregnated || prostateStim) {
+			slaveSkillIncrease('penetrative', S.Milkmaid, 2);
+		}
 		V.milkmaidDevotionThreshold += (5 * V.milkmaidDevotionBonus);
 		V.milkmaidTrustThreshold += (5 * V.milkmaidTrustBonus);
 		for (const slave of slaves) {
@@ -834,15 +843,18 @@ App.EndWeek.dairyReport = function() {
 						if (slave.trust < -65) {
 							horrified.push(slave);
 						}
-					} else if (slave.skill.vaginal > 0) {
-						slave.skill.vaginal -= 10;
-						skillsLost.push(slave);
 					} else if (slave.skill.oral > 0) {
 						slave.skill.oral -= 10;
 						skillsLost.push(slave);
 					} else if (slave.skill.anal > 0) {
 						slave.skill.anal -= 10;
 						skillsLost.push(slave);
+					} else if (slave.skill.vaginal > 0) {
+						slave.skill.vaginal -= 10;
+						skillsLost.push(slave);
+					} else if (slave.skill.penetrative > 0) {
+						slave.skill.penetrative -= 10;
+						skillsLost.push(slave);
 					} else if (slave.career !== "a bioreactor") {
 						slave.career = "a bioreactor";
 						careerForgotten.push(slave);
@@ -899,15 +911,18 @@ App.EndWeek.dairyReport = function() {
 					if (slave.trust < -70) {
 						horrified.push(slave);
 					}
-				} else if (slave.skill.vaginal >= 20) {
-					slave.skill.vaginal -= 10;
-					skillsLost.push(slave);
 				} else if (slave.skill.oral >= 20) {
 					slave.skill.oral -= 10;
 					skillsLost.push(slave);
 				} else if (slave.skill.anal >= 20) {
 					slave.skill.anal -= 10;
 					skillsLost.push(slave);
+				} else if (slave.skill.vaginal >= 20) {
+					slave.skill.vaginal -= 10;
+					skillsLost.push(slave);
+				} else if (slave.skill.penetrative >= 20) {
+					slave.skill.penetrative -= 10;
+					skillsLost.push(slave);
 				} else if (slave.career !== "a bioreactor") {
 					slave.career = "a bioreactor";
 					careerForgotten.push(slave);
diff --git a/src/endWeek/reports/masterSuiteReport.js b/src/endWeek/reports/masterSuiteReport.js
index 131fb2f8028043adb51502d7dbfb0564e936c4c8..e4676e7a9ba0921fe34c37f84e20cb8a8c468ba8 100644
--- a/src/endWeek/reports/masterSuiteReport.js
+++ b/src/endWeek/reports/masterSuiteReport.js
@@ -88,7 +88,7 @@ App.EndWeek.masterSuiteReport = function() {
 			S.Concubine.devotion += 2;
 			S.Concubine.trust += 2;
 		}
-		repX(Beauty(S.Concubine) * 5 + (S.Concubine.skill.vaginal || 0) + (S.Concubine.skill.anal || 0) + (S.Concubine.skill.oral || 0) + (S.Concubine.skill.whoring || 0) + (S.Concubine.skill.entertainment || 0), "concubine", S.Concubine);
+		repX(Beauty(S.Concubine) * 5 + (adjustedPenSkill(S.Concubine, true) || 0) + (S.Concubine.skill.vaginal || 0) + (S.Concubine.skill.anal || 0) + (S.Concubine.skill.oral || 0) + (S.Concubine.skill.whoring || 0) + (S.Concubine.skill.entertainment || 0), "concubine", S.Concubine);
 
 		App.Events.addNode(frag, r);
 
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 6de1a22d0bf5abb178ff264726b003853b665769..93b6e502abe1771e64db66721e835825b2b01a8f 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -246,6 +246,9 @@ App.EndWeek.penthouseReport = function() {
 			case "fuck skill":
 				r.push(`isn't as skilled at vaginal intercourse as ${he} is.`);
 				break;
+			case "penetrative skill":
+				r.push(`isn't as skilled at penetration as ${he} is.`);
+				break;
 			case "whore skill":
 				r.push(`isn't as skilled at the fine art of sex for money as ${he} is.`);
 				break;
@@ -382,6 +385,7 @@ App.EndWeek.penthouseReport = function() {
 				slave.trust += 1;
 			}
 
+			// These all need to be have sex act incrementors added to them. Or is it handled somewhere else?
 			if (headGirlsTraining === "obedience") {
 				slave.training = 0;
 				effectiveness -= (slave.intelligence + slave.intelligenceImplant) / 3;
@@ -476,13 +480,28 @@ App.EndWeek.penthouseReport = function() {
 				} else if (S.HeadGirl.dick > 0 && canPenetrate(S.HeadGirl)) {
 					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick. Your Head Girl uses ${his} penis as an effective teaching tool. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`);
 					slaveSkillIncrease('vaginal', slave, random(5, 10));
-				} else if (S.HeadGirl.clit > 2) {
+				} else if (S.HeadGirl.clit >= 3) {
 					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a phallus. Your Head Girl uses ${his} pseudophallus-sized clit as an effective teaching tool. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`);
 					slaveSkillIncrease('vaginal', slave, random(5, 10));
 				} else {
 					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`);
 				}
 				slaveSkillIncrease('vaginal', slave, Math.ceil(effectiveness / 10));
+			} else if (headGirlsTraining === "penetrative skill") {
+				slave.training = 0;
+				if (S.HeadGirl.energy > 95) {
+					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to properly fuck a ${girl}. Your Head Girl's enthusiasm for sex is infectious. ${slave.slaveName}'s <span class="green">penetrative skills have improved.</span>`);
+					slaveSkillIncrease('penetrative', slave, random(5, 10));
+				} else if (S.HeadGirl.vagina > 0 && canDoVaginal(S.HeadGirl) && S.HeadGirl.fetish === "pregnancy" && S.HeadGirl.fetishStrength > 60) {
+					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to properly fuck a ${girl}. Your Head Girl uses ${his} pussy as an effective teaching tool. ${slave.slaveName}'s <span class="green">penetrative skills have improved.</span>`);
+					slaveSkillIncrease('penetrative', slave, random(5, 10));
+				} else if (S.HeadGirl.anus > 0 && canDoAnal(S.HeadGirl) && S.HeadGirl.fetish === Fetish.BUTTSLUT && S.HeadGirl.fetishStrength > 60) {
+					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to properly fuck a ${girl}. Your Head Girl uses ${his} rear hole as an effective teaching tool. ${slave.slaveName}'s <span class="green">penetrative skills have improved.</span>`);
+					slaveSkillIncrease('penetrative', slave, random(5, 10));
+				} else {
+					r.push(`In spare moments ${he} teaches ${slave.slaveName} how to properly fuck a ${girl}. ${slave.slaveName}'s <span class="green">penetrative skills have improved.</span>`);
+				}
+				slaveSkillIncrease('penetrative', slave, Math.ceil(effectiveness / 10));
 			} else if (headGirlsTraining === "whore skill") {
 				slave.training = 0;
 				r.push(`In spare moments ${he} teaches ${slave.slaveName} how to prostitute ${himself2}. ${slave.slaveName}'s <span class="green">whoring skills have improved.</span>`);
@@ -717,6 +736,8 @@ App.EndWeek.penthouseReport = function() {
 							HGPossibleSlaves[5].push({ID: slave.ID, training: "oral skill"});
 						} else if (slave.skill.vaginal < S.HeadGirl.skill.vaginal && slave.vagina > 0 && canDoVaginal(slave)) {
 							HGPossibleSlaves[5].push({ID: slave.ID, training: "fuck skill"});
+						} else if (slave.skill.penetrative < S.HeadGirl.skill.penetrative && penetrativeSocialUse(slave) >= 40) {
+							HGPossibleSlaves[5].push({ID: slave.ID, training: "penetrative skill"});
 						} else if (slave.skill.anal < S.HeadGirl.skill.anal && slave.anus > 0 && canDoAnal(slave)) {
 							HGPossibleSlaves[5].push({ID: slave.ID, training: "anal skill"});
 						} else if (slave.skill.whoring < S.HeadGirl.skill.whoring) {
diff --git a/src/endWeek/reports/personalAttention.js b/src/endWeek/reports/personalAttention.js
index 75baabd3e431f0766bd5fdd20d0fba0a3668e580..3a18c86c14fb29109a8ac0922735fad38eb3a27f 100644
--- a/src/endWeek/reports/personalAttention.js
+++ b/src/endWeek/reports/personalAttention.js
@@ -102,6 +102,7 @@ App.PersonalAttention.slaveReport = function(slave) {
 	let coloredText;
 	let trainingEfficiency;
 	let vaginalTrainingEfficiency;
+	let dickTrainingEfficiency;
 	let analTrainingEfficiency;
 	let seed;
 	let skillgainS = false;
@@ -1076,11 +1077,13 @@ App.PersonalAttention.slaveReport = function(slave) {
 				trainingEfficiency += 10;
 			}
 			if (pcHorny) {
+				// wip
 			} else if (pcFrigid) {
 				r.push(`Needing to teach sex while having no desire to have any complicates matters. You do your best to put up an effort when it comes to practical lessons, but it is far too little to be effective.`);
 				trainingEfficiency *= .25;
 			}
 			trainingEfficiency *= hindranceModSex;
+			/*
 			if (hindranceModSex <= .3) {
 				r.push(`With how difficult it is for you to get around, you end up only taking a fraction of the jobs you would normally consider. That is also not taking into account just how easily identifiable someone with your physique is to the public.`);
 			} else if (hindranceModSex <= .5) {
@@ -1088,6 +1091,7 @@ App.PersonalAttention.slaveReport = function(slave) {
 			} else if (hindranceModSex <= .7) {
 				r.push(`You keep missing out on opportunities between the difficulties getting places with your reduced mobility and the increased risk of your physical hindrances making you identifiable.`);
 			}
+			*/
 			Math.max(1, trainingEfficiency);
 
 			if (slave.vagina >= 0) {
@@ -1102,6 +1106,11 @@ App.PersonalAttention.slaveReport = function(slave) {
 			} else if (slave.anus === 0 || !canDoAnal(slave)) {
 				analTrainingEfficiency = Math.trunc(trainingEfficiency / 2);
 			}
+			if (slave.dick === 0 || !canAchieveErection(slave)) {
+				dickTrainingEfficiency = Math.trunc(trainingEfficiency / 4);
+			} else {
+				dickTrainingEfficiency = Math.trunc(trainingEfficiency / 2);
+			}
 			if (slave.devotion > 50) {
 				r.push(`${He}'s devoted to you, making sexual training much easier.`);
 			} else if (slave.devotion > 20) {
@@ -1144,6 +1153,10 @@ App.PersonalAttention.slaveReport = function(slave) {
 				r.push(`Since ${he}'s anally unskilled, and not an anal virgin, you start with ${his} ass.`);
 				r.push(App.UI.DOM.makeElement("span", `${His} anal skills have improved.`, "lime"));
 				r.push(slaveSkillIncrease('anal', slave, trainingEfficiency));
+			} else if (slave.skill.penetrative <= 10 && slave.dick > 0 && canPenetrate(slave)) { // WIP
+				r.push(`Since ${he} is unskilled at using ${his} cock, you start with ${his} dick.`);
+				r.push(App.UI.DOM.makeElement("span", `${His} penetrative skills have improved.`, "lime"));
+				r.push(slaveSkillIncrease('penetrative', slave, trainingEfficiency));
 			} else if (slave.skill.oral <= 30) {
 				r.push(`Since ${he}'s sexually experienced, you work with ${him} on the finer points of oral sex.`);
 				r.push(App.UI.DOM.makeElement("span", `${His} oral skills have improved.`, "lime"));
@@ -1178,6 +1191,23 @@ App.PersonalAttention.slaveReport = function(slave) {
 				}
 				r.push(App.UI.DOM.makeElement("span", `${His} anal skills have improved.`, "lime"));
 				r.push(slaveSkillIncrease('anal', slave, trainingEfficiency));
+			} else if (slave.skill.penetrative <= 30 && slave.dick > 0 && canPenetrate(slave)) { // wip
+				r.push(`Since ${he}'s experienced in penetrating others, you work with ${him} on the finer points of pleasing with ${his} dick. ${He} can already can enter any orifice smoothly, but ${his} control over the pace and the depth and strength of the penetration required at every moment could be improved. ${He} works ${his} Kegel muscles to improve ${his} sexual performance and practices with`);
+				let orifices = [];
+				if (V.policies.sexualOpenness === 1 || slave.toyHole === "dick") {
+					if (V.PC.vagina > 0 && canDoVaginal(V.PC)) {
+						orifices.push("vagina");
+					}
+					if (V.PC.anus > 0 && canDoAnal(V.PC)) {
+						orifices.push("anus");
+					}
+					orifices.push("mouth");
+					orifices[0] = "your " + orifices[0];
+				}
+				orifices.push("the holes of the other slaves you indicate.");
+				r.push(toSentence(orifices));
+				r.push(App.UI.DOM.makeElement("span", `${His} penetrative skills have improved.`, "lime"));
+				r.push(slaveSkillIncrease('penetrative', slave, trainingEfficiency));
 			} else if (slave.skill.vaginal <= 10 && slave.vagina >= 0) {
 				r.push(`Since ${he}'s vaginally unskilled,`);
 				if (slave.vagina === 0 && !canDoVaginal(slave)) {
@@ -1202,6 +1232,18 @@ App.PersonalAttention.slaveReport = function(slave) {
 				r.push(`you explain the basics of anal sex to ${him}.`);
 				r.push(App.UI.DOM.makeElement("span", `${His} anal skills have improved.`, "lime"));
 				r.push(slaveSkillIncrease('anal', slave, analTrainingEfficiency));
+			} else if (slave.skill.penetrative <= 10) { // wip
+				r.push(`Since ${he}'s unskilled penetrating others,`);
+				if (slave.chastityPenis) {
+					r.push(`and ${his} penis is caged,`);
+				} else if (!canAchieveErection(slave)) {
+					r.push(`and can't achieve an erection,`);
+				} else {
+					r.push(`and can't penetrate regular holes,`);
+				}
+				r.push(`you explain the basics of penetrative sex to ${him}.`);
+				r.push(App.UI.DOM.makeElement("span", `${His} penetrative skills have improved.`, "lime"));
+				r.push(slaveSkillIncrease('penetrative', slave, dickTrainingEfficiency));
 			} else if (slave.skill.oral < 100) {
 				r.push(`${He} is already a skilled oral whore, but ${his} skills can be polished further. You train ${him} in the basics of`);
 				if (V.seePee === 1) {
@@ -1276,6 +1318,17 @@ App.PersonalAttention.slaveReport = function(slave) {
 				r.push(App.UI.DOM.makeElement("span", `${His} anal skills have improved,`, "lime"));
 				r.push(`but it's a slow process without practical experience.`);
 				r.push(slaveSkillIncrease('anal', slave, analTrainingEfficiency));
+			} else if (slave.skill.penetrative <= 30 && canAchieveErection(slave)) { // wip
+				r.push(`Since ${he} has only rudimentary penetrative skills,`);
+				if (slave.chastityPenis) {
+					r.push(`and ${his} penis is caged,`);
+				} else {
+					r.push(`and can't penetrate regular holes,`);
+				}
+				r.push(`you spend time teaching ${him} sexual positions and how to someday use ${his} cock to its potential. You have ${him} work ${his} Kegel muscles all week to prepare ${him} for the future.`);
+				r.push(App.UI.DOM.makeElement("span", `${His} penetrative skills have improved,`, "lime"));
+				r.push(`but it's a slow process without practical experience.`);
+				r.push(slaveSkillIncrease('penetrative', slave, dickTrainingEfficiency));
 			} else if (slave.skill.vaginal < 100 && slave.vagina >= 0) {
 				r.push(`${He} already a skilled pussy slut,`);
 				if (slave.vagina === 0 && !canDoVaginal(slave)) {
diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js
index 288894ec0e9277f04f618928e75885bcd2fd04a4..604f72b56ab950b855b54448c8774832e1e3ea5a 100644
--- a/src/endWeek/saGetMilked.js
+++ b/src/endWeek/saGetMilked.js
@@ -565,7 +565,13 @@
 					if (S.Milkmaid.dick > 4 && canAchieveErection(S.Milkmaid)) {
 						const milkmaidPronouns = getPronouns(S.Milkmaid);
 						r.text += ` ${S.Milkmaid.slaveName} sometimes stands in for the machines, which is a polite way of saying ${milkmaidPronouns.he} sometimes fucks ${slave.slaveName}'s ass to help ${him} cum.`;
-						r.cum *= 1.2;
+						if (S.Milkmaid.skill.penetrative > 90) {
+							r.cum *= 1.3;
+						} else if (S.Milkmaid.skill.penetrative > 10) {
+							r.cum *= 1.2;
+						} else {
+							r.cum *= 1.1;
+						}			
 					}
 				}
 			}
diff --git a/src/endWeek/saLiveWithHG.js b/src/endWeek/saLiveWithHG.js
index bb20968e1b45208d2bc83bf0eef4ae8aa5a85923..f5df4531199700fd852131152f81e34cfec4ea87 100644
--- a/src/endWeek/saLiveWithHG.js
+++ b/src/endWeek/saLiveWithHG.js
@@ -518,6 +518,9 @@ App.SlaveAssignment.liveWithHG = function saliveWithHG(slave) {
 		} else if (slave.vagina > 0 && canDoVaginal(slave) && slave.skill.vaginal <= 30) {
 			r.push(`${HG.slaveName} wants ${his2} personal sex slave to be as skilled with ${his} pussy as possible, so ${he2} trains ${slave.slaveName}'s vaginal skills.`);
 			r.push(slaveSkillIncrease('vaginal', slave, 10));
+		} else if (((HG.vagina > 0 && canDoVaginal(HG)) || (HG.anus > 0 && canDoAnal(HG))) && slave.dick > 0 && canPenetrate(slave) && slave.skill.penetrative <= 30) {
+			r.push(`${HG.slaveName} wants ${his2} personal sex slave to be as skilled with ${his} dick as possible, so ${he2} trains ${slave.slaveName}'s penetrative skills.`);
+			r.push(slaveSkillIncrease('penetrative', slave, 10));
 		} else if (slave.anus > 0 && canDoAnal(slave) && slave.skill.anal <= 30) {
 			r.push(`${HG.slaveName} wants ${his2} personal sex slave to be a skillful backdoor whore, so ${he2} trains ${slave.slaveName}'s anal skills.`);
 			r.push(slaveSkillIncrease('anal', slave, 10));
diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js
index df07c15fa9f6b30ee9330758157d347e4f4f1bb9..e81b0a89d2841501e1f43c3365b52450dad6e54a 100644
--- a/src/endWeek/saLongTermEffects.js
+++ b/src/endWeek/saLongTermEffects.js
@@ -218,6 +218,13 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 					r.push(`${He}'s trained to perform thorough mechanical obedience, <span class="flaw break">utterly destroying ${his} sexual deficiencies.</span>`);
 					slave.sexualFlaw = SexualFlaw.NONE;
 				}
+				if (canAchieveErection(slave)) {
+					r.push(`${He} is trained to become erect on command, to endure having ${his} phallus ridden for as long as desired, to ejaculate on demand, or refrain from doing so if ordered.`);
+					if (slave.skill.penetrative > 25) {
+						r.push(`Since ${his} cock is now a simple accessory to the suit, ${he} <span class="stat drop">quickly loses the finer techniques ${he} once had.</span>`);
+						slave.skill.penetrative = 25;
+					}
+				}
 			} else if (slave.fuckdoll <= 75) {
 				r.push(`This week ${he} <span class="fuckdoll">begins to learn more advanced commands</span> from ${his} suit. ${He} is taught a command that instructs ${him} to take a more active role in penetrative sex. When that command is given, ${he} must fuck ${himself} against any`);
 				if (V.PC.dick !== 0) {
diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js
index fd3cb702e6481ecd28482dac2b1c6cfc67acbb86..264c11e2dcca4fdda5d6797dcc6f6a79238e1b28 100644
--- a/src/endWeek/saPleaseYou.js
+++ b/src/endWeek/saPleaseYou.js
@@ -1148,6 +1148,10 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				r.push(`Spending so much intimate time with an attractive woman <span class="green">reconciles ${him} to serving the fairer sex.</span>`);
 				slave.behavioralFlaw = BehavioralFlaw.NONE;
 			}
+			if (slave.skill.penetrative < 100 && (slave.devotion >= -20 || slave.trust > 20)) {
+				r.push(`You find ${his} ability to fuck you unsatisfactory, so you work to <span class="green">improve ${his} penetrative skills.</span>`);
+				r.push(slaveSkillIncrease("penetrative", slave, trainingEfficiency));
+			}
 		}
 		seX(slave, "penetrative", V.PC, canDoVaginal(V.PC) ? "vaginal" : "anal", penetrativeUse);
 		if (canImpreg(V.PC, slave)) {
@@ -1263,6 +1267,10 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				r.push(`Spending so much intimate time with an attractive woman <span class="green">reconciles ${him} to serving the fairer sex.</span>`);
 				slave.behavioralFlaw = BehavioralFlaw.NONE;
 			}
+			if (slave.skill.penetrative < 100 && (slave.devotion >= -20 || slave.trust > 20)) {
+				r.push(`You find ${his} technique lacks refinement, so you work to <span class="green">improve ${his} penetrative skills.</span>`);
+				r.push(slaveSkillIncrease("penetrative", slave, trainingEfficiency));
+			}
 		}
 		seX(slave, "penetrative", V.PC, "oral", penetrativeUse);
 		if (V.policies.sexualOpenness === 0) {
diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js
index bae984a353622be934c2d2c5a580a08fac9e1e11..fbf9690206b2461570271a8e8c4e77ddbcf84e98 100644
--- a/src/endWeek/saRecruitGirls.js
+++ b/src/endWeek/saRecruitGirls.js
@@ -1153,7 +1153,7 @@ App.SlaveAssignment.recruitGirls = function recruitGirls(slave) {
 			if (slave.accent <= 1) {
 				if (totalInt > 50) {
 					if (totalInt > 95) {
-						if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal >= 400) {
+						if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal + slave.skill.penetrative >= 400) {
 							pushFS(`Each week ${he} hosts ${his} own seminar demonstrating new and exciting sexual techniques, some even of ${his} own creation.`);
 							seed += 1;
 						} else {
@@ -1162,7 +1162,7 @@ App.SlaveAssignment.recruitGirls = function recruitGirls(slave) {
 						seed += 2;
 						FSdefend++;
 						arcology.FSSlaveProfessionalism += 0.01 * V.FSSingleSlaveRep * FSIntMod;
-					} else if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal >= 400) {
+					} else if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal + slave.skill.penetrative >= 400) {
 						pushFS(`${He} participates in a weekly article showcasing skills every slave needs. However, only being able to recite learned information limits ${him}.`);
 						seed += 1;
 					} else {
diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js
index 03f06324888eace4124a9893ab261acde37b8dd6..58c3399515a74066ebc2096f1cf08f0a01896d58 100644
--- a/src/endWeek/saRelationships.js
+++ b/src/endWeek/saRelationships.js
@@ -1097,7 +1097,7 @@ App.SlaveAssignment.relationships = function saRelationships(slave) {
 				}
 			}
 			if (lover.actualAge - slave.actualAge > 10 && slave.relationship >= 4 && random(1, 300) > (slave.intelligence + slave.intelligenceImplant + lover.intelligence + lover.intelligenceImplant) && lover.devotion > 75 && lover.trust > 50 && (lover.intelligence + lover.intelligenceImplant > 15) && (slave.devotion > 20 || (slave.devotion >= -20 && slave.trust < -20) || slave.trust > -10)) {
-				if ((lover.skill.oral > slave.skill.oral) || (lover.skill.anal > slave.skill.anal) || (lover.skill.vaginal > slave.skill.vaginal && slave.vagina >= 0 && lover.vagina >= 0) || (lover.trust > slave.trust)) {
+				if ((lover.skill.oral > slave.skill.oral) || (lover.skill.anal > slave.skill.anal) || (lover.skill.vaginal > slave.skill.vaginal && slave.vagina >= 0 && lover.vagina >= 0) || (lover.skill.penetrative > slave.skill.penetrative && canPenetrate(slave) && (lover.vagina > 0 || lover.anus > 0)) || (lover.trust > slave.trust)) {
 					r.push(`${slave.slaveName}'s`);
 					if (slave.relationship >= 5) {
 						r.push(`${wife2}`);
@@ -1108,15 +1108,24 @@ App.SlaveAssignment.relationships = function saRelationships(slave) {
 					if (lover.skill.oral > slave.skill.oral) {
 						r.push(`better at blowjobs than ${he} is. They are such good slaves that the senior ${girl2} serves as a mentor to the junior, improving ${his} oral skills.`);
 						r.push(slaveSkillIncrease('oral', slave, 5));
-					} else if (lover.skill.anal > slave.skill.anal) {
-						r.push(`better at`);
-						if (lover.anus > 0) {
-							r.push(`taking a buttfuck`);
+					} else if (lover.skill.penetrative > slave.skill.penetrative && canPenetrate(slave) && (lover.vagina > 0 || lover.anus > 0)) {
+						if (canPenetrate(lover)) {
+							r.push(`a better lover`);
+						} else if (lover.dick > 0) {
+							r.push(`better with ${his2} unusable dick`);
+						} else if (lover.clit >= 3) {
+							r.push(`better with ${his2} clit`);
 						} else {
-							r.push(`using ${his2} rear`);
+							r.push(`better with a strapon`);
 						}
-						r.push(`than ${he} is, and they are such good slaves that the senior ${girl2} serves as a mentor to the junior, improving ${his} anal skills.`);
-						r.push(slaveSkillIncrease('anal', slave, 5));
+						r.push(`than ${he}`);
+						if (canPenetrate(lover)) {
+							r.push(`is,`);
+						} else {
+							r.push(`is with ${his} cock,`);
+						}
+						r.push(`and they are such good slaves that the senior ${girl2} serves as a mentor to the junior, improving ${his} penetrative skills.`);
+						r.push(slaveSkillIncrease('penetrative', slave, 5));
 					} else if (lover.skill.vaginal > slave.skill.vaginal && slave.vagina > 0 && lover.vagina > 0) {
 						if (lover.vagina > 0) {
 							r.push(`a better lover`);
@@ -1131,6 +1140,15 @@ App.SlaveAssignment.relationships = function saRelationships(slave) {
 						}
 						r.push(`and they are such good slaves that the senior ${girl2} serves as a mentor to the junior, improving ${his} vaginal skills.`);
 						r.push(slaveSkillIncrease('vaginal', slave, 5));
+					} else if (lover.skill.anal > slave.skill.anal) {
+						r.push(`better at`);
+						if (lover.anus > 0) {
+							r.push(`taking a buttfuck`);
+						} else {
+							r.push(`using ${his2} rear`);
+						}
+						r.push(`than ${he} is, and they are such good slaves that the senior ${girl2} serves as a mentor to the junior, improving ${his} anal skills.`);
+						r.push(slaveSkillIncrease('anal', slave, 5));
 					} else if (lover.trust > slave.trust) {
 						r.push(`a better slave than ${he} is, and they are such obedient slaves that the senior ${girl2} serves as a mentor to the junior, <span class="trust inc">improving ${his} trust.</span>`);
 						slave.trust += 5;
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index 5b9bd4a3da7d6fc185a0fc0865694472d8d99d52..36588d64c7a339c5de8102a7dcf520e2d0e17b3b 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -495,7 +495,7 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 				slave.devotion += 4;
 			}
 		} else {
-			if ((slave.skill.oral + slave.skill.anal >= 200) && ((slave.skill.vaginal >= 100) || !canDoVaginal(slave))) {
+			if ((slave.skill.oral >= 100) && ((slave.skill.anal >= 100) || !canDoAnal(slave)) && ((slave.skill.vaginal >= 100) || !canDoVaginal(slave)) && (slave.skill.penetrative >= 100 && canPenetrate(slave))) {
 				r += ` ${He}'s a <span class="slave skill">sexual master</span> `;
 				if (canDoVaginal(slave)) {
 					r += `whose`;
@@ -509,7 +509,17 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 					r += ` front hole, ${his}`;
 				}
 				r += ` charms are only for the <span class="green">most prominent citizens.</span> When ${he}'s not `;
-				if (canDoVaginal(slave) && jsRandom(1, 4) === 1) {
+				if (slave.sexAmount > 70 && jsRandom(1, 3) === 1) {
+					r += `getting gangbanged,`;
+				} else if (adjustedPenSkill(slave, true) >= 100 && canPenetrate(slave) && jsRandom(1, 3) === 1) {
+					r += `plunging ${his} `;
+					if (slave.prestige > 1 || slave.porn.prestige > 2) {
+						r += `coveted`;
+					} else {
+						r += `renowned`;
+					}
+					r += ` cock into some lucky hole,`;
+				} else if (canDoVaginal(slave) && jsRandom(1, 2) === 1) {
 					r += `pleasing high society with ${his} `;
 					if (slave.prestige > 1 || slave.porn.prestige > 2) {
 						r += `prestigious`;
@@ -517,17 +527,7 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 						r += `popular`;
 					}
 					r += ` pussy,`;
-				} else if (slave.sexAmount > 70 && jsRandom(1, 3) === 1) {
-					r += `getting gangbanged,`;
-				} else if (jsRandom(1, 2) === 1) {
-					r += `giving away one of ${his} `;
-					if (slave.prestige > 1 || slave.porn.prestige > 2) {
-						r += `famous`;
-					} else {
-						r += `top-tier`;
-					}
-					r += ` blowjobs,`;
-				} else {
+				} else if (jsRandom(1, 3) === 1 && canDoAnal(slave)) {
 					r += `providing free access to ${his} `;
 					if (slave.prestige > 1 || slave.porn.prestige > 2) {
 						r += `legendary`;
@@ -535,6 +535,14 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 						r += `notorious`;
 					}
 					r += ` anus,`;
+				} else {
+					r += `giving away one of ${his} `;
+					if (slave.prestige > 1 || slave.porn.prestige > 2) {
+						r += `famous`;
+					} else {
+						r += `top-tier`;
+					}
+					r += ` blowjobs,`;
 				}
 				r += ` ${he} offers personal training and sexual therapy.`;
 			} else {
@@ -553,6 +561,10 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 					skillIncrease = (5 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32) + V.analUseWeight);
 					r += ` ${slaveSkillIncrease('anal', slave, skillIncrease)}`;
 				}
+				if (canPenetrate(slave) || random(1, 100) < penetrativeSocialUse(slave)) {
+					skillIncrease = (5 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32) + V.penetrativeUseWeight);
+					r += ` ${slaveSkillIncrease('penetrative', slave, skillIncrease)}`;
+				}
 			}
 			if (!isAmputee(slave)) {
 				if (slave.skill.entertainment < 100) {
@@ -1298,22 +1310,25 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 			mammaryUse *= 2;
 		}
 		penetrativeUse = 0;
-		if (canDoVaginal(slave) && slave.clit > 1) {
+		if (canDoVaginal(slave) && slave.clit >= 3) {
 			penetrativeUse += (V.penetrativeUseWeight + (slave.skill.vaginal / 30) + slave.clit);
 		}
 		if (slave.dick && slave.chastityPenis !== 1) {
 			if (canPenetrate(slave)) {
-				penetrativeUse += (V.penetrativeUseWeight + slave.dick + Math.min(slave.balls, 10) / 4);
+				penetrativeUse += (V.penetrativeUseWeight + (slave.skill.penetrative / 30) + slave.dick + Math.min(slave.balls, 10) / 4);
 				if (slave.drugs === Drug.HYPERTESTICLE) {
 					penetrativeUse += Math.min(slave.balls, 5);
 				}
 			} else {
-				penetrativeUse += (V.penetrativeUseWeight + Math.min(slave.balls, 15) + Math.min(slave.balls, 10) / 8);
+				penetrativeUse += (V.penetrativeUseWeight + (slave.skill.penetrative / 30) + Math.min(slave.balls, 15) + Math.min(slave.balls, 10) / 8);
 				if (slave.drugs === Drug.HYPERTESTICLE) {
 					penetrativeUse += Math.min(slave.balls, 5);
 				}
 			}
 		}
+		if (penetrativeSocialUse(slave) >= 20) {
+			penetrativeUse += Math.random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
+		}
 
 		const demand = (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse);
 
@@ -1395,6 +1410,10 @@ App.SlaveAssignment.serveThePublic = function saServeThePublic(slave) {
 								slave.need -= analUse;
 							}
 						}
+						if (penetrativeUse > 0 && isVirile(slave) && canPenetrate(slave)) {
+							r += ` ${He} got special sexual satisfaction from the times this week that ${he} wasn't required to wear a condom before dumping ${his} load in someone.`;
+							slave.need -= Math.max(1, penetrativeUse * .5);
+						}
 						break;
 					case Fetish.HUMILIATION:
 						r += ` ${He} enjoys the humiliation of being a public slut, and got a bit of sexual satisfaction from every sex act ${he} performed this week.`;
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index 07b3b403eef9345d5dc4862264f9a6a941273660..150c8189db7aefd23925e21184c78f027996877b 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -1225,7 +1225,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 					r.push(`Since ${domName} loves hard cocks, ${subName} finds ${himself} being sucked, groped, and toyed with. ${He} spends the week complying with ${domName}'s amusements. <span class="hotpink">${domName} enjoys having a nice dick right at hand,</span> even if it's too big to fit in ${him}.`);
 				} else {
 					r.push(`Since ${domName} loves hard cocks, ${subName} finds ${himself} being sucked, groped, and played with until ${he} comes. ${He} spends the week enjoying with ${domName}'s little games. <span class="hotpink">${domName} enjoys having a nice dick right at hand,</span> even if it's too big to fit in ${him}.`);
-				}			
+				}
 			} else if (slave.dick > 6 && slave.balls > 0) {
 				if (slave.devotion < -20) {
 					r.push(`Since ${domName} loves cocks, even big soft ones, ${subName} finds ${himself} being sucked, groped, and cruelly taunted for ${his} inability to get hard. ${He} spends the week trying to avoid ${domName}'s abuse of ${his} poor oversized penis. <span class="hotpink">${domName} enjoys having a nice dick right at hand,</span> even if it's only good for taunting and torture.`);
@@ -1811,14 +1811,14 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 * @param {"oral"|"vaginal"|"anal"} skillName
-	 * @param {number} skillValue
+	 * @param {"oral"|"vaginal"|"anal"|"penetrative"} skillName
+	 * @param {number} skillUse
 	 */
-	function increaseSkillFromCumdump(slave, skillName, skillValue) {
-		if (skillValue < 30) {
-			r.push(slaveSkillIncrease(skillName, slave, (Math.floor((oralUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
-		} else if (skillValue < 100) {
-			r.push(slaveSkillIncrease(skillName, slave, (Math.floor((oralUse / 4) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
+	function increaseSkillFromCumdump(slave, skillName, skillUse) {
+		if (slave.skill[skillName] < 30) {
+			r.push(slaveSkillIncrease(skillName, slave, (Math.floor((skillUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
+		} else if (slave.skill[skillName] < 100) {
+			r.push(slaveSkillIncrease(skillName, slave, (Math.floor((skillUse / 4) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
 		}
 	}
 
@@ -1827,16 +1827,23 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 	 */
 	function slaveSkills(slave) {
 		if (jobType === "stud") {
-			// Penetrative skill goes here.
+			if (slave.fuckdoll === 0 && slave.fetish !== Fetish.MINDBROKEN) {
+				if (slave.career === "a breeding bull" || slave.devotion > 20) {
+					r.push(slaveSkillIncrease("penetrative", slave, 2));
+				}
+			}
 		} else if (jobType === "cumdump") {
 			if (oralUse > 0) {
-				increaseSkillFromCumdump(slave, "oral", slave.skill.oral);
+				increaseSkillFromCumdump(slave, "oral", oralUse);
 			}
 			if (vaginalUse > 0) {
-				increaseSkillFromCumdump(slave, "vaginal", slave.skill.vaginal);
+				increaseSkillFromCumdump(slave, "vaginal", vaginalUse);
 			}
 			if (analUse > 0) {
-				increaseSkillFromCumdump(slave, "anal", slave.skill.anal);
+				increaseSkillFromCumdump(slave, "anal", analUse);
+			}
+			if (penetrativeUse > 0) {
+				increaseSkillFromCumdump(slave, "penetrative", penetrativeUse);
 			}
 		} else if (jobType === "sub") {
 			const {his2} = getPronouns(domSlave).appendSuffix('2');
@@ -1865,6 +1872,14 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 						r.push(slaveSkillIncrease('anal', slave, (Math.floor((analUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
 					}
 				}
+				if (penetrativeUse > 0) {
+					if (slave.skill.penetrative < domSlave.skill.penetrative) {
+						r.push(`${domName} is better at fucking others than ${subName} is, so ${he2} gives ${him} some pointers to improve ${his} skills.`);
+						r.push(slaveSkillIncrease('penetrative', slave, (Math.floor(penetrativeUse + Math.floor(slave.intelligence + slave.intelligenceImplant) / 32))));
+					} else if (slave.skill.penetrative < 30) {
+						r.push(slaveSkillIncrease('penetrative', slave, (Math.floor((penetrativeUse / 2) + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))));
+					}
+				}
 			}
 		}
 	}
diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js
index 1e6005f76133dd36254bfd1e3b6b31f2810cd6bd..e870ab5c6a88a2373539116ac400ff85086c9a91 100644
--- a/src/endWeek/saSocialEffects.js
+++ b/src/endWeek/saSocialEffects.js
@@ -588,7 +588,7 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 				t.push(new SocialEffect("Slave Professionalism", -2, `Can't speak ${V.language} or be silent`,
 					`Society <span class="red">dislikes</span> ${slave.slaveName}'s inability to properly speak ${V.language} or hold ${his} tongue; allowing such a flaw hinders the notion of professional slavery.`));
 			}
-			if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal >= 400) {
+			if (slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal + adjustedPenSkill(slave) >= 400) {
 				t.push(new SocialEffect("Slave Professionalism", 1, `Highly skilled`,
 					`Society <span class="green">appreciates</span> a slave with skills of ${slave.slaveName}'s caliber.`));
 			}
@@ -651,7 +651,7 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 				t.push(new SocialEffect("Body Purist", 1, `Makeup-free beauty`,
 					`Society <span class="green">approves</span> of keeping ${his} naturally beautiful face makeup-free.`));
 			} else if (slave.makeup > 1) {
-				t.push(new SocialEffect("Body Purist", 1, `Heavy makeup`,
+				t.push(new SocialEffect("Body Purist", -1, `Heavy makeup`,
 					`Society <span class="red">disapproves</span> of ${his} heavy makeup, which covers up ${his} natural features.`));
 			}
 		} else if (FutureSocieties.isActive('FSTransformationFetishist')) {
diff --git a/src/endWeek/saTakeClasses.js b/src/endWeek/saTakeClasses.js
index 5503d872f56cadd609c4e90c293b3cda09a69f07..792d5f30567ba266bb8d3aea9457fb5f99e583ea 100644
--- a/src/endWeek/saTakeClasses.js
+++ b/src/endWeek/saTakeClasses.js
@@ -337,6 +337,12 @@ App.SlaveAssignment.takeClasses = function saTakeClasses(slave) {
 			} else if (slave.skill.anal <= 10 && slave.anus >= 0) {
 				set.add(`Since ${he} is a novice at taking it up ${his} butt and not permitted to learn through practice, ${he} is taught relaxation exercises and other simple anal basics.`);
 				set.add(slaveSkillIncrease('anal', slave, skillIncrease));
+			} else if (slave.skill.penetrative <= 10 && penetrativeSocialUse() >= 40 && (canPenetrate(slave) || slave.clit >= 3)) {
+				set.add(`Since ${he} is a novice at using ${his} ${slave.clit < 3 ? "dick" : "phallic clit"}, ${he} is taught the basics of foreplay, insertion and movement.`);
+				set.add(slaveSkillIncrease('penetrative', slave, skillIncrease));
+			} else if (slave.skill.penetrative <= 10 && penetrativeSocialUse() >= 40) {
+				set.add(`Since ${he} is a novice at penetrating others with a phallus, ${he} is taught the basics of foreplay, insertion and movement.`);
+				set.add(slaveSkillIncrease('penetrative', slave, skillIncrease));
 			} else if (slave.skill.whoring <= 10) {
 				set.add(`Since ${he} has little idea what's involved in selling ${his} body, ${he} is taught basic safety practices and other simple prostitution skills.`);
 				set.add(slaveSkillIncrease('whoring', slave, skillIncrease));
@@ -359,6 +365,9 @@ App.SlaveAssignment.takeClasses = function saTakeClasses(slave) {
 				} else if (slave.skill.anal <= 30) {
 					set.add(`Having completed the basic sex slave curriculum, ${he} studies more advanced techniques and exotic positions to make use of ${his} ${(slave.anus === 0) ? `virgin ass for use in ${his} first time` : `ass`}.`);
 					set.add(slaveSkillIncrease('anal', slave, skillIncrease));
+				} else if (slave.skill.penetrative <= 30 && penetrativeSocialUse() >= 40) {
+					set.add(`Having completed the basic sex slave curriculum, ${he} studies more advanced techniques and exotic positions to ${canPenetrate(slave) ? `make use of ${his} penis` : `better penetrate others`}.`);
+					set.add(slaveSkillIncrease('penetrative', slave, skillIncrease));
 				}
 			}
 		}
@@ -769,6 +778,9 @@ App.SlaveAssignment.takeClasses = function saTakeClasses(slave) {
 		if (slave.vagina >= 0 && (slave.skill.vaginal <= 10 || (V.schoolroomUpgradeSkills > 0 && slave.skill.vaginal <= 30))) {
 			return;
 		}
+		if (penetrativeSocialUse() >= 40 && (slave.skill.penetrative <= 10 || (V.schoolroomUpgradeSkills > 0 && slave.skill.penetrative <= 30))) {
+			return;
+		}
 		if (needsTutoring(slave)) {
 			return;
 		}
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index 5d62b91610c5169362abc9c676601eb77f178334..48066543f149cf2a2dff39df484c01fc4845bc6b 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -397,43 +397,53 @@ App.SlaveAssignment.whore = function(slave) {
 			} else {
 				let canA = canDoAnal(slave) ? 1 : 0;
 				let canV = canDoVaginal(slave) ? 1 : 0;
+				let canP = canPenetrate(slave) && penetrativeSocialUse(slave) >= 40 ? 1 : 0;
 				let skillTarget = 100 +
 					(
-						(slave.skill.anal - 100) * canA * (1.5 - 0.5 * canV) +
-						(slave.skill.vaginal - 100) * canV * (1.5 - 0.5 * canA) +
-						(slave.skill.oral - 100) * (3 - 1.5 * canA - 1.5 * canV + canA * canV)
-					) * 3 / 10;
+						(slave.skill.anal - 100) * canA * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(slave.skill.vaginal - 100) * canV * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(slave.skill.penetrative - 100) * canP * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(slave.skill.oral - 100) * [12, 6, 4, 3][canA + canV + canP] // 100 -> 1200, 600, 400, 300
+					) / 120;
 				// Complicated, I know - but it should automatically account for what acts are possible to scale the injury risk smoothly between 90% when totally unskilled
 				// and 0% when perfectly skilled in the relevant method or methods.
 
 				if (jsRandom(1, 100) > skillTarget) {
-					healthDamage(slave, 10 - 7 * canA * canV);		// Any limitations means an injury inflicts the harsher 10 instead of 3
+					healthDamage(slave, 10 - 7 * canA * (canV | canP));		// Any limitations means an injury inflicts the harsher 10 instead of 3
 					injury = 1;
 				}
 
-				if (slave.vagina < 0) {
-					if (!injury) {
-						r += ` ${He}'s such an expert whore that ${he} copes with the stress of being a ${SlaveTitle(slave)} slut.`;
-					} else {
-						r += ` The stress of being a ${SlaveTitle(slave)} prostitute is <span class="health dec">hard on ${him}.</span>`;
-					}
-				} else if (!canV && canA) {
-					if (!injury) {
-						r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to buttsex and oral.`;
-					} else {
-						r += ` The stress of being limited to buttsex and oral is <span class="health dec">hard on ${him}.</span>`;
-					}
-				} else if (!canA && canV) {
-					if (!injury) {
-						r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to vaginal and oral.`;
-					} else {
-						r += ` The stress of being limited to vaginal and oral is <span class="health dec">hard on ${him}.</span>`;
-					}
-				} else if (!canA && !canV) {
-					if (!injury) {
-						r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to oral.`;
-					} else {
-						r += ` The stress of being limited to oral sex is <span class="health dec">hard on ${him}.</span>`;
+				if (canA + canV + canP < 2){
+					if (slave.vagina < 0) {
+						if (!injury) {
+							r += ` ${He}'s such an expert whore that ${he} copes with the stress of being a ${SlaveTitle(slave)} slut.`;
+						} else {
+							r += ` The stress of being a ${SlaveTitle(slave)} prostitute is <span class="health dec">hard on ${him}.</span>`;
+						}
+					} else if (canA) {
+						if (!injury) {
+							r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to buttsex and oral.`;
+						} else {
+							r += ` The stress of being limited to buttsex and oral is <span class="health dec">hard on ${him}.</span>`;
+						}
+					} else if (canV) {
+						if (!injury) {
+							r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to vaginal and oral.`;
+						} else {
+							r += ` The stress of being limited to vaginal and oral is <span class="health dec">hard on ${him}.</span>`;
+						}
+					} else if (canP) {
+						if (!injury) {
+							r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to penetrative and oral.`;
+						} else {
+							r += ` The stress of being limited to penetrative and oral is <span class="health dec">hard on ${him}.</span>`;
+						}
+					} else if (canA + canV + canP === 0) {
+						if (!injury) {
+							r += ` ${He}'s such an expert whore that ${he} copes with the stress of being limited to oral.`;
+						} else {
+							r += ` The stress of being limited to oral sex is <span class="health dec">hard on ${him}.</span>`;
+						}
 					}
 				}
 			}
@@ -610,6 +620,14 @@ App.SlaveAssignment.whore = function(slave) {
 						r += `popular`;
 					}
 					r += ` pussy,`;
+				} else if (adjustedPenSkill(slave, true) >= 100 && canPenetrate(slave) && jsRandom(1, 3) === 1) {
+					r += `plunging ${his} `;
+					if (slave.prestige > 1 || slave.porn.prestige > 2) {
+						r += `coveted`;
+					} else {
+						r += `renowned`;
+					}
+					r += ` cock into some wealthy hole,`;
 				} else if (beauty > 70 && jsRandom(1, 3) === 1) {
 					r += `getting gangbanged,`;
 				} else if (jsRandom(1, 2) === 1) {
@@ -648,6 +666,10 @@ App.SlaveAssignment.whore = function(slave) {
 					skillIncrease = (5 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32) + V.analUseWeight);
 					r += ` ${slaveSkillIncrease('anal', slave, skillIncrease)}`;
 				}
+				if (canPenetrate(slave) || random(1, 100) < penetrativeSocialUse(slave)) {
+					skillIncrease = (5 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32) + V.penetrativeUseWeight);
+					r += ` ${slaveSkillIncrease('penetrative', slave, skillIncrease)}`;
+				}
 			}
 		}
 	}
@@ -1382,22 +1404,25 @@ App.SlaveAssignment.whore = function(slave) {
 			mammaryUse *= 2;
 		}
 		penetrativeUse = 0;
-		if (canDoVaginal(slave) && slave.clit > 1) {
+		if (canDoVaginal(slave) && slave.clit >= 3) {
 			penetrativeUse += (V.penetrativeUseWeight + (slave.skill.vaginal / 30) + slave.clit);
 		}
 		if (slave.dick && slave.chastityPenis !== 1) {
 			if (canPenetrate(slave)) {
-				penetrativeUse += (V.penetrativeUseWeight + slave.dick + Math.min(slave.balls, 10) / 4);
+				penetrativeUse += (V.penetrativeUseWeight + (slave.skill.penetrative / 30) + slave.dick + Math.min(slave.balls, 10) / 4);
 				if (slave.drugs === Drug.HYPERTESTICLE) {
 					penetrativeUse += Math.min(slave.balls, 5);
 				}
 			} else {
-				penetrativeUse += (V.penetrativeUseWeight + Math.min(slave.balls, 15) + Math.min(slave.balls, 10) / 8);
+				penetrativeUse += (V.penetrativeUseWeight + (slave.skill.penetrative / 30) + Math.min(slave.balls, 15) + Math.min(slave.balls, 10) / 8);
 				if (slave.drugs === Drug.HYPERTESTICLE) {
 					penetrativeUse += Math.min(slave.balls, 5);
 				}
 			}
 		}
+		if (penetrativeSocialUse(slave) >= 20) {
+			penetrativeUse += Math.random(0, V.penetrativeUseWeight + (slave.skill.penetrative / 30));
+		}
 
 		const demand = (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse);
 		oralUse = Math.trunc((oralUse / demand) * beauty);
@@ -1478,6 +1503,10 @@ App.SlaveAssignment.whore = function(slave) {
 								slave.need -= analUse;
 							}
 						}
+						if (penetrativeUse > 0 && isVirile(slave) && canPenetrate(slave)) {
+							r += ` ${He} got special sexual satisfaction from the times this week that ${he} wasn't required to wear a condom before dumping ${his} load in someone.`;
+							slave.need -= Math.max(1, penetrativeUse * .5);
+						}
 						break;
 					case Fetish.HUMILIATION:
 						r += ` ${He} enjoys the humiliation of being a whore, and got a bit of sexual satisfaction from every sex act ${he} performed this week.`;
diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js
index b8e0ecb48dd66028cd127ceeedae489e4d045954..9b84a1bac7403856b70933823f3ce3843df2778f 100644
--- a/src/endWeek/slaveAssignmentReport.js
+++ b/src/endWeek/slaveAssignmentReport.js
@@ -21,7 +21,8 @@ App.EndWeek.slaveAssignmentReport = function() {
 		entertainment: "entertain",
 		vaginal: "vaginal",
 		anal: "anal",
-		oral: "oral"
+		oral: "oral",
+		penetrative: "penetrative"
 	};
 
 	const res = document.createDocumentFragment();
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index b08ee41e103bd8bd791b02d7378f2e4478baa136..98dbd06e55391423d7697c60b4d72ea1f94d1d38 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -1828,8 +1828,16 @@ globalThis.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDeman
 			App.EndWeek.saVars.madamBonus += 0.05 * Math.floor((-0.00008 * madamIntel * madamIntel) + (0.0337 * madamIntel) + 0.5);
 		}
 		if (madam.dick > 2 && canPenetrate(madam)) {
-			// $His turgid dick helps $him manage the bitches.
-			App.EndWeek.saVars.madamBonus += 0.05;
+			if (S.Madam.skill.penetrative > 90) {
+				// $His skilled dick incentivizes the bitches to behave.
+				App.EndWeek.saVars.madamBonus += 0.07;
+			} else if (S.Madam.skill.penetrative > 10) {
+				// $His turgid dick helps $him manage the bitches.
+				App.EndWeek.saVars.madamBonus += 0.05;
+			} else {
+				// `$He tries to use $his turgid cock to keep the bitches in line, but $his lack of skill only leaves them off kilter.
+				App.EndWeek.saVars.madamBonus -= 0.05;
+			}
 		}
 		for (const slave of App.Entity.facilities.brothel.employees()) {
 			if (madam.relationshipTarget === slave.ID) {
@@ -1851,7 +1859,7 @@ globalThis.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDeman
 				}
 			} else if (slave.prestigeDesc === "$He is remembered for winning best in show as a cockmilker.") {
 				if (FutureSocieties.isActive('FSGenderFundamentalist')) {
-					if (slave.balls === 0 && slave.dick === 0 && slave.vagina > -1) { /* this needs review - doesn't fit right. An XY slave would be expected to be masculine. */
+					if (slave.balls === 0 && slave.dick === 0 && slave.vagina > -1) { /* this needs review - doesn't fit right. An XY slave would be expected to be masculine. 5.0.0 */
 						App.EndWeek.saVars.madamBonus += 0.20;
 					}
 				} else if ((slave.balls > 5 && slave.dick !== 0) || (slave.balls > 4 && slave.dick !== 0 && slave.prostate > 1)) {
@@ -1960,12 +1968,17 @@ globalThis.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDeman
 				} else {
 					const canA = canDoAnal(s) ? 1 : 0;
 					const canV = canDoVaginal(s) ? 1 : 0;
-					let skilltarget = (100 + ((s.skill.anal - 100) * canA * (1.5 - 0.5 * canV) + (s.skill.vaginal - 100) * canV * (1.5 - 0.5 * canA) + (s.skill.oral - 100) * (3 - 1.5 * canA - 1.5 * canV + canA * canV)) * 3 / 10);
+					let canP = canPenetrate(s) && penetrativeSocialUse(s) >= 40 ? 1 : 0;
+					let skilltarget = (100 + (s.skill.anal - 100) * canA * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(s.skill.vaginal - 100) * canV * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(s.skill.penetrative - 100) * canP * [0, 6, 4, 3][canA + canV + canP] + // 100 -> 0, 600, 400, 300
+						(s.skill.oral - 100) * [12, 6, 4, 3][canA + canV + canP] // 100 -> 1200, 600, 400, 300
+						) / 120;
 					// Complicated, I know - but it should automatically account for what acts are possible to scale the injury risk smoothly between 90% when totally unskilled
 					// and 0% when perfectly skilled in the relevant method or methods.
 
 					if (jsRandom(1, 100) > skilltarget) {
-						healthDamage(s, 10 - 7 * canA * canV); // Any limitations means an injury inflicts the harsher 10 instead of 3
+						healthDamage(s, 10 - 7 * canA * (canV | canP)); // Any limitations means an injury inflicts the harsher 10 instead of 3
 						s.minorInjury = 1;
 					}
 				}
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index faf89e7803fbbe26b54a495819301d204f22da2f..bd6c5b936f3ddf249d8968bb54d39842a013fac7 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -439,7 +439,7 @@ globalThis.BeautyArray = function(slave) {
 			}
 		}
 		if (arcologyInfo.fsActive('FSSlaveProfessionalism')) {
-			adjustBeauty("Skilled: Slave Professionalism", ((arcology.FSSlaveProfessionalism / 50) * ((slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal) / 100))); /* 10 */
+			adjustBeauty("Skilled: Slave Professionalism", ((arcology.FSSlaveProfessionalism / 50) * ((slave.skill.entertainment + slave.skill.whoring + slave.skill.oral + slave.skill.anal + slave.skill.vaginal + adjustedPenSkill(slave)) / 100))); /* 10 */
 		}
 		if (arcologyInfo.fsActive('FSYouthPreferentialist')) {
 			if (slave.visualAge < 30) {
@@ -1882,7 +1882,7 @@ globalThis.FResultArray = (function() {
 			adjustFResult(`Muscles: weak`, -2);
 		}
 
-		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight;
+		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight + V.penetrativeUseWeight;
 		if (uses <= 0) {
 			return;
 		}
@@ -1906,6 +1906,12 @@ globalThis.FResultArray = (function() {
 				adjustFResult(`Anal potential: Aphrodisiac inflation`, (V.analUseWeight / uses) * (slave.inflation * 3));
 			}
 		}
+		if (canPenetrate(slave)) {
+			adjustFResult(`Dick use potential: skill, and arcology penetrative weight`, (6 + slave.piercing.dick.weight) * (V.penetrativeUseWeight / uses) * (slave.skill.penetrative / 30));
+			adjustFResult(`Dick use potential: Dick size`, (slave.dick < 7 ? Math.floor(slave.dick / 2) : Math.round((slave.dick - 8) / 2)));
+		} else if (penetrativeSocialUse() >= 20) {
+			adjustFResult(`Penetrative potential: skill, and arcology penetrative weight`, (6 + slave.piercing.dick.weight) * (V.penetrativeUseWeight / uses) * (slave.skill.penetrative / 30));
+		}			
 	}
 
 	/**
@@ -2921,6 +2927,9 @@ globalThis.slaveCostBeauty = function(slave, isStartingSlave, followLaws, isSpec
 		if (slave.skill.vaginal) {
 			startingSlaveMultiplier += 0.00001 * slave.skill.vaginal * slave.skill.vaginal;
 		}
+		if (slave.skill.penetrative > 10) {
+			startingSlaveMultiplier += 0.00001 * slave.skill.penetrative * slave.skill.penetrative;
+		}
 		if (slave.skill.anal) {
 			startingSlaveMultiplier += 0.00001 * slave.skill.anal * slave.skill.anal;
 		}
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index e25992d84e48d41cad05c2c3865a7722a6cda4b9..903a4581e7eb0bd962be3d9a27555f9e306f7893 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -1239,7 +1239,7 @@ globalThis.isHorny = function(actor) {
  * @param {FC.HumanState} actor
  * @returns {boolean}
  */
-globalThis.acceptsUnderage = function(actor) {
+globalThis.acceptsUnderage = function(actor) { // should this consider slaves below an age threshold?
 	return (actor.fetish === Fetish.MINDBROKEN ||
 		(actor.behavioralQuirk === "sinful") ||
 		(actor.devotion > 50) || 
diff --git a/src/npc/databases/dSlavesDatabase.js b/src/npc/databases/dSlavesDatabase.js
index 058fdcf9cf3189f54a76c58b27cc1e653cd3416e..369fb4baa455680a51fe1eded081e7fee1cf10d2 100644
--- a/src/npc/databases/dSlavesDatabase.js
+++ b/src/npc/databases/dSlavesDatabase.js
@@ -128,6 +128,7 @@ App.Data.HeroSlaves.D = [
 			vaginal: 35,
 			oral: 35,
 			anal: 35,
+			penetrative: 15,
 			combat: 65
 		},
 		intelligence: -20,
@@ -265,6 +266,7 @@ App.Data.HeroSlaves.D = [
 			vaginal: 15,
 			oral: 15,
 			anal: 15,
+			penetrative: 15,
 			combat: 15,
 		},
 		attrXX: 80,
@@ -315,6 +317,7 @@ App.Data.HeroSlaves.D = [
 			vaginal: 100,
 			oral: 100,
 			anal: 100,
+			penetrative: 35,
 			combat: 65,
 		},
 		clothes: "restrictive latex",
@@ -357,6 +360,7 @@ App.Data.HeroSlaves.D = [
 			vaginal: 100,
 			oral: 100,
 			anal: 100,
+			penetrative: 35,
 			entertainment: 100
 		},
 		intelligence: 25,
@@ -1034,6 +1038,7 @@ App.Data.HeroSlaves.D = [
 		ovaries: 1,
 		skill: {
 			vaginal: 35,
+			penetrative: 35,
 			oral: 35,
 			anal: 35
 		},
@@ -1702,6 +1707,7 @@ App.Data.HeroSlaves.D = [
 		skill: {
 			vaginal: 100,
 			oral: 100,
+			penetrative: 35,
 			anal: 100
 		},
 		clothes: "slutty jewelry",
@@ -2780,6 +2786,7 @@ App.Data.HeroSlaves.D = [
 		ovaries: 1,
 		skill: {
 			vaginal: 15,
+			penetrative: 15,
 			oral: 35
 		},
 		clothes: "a slave gown",
@@ -3266,6 +3273,7 @@ App.Data.HeroSlaves.D = [
 			vaginal: 100,
 			oral: 100,
 			anal: 100,
+			penetrative: 100,
 			whoring: 100,
 			entertainment: 100,
 			combat: 100
diff --git a/src/npc/databases/ddSlavesDatabase.js b/src/npc/databases/ddSlavesDatabase.js
index 8aaa94edc5e3081bf9adee6ec3b86cca45d652e1..e22491063e6dc73ed434f21f81ec9735a593be62 100644
--- a/src/npc/databases/ddSlavesDatabase.js
+++ b/src/npc/databases/ddSlavesDatabase.js
@@ -33,7 +33,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 1,
 		scrotum: 1,
-		skill: {oral: 35, anal: 100},
+		skill: {oral: 35, anal: 100, penetrative: 35},
 		intelligenceImplant: 30,
 		attrXX: 40,
 		attrXY: 40,
@@ -97,7 +97,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 1,
 		scrotum: 1,
-		skill: {oral: 15, anal: 15},
+		skill: {oral: 15, anal: 15, penetrative: 15},
 		attrXX: 40,
 		attrXY: 40,
 		fetish: "buttslut",
@@ -206,7 +206,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 2,
 		scrotum: 2,
-		skill: {oral: 100, anal: 100},
+		skill: {oral: 100, anal: 100, penetrative: 65},
 		intelligence: 100,
 		intelligenceImplant: 30,
 		attrXX: 40,
@@ -316,7 +316,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 2,
 		scrotum: 2,
-		skill: {oral: 35, anal: 35},
+		skill: {oral: 35, anal: 35, penetrative: 15},
 		clothes: "a slave gown",
 		intelligence: -20,
 		attrXX: 40,
@@ -439,7 +439,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 1,
 		scrotum: 1,
-		skill: {oral: 15, anal: 15},
+		skill: {oral: 15, anal: 15, penetrative: 15},
 		clothes: "attractive lingerie",
 		intelligence: -20,
 		attrXX: 40,
@@ -521,7 +521,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 2,
 		scrotum: 2,
-		skill: {oral: 35, anal: 15},
+		skill: {oral: 35, anal: 15, penetrative: 15},
 		clothes: "restrictive latex",
 		intelligence: 25,
 		intelligenceImplant: 30,
@@ -565,7 +565,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 2,
 		scrotum: 2,
-		skill: {oral: 15, anal: 15},
+		skill: {oral: 15, anal: 15, penetrative: 15},
 		intelligence: 98,
 		intelligenceImplant: 30,
 		attrXX: 40,
@@ -640,7 +640,7 @@ App.Data.HeroSlaves.DD = [
 		balls: 3,
 		scrotum: 3,
 		anusTat: "bleached",
-		skill: {oral: 100, anal: 100},
+		skill: {oral: 100, anal: 100, penetrative: 100},
 		attrXX: 40,
 		attrXY: 40,
 		fetishKnown: 1,
@@ -674,7 +674,7 @@ App.Data.HeroSlaves.DD = [
 		prostate: 1,
 		balls: 1,
 		anusTat: "bleached",
-		skill: {oral: 15, combat: 15},
+		skill: {oral: 15, penetrative: 15, combat: 15},
 		intelligence: 30,
 		attrXX: 40,
 		attrXY: 40,
@@ -715,7 +715,7 @@ App.Data.HeroSlaves.DD = [
 		balls: 3,
 		scrotum: 3,
 		anusTat: "bleached",
-		skill: {combat: 65},
+		skill: {combat: 65, penetrative: 35},
 		intelligence: 30,
 		intelligenceImplant: 30,
 		attrXX: 40,
@@ -755,7 +755,7 @@ App.Data.HeroSlaves.DD = [
 		balls: 3,
 		scrotum: 3,
 		anusTat: "bleached",
-		skill: {oral: 15},
+		skill: {oral: 15, penetrative: 15},
 		attrXX: 40,
 		attrXY: 40,
 		fetishKnown: 1,
@@ -797,7 +797,7 @@ App.Data.HeroSlaves.DD = [
 		balls: 2,
 		scrotum: 2,
 		anusTat: "bleached",
-		skill: {anal: 100, combat: 65},
+		skill: {anal: 100, combat: 65, penetrative: 35},
 		addict: 50,
 		intelligence: 20,
 		intelligenceImplant: 30,
@@ -843,7 +843,7 @@ App.Data.HeroSlaves.DD = [
 		shouldersTat: "tribal patterns",
 		armsTat: "rude words",
 		stampTat: "rude words",
-		skill: {oral: 100, entertainment: 15},
+		skill: {oral: 100, penetrative: 15, entertainment: 15},
 		clothes: "a slutty outfit",
 		collar: "pretty jewelry",
 		shoes: "heels",
@@ -908,6 +908,7 @@ App.Data.HeroSlaves.DD = [
 			vaginal: 35,
 			oral: 100,
 			anal: 100,
+			penetrative: 15,
 			whoring: 100,
 			entertainment: 35
 		},
@@ -960,7 +961,7 @@ App.Data.HeroSlaves.DD = [
 		scrotum: 4,
 		makeup: 1,
 		nails: 1,
-		skill: {entertainment: 35},
+		skill: {penetrative: 15, entertainment: 35},
 		clothes: "cutoffs and a t-shirt",
 		collar: "pretty jewelry",
 		shoes: "heels",
@@ -1017,7 +1018,7 @@ App.Data.HeroSlaves.DD = [
 		scrotum: 2,
 		anusTat: "flowers",
 		brand: {"back": "your initials"},
-		skill: {oral: 15, anal: 15, entertainment: 15},
+		skill: {oral: 15, anal: 15, penetrative: 15, entertainment: 15},
 		clothes: "a comfortable bodysuit",
 		collar: "pretty jewelry",
 		shoes: "heels",
@@ -1064,7 +1065,7 @@ App.Data.HeroSlaves.DD = [
 		scrotum: 2,
 		makeup: 1,
 		nails: 1,
-		skill: {oral: 15},
+		skill: {oral: 15, penetrative: 35},
 		collar: "pretty jewelry",
 		shoes: "heels",
 		intelligence: 100,
@@ -1121,7 +1122,7 @@ App.Data.HeroSlaves.DD = [
 		nails: 3,
 		legsTat: "flowers",
 		stampTat: "flowers",
-		skill: {oral: 100, anal: 100, whoring: 100},
+		skill: {oral: 100, anal: 100, penetrative: 65, whoring: 100},
 		clothes: "a slave gown",
 		collar: "pretty jewelry",
 		shoes: "heels",
@@ -1223,6 +1224,7 @@ App.Data.HeroSlaves.DD = [
 			vaginal: 35,
 			oral: 35,
 			anal: 15,
+			penetrative: 35,
 			whoring: 35,
 			entertainment: 35,
 			combat: 15
@@ -1288,6 +1290,7 @@ App.Data.HeroSlaves.DD = [
 			vaginal: 15,
 			oral: 100,
 			anal: 15,
+			penetrative: 100,
 			whoring: 15,
 			entertainment: 15,
 			combat: 35
@@ -1419,6 +1422,7 @@ App.Data.HeroSlaves.DD = [
 			vaginal: 100,
 			oral: 100,
 			anal: 100,
+			penetrative: 35,
 			whoring: 15,
 			entertainment: 35
 		},
@@ -1525,6 +1529,7 @@ App.Data.HeroSlaves.DDextreme = [
 		hStyle: "neat",
 		boobs: 400,
 		preg: -2,
+		skill: {penetrative: 15},
 		attrXX: 40,
 		attrXY: 40,
 		sexualFlaw: "hates penetration",
@@ -1562,7 +1567,7 @@ App.Data.HeroSlaves.DDextreme = [
 		preg: -2,
 		dick: 1,
 		anusTat: "bleached",
-		skill: {oral: 100},
+		skill: {oral: 100, penetrative: 35},
 		clothes: "a penitent nuns habit",
 		collar: "tight steel",
 		shoes: "heels",
@@ -1609,7 +1614,7 @@ App.Data.HeroSlaves.DDextreme = [
 		balls: 3,
 		scrotum: 3,
 		anusTat: "bleached",
-		skill: {combat: 65},
+		skill: {combat: 65, penetrative: 15},
 		intelligence: -40,
 		intelligenceImplant: 30,
 		attrXX: 40,
@@ -1713,7 +1718,7 @@ App.Data.HeroSlaves.DDextreme = [
 		intelligenceImplant: 30,
 		attrXX: 100,
 		attrXY: 0,
-		skill: {oral: 95},
+		skill: {oral: 95, penetrative: 95},
 		fetish: "submissive",
 		fetishKnown: 1,
 		behavioralQuirk: "advocate"
diff --git a/src/npc/databases/dfSlavesDatabase.js b/src/npc/databases/dfSlavesDatabase.js
index 67324f2ea859a833827baef4b12ec8b0dad44775..87b299ec904635c902a033a8a95241a677fde7b6 100644
--- a/src/npc/databases/dfSlavesDatabase.js
+++ b/src/npc/databases/dfSlavesDatabase.js
@@ -190,7 +190,7 @@ App.Data.HeroSlaves.DF = [
 		preg: -2,
 		anus: 2,
 		ovaries: 1,
-		skill: {vaginal: 35, oral: 100, anal: 35},
+		skill: {vaginal: 35, oral: 100, anal: 35, penetrative: 15},
 		attrXY: 40,
 		fetish: "submissive",
 		fetishKnown: 1,
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 930b0f8f3fc1167703ac59db7095952ef6cc7469..7708841f34a9058155884038bc61e173d326e147 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -45,6 +45,7 @@ App.StartingGirls.generate = function(params) {
 	slave.skill.oral = mapValue(slave.skill.oral, App.Data.StartingGirls.skill);
 	slave.skill.anal = mapValue(slave.skill.anal, App.Data.StartingGirls.skill);
 	slave.skill.vaginal = mapValue(slave.skill.vaginal, App.Data.StartingGirls.skill);
+	slave.skill.penetrative = mapValue(slave.skill.penetrative, App.Data.StartingGirls.skill);
 	slave.skill.whoring = mapValue(slave.skill.whoring, App.Data.StartingGirls.skill);
 	slave.skill.entertainment = mapValue(slave.skill.entertainment, App.Data.StartingGirls.skill);
 
@@ -121,6 +122,9 @@ App.StartingGirls.cleanup = function(slave) {
 	} else if ((slave.vagina > 2 && slave.skill.vaginal <= 10) || (slave.vagina === 0 && slave.skill.vaginal > 30)) {
 		slave.skill.vaginal = 15;
 	}
+	if (slave.physicalAge >= slave.pubertyAgeXY + 2 && slave.skill.penetrative <= 10) {
+		slave.skill.penetrative = 15;
+	}
 };
 
 /** Apply starting girl PC career bonus
@@ -139,6 +143,10 @@ App.StartingGirls.applyCareerBonus = function(slave) {
 		}
 		if ((seed > 0) && (slave.skill.vaginal < 60) && (slave.vagina > -1) && ((slave.vagina > 0) || (slave.skill.vaginal <= 10))) {
 			slave.skill.vaginal += 20;
+			seed--;
+		}
+		if ((seed > 0) && (slave.skill.penetrative < 60) && ((canPenetrate(slave) || slave.skill.penetrative <= 10))) {
+			slave.skill.penetrative +=20;
 		}
 	}
 
@@ -1533,6 +1541,7 @@ App.StartingGirls.lower = function(slave, cheat = false) {
 				slave.balls = 0;
 				slave.pubertyXY = 0;
 				slave.pubertyAgeXY = V.potencyAge;
+				slave.skill.penetrative = 0;
 			})
 			.addValue("Tiny", 1, () => slave.clit = 0)
 			.addValue("Small", 2, () => slave.clit = 0)
@@ -2013,6 +2022,11 @@ App.StartingGirls.skills = function(slave, cheat = false) {
 		App.StartingGirls.addSet(option, App.Data.StartingGirls.skill);
 	}
 
+	App.StartingGirls.addSet(
+		options.addOption("Penetrative sex", "penetrative", slave.skill),
+		App.Data.StartingGirls.skill);
+		option.addComment("Penetrative skills are usually not considered valuable.");
+
 	App.StartingGirls.addSet(
 		options.addOption("Prostitution", "whoring", slave.skill),
 		App.Data.StartingGirls.skill);
@@ -2026,7 +2040,7 @@ App.StartingGirls.skills = function(slave, cheat = false) {
 
 	// skill warning
 	const totalSkill = slave.skill.whoring + slave.skill.entertainment + slave.skill.vaginal
-		+ slave.skill.anal + slave.skill.oral + slave.skill.combat;
+		+ slave.skill.penetrative + slave.skill.anal + slave.skill.oral + slave.skill.combat;
 
 	if (totalSkill > 200 && !cheat) {
 		let comment = ["Starting slaves incur"];
diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js
index dbdacc91f568f7bc8a957fb3f03962f3c7838cf6..0a9908a0df9e037fb908c5e43a8af03c9ee86348 100644
--- a/src/npc/startingGirls/startingGirlsPassage.js
+++ b/src/npc/startingGirls/startingGirlsPassage.js
@@ -135,6 +135,7 @@ App.StartingGirls.passage = function() {
 						V.activeSlave.skill.anal = 0;
 						V.activeSlave.skill.oral = 0;
 						V.activeSlave.skill.vaginal = 0;
+						V.activeSlave.skill.penetrative = 0;
 						V.activeSlave.skill.whoring = 0;
 						V.activeSlave.skill.entertainment = 0;
 						V.activeSlave.skill.combat = 0;
@@ -167,6 +168,7 @@ App.StartingGirls.passage = function() {
 							V.activeSlave.skill.anal = 0;
 							V.activeSlave.skill.oral = 0;
 							V.activeSlave.skill.vaginal = 0;
+							V.activeSlave.skill.penetrative = 0;
 							V.activeSlave.skill.whoring = 0;
 							V.activeSlave.skill.entertainment = 0;
 							V.activeSlave.skill.combat = 0;
diff --git a/src/player/personalAttentionSelect.js b/src/player/personalAttentionSelect.js
index f2814fb9de0253dd0659247165423cc2fa71025e..0e66b115c5f1aceb4e343adb0d20a9b89ad5f8a4 100644
--- a/src/player/personalAttentionSelect.js
+++ b/src/player/personalAttentionSelect.js
@@ -632,7 +632,7 @@ App.UI.Player.personalAttention = function() {
 					]));
 				} else if (slave.skill.anal >= 100 &&
 					slave.skill.oral >= 100 &&
-					lave.skill.penetrative >= 30 &&
+					slave.skill.penetrative >= 30 &&
 					slave.skill.whoring >= whoreSkillCap &&
 					slave.skill.entertainment >= whoreSkillCap) {
 					if (slave.skill.vaginal >= 100) {