diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index be96ecaa4fa3a03b7e061875c405c78c336b5110..cafdacf412590f49130e3273ec29c7f5cfd2d2c1 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -85,6 +85,9 @@ globalThis.walkPast = (function() {
 						if (activeSlave.dick > 0 && (V.policies.sexualOpenness === 1 || activeSlave.toyHole === "dick")) {
 							watchArray.push(dickWatch);
 						}
+						if (activeSlave.dick > 0 && !activeSlave.chastityPenis && (V.policies.sexualOpenness === 1 || activeSlave.toyHole === "dick")) {
+							watchArray.push(suckDickWatch);
+						}
 						if (activeSlave.vagina >= 0) {
 							watchArray.push(vaginaWatch);
 						}
@@ -8310,7 +8313,7 @@ globalThis.walkPast = (function() {
 		return t;
 	}
 
-	/** Generate dick text for a given slave
+	/** Generate dick text for a given slave focused on penetrative sex
 	 * @param {App.Entity.SlaveState} slave
 	 * @returns {string}
 	 */
@@ -8911,6 +8914,608 @@ globalThis.walkPast = (function() {
 		return t;
 	}
 
+		/** Generate dick text for a given slave focused on oral sex
+	 * @param {App.Entity.SlaveState} slave
+	 * @returns {string}
+	 */
+		function suckDickWatch(slave) {
+			const {
+				he, him, his,
+				He, His,
+			} = getPronouns(slave);
+	
+			target = "fSuckDick";
+			// Desc dick and vag
+			t += App.Desc.crotch(slave);
+			t += ` `;
+			t += App.Desc.dick(slave);
+			t += ` `;
+			switch (slave.clothes) {
+				case "a Fuckdoll suit":
+					t += `${His} suit is expressly designed to encourage use of ${his} holes and dick.`;
+					break;
+				case "uncomfortable straps":
+					if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `A strap passes `;
+						if (hasBothLegs(slave)) {
+							t += `between ${his} legs, `;
+						} else {
+							t += `along ${his} perineum, `;
+						}
+						t += `and the big ring over ${his} hermaphroditic genitalia gleams from between them.`;
+					} else if (slave.dick !== 0) {
+						t += `A strap passes `;
+						if (hasBothLegs(slave)) {
+							t += `between ${his} legs, `;
+						} else {
+							t += `along ${his} perineum, `;
+						}
+						t += `and the ring around the base of ${his} cock gleams from between them.`;
+					} else {
+						t += `A strap passes `;
+						if (hasBothLegs(slave)) {
+							t += `between ${his} legs, `;
+						} else {
+							t += `along ${his} perineum, `;
+						}
+						t += `and the ring over ${his} pussy gleams from between them.`;
+					}
+					break;
+				case "shibari ropes":
+					t += `${His} ropes run tightly `;
+					if (hasBothLegs(slave)) {
+						t += `between ${his} legs, `;
+					} else {
+						t += `along ${his} perineum, `;
+					}
+					t += `pressing ${him} closely as ${he} moves.`;
+					break;
+				case "restrictive latex":
+					if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} cock and pussy stick out through a big hole in the latex.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} cock sticks out through a hole in the latex.`;
+					} else {
+						t += `As one of the only islands in the sea of `;
+						if (!(slave.clothingBaseColor)) {
+							t += `black `;
+						}
+						t += `latex, ${his} pussy is eye-catching.`;
+					}
+					break;
+				case "attractive lingerie for a pregnant woman":
+					if ((slave.dick > 4) && (slave.balls > 3)) {
+						t += `As ${he} moves, ${his} pretty panties totally fail to restrain ${his} huge cock and balls, which bounce around lewdly in mockery of ${his} lovely appearance.`;
+					} else if (slave.dick > 4) {
+						t += `As ${he} moves, ${his} pretty panties totally fail to restrain ${his} huge penis, which flops around lewdly in mockery of ${his} lovely appearance.`;
+					} else if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} pretty panties struggle to restrain ${his} penis.`;
+					} else {
+						t += `As ${he} moves, ${his} pretty panties daintily cover ${his} womanhood.`;
+					}
+					break;
+				case "kitty lingerie":
+					if (slave.dick > 5) {
+						t += `As ${he} moves, ${his} huge penis bulges out from the top of ${his} panties.`;
+					} else if (slave.dick > 3) {
+						t += `As ${he} moves, ${his} large penis bulges within ${his} panties.`;
+					} else if ((slave.dick > 0) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} silk panties daintily cover ${his} dual genitalia.`;
+					} else if (slave.dick > 0) {
+						t += `As ${he} moves, ${his} silk panties daintily cover ${his} penis.`;
+					} else if (slave.dick !== -1) {
+						t += `As ${he} moves, ${his} silk panties daintily cover ${his} womanhood.`;
+					} else {
+						t += `As ${he} moves, ${his} silk panties daintily cover ${his} void groin.`;
+					}
+					break;
+				case "a maternity dress":
+					if (slave.dick > 2) {
+						t += `As ${he} moves, something occasionally tents the front of ${his} dress.`;
+					} else {
+						t += `${His} loose dress gives no hints to what's inside it.`;
+					}
+					break;
+				case "stretch pants and a crop-top":
+					if (slave.dick > 2) {
+						t += `As ${he} moves, something occasionally tents the front of ${his} pants.`;
+					} else {
+						t += `${His} tight pants don't leave much to the imagination.`;
+					}
+					break;
+				case "attractive lingerie":
+					if ((slave.dick > 4) && (slave.balls > 3)) {
+						t += `As ${he} moves, ${his} pretty g-string totally fails to restrain ${his} huge cock and balls, which bounce around lewdly in mockery of ${his} lovely appearance.`;
+					} else if (slave.dick > 4) {
+						t += `As ${he} moves, ${his} pretty g-string totally fails to restrain ${his} huge penis, which flops around lewdly in mockery of ${his} lovely appearance.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} pretty g-string struggles to restrain ${his} hermaphroditic genitalia.`;
+					} else if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} pretty g-string struggles to restrain ${his} penis.`;
+					} else {
+						t += `As ${he} moves, ${his} pretty g-string daintily covers ${his} womanhood.`;
+					}
+					break;
+				case "a slutty maid outfit":
+					if ((slave.dick > 4) && (slave.balls > 3)) {
+						t += `${His} apron is cut very short in front. ${His} cock and balls are so big that ${he} hangs out beyond the hem of ${his} apron.`;
+					} else if (slave.dick > 4) {
+						t += `${His} apron is cut very short in front. ${His} dick is so big that its lower half dangles out of ${his} clothing.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} apron is cut very short in front, revealing frequent glimpses of ${his} dangling cock, and occasional hints of something more.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} apron is cut very short in front, revealing frequent glimpses of ${his} dangling cock.`;
+					} else {
+						t += `${His} apron is cut very short in front, revealing occasional glimpses of ${his} womanhood.`;
+					}
+					break;
+				case "a nice maid outfit":
+					if (slave.dick > 4) {
+						t += `As ${he} moves, something massive bulges against the front of ${his} apron.`;
+					} else if (slave.dick > 1) {
+						t += `As ${he} moves, something presses against the front of ${his} apron.`;
+					} else {
+						t += `${His} apron gives no hint of what's behind it.`;
+					}
+					break;
+				case "a hijab and abaya":
+				case "a niqab and abaya":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia bulges the front of ${his} abaya as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia is totally concealed by ${his} abaya.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis bulges the front of ${his} abaya as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis is totally concealed by ${his} abaya.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} vagina is totally concealed by ${his} abaya.`;
+					} else {
+						t += `${His} featureless groin is totally concealed by ${his} abaya.`;
+					}
+					break;
+				case "a klan robe":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia bulges the front of ${his} robe as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia is totally concealed by ${his} robe.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis bulges the front of ${his} robe as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis is totally concealed by ${his} robe.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} vagina is totally concealed by ${his} robe.`;
+					} else {
+						t += `${His} featureless groin is totally concealed by ${his} robe.`;
+					}
+					break;
+				case "overalls":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia tents out the front of ${his} overalls as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia sometimes bulges ${his} overalls as ${he} moves.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis tents out the front of ${his} overalls as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis sometimes bulges ${his} overalls as ${he} moves.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} overalls fits snugly on ${his} pussylips.`;
+					} else {
+						t += `${His} overalls fits snugly on ${his} featureless groin.`;
+					}
+					break;
+				case "a monokini":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia tents out the front of ${his} monokini as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia sometimes bulges ${his} monokini as ${he} moves.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis tents out the front of ${his} monokini as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis sometimes bulges ${his} monokini as ${he} moves.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} monokini clings to ${his} pussylips as ${he} moves.`;
+					} else {
+						t += `${His} monokini clings to ${his} featureless groin as ${he} moves.`;
+					}
+					break;
+				case "an apron":
+					if (slave.dick > 4) {
+						t += `${His} dick sometimes creates a bulge in ${his} apron as ${he} moves.`;
+					} else if ((slave.dick > 0) && (slave.vagina > -1)) {
+						t += `${His} apron exposes ${his} hermaphroditic genitalia if ${he} moves too quickly.`;
+					} else if (slave.dick > 0) {
+						t += `${His} apron exposes ${his} cock if ${he} moves too quickly.`;
+					} else if (slave.vagina > -1) {
+						t += `${His} apron exposes ${his} featureless groin if ${he} moves too quickly.`;
+					} else {
+						t += `${His} apron exposes ${his} pussy if ${he} moves too quickly.`;
+					}
+					break;
+				case "a cybersuit":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia tents out the front of ${his} bodysuit as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia sometimes bulges ${his} bodysuit as ${he} moves.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis tents out the front of ${his} bodysuit as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis sometimes bulges ${his} bodysuit as ${he} moves.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} bodysuit clings to ${his} pussylips as ${he} moves.`;
+					} else {
+						t += `${His} bodysuit clings to ${his} featureless crotch as ${he} moves.`;
+					}
+					break;
+				case "a tight Imperial bodysuit":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia tents out the front of ${his} bodysuit as ${he} moves.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitalia sometimes bulges ${his} bodysuit as ${he} moves.`;
+					} else if (slave.dick > 4) {
+						t += `${His} penis tents out the front of ${his} bodysuit as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} penis sometimes bulges ${his} bodysuit as ${he} moves.`;
+					} else if (slave.vagina !== -1) {
+						t += `${His} bodysuit clings to ${his} pussylips as ${he} moves.`;
+					} else {
+						t += `${His} bodysuit clings to ${his} featureless crotch as ${he} moves.`;
+					}
+					break;
+				case "a string bikini":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} g-string totally fails to restrain ${his} hermaphroditic genitalia.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} g-string struggles to restrain ${his} hermaphroditic genitalia.`;
+					} else if ((slave.dick > 4) && (slave.balls > 3)) {
+						t += `As ${he} moves, ${his} g-string totally fails to restrain ${his} huge penis, and occasionally gives ${his} huge scrotum a painful pinch.`;
+					} else if (slave.dick > 4) {
+						t += `As ${he} moves, ${his} g-string totally fails to restrain ${his} huge penis.`;
+					} else if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} pretty white g-string struggles to restrain ${his} penis, which adds to ${his} sluttiness as it escapes.`;
+					} else {
+						t += `As ${he} moves, ${his} g-string rides up between ${his} pussylips.`;
+					}
+					break;
+				case "a scalemail bikini":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} scalemail bottom fails to conceal ${his} hermaphroditic genitalia.`;
+					} else if (slave.dick > 4) {
+						t += `As ${he} moves, ${his} scalemail bottom fails to conceal ${his} huge penis.`;
+					} else if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} scalemail bottom covers ${his} penis.`;
+					} else {
+						t += `As ${he} moves, ${his} scalemail bottom conceals all.`;
+					}
+					break;
+				case "striped panties":
+					if ((slave.dick > 4) && (slave.vagina !== -1)) {
+						t += `As ${he} moves, ${his} cute panties fail to conceal ${his} hermaphroditic genitalia.`;
+					} else if (slave.dick > 4) {
+						t += `As ${he} moves, ${his} cute panties fail to conceal ${his} huge penis.`;
+					} else if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} cute panties cover ${his} penis.`;
+					} else {
+						t += `As ${he} moves, ${his} cute panties conceal all.`;
+					}
+					break;
+				case "clubslut netting":
+					if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} bare cock flops around, sticking through its hole in ${his} netting.`;
+					} else if (slave.vagina !== -1) {
+						t += `As ${he} moves, ${his} bare pussy beckons from its hole in ${his} netting.`;
+					} else {
+						t += `As ${he} moves, ${his} netting displays ${his} featureless groin.`;
+					}
+					break;
+				case "a cheerleader outfit":
+					if (slave.dick !== 0) {
+						t += `As ${he} moves, ${his} short pleated cheerleader skirt is bounced forward by something `;
+						if (hasBothLegs(slave)) {
+							t += `between ${his} legs.`;
+						} else {
+							t += `at ${his} crotch.`;
+						}
+					} else {
+						t += `As ${he} moves, ${his} short pleated cheerleader skirt shows off ${his} butt.`;
+					}
+					break;
+				case "cutoffs and a t-shirt":
+					if ((slave.dick > 4) && (slave.balls > 3)) {
+						t += `There's a huge bulge in the front of ${his} cutoffs.`;
+					} else if (slave.dick > 1) {
+						t += `There's a bulge in the front of ${his} cutoffs.`;
+					} else {
+						t += `${His} cutoffs conceal ${his} front enticingly.`;
+					}
+					break;
+				case "spats and a tank top":
+					if (slave.dick > 4) {
+						t += `${His} spats have a large, attention-drawing bulge that looks uncomfortable as ${he} moves around.`;
+					} else if (slave.dick > 1) {
+						t += `Something bulges against the tight fit of ${his} spats as ${he} moves.`;
+					} else {
+						t += `${His} spats snugly fit to ${his} crotch as ${he} moves.`;
+					}
+					break;
+				case "a slutty outfit":
+					if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s very unusual `;
+						if (hasBothLegs(slave)) {
+							t += `between the legs.`;
+						} else {
+							t += `down there.`;
+						}
+					} else if (slave.dick > 2) {
+						t += `For today's slutty outfit ${he}'s chosen ripped jean shorts so brief that ${his} huge dick occasionally escapes and flops free.`;
+					} else if (slave.dick !== 0) {
+						t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s got something other than a pussy `;
+						if (hasBothLegs(slave)) {
+							t += `between the legs.`;
+						} else {
+							t += `down there.`;
+						}
+					} else {
+						t += `For today's slutty outfit ${he}'s chosen ripped jean shorts so tight that ${he} sports a raging cameltoe.`;
+					}
+					break;
+				case "a slave gown":
+					if (isAmputee(slave) && (slave.vagina !== -1)) {
+						t += `${He}'s wearing a lovely 'dress' designed specifically for an amputee.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} gorgeous dress leaves little to the imagination; there's little doubt ${his} pussy is bare beneath it, and ${his} cock tents the fabric as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} gorgeous dress leaves little to the imagination; ${his} cock tents the fabric as ${he} moves.`;
+					} else {
+						t += `${His} gorgeous dress leaves little to the imagination; there's little doubt ${his} pussy is bare beneath it.`;
+					}
+					break;
+				case "a halter top dress":
+					if (isAmputee(slave) && (slave.vagina !== -1)) {
+						t += `${He}'s wearing a 'beautiful halter top dress' designed specifically for an amputee.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} beautiful halter top dress is almost sculpted around ${him}, but ${his} cock tents the fabric as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} beautiful halter top dress is almost sculpted around ${him}; but ${his} cock tents the fabric as ${he} moves.`;
+					} else {
+						t += `${His} beautiful halter top dress is almost sculpted around ${him}.`;
+					}
+					break;
+				case "an evening dress":
+					if (isAmputee(slave) && (slave.vagina !== -1)) {
+						t += `${He}'s wearing a 'sensual evening dress' designed specifically for an amputee.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} sensual evening dress is almost sculpted around ${him}, but ${his} cock tents the fabric as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} sensual evening dress is almost sculpted around ${him}; but ${his} cock tents the fabric as ${he} moves.`;
+					} else {
+						t += `${His} sensual evening dress is almost sculpted around ${him}.`;
+					}
+					break;
+				case "a ball gown":
+					if (isAmputee(slave) && (slave.vagina !== -1)) {
+						t += `${He}'s wearing a 'fabulous silken ball gown' designed specifically for an amputee.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} fabulous silken ball gown is draped around ${him}, but ${his} cock tents the fabric as ${he} moves.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} fabulous silken ball gown is draped around ${him}; but ${his} cock tents the fabric as ${he} moves.`;
+					} else {
+						t += `${His} fabulous silken ball gown is draped around ${him}.`;
+					}
+					break;
+				case "slutty business attire":
+					if (slave.dick > 4) {
+						t += `As ${he} moves, something massive tents the front of ${his} short skirt.`;
+					} else if (slave.dick > 1) {
+						t += `As ${he} moves, something presses against the front of ${his} short skirt.`;
+					} else {
+						t += `${His} short skirt gives no hint of what's behind it.`;
+					}
+					break;
+				case "a fallen nuns habit":
+					if (slave.dick > 0) {
+						t += `${His} slutty nun outfit leaves ${his} cock to swing sacrilegiously.`;
+					} else {
+						t += `${His} slutty nun outfit leaves ${his} pussy totally and sacrilegiously bare.`;
+					}
+					break;
+				case "a chattel habit":
+					t += `${His} chattel habit makes ${his} sexual status immediately and encouragingly obvious.`;
+					break;
+				case "a penitent nuns habit":
+					if (slave.dick > 0) {
+						t += `${He} moves with painful caution, desperately trying to keep ${his} coarse habit from chafing ${his} dick raw.`;
+					} else {
+						t += `${He} moves with painful caution, desperately trying to keep ${his} coarse habit from chafing ${his} pussy raw.`;
+					}
+					break;
+				case "nice business attire":
+					if (slave.dick > 4) {
+						t += `As ${he} moves, something massive tents the front of ${his} skirt.`;
+					} else if (slave.dick > 1) {
+						t += `As ${he} moves, something presses against the front of ${his} skirt.`;
+					} else {
+						t += `Unusually, ${his} businesslike skirt gives no hint of what's behind it.`;
+					}
+					break;
+				case "a slutty nurse outfit":
+					t += `${His} tight skirt constantly threatens to ride up in front.`;
+					break;
+				case "a schoolgirl outfit":
+					t += `${His} schoolgirl skirt is so short that it constantly threatens to ride up in front.`;
+					break;
+				case "a kimono":
+					t += `${His} obi demurely covers ${his} front.`;
+					break;
+				case "a burqa":
+					t += `${His} burqa billows slightly as ${he} moves.`;
+					break;
+				case "a bra":
+				case "a button-up shirt":
+				case "a sweater":
+				case "a tank-top":
+				case "a tube top":
+				case "a striped bra":
+				case "a sports bra":
+				case "a t-shirt":
+				case "an oversized t-shirt":
+					t += `${His} clothing leaves ${his} genitals bare and visible.`;
+					break;
+				case "a button-up shirt and panties":
+				case "a slutty klan robe":
+				case "a sweater and panties":
+				case "a tank-top and panties":
+				case "an oversized t-shirt and boyshorts":
+				case "a t-shirt and jeans":
+				case "boyshorts":
+				case "cutoffs":
+				case "leather pants and pasties":
+				case "leather pants":
+				case "panties":
+				case "sport shorts and a t-shirt":
+				case "a t-shirt and panties":
+				case "panties and pasties":
+				case "striped underwear":
+				case "sport shorts and a sports bra":
+				case "jeans":
+				case "a sweater and cutoffs":
+				case "leather pants and a tube top":
+				case "sport shorts":
+					t += `${His} clothing clings to the outline of ${his} genitals.`;
+					break;
+				case "a gothic lolita dress":
+					t += `${His} dress ends halfway down ${his} thighs.`;
+					break;
+				case "a hanbok":
+					t += `${His} hanbok billows slightly as ${he} moves.`;
+					break;
+				case "a one-piece swimsuit":
+					t += `${His} swimsuit clings to the outline of ${his} genitals.`;
+					break;
+				case "a police uniform":
+					t += `${His} trousers cling to the outline of ${his} genitals.`;
+					break;
+				case "a nice pony outfit":
+				case "a slutty pony outfit":
+					t += `${His} leather outfit clings tightly to the outline of ${his} genitals.`;
+					break;
+				case "a skimpy loincloth":
+					t += `${His} skimpy loincloth gives frequent glimpses of ${his} bare genitals underneath.`;
+					break;
+				case "a burkini":
+					t += `${His} modest swimwear includes a tunic that ends halfway down ${his} thighs.`;
+					break;
+				case "a hijab and blouse":
+					t += `${His} long skirt billows as ${he} moves.`;
+					break;
+				case "battledress":
+					t += `${His} fatigue trousers are utilitarian and unflattering.`;
+					break;
+				case "a comfortable bodysuit":
+					if (slave.dick !== 0) {
+						t += `${His} bodysuit displays every `;
+						if (V.showInches === 2) {
+							t += `inch `;
+						} else {
+							t += `centimeter `;
+						}
+						t += `of ${his} member as ${he} moves.`;
+					} else {
+						t += `${His} bodysuit shows off ${his} womanhood as ${he} moves.`;
+					}
+					break;
+				case "a leotard":
+					if ((slave.dick > 0) && canAchieveErection(slave)) {
+						t += `${He}'s got ${his} erection tucked vertically upward under the tight material of ${his} leotard.`;
+					} else if (slave.dick > 0) {
+						t += `The tight material of ${his} leotard hugs and minimizes the size of ${his} soft member as ${he} moves.`;
+					} else {
+						t += `The thin crotch piece of ${his} leotard occasionally threatens to ride up between ${his} pussylips as ${he} moves.`;
+					}
+					break;
+				case "a bunny outfit":
+					if ((slave.dick > 0) && canAchieveErection(slave)) {
+						t += `${He}'s moving uncomfortably, as though ${his} teddy isn't tailored quite perfectly for what ${he}'s got going on in front.`;
+					} else if (slave.dick > 0) {
+						t += `${His} teddy is tailored well enough to minimize the fact that ${he} isn't a natural woman.`;
+					} else {
+						t += `As ${he} moves, the satin material of ${his} bunny outfit flashes just a hint of inviting pussy.`;
+					}
+					break;
+				case "harem gauze":
+					if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} hermaphroditic genitals are clearly visible through the thin gauze that covers them.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} dick is clearly visible through the thin gauze that covers it.`;
+					} else {
+						t += `${His} pussy is clearly visible through the thin gauze that covers it.`;
+					}
+					break;
+				case "pasties":
+					t += `${His} crotch pastie is eye-catching as it moves with ${him}.`;
+					break;
+				case "slutty jewelry":
+					if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `${His} belt of light chain has a lewd bauble over ${his} stomach; its weight pulls it down towards ${his} hermaphroditic genitalia with each step.`;
+					} else if (slave.dick !== 0) {
+						t += `${His} belt of light chain has a lewd bauble over ${his} stomach; its weight pulls it down towards the base of ${his} penis with each step.`;
+					} else {
+						t += `${His} belt of light chain has a lewd bauble over ${his} stomach; its weight pulls it down towards ${his} mons with each step.`;
+					}
+					break;
+				case "a t-shirt and thong":
+				case "a thong":
+				case "a tube top and thong":
+					t += `You get a good view of ${his} `;
+					if (slave.dick > 5) {
+						t += `thong and the huge penis hanging out of it.`;
+					} else if (slave.dick > 3) {
+						t += `thong and the penis that escaped its confines.`;
+					} else if (slave.dick !== 0) {
+						t += `bulging thong as ${he} moves.`;
+					} else {
+						t += `thong as ${he} moves.`;
+					}
+					break;
+				case "a bimbo outfit":
+					t += `${His} miniskirt is so short it draws the eye right to ${his} `;
+					if (slave.dick > 5) {
+						t += `thong and the huge penis hanging out of it.`;
+					} else if (slave.dick > 3) {
+						t += `thong and the penis that escaped its confines.`;
+					} else if (slave.dick !== 0) {
+						t += `bulging thong.`;
+					} else {
+						t += `exposed thong.`;
+					}
+					break;
+				case "a courtesan dress":
+					t += `${He} is just begging to be splayed out so that ${his} skirt may 'bloom'.`;
+					break;
+				default:
+					if (slave.chastityVagina) {
+						t += `${His} chastity belt protects ${him} from vanilla intercourse.`;
+					} else if ((slave.dick !== 0) && (slave.vagina !== -1)) {
+						t += `You get a good view of ${his} cock and pussy: a marvel of modern surgery.`;
+					} else if (slave.dick !== 0) {
+						t += `You get a good view of ${his} cock.`;
+					} else {
+						t += `You get a good view of ${his} pussy.`;
+					}
+			}
+			if (dildoLength(slave) > 1) {
+				t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`;
+				if (plugLength(slave) > 1) {
+					t += `Beside it, a second bulge caused by ${his} extra long buttplug.`;
+				}
+			} else if (plugLength(slave) > 1) {
+				t += `With every motion ${he} makes, ${his} buttplug shifts, bulging out ${his} stomach.`;
+			}
+			t += `You lick your lips.`;
+
+			return t;
+		}
+	
 	/** Generate anus text for a given slave
 	 * @param {App.Entity.SlaveState} slave
 	 * @returns {string}
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index 7d296747d3fbb1626520558eec12bdf52c35508e..3d04945747ea0d6d11c7980cf504a15419dbd71e 100644
--- a/src/interaction/siWork.js
+++ b/src/interaction/siWork.js
@@ -388,8 +388,9 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			if (slave.dick > 0) {
 				if (!(slave.chastityPenis)) {
 					sexOptions.push({text: `Grope ${his} dick`, scene: () => App.Interact.fondleDick(slave)});
-					if (canPenetrate(slave)) {
-						if (V.policies.sexualOpenness === 1 || slave.toyHole === "dick") {
+					if (V.policies.sexualOpenness === 1 || slave.toyHole === "dick") {
+						sexOptions.push({text: `Suck ${his} dick`, scene: () => App.Interact.fSuckDick(slave)});
+						if (canPenetrate(slave)) {
 							sexOptions.push({text: `Ride ${his} dick`, scene: () => App.Interact.fDick(slave)});
 						}
 					}
diff --git a/src/js/main.js b/src/js/main.js
index 20e9b31a7bac8cb9d7a772b413ce245192ffa311..e7399d25efce8978ac4c97098cf91efb3864affa 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -44,6 +44,9 @@ App.MainView.useFucktoy = function(slave) {
 				linkArray.push(App.UI.DOM.link(`Fuck ${him} over ${his} belly`, showScene, ["fBellyFuck"]));
 			}
 		}
+		if (slave.dick > 0 && !slave.chastityPenis) {
+			linkArray.push(App.UI.DOM.link(`Suck ${him}`, showScene, ["fSuckDick"]));
+		}
 		if (canPenetrate(slave)) {
 			linkArray.push(App.UI.DOM.link(`Ride ${him}`, showScene, ["fDick"]));
 		}
@@ -95,8 +98,10 @@ App.MainView.useGuard = function() {
 			linkArray.push(App.UI.DOM.link(`Fuck ${him} over ${his} belly`, showScene, ["fBellyFuck"]));
 		}
 	}
-
-	if (canPenetrate(guard)) {
+	if (guard.dick > 0 && !guard.chastityPenis) {
+		linkArray.push(App.UI.DOM.link(`Suck ${him}`, showScene, ["fSuckDick"]));
+	}
+if (canPenetrate(guard)) {
 		linkArray.push(App.UI.DOM.link(`Ride ${him}`, showScene, ["fDick"]));
 	}
 	linkArray.push(App.UI.DOM.passageLink(`Abuse ${him}`, "Gameover", () => { V.gameover = "idiot ball"; }));
diff --git a/src/npc/interaction/fSuckDick.js b/src/npc/interaction/fSuckDick.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6b16e5ae59cef2db4d149abbe00e2d764a318c7
--- /dev/null
+++ b/src/npc/interaction/fSuckDick.js
@@ -0,0 +1,817 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fSuckDick = function(slave) {
+	const node = new DocumentFragment();
+
+	const {
+		He, His,
+		he, his, him, himself
+	} = getPronouns(slave);
+
+	seX(slave, "penetrative", V.PC, "oral");
+
+	const belly = slave.belly > 5000 ? bellyAdjective(slave) + " belly" : " belly";
+	const amount = cumAmount(slave);
+	let liquid = "precum";
+
+	let nutte;
+	if (slave.scrotum > 0) {
+		if (slave.balls === 1) {
+			nutte = "vestigial gonads";
+		} else if (slave.balls === 2) {
+			nutte = "small testes";
+		} else if (slave.balls === 3) {
+			nutte = "average balls";
+		} else if (slave.balls === 4) {
+			nutte = "large balls";
+		} else if (slave.balls === 5) {
+			nutte = "massive balls";
+		} else if (slave.balls === 6) {
+			nutte = "huge balls";
+		} else if (slave.balls === 7) {
+			nutte = "giant balls";
+		} else if (slave.balls === 8) {
+			nutte = "enormous balls";
+		} else if (slave.balls === 9) {
+			nutte = "monstrous balls";
+		} else if (slave.balls === 0) {
+			nutte = "soft scrotum";
+		} else {
+			nutte = "overly massive balls";
+		}
+	} else {
+		if (slave.vagina !== -1) {
+			nutte = "vaginal opening";
+		} else {
+			nutte = "soft perineum";
+		}
+	}
+
+	let dickAdj;
+	if (slave.dick === 1) {
+		dickAdj = "tiny";
+	} else if (slave.dick === 2) {
+		dickAdj = "cute";
+	} else if (slave.dick === 3) {
+		dickAdj = "average";
+	} else if (slave.dick === 4) {
+		dickAdj = "big";
+	} else if (slave.dick === 5) {
+		dickAdj = "impressive";
+	} else if (slave.dick === 6) {
+		dickAdj = "huge";
+	} else if (slave.dick === 7) {
+		dickAdj = "gigantic";
+	} else if (slave.dick === 8) {
+		dickAdj = "titanic";
+	} else if (slave.dick === 9) {
+		dickAdj = "absurd";
+	} else if (slave.dick === 10) {
+		dickAdj = "inhuman";
+	} else {
+		dickAdj = "hypertrophied";
+	}
+
+	let lips;
+	let lipsLong = "thin lips";
+	if (V.PC.lips <= 10) {
+		lips = "thin ";
+	} else if (V.PC.lips <= 20) {
+		lips = "attractive ";
+	} else if (V.PC.lips <= 40) {
+		lips = "full ";
+	} else if (V.PC.lips <= 70) {
+		lips = "plump ";
+	} else if (V.PC.lips <= 95) {
+		lips = "huge cartoon ";
+	} else {
+		lips = "puffy pussy-like ";
+	}
+	if (V.PC.lips > 10) {
+		lipsLong = lips + (V.PC.lipsImplant > 0 ? "fake lips" : "natural lips");
+	}
+	lips += "lips";
+
+	let r = [];
+
+	if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) {
+		r.push(`You ask ${slave.slaveName} to go to your office and order ${him} to lie down on the floor. ${He} does so`);
+		if (slave.devotion > 95) {
+			r.push(`with a smile, skipping over to give you a quick kiss before ${he} complies with your request.`);
+		} else if (slave.devotion > 50) {
+			r.push(`without hesitation, ready to serve and obey.`);
+		} else if (slave.devotion > -50) {
+			r.push(`with a look of trepidation, as though afraid you're going to hurt ${him}.`);
+		} else if (slave.devotion <= -50) {
+			r.push(`with a look of hatred, though only after you threaten to punish ${him}.`);
+		}
+	} else {
+		r.push(`You have ${slave.slaveName} brought into your office and placed on the floor.`);
+	}
+
+	r.push(`After ${he} is situated, you go over to ${him} and admire ${his} naked body, licking your ${lipsLong}. ${He}`);
+	if (slave.devotion > 50) {
+		r.push(`gives you a soft smile.`);
+	} else {
+		r.push(`gives you an angry glare.`);
+	}
+
+	if (hasAnyLegs(slave)) {
+		if (hasBothLegs(slave)) {
+			r.push(`You kneel between ${his} legs,`);
+		} else {
+			r.push(`You kneel beside ${his} leg,`);
+		}
+	} else {
+		r.push(`You kneel`);
+	}
+	r.push(`in front of ${his} crotch, take the shaft of ${his} ${dickAdj} dick`);
+	if (slave.dick > 6) {
+		r.push(`with both hands`);
+	} else if (slave.dick >2) {
+		r.push(`with your hand`);
+	} else {
+		r.push(`between your forefinger and thumb`);
+	}
+	
+	r.push(`and you lower your head towards ${his} glans while`);
+	if (canSee(slave)) {
+		r.push(`you look into ${his} eyes with a smile.`);
+	} else {
+		r.push(`you emit a suggestive sound.`);
+	}
+	r.push(`It's obvious the slave has no clue what your intentions are until you stick out your tongue and lick the tip of ${his} limp penis.`);
+
+	switch (slave.fetish) {
+		case Fetish.MINDBROKEN:
+			r.push(`Since the slave is mindbroken, ${he} lies still and ${his} face shows no reaction,`);
+			if (canAchieveErection(slave)) {
+				r.push(`but used to the demands of sex work,`);
+			}
+			break;
+		case Fetish.BOOBS:
+			if (hasAnyArms(slave)) {
+				r.push(`The slave fondles ${his} breasts, while`);
+			}
+			break;
+		case Fetish.BUTTSLUT:
+			if (hasAnyArms(slave)) {
+				r.push(`The slave rubs ${his} anus, while`);
+			}
+			break;
+		case Fetish.DOM:
+			r.push(`The slave thrusts ${his} hips upwards, while`);
+			break;
+		default:
+			r.push(`A slight moan of pleasure escapes the slave's lips, while`);
+		}
+	if (canAchieveErection(slave)) {
+		r.push(`${his} ${dickAdj} dick starts to swell and grow.`);
+	} else {
+		r.push(`${his} dick grows a bit, but remains flaccid since ${he} can't get an erection.`);
+	}
+
+	if (slave.devotion >= 95) {
+		r.push(`Since ${slave.slaveName} loves you, ${he} thinks that what you are about to do is a reward for ${his} loyalty.`);
+	} else if (slave.devotion <= 20) {
+		r.push(`Since ${slave.slaveName} hates you, ${he} has mixed feelings, between submitting to your wishes and the possibility that the person ${he} loathes will give ${him} a blowjob. The second option prevails.`);
+	}
+
+	App.Events.addParagraph(node, r);
+	r = [];
+
+	r.push(`You stop what you're doing and instruct ${him} to let you know when he's about to cum.`);
+	if (slave.fetish === Fetish.MINDBROKEN) {
+		r.push(`${He} focuses ${his}`);
+		r.push(canSee(slave) ? "dull" : "blind");
+		r.push(`eyes in your direction.`);
+	} else if (disobedience(slave) === 0) {
+		r.push(`${He} nods.`);
+	} else {
+		r.push(`${He} smiles slyly.`)
+	}
+
+	r.push(`You go down on ${him} again, this time`);
+	if (slave.foreskin > 0) {
+		r.push(`pursing your ${lips}, taking the tip of ${his} member with them and sliding ${his} foreskin back, while playing with your tongue on the glans.`);
+	} else {
+		r.push(`encircling the tip of ${his} member with your ${lips} and letting the glans slide slowly into your mouth, while playing with your tongue.`);
+	}
+	
+	r.push(`Once the glans is inside your mouth, you start to slowly bob your head up and down, every time a little further, until`);
+	if (slave.dick > 7) {
+		r.push(`all ${his} gigantic cockhead occupies your whole buccal cavity.`);
+	} else if (slave.dick > 5) {
+		r.push(`${his} enormous cockhead hits the back of your buccal cavity.`);
+	} else if (slave.dick > 3) {
+		r.push(`${his} big cockhead is at the entrance of your throat.`);
+	} else if (slave.dick > 1) {
+		r.push(`the whole length of ${his} cock is inside you mouth.`);
+	} else {
+		r.push(`you have ${his} cute small penis in your mouth and your lips sealed against ${his} pubes.`);
+	}
+
+	if (!canAchieveErection(slave)) { // Slaves unable to achieve an erection
+		r.push(`As long as ${he} can't achieve an erection, it's hard to excite ${him} enough with only the use of your mouth, so`);
+		if (slave.prostate > 0 && canDoAnal(slave)) { // Slaves with excitable prostate
+			if (slave.dick > 2) {
+				r.push(`while holding ${his} dick with your left hand, with the other`);
+			}
+			r.push(`you put two fingers in ${his} anus to reach ${his} prostate and massage it.`);
+		} else if (canDoVaginal(slave)) { // Slaves with non-virgin vagina and no chastity belt
+			if (slave.dick > 2) {
+				r.push(`while holding ${his} dick with your left hand, with the other`);
+			}
+			if (slave.vagina < 3) {
+				r.push(`you put two fingers inside ${his} vagina and fuck ${him} rudely.`);
+			} else {
+				r.push(`you rudely fistfuck ${his} loose vagina.`);
+			}
+		} else if (slave.balls > 0) { // Slaves with balls outside the abdomen
+			if (slave.dick > 2 && slave.scrotum > 0) {
+				r.push(`while holding ${his} dick with your left hand, with the other`);
+			}
+			r.push(`you fondle ${his} ${nutte}.`);
+		} else if (V.seePee === 1 && jsRandom(1, 100) > 50) { // Involuntary urination ending
+			r.push(`You continue sucking the slave's member for a long time, without getting any positive reaction. You notice how ${he} ${slave.fetish === Fetish.MINDBROKEN ? "remains impassible" : "strains, tensing up, desperately trying to cum for you"}. Suddenly, you notice a bitter and salty taste filling your mouth and going down your throat, and you move your head away just to receive a hot stream of urine on your face.`);
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`After the first impression, you burst out laughing, while ${he} remains on the ground, ${slave.fetish === Fetish.MINDBROKEN ? "letting out the rest of the pee" : "trembling with fear"}. It is clear that it is not ${his} fault, ${he} has tried to fulfill your wishes in the best way that ${he} could, but you have not chosen with good judgment the right slave to give ${him} a blowjob. In any case, what happened cannot be left without an adequate punishment.`);
+			if (canWalk(V.PC)) {
+				r.push(`You stand up in front of ${him},`);
+			} else {
+				r.push(`You crawl on top of ${him},`);
+			}
+			if (V.PC.dick > 0) {
+				r.push(`pull out your penis,`);
+			} else if (slave.boobs > 5000) {
+				r.push(`sit on ${his} enormous boobs, legs open, facing ${him},`);
+			} else if (slave.boobs > 300) {
+				r.push(`squat on ${his} tits, facing ${him},`);
+			} else {
+				r.push(`squat on ${his} chest, facing ${him},`);
+			}
+			r.push(`and completely unload your bladder on ${his} face.`);
+			if (slave.fetish !== Fetish.MINDBROKEN) {
+				r.push(`The slave is <span class="trust inc">relieved</span> that this is the only consequence of ${his} sudden incontinence.`);
+				slave.trust += 2;
+			}
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			liquid = "urine";
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 3;
+			}
+
+			App.Events.addParagraph(node, r);
+
+			return node;
+
+		} else { // Player fails to orally please the slave
+			r.push(`You continue sucking the slave's member for a long time, without getting any positive reaction. You notice how ${he} strains, tensing up, desperately trying to cum for you, but to no avail. After what seems like hours to you, you get tired and give up. ${He} makes a face between worried and sad. You make ${him} understand that it is not necessary to worry, that you appreciate ${his} effort and that you are sure that ${he} will find another way to serve you in order to compensate you.`)
+			
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			App.Events.addParagraph(node, r);
+
+			return node;
+		}
+
+		if (isMindbroken(slave)) {
+			r.push(`Without any warning, ${his} ${dickAdj} flaccid dick begins to release cum into your mouth. At the moment, you move away.`);
+			r.push(`You should have known this would happen with a mindbroken slave. You turn your head away, releasing what you have in your mouth.`);
+			r.push(cumFinal());
+		
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`It is not worth scolding ${him}, ${his} mental state won't allow ${him} to understand it.`)
+
+			liquid = "cum";
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			App.Events.addParagraph(node, r);
+
+			return node;
+
+		} else {
+			r.push(`You continue to suck ${his} flaccid ${dickAdj} cock, determined to extract ${his} sperm. At one point you feel an almost imperceptible throb in ${his} member and ${he} lets you know that ${his} orgasm is imminent. You take one last firm suck before slowly letting the glans out of your mouth and taking the base of ${his} ${dickAdj} member ${slave.dick > 2 ? "with your hand" : "with your forefinger and thumb"}, toying the soft shaft with your ${lipsLong}, just in time.`);
+			r.push(cumFinal());
+			r.push(`${He} didn't enjoy being forced to come.`);
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(cleanup());
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors());
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.trust -= 2;
+			slave.devotion -= 5;
+
+			App.Events.addParagraph(node, r);
+			return node;
+
+		}
+	} else {
+		r.push(`You continue sucking on the ${dickAdj} slave's member for some time, using your tongue and lips, making sure to keep it well lubricated with your saliva. Soft moans escape ${his} lips. At one moment, the cock in your mouth becomes even more rigid, and you know that the excellent worship you are giving this cock is going to bring its owner a powerful orgasm.`);
+		if (isHorny(V.PC)) {
+			r.push(`All of this excites you to the point that you feel like you're about to have your own orgasm, without any physical stimulation, other than having a cock in your mouth.`);
+		}
+		r.push(`You lift your head until only the${slave.dick > 4 ? " top half of the" : ""} glans is surrounded by your ${lips}, using your tongue to play with ${slave.foreskin === 0 ? "the tip" : "the frenulum"}, and`);
+		if (slave.dick > 6) {
+			r.push(`your hands`);
+		} else if (slave.dick >2) {
+			r.push(`your hand`);
+		} else {
+			r.push(`your forefinger and thumb`);
+		}
+		r.push(`to pump the shaft, waiting for ${him} to warn you that ${he} is about to cum.`)
+
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		if (slave.fetish === Fetish.MINDBROKEN) { // Mindbroken slaves don't warn the player
+			r.push(`He's mentally broken, so ${he}'s unable to react when ${he} orgasms. ${He} doesn't warn you, ${he} doesn't give you any clues, you just feel ${his} penis twitch a bit before ${his} seed starts to flood your mouth.`);
+			if (isHorny(V.PC)) {
+				r.push(`${His} semen in your mouth takes you beyond your limits and an intense, extremely pleasurable and endless orgasm takes control of your mind. Instinctively you swallow the seed that the slave unloads in your mouth while`);
+				if (V.PC.dick > 0) {
+					r.push(`your own semen waters the floor under your body${V.PC.vagina >= 0 ? " and" : "."}`);
+				}
+				if (V.PC.vagina >= 0) {
+					if (V.PC.vaginaLube === 0) {
+						r.push(`your dry vagina pulses rhythmically.`);
+					} else if (V.PC.vaginaLube === 1) {
+						r.push(`your natural lubrication runs down your legs.`);
+					} else {
+						r.push(`your vaginal fluids gush between your legs, forming a pool.`);
+					}
+				} else if (V.PC.dick < 0) {
+					r.push(`while your anus contracts rhythmically.`);
+				}
+				if (amount + (V.PC.bellyPreg > 1500 ? 100 : 0) > 150) {
+					r.push(`${His} cumshot is so voluminous that your stomach can't take it anymore and you raise your head, releasing what you have in your mouth.`);
+					r.push(cumFinal(150));
+				}
+			} else {
+				r.push(`You should have known this would happen. You turn your head away, releasing what you have in your mouth.`);
+				r.push(cumFinal());
+			}
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`It is not worth scolding ${him}, ${his} mental state won't allow ${him} to understand it.`)
+
+			liquid = "cum";
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			App.Events.addParagraph(node, r);
+			return node;
+
+		} else if ((disobedience(slave) > 0 || (slave.fetish === Fetish.DOM && slave.devotion < 40 && slave.trust > -30)) && hasAnyArms(slave)) { // Disobedient slaves try to force the player to swallow, dominant slaves have a plus
+			r.push(`You feel a throbbing at the base of the dick, and ${amount <= 100 ? "liquid splatters in the back of your mouth" : "a thick spurt fills your mouth"}. You feel ${hasBothArms(slave) ? "the slave's hands" : "a hand"} on your head pushing you down.`);
+			if (canTalk(slave)) {
+				r.push(`<span class="orangered">${Spoken(slave, "Yeah, now, I cum! All for you!")}</span>`);
+			} else {
+				r.push(`The slave makes a grunt of pleasure, and you understand that <span class="orangered">${he} is determined to unload all ${his} semen in your mouth</span>.`);
+			}
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			if (isHorny(V.PC)) { // Horny player can't resist the disobedient slave
+				r.push(`A new throbbing of ${his} cock, with the consequent seminal discharge in your oral cavity, takes you beyond your limits and an intense, extremely pleasurable and endless orgasm takes control of your mind. You have no strength or desire to resist, and you simply let yourself be carried away by your pleasure and let the hands of the slave guide your head.`);
+				r.push(swallow());
+			} else if (overpowerCheck(slave, V.PC) >= jsRandom(1, 100)) {
+				r.push(`You slam ${his} hand${hasBothArms(slave) ? "s" : ""} with yours, releasing ${his} grip on your head, and you manage to tear your mouth away from ${his} cock.`);
+				if (canWalk(V.PC)) {
+					if (slave.balls > 0 && slave.scrotum > 0) {
+						r.push(`You stand up and kick ${him} hard in ${his} ${nutte}.`);
+					} else if (slave.vagina >= 0) {
+						r.push(`You pinch and twist ${his} labia furiously.`);
+					} else {
+						r.push(`You stand up and kick ${him} in the anus, so hard half a foot goes inside.`);
+					}
+				} else {
+					if (slave.balls > 0 && slave.scrotum > 0) {
+						r.push(`You move away a bit and give ${him} two strong punches in ${his} ${nutte}.`);
+					} else if (slave.vagina >= 0) {
+						r.push(`You pinch and twist ${his} labia furiously.`);
+					} else {
+						r.push(`You punch ${him} so hard in the anus that half your fist gets stuck inside.`);
+					}
+				}
+				r.push(`Despite ${his} pained face, ${his} orgasm doesn't stop.`);
+				
+				r.push(cumFinal());
+				
+				slave.devotion--;
+			} else {
+				r.push(`You try to break free, but you don't have enough strength and your unsuccessful attempts only excite ${him} more. Finally you give up and decide to cooperate as best you can so that ${he} finishes as soon as possible.`);
+				r.push(swallow());
+			}
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`You look at ${him} with a deeply angry face. Deep down you know that what happened is your fault, you shouldn't have put yourself in danger with a rebellious slave. You decide not to be harsh and simply lecture ${him} about the duties of slaves, the rules they must follow, and the respect they owe their owner. You assure ${him} that you trust ${him} to improve so that you can be proud of ${him}. <span class="trust inc">${He} nods, without much conviction</span>.`)
+
+			liquid = "cum";
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.trust += 10;
+
+			App.Events.addParagraph(node, r);
+			return node;			
+			
+		} else if (!hasAnyArms(slave)) { // Slaves with no arms
+			r.push(`You continue sucking ${him} until ${he} warns you that ${his} orgasm is imminent. You pull your mouth away and take hold of the base of ${his} member ${slave.dick > 2 ? "with your hand" : "with your forefinger and thumb"}, just in time to feel the first contraction.`);
+
+			r.push(cumFinal());
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors())
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.trust += 2;
+			slave.devotion += 2;
+
+			App.Events.addParagraph(node, r);
+			return node;			
+
+		} else if (slave.skill.oral < 30 || (slave.skill.oral < 70 && jsRandom(1,100) > 70)) { //Player decides to give an oral lesson to the slave
+			r.push(`You've looked through your archives and realized that ${slave.slaveName} can improve on ${his} oral skills, so you decide you're going to give ${him} a master class in pleasing a penis all the way. You take ${his} hands and place them on your head, making it clear that you want ${him} to take the reins, while you concentrate on using your ${lipsLong} and tongue to teach ${him}. At the same time you caress ${his} body until you take ${him} to the limit. You know your slaves well and you are aware ${he}'s about to erupt in your mouth.`);
+			r.push(swallow());
+			
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`You smile at ${him} and give ${him} details of how you have used your mouth, your lips and your tongue to make ${his} orgasm as pleasant as possible. You ask ${him} to take good note and apply it at work or when necessary. ${He} nods, grateful.`);
+			r.push(slaveSkillIncrease('oral', slave, 5));
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(cleanup())
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors());
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.trust += 2;
+			slave.devotion += 2;
+
+			App.Events.addParagraph(node, r);
+			return node;			
+
+		} else if (isHorny(slave) && slave.devotion < 50 && slave.trust > 50 && jsRandom(1, 100) > 50) { // Slaves unable to warn with time enough
+			r.push(`${He} warns you that ${his} orgasm is imminent at the time you feel a throbbing at the base of the dick, and ${amount <= 100 ? "liquid splatters in the back of your mouth" : "a thick spurt fills your mouth"}.`);
+			r.push(`You pull away immediately, letting go what's in your mouth. ${He} let ${himself} go, the expression on ${his} face is worried, but ${his} orgasm and ${his} moans increase in intensity, having cummed in your mouth arouses ${him}${isHorny(V.PC) ? ", and you too." : "."} You look at ${him} threateningly, you're really angry.`);
+
+			if (isHorny(V.PC)) {
+				r.push(`You can't control yourself anymore and an intense, extremely pleasurable and endless orgasm takes control of your mind,`);
+				if (V.PC.dick > 0) {
+					r.push(`your own semen waters the floor under your body${V.PC.vagina >= 0 ? " and" : "."}`);
+				}
+				if (V.PC.vagina >= 0) {
+					if (V.PC.vaginaLube === 0) {
+						r.push(`your dry vagina pulses rhythmically.`);
+					} else if (V.PC.vaginaLube === 1) {
+						r.push(`your natural lubrication runs down your legs.`);
+					} else {
+						r.push(`your vaginal fluids gush between your legs, forming a pool.`);
+					}
+				} else if (V.PC.dick < 0) {
+					r.push(`while your anus contracts rhythmically.`);
+				}
+			}
+			r.push(cumFinal(30));
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(`Finally, you decide that what has happened is not serious enough to deserve a severe punishment. You lecture ${him} about self-control, the rules slaves must follow, and the respect they owe their owner. You assure ${him} that you trust ${him} to improve so that you can be proud of ${him}. <span class="trust inc">${He} nods, without much conviction</span>.`)
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			liquid = "cum";
+
+			r.push(cleanup());
+			App.Events.addParagraph(node, r);
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors());
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.devotion += 2;
+			slave.trust += 5;
+
+		} else if (V.week - slave.weekAcquired > 30 && slave.devotion > 90 && isHorny(V.PC)) { // Senior devoted slaves can be rewarded by a horny player
+			r.push(`This devoted slave has been serving you for quite some time. Horny as you are, you decide to reward ${him} by letting ${him} go all the way. When ${he} tells you that ${he} is about to cum, instead of taking your mouth away, you take ${his} hand with yours, guiding it to the top of your head, letting ${him} know that you want ${him} to take the initiative and set the right pace. The slave understands it and, breathing heavily, ${he} prepares to fulfill your wish with great pleasure.`);
+			r.push(swallow());
+		
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			liquid = "cum";
+
+			r.push(cleanup());
+			App.Events.addParagraph(node, r);
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors());
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.devotion += 5;
+			slave.trust += 2;
+
+		} else { // Default
+			r.push(`You continue to suck ${him}, stroking ${his} body with one hand, making sure the blowjob is memorable. At one point you feel ${his} member stiffen and ${he} lets you know that ${his} orgasm is imminent. You take one last firm suck before slowly letting the glans out of your mouth and taking the base of ${his} ${dickAdj} member ${slave.dick > 2 ? "with your hand" : "with your forefinger and thumb"}, toying the shaft with your ${lipsLong}, just in time to feel the first contraction.`);
+			r.push(cumFinal());
+
+			if (isHorny(V.PC)) {
+				r.push(`${His} moans of pleasure take you beyond your limits and you cum simultaneously with ${him}, a hands-free, intense, extremely pleasurable and endless orgasm takes control of your mind,`);
+				if (V.PC.dick > 0) {
+					r.push(`your own semen waters the floor under your body${V.PC.vagina >= 0 ? " and" : "."}`);
+				}
+				if (V.PC.vagina >= 0) {
+					if (V.PC.vaginaLube === 0) {
+						r.push(`your dry vagina pulses rhythmically.`);
+					} else if (V.PC.vaginaLube === 1) {
+						r.push(`your natural lubrication runs down your legs.`);
+					} else {
+						r.push(`your vaginal fluids gush between your legs, forming a pool.`);
+					}
+				} else if (V.PC.dick < 0) {
+					r.push(`while your anus contracts rhythmically.`);
+				}
+			}
+
+			App.Events.addParagraph(node, r);
+			r = [];
+
+			r.push(cleanup());
+
+			if (V.policies.sexualOpenness === 0) {
+				r = [];
+				r.push(rumors());
+				App.Events.addParagraph(node, r);
+		
+				V.PC.degeneracy += 2;
+			}
+
+			slave.trust += 2;
+			slave.devotion += 5;
+
+			App.Events.addParagraph(node, r);
+			return node;
+
+		}			
+	}
+
+	return node;
+
+/* FUNCTIONS */
+
+	function swallow() {
+		const text = [];
+
+		text.push(`You put your hands on either side of ${his} body, for balance,`);
+		if (slave.dick > 7) {
+			text.push(`as ${he} forces your head down, trying to put more of ${his} ${dickAdj} cock inside you, but the apple-sized cockhead can't go any deeper. ${His} urethral opening is wedged in the back of your throat, discharging ${his} cum directly into your guts.`);
+		} else if (slave.dick > 4) {
+			text.push(`while ${he} pushes your head down and ${his} hips up, and with the help of your abundant saliva, despite the thickness of ${his} cock, ${he} manages to put it through your throat and lodge it in your esophagus. Your distended ${lipsLong} encircle the wide base of the phallus and your nose is flattened against ${his} pubis. You sense how ${his} ${dickAdj} cock throbs as it unloads ${his} cum in your stomach.`);
+		} else if (slave.dick > 2) {
+			text.push(`while ${he} pushes your head down and ${his} hips up, and with the help of your abundant saliva, ${he} manages to lodge ${his} ${dickAdj} cock in your throat. Your ${lipsLong} encircle the base of the phallus and your nose flattens against ${his} pubis, as you feel ${his} cock throbbing, forcing ${his} cum down your throat.`);
+		} else {
+			text.push(`as ${he} pushes your head down and ${his} hips up, making sure all of ${his} ${dickAdj} cock is inside your mouth. Your ${lipsLong} encircle the base of ${his} phallus and your nose flattens against ${his} pubis as you feel ${his} cock throb, releasing ${his} semen onto your tongue at the back of your mouth.`);
+		}
+		if (amount + (V.PC.bellyPreg > 1500 ? 100 : 0) > 150) {
+			text.push(`${His} cumshot is so voluminous that your stomach can't take it anymore and you slap your hand on ${his} hips to let ${him} know. ${He} understands and lets go of your head, so you can release ${his} member from your ${slave.dick > 2 ? "throat" : "mouth"}.`);
+			text.push(cumFinal(150));
+		}
+		
+		return toSentence(text);
+	}
+
+	function cumFinal(partial = 0) {
+		const text2 = [];
+		let parts= [];
+		let rest = amount - partial;
+
+		if (rest < 0) {
+			text2.push(`A last drop of semen oozes from the tip of ${his} cock and slides, sticky, down the shaft.`);
+		} else if (rest < 10) {
+			text2.push(`${His} cock twitches and a big drop of sticky cum escapes from the tip and slides along the shaft to the base.`);
+		} else if (rest < 20) {
+			text2.push(`${His} cock twitches and ${he} releases a few timid spurts of cum over ${his} pubis.`);
+		} else {
+			let text3 = [];
+			text3.push(`on ${his} ${belly}`);
+			if (rest > 80) {
+				text3.push(`over ${his} ${App.Desc.boobBits.noun(slave.boobs, false, true)}`);
+				if (rest > 150) {
+					text3.push(`on ${his} face`);
+					if (rest > 180) {
+						text3.push(`${his} ${slave.hStyle === "bald" ? "bald head" : "hair"}`);
+						if (rest >= 200) {
+							text3.push(`the floor over ${his} head`);
+						}
+					}
+				}
+			}
+			let where = toSentence(text3);
+
+			if (amount <= 30) {
+				text2.push(`${His} cock throbs and three spurts of semen land ${where}.`);
+			} else if (amount <= 60) {
+				text2.push(`${His} cock throbs and several spurts of semen land ${where}.`);
+			} else if (amount <= 80) {
+				text2.push(`${His} cock throbs and releases a large load of cum ${where}.`);
+			} else if (amount <= 100) {
+				text2.push(`${His} dick throbs and massive spurts of seed land ${where}.`);
+			} else if (amount <= 140) {
+				text2.push(`${His} dick throbs and jumps, huge spurts of seed land ${where}.`);
+			} else if (amount <= 160) {
+				text2.push(`${His} dick throbs and jumps, a giant and drawn out gush of cum land ${where}.`);
+			} else if (amount <= 180) {
+				text2.push(`${His} cock throbs and jumps, releasing a long, copious stream of cum that lands ${where}.`);
+			} else if (amount <= 200) {
+				text2.push(`${His} dick throbs and jumps, a monstrous and drawn out gush of cum lands ${where}.`);
+			} else {
+				text2.push(`${His} dick throbs and jumps, an overly massive and unending gush of seed lands ${where}.`);
+			}
+		}
+
+		return toSentence(text2);
+	}
+
+	function cleanup() {
+		const text = [];
+
+		if (V.slaves.length > 1) {
+			text.push(`You order one of your other slaves to clean up the mess on the floor.`);
+		} else if (canMove(slave)) {
+			text.push(`You order ${slave.slaveName} to clean up the mess on the floor, which ${he} does.`);
+		}
+
+		if (canTaste(V.PC)) {
+			text.push(`The taste of the slave's ${liquid} fills your mouth,`);
+		} else if (canSmell(V.PC)) {
+			text.push(`You feel that your mouth smells of the slave's ${liquid},`);
+		} else {
+			text.push(`You know that your mouth smells of the slave's ${liquid},`);
+		}
+		if (V.PC.refreshmentType === 0) {
+			text.push(`so you smoke your preferred ${V.PC.refreshment} to get rid of it.`);
+		} else if (V.PC.refreshmentType === 1) {
+			text.push(`so you drink a glass of ${V.PC.refreshment} to get rid of it.`);
+		} else if (V.PC.refreshmentType === 2) {
+			text.push(`so you eat a plate of ${V.PC.refreshment} to get rid of it.`);
+		} else {
+			text.push(`so you rinse your mouth to get rid of it.`);
+		}
+
+		if (canMove(slave) && slave.fetish !== Fetish.MINDBROKEN && V.postSexCleanUp > 0) {
+			text.push(`Your${liquid === "cum" ? " satisfied" : ""} slave`);
+			switch (slave.assignment) {
+				case "whore":
+					text.push(`heads to the bathroom to clean ${himself} before returning to selling ${his} body publicly.`);
+					break;
+				case "serve the public":
+					text.push(`heads to the bathroom to clean ${himself} before returning to allowing the public to use ${his} body.`);
+					break;
+				case "rest":
+					text.push(`heads to the bathroom to clean ${himself} before crawling back into bed.`);
+					break;
+				case "get milked":
+					text.push(`hurries to the bathroom to clean ${himself}`);
+					if (slave.lactation > 0) {
+						text.push(`before going to get ${his} uncomfortably milk-filled tits drained.`);
+					} else {
+						text.push(`and then rests until ${his} balls are ready to be drained again.`);
+					}
+					break;
+				case "please you":
+					text.push(`hurries to the bathroom to clean ${himself} before returning to await your next use of ${his} body, as though nothing had happened.`);
+					break;
+				case "be a subordinate slave":
+					text.push(`moves to the bathroom to clean ${himself}, though it's only a matter of time before another slave decides to take their turn with ${him}.`);
+					break;
+				case "be a servant":
+					text.push(`hurries to the bathroom to clean ${himself}, since ${his} chores didn't perform themselves while you used ${him}.`);
+					break;
+				case "be your Head Girl":
+					text.push(`hurries to the bathroom to clean ${himself}, worried that ${his} charges got up to trouble while you were using ${him}.`);
+					break;
+				case "guard you":
+					text.push(`hurries off to clean ${himself} so you'll be unguarded for as little time as possible.`);
+					break;
+				case "work in the brothel":
+					text.push(`goes to clean ${himself} so ${his} next customer has no idea what ${he}'s been up to.`);
+					break;
+				case "serve in the club":
+					text.push(`goes to clean ${himself} to make it appear unused.`);
+					break;
+				case "work in the dairy":
+					text.push(`goes off to carefully clean ${himself} to avoid besmirching the nice clean dairy.`);
+					break;
+				case "work as a farmhand":
+					text.push(`goes off to clean ${himself} to avoid tainting the food in ${V.farmyardName}.`);
+					break;
+				case "work as a servant":
+					text.push(`rushes to clean ${himself}, impatient to get back to ${his} undiminished chores.`);
+					break;
+				case "work as a nanny":
+					text.push(`hurries off to clean ${himself} before heading back to the ${V.nurseryName}.`);
+			}
+		}
+
+		return text.join(' ');
+	}
+
+	
+	function rumors() {
+		return `Rumors spread that you <span class="reputation dec">enjoy taking it from slaves.</span>`;
+	}
+
+}
\ No newline at end of file