diff --git a/game/03-JavaScript/05-renderer/00-combat.js b/game/03-JavaScript/05-renderer/00-combat.js
index 008974c0a49c0b6c414701ef4337825176b813e1..885994cc8ac427a0002943e6d84189d9abfb1630 100644
--- a/game/03-JavaScript/05-renderer/00-combat.js
+++ b/game/03-JavaScript/05-renderer/00-combat.js
@@ -207,7 +207,7 @@ class CombatSystem {
 	}
 
 	isFeetActive() {
-		const activeUse = V.feetuse === "penis";
+		const activeUse = V.feetuse === "penis" || V.feetstate === "tentacle";
 		return !!activeUse;
 	}
 
diff --git a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
index d54be9e7889106c218734cb8965b12ffecabbd52..d317d733c4cc6ad33af4b10bce8cd77e868be738 100644
--- a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
+++ b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
@@ -311,6 +311,46 @@ class NpcCanvasHelper {
 		return Object.assign(defaults, overrideOptions);
 	}
 
+	static genPenetratorInternalEjaculationLayer(overrideOptions = {}) {
+		/**
+		 * @type {CanvasModelLayers<NpcOptions>}
+		 */
+		const defaults = {
+			srcfn(options) {
+				const penetrator = options.penetrators[0];
+				if (penetrator == null) {
+					return "";
+				}
+				let cavity;
+				if (penetrator.position === "vagina") cavity = "vaginal";
+				if (penetrator.position === "anus") cavity = "anal";
+				if (penetrator.position === "mouth") cavity = "oral";
+				return `${options.src}/body/${cavity}/${cavity}cum.png`;
+			},
+			showfn(options) {
+				const penetrator = options.penetrators[0];
+				if (penetrator == null || !["vagina", "anus", "mouth", null].includes(penetrator.position)) {
+					return false;
+				}
+				return penetrator.show && penetrator.state === "penetrating" && penetrator.isEjaculating;
+			},
+			animationfn(options) {
+				return options.animKey;
+			},
+			zfn(options) {
+				const penetrator = options.penetrators[0];
+				if (penetrator == null) {
+					return 0;
+				}
+				if (penetrator.position === "mouth") {
+					return 73;
+				}
+				return 50;
+			},
+		};
+		return Object.assign(defaults, overrideOptions);
+	}
+
 	static genCondomLayer(overrideOptions = {}) {
 		/**
 		 * @type {CanvasModelLayers<NpcOptions>}
diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js
index 500c2c3d682f89ed4d059f9340c0013d7e849903..001df8282340858ce38973aa0f78e1cf0ff36966 100644
--- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js
+++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js
@@ -163,7 +163,7 @@ const combatCloseVagina = {
 				if (options.vagina.npc === "tentacle") {
 					return true;
 				}
-				return wearingCondom(V.vaginatarget) !== "worn" && !npcHasStrapon(V.vaginatarget);
+				return wearingCondom(V.vaginatarget) !== "worn" && !npcHasStrapon(V.vaginatarget) && !playerChastity("vagina");
 			},
 			animationfn(options) {
 				return options.animKeyVagina;
diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
index 54bd1c9a4b302bb4bd278d096934732fa021a65d..7d0d165e63afbdb11a7a81057a91bb3035841ca4 100644
--- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
+++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
@@ -96,6 +96,7 @@ const combatMainNpc = {
 		},
 		npcPenetrator: NpcCanvasHelper.genPenetratorLayer(),
 		npcPenetratorEjaculate: NpcCanvasHelper.genPenetratorEjaculationLayer(),
+		npcInternalEjaculate: NpcCanvasHelper.genPenetratorInternalEjaculationLayer(),
 		npcCondom: NpcCanvasHelper.genCondomLayer(),
 	},
 };
diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
index c1951a336c4a5a9a7933da04132023cd38178f34..fefc2dc18769cd3b541e7168e0b0396677c5f860 100644
--- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
+++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
@@ -454,6 +454,18 @@ const combatMainPc = {
 			filters: ["tentacles"],
 			z: 49,
 		},
+		tentacleAnalCum: {
+			srcfn(options) {
+				return `${options.src}body/anal/analcum.png`;
+			},
+			showfn(options) {
+				return options.tentacles.anus.show && V.anusstate === "tentacledeep";
+			},
+			animationfn(options) {
+				return options.animKey;
+			},
+			z: 50,
+		},
 		tentacleBreasts: {
 			srcfn(options) {
 				return `${options.src}tentacles/${options.tentacles.breasts.state}.png`;
@@ -551,6 +563,18 @@ const combatMainPc = {
 			filters: ["tentacles"],
 			z: 72,
 		},
+		tentacleOralCum: {
+			srcfn(options) {
+				return `${options.src}body/oral/oralcum.png`;
+			},
+			showfn(options) {
+				return options.tentacles.mouth.show && V.mouthstate === "tentacledeep";
+			},
+			animationfn(options) {
+				return options.animKey;
+			},
+			z: 73,
+		},
 		tentaclePenis: {
 			srcfn(options) {
 				return `${options.src}tentacles/${options.tentacles.penis.state}.png`;
@@ -577,6 +601,18 @@ const combatMainPc = {
 			filters: ["tentacles"],
 			z: 49,
 		},
+		tentacleVaginaCum: {
+			srcfn(options) {
+				return `${options.src}body/vaginal/vaginalcum.png`;
+			},
+			showfn(options) {
+				return options.tentacles.vagina.show && V.vaginastate === "tentacledeep";
+			},
+			animationfn(options) {
+				return options.animKey;
+			},
+			z: 50,
+		},
 		/*
 		 *	██████   █████  ███████ ███████
 		 *	██   ██ ██   ██ ██      ██