diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js
index 73b11a4b5d90dcab1bd124f1e1416dc6a352aa84..2c2ec8d7069a5df035a1bd99c2ac075e398a6176 100644
--- a/src/endWeek/saServant.js
+++ b/src/endWeek/saServant.js
@@ -91,8 +91,7 @@ window.saServant = function saServant(slave) {
 	// who is she serving and why aren't they benefiting?
 	// is the current number of servants correct to accomplish this task?
 	// why can't the player prevent this on-assignment sex while still getting the other benefits of having a servant?
-	const _oral = jsRandom(5, 10);
-	actX(slave, "oral", _oral);
+	actX(slave, "oral", jsRandom(5, 10));
 
 	if (slave.relationship === -2) {
 		t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`;
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index 46e6925734d63445ba6147cac384c6fdaf524885..ea5bb6298b446969cbfcf342bb1654f51ad1c31f 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1419,12 +1419,11 @@ window.saServeThePublic = (function saServeThePublic() {
 		mammaryUse = Math.trunc((mammaryUse / demand) * slave.sexAmount);
 		penetrativeUse = Math.trunc((penetrativeUse / demand) * slave.sexAmount);
 
-		actX(slave, "oral", oralUse);
-		actX(slave, "anal", analUse);
-		actX(slave, "vaginal", vaginalUse);
-		actX(slave, "mammary", mammaryUse);
-		actX(slave, "penetrative", penetrativeUse);
-		actX(slave, "publicUse", (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse));
+		seX(slave, "oral", "public", "penetrative", oralUse);
+		seX(slave, "anal", "public", "penetrative", analUse);
+		seX(slave, "vaginal", "public", "penetrative", vaginalUse);
+		seX(slave, "mammary", "public", "penetrative", mammaryUse);
+		seX(slave, "penetrative", "public", "penetrative", penetrativeUse);
 
 		cervixPump = 0;
 		if (slave.cervixImplant === 1 || slave.cervixImplant === 3) {
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index f996c8a1bd5a79f8f97c84c1d755dca2723eb23e..bbcdf82799c596914266c0b43567974dd6a5de7f 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -1501,12 +1501,11 @@ window.saWhore = (function saWhore() {
 		mammaryUse = Math.trunc((mammaryUse / demand) * beauty);
 		penetrativeUse = Math.trunc((penetrativeUse / demand) * beauty);
 
-		actX(slave, "oral", oralUse);
-		actX(slave, "anal", analUse);
-		actX(slave, "vaginal", vaginalUse);
-		actX(slave, "mammary", mammaryUse);
-		actX(slave, "penetrative", penetrativeUse);
-		actX(slave, "publicUse", (oralUse + analUse + vaginalUse + mammaryUse + penetrativeUse));
+		seX(slave, "oral", "public", "penetrative", oralUse);
+		seX(slave, "anal", "public", "penetrative", analUse);
+		seX(slave, "vaginal", "public", "penetrative", vaginalUse);
+		seX(slave, "mammary", "public", "penetrative", mammaryUse);
+		seX(slave, "penetrative", "public", "penetrative", penetrativeUse);
 
 		cervixPump = 0;
 		if (slave.cervixImplant === 1 || slave.cervixImplant === 3) {
diff --git a/src/endWeek/saWorkAGloryHole.js b/src/endWeek/saWorkAGloryHole.js
index d7fefd1a706696b0e006364b09a7c4273a4c695c..ec081f3da82542ecceebf933a27ca6203ea6f340 100644
--- a/src/endWeek/saWorkAGloryHole.js
+++ b/src/endWeek/saWorkAGloryHole.js
@@ -402,10 +402,9 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() {
 
 		slave.need -= ((analUse + vaginalUse) / 4);
 
-		actX(slave, "oral", oralUse);
-		actX(slave, "anal", analUse);
-		actX(slave, "vaginal", vaginalUse);
-		actX(slave, "publicUse", (oralUse + analUse + vaginalUse));
+		seX(slave, "oral", "public", "penetrative", oralUse);
+		seX(slave, "anal", "public", "penetrative", analUse);
+		seX(slave, "vaginal", "public", "penetrative", vaginalUse);
 
 		if (slave.cervixImplant === 1 || slave.cervixImplant === 3) {
 			cervixPump += (20 * vaginalUse);
diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js
index 3375204a38707d61a7f4185c72c92188403ca894..28a430801fb3b847c923f69673a8ed269eb6a147 100644
--- a/src/js/sexActsJS.js
+++ b/src/js/sexActsJS.js
@@ -378,59 +378,68 @@ window.SimpleSexAct = (function() {
 	function SimpleSlaveSlaveFucking(subslave, domslave, fuckCount = 1) {
 		let fuckTarget = 0;
 		let r = "";
+		let slave1ID;
+		let slave2ID;
+		let sex = "";
 
 		for (let j = 0; j < fuckCount; j++) {
 		// there is a reason randomization happens inside cycle - to spread fuck around, otherwise cycle isn't even needed
 			fuckTarget = jsRandom(1, 100);
 			if (subslave.nipples === "fuckable" && canPenetrate(domslave) && fuckTarget > 80) {
+				sex = "mammary";
 				if (passage() === "SA serve your other slaves") {
 					if (subslave.ID === V.slaves[V.i].ID) {
-						actX(V.slaves[V.i], "mammary");
-						actX(domslave, "penetrative");
+						slave1ID = V.slaves[V.i].ID;
+						slave2ID = domslave.ID;
 					} else {
-						actX(subslave, "mammary");
-						actX(V.slaves[V.i], "penetrative");
+						slave1ID = subslave.ID;
+						slave2ID = V.slaves[V.i].ID;
 					}
 				} else {
-					actX(subslave, "mammary");
-					actX(domslave, "penetrative");
+					slave1ID = subslave.ID;
+					slave2ID = domslave.ID;
 				}
 			} else if (canDoVaginal(subslave) && subslave.vagina > 0 && canPenetrate(domslave) && fuckTarget > 33) {
+				sex = "vaginal";
 				if (passage() === "SA serve your other slaves") {
 					if (subslave.ID === V.slaves[V.i].ID) {
-						actX(V.slaves[V.i], "vaginal");
-						actX(domslave, "penetrative");
+						slave1ID = V.slaves[V.i].ID;
+						slave2ID = domslave.ID;
 					} else {
-						actX(subslave, "vaginal");
-						actX(V.slaves[V.i], "penetrative");
+						slave1ID = subslave.ID;
+						slave2ID = V.slaves[V.i].ID;
 					}
 				} else {
-					actX(subslave, "vaginal");
-					actX(domslave, "penetrative");
+					slave1ID = subslave.ID;
+					slave2ID = domslave.ID;
 				}
 				if (canImpreg(subslave, domslave)) {
 					r += knockMeUp(subslave, 3, 0, domslave.ID, 1);
 				}
 			} else if (canDoAnal(subslave) && subslave.anus > 0 && canPenetrate(domslave) && fuckTarget > 10) {
-			// i think would impregnate from anal here even without .mpreg? same in original widget too
+				// i think would impregnate from anal here even without .mpreg? same in original widget too
+				sex = "anal";
 				if (canImpreg(subslave, domslave) && subslave.mpreg === 1) {
 					r += knockMeUp(subslave, 3, 1, domslave.ID, 1);
 				}
 				if (passage() === "SA serve your other slaves") {
 					if (subslave.ID === V.slaves[V.i].ID) {
-						actX(V.slaves[V.i], "anal");
-						actX(domslave, "penetrative");
+						slave1ID = V.slaves[V.i].ID;
+						slave2ID = domslave.ID;
 					} else {
-						actX(subslave, "anal");
-						actX(slave[V.i], "penetrative");
+						slave1ID = subslave.ID;
+						slave2ID = V.slaves[V.i].ID;
 					}
 				} else {
-					actX(subslave, "anal");
-					actX(domslave, "penetrative");
+					slave1ID = subslave.ID;
+					slave2ID = domslave.ID;
 				}
 			} else {
 				actX(subslave, "oral");
 			}
+			if (typeof slave1ID === Number  && typeof slave2ID === Number) {
+				seX(V.slaves[slave1ID], sex, V.slaves[slave2ID], "penetrative");
+			}
 		}
 		return r;
 	}
@@ -494,3 +503,23 @@ window.actX = function actX(slave, act, count = 1) {
 	}
 	slave.counter[act] += count;
 };
+
+/**
+ * Sex is between two.  This is a handy wrapper for actX that emphasizes that.
+ * @param {App.Entity.SlaveState} slave1 always a slave
+ * @param {string} act1 oral, anal, etc
+ * @param {App.Entity.SlaveState || string} slave2 slave or PC or "public"
+ * @param {string} act2 oral, anal, etc
+ * @param {number} count
+ */
+window.seX = function seX(slave1, act1, slave2, act2, count = 1) {
+	// Slave 1 does their normal thing
+	actX(slave1, act1, count);
+
+	// Slave 2 does their normal thing.  If "Slave 2" is the public, then increment the public counter for slave 1 instead.
+	if (slave2 === "public") {
+		actX(slave1, "publicUse", count);
+	} else {
+		actX(slave2, act2, count);
+	}
+};