diff --git a/src/npc/descriptions/butt/anus.js b/src/npc/descriptions/butt/anus.js
index a4e0f47b75b8cf966792f9363bfab7b83ffbbb03..fc1e2376b259bbbff1656535e5707f868a8a2786 100644
--- a/src/npc/descriptions/butt/anus.js
+++ b/src/npc/descriptions/butt/anus.js
@@ -25,17 +25,16 @@ App.Desc.anus = function(slave) {
 		if (slave.analArea - slave.anus > 3) {
 			r.push(`but it's surrounded by a massive oval of ${analSkinDesc} ${skinDesc} skin that runs from ${his} tailbone all the way down to the`);
 			if (slave.vagina > -1) {
-				r.push(`bottom of ${his} pussy`);
+				r.push(`bottom of ${his} pussy.`);
 			} else {
-				r.push(`base of ${his} cock`);
+				r.push(`base of ${his} cock.`);
 			}
-			r.push(`.`);
 		} else if (slave.analArea - slave.anus > 2) {
-			r.push(`but it's surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that occupies ${his} entire ${either("asscrack", "buttcrack")} ass`);
+			r.push(`but it's surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that occupies ${his} entire ${either("asscrack", "buttcrack")} ass.`);
 		} else if (slave.analArea - slave.anus > 1) {
 			r.push(`but it's surrounded by a big ring of ${analSkinDesc} ${skinDesc} skin.`);
 		} else if (slave.analArea - slave.anus > 0) {
-			r.push(`and it's surrounded by a cute ${either("pucker", "ring", "rosebud")} of ${skinDesc} skin`);
+			r.push(`and it's surrounded by a cute ${either("pucker", "ring", "rosebud")} of ${skinDesc} skin.`);
 		} else {
 			r.push(`and the ${skinDesc} skin around it is stretched smooth, since it's been deflowered only recently.`);
 		}
@@ -69,7 +68,7 @@ App.Desc.anus = function(slave) {
 				r.push(`base of ${his} cock.`);
 			}
 		} else if (slave.analArea - slave.anus > 0) {
-			r.push(`and it's surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that occupies ${his} entire ${either("asscrack", "buttcrack")}`);
+			r.push(`and it's surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that occupies ${his} entire ${either("asscrack", "buttcrack")}.`);
 		} else {
 			r.push(`and the ${skinDesc} skin around it is stretched smooth, suggesting ${he}'s getting used to having such a cock-hungry rear fuckhole.`);
 		}
@@ -78,11 +77,10 @@ App.Desc.anus = function(slave) {
 		if (slave.analArea - slave.anus > 0) {
 			r.push(`and it's surrounded by a massive oval of ${skinDesc} skin that runs from ${his} tailbone all the way down to the`);
 			if (slave.vagina > -1) {
-				r.push(`bottom of ${his} pussy`);
+				r.push(`bottom of ${his} pussy.`);
 			} else {
-				r.push(`base of ${his} cock`);
+				r.push(`base of ${his} cock.`);
 			}
-			r.push(`.`);
 		} else {
 			r.push(`and the ${skinDesc} skin around it is stretched smooth, suggesting ${he}'s only recently had ${his} ass ruined.`);
 		}
diff --git a/src/npc/descriptions/crotch/dick.js b/src/npc/descriptions/crotch/dick.js
index 169e20f86eaf6e6eceb4e45e2fb44c7671be45a9..8928310140fe82095145a41eec4d60426d838aca 100644
--- a/src/npc/descriptions/crotch/dick.js
+++ b/src/npc/descriptions/crotch/dick.js
@@ -399,7 +399,7 @@ App.Desc.dick = function(slave) {
 				case 10:
 					r.push(`and ${he} has an inhuman pair of testicles`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, nearly ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, nearly ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -407,7 +407,7 @@ App.Desc.dick = function(slave) {
 				case 9:
 					r.push(`and ${he} has a titanic pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -415,7 +415,7 @@ App.Desc.dick = function(slave) {
 				case 8:
 					r.push(`and ${he} has a gigantic pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -423,7 +423,7 @@ App.Desc.dick = function(slave) {
 				case 7:
 					r.push(`and ${he} has a monstrous pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -431,7 +431,7 @@ App.Desc.dick = function(slave) {
 				case 6:
 					r.push(`and ${he} has an enormous pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -439,7 +439,7 @@ App.Desc.dick = function(slave) {
 				case 5:
 					r.push(`and ${he} has a huge pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -447,7 +447,7 @@ App.Desc.dick = function(slave) {
 				case 4:
 					r.push(`and ${he} has a big pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -455,7 +455,7 @@ App.Desc.dick = function(slave) {
 				case 3:
 					r.push(`and ${he} has an average pair of`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -463,7 +463,7 @@ App.Desc.dick = function(slave) {
 				case 2:
 					r.push(`and ${he} has a small pair of testicles`);
 					if (V.showDickCMs === 1) {
-						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long`);
+						r.push(`testicles, about ${ballsToEitherUnit(slave.balls)} long.`);
 					} else {
 						r.push(`testicles.`);
 					}
@@ -592,7 +592,7 @@ App.Desc.dick = function(slave) {
 					} else if (scrotalFullness === 0) {
 						r.push(`${His} soft scrotum allows them to rest comfortably`);
 						if (hasBothLegs(slave)) {
-							r.push(`between ${his} leg.s`);
+							r.push(`between ${his} legs.`);
 						} else {
 							r.push(`beneath ${his}`);
 							if (isAmputee(slave)) {
@@ -1008,9 +1008,11 @@ App.Desc.dick = function(slave) {
 				if (canAchieveErection(slave)) {
 					r.push(`goes, along with ${his} shaft`);
 					if (hasAnyLegs(slave)) {
-						r.push(`and leg`);
+						r.push(`and`);
 						if (hasBothLegs(slave)) {
-							r.push(`s`);
+							r.push(`legs`);
+						} else {
+							r.push(`leg`);
 						}
 					}
 					r.push(`whenever ${he} is erect.`);
@@ -1369,11 +1371,11 @@ App.Desc.dick = function(slave) {
 					} else if (scrotalFullness === 0) {
 						r.push(`${His} soft scrotum allows them to rest comfortably`);
 						if (hasAnyLegs(slave)) {
-							r.push(`between ${his} leg`);
+							r.push(`between ${his}`);
 							if (hasBothLegs(slave)) {
-								r.push(`s.`);
+								r.push(`legs.`);
 							} else {
-								r.push(`and stump.`);
+								r.push(`leg and stump.`);
 							}
 						} else {
 							r.push(`beneath ${his}`);
diff --git a/src/npc/descriptions/describeTattoos.js b/src/npc/descriptions/describeTattoos.js
index 5d08d394fbc826a4ceeda0d4f5caf7197d824ec2..9ad4b38fc69b7a3b7ffcf1f823b65369656eb26c 100644
--- a/src/npc/descriptions/describeTattoos.js
+++ b/src/npc/descriptions/describeTattoos.js
@@ -474,11 +474,11 @@ App.Desc.tattoo = function(slave, surface) {
 						case "Asian art":
 							r.push(`A traditional Asian household scene is tattooed on ${his} lower back, showing a rendition of ${slave.slaveName}, dressed in rich silks, having sex with a`);
 							if (V.PC.title === 1) {
-								r.push(`gentleman`);
+								r.push(`gentleman.`);
 							} else {
-								r.push(`lady`);
+								r.push(`lady.`);
 							}
-							r.push(`. The slave and the`);
+							r.push(`The slave and the`);
 							if (V.PC.title === 1) {
 								r.push(`gentleman`);
 							} else {
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index 2606e331030394e182d96d89d4caf4c160a3a117..01c06dd0e43024e1041e337e0db90e971d5a1382 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -798,12 +798,12 @@ App.Desc.mods = function(slave, surface) {
 	if (slave.fuckdoll !== 0 && !["anus", "lips", "vagina"].includes(surface)) { /* Fuckdoll vulva and anus alone are visible, plus enormous lips */
 		return App.Desc.piercing(slave, surface); // Most piercings are part of the suit and have appropriate descriptions
 	}
-	return (
-		App.Desc.piercing(slave, surface) +
-		App.Desc.tattoo(slave, surface) +
-		App.Desc.brand(slave, surface) +
+	return [
+		App.Desc.piercing(slave, surface),
+		App.Desc.tattoo(slave, surface),
+		App.Desc.brand(slave, surface),
 		App.Desc.scar(slave, surface)
-	);
+	].join(' ');
 };
 
 /**
diff --git a/src/npc/descriptions/style/hairClothing.js b/src/npc/descriptions/style/hairClothing.js
index b0b4a402cc8025fde936113b94b0f9407c4aaf84..3d553e04c073a50e93f1739b85605fd93a8484ae 100644
--- a/src/npc/descriptions/style/hairClothing.js
+++ b/src/npc/descriptions/style/hairClothing.js
@@ -1778,16 +1778,17 @@ App.Desc.hairClothing = function(slave) {
 							r.push(App.Desc.image(slave));
 							break;
 						case "spats and a tank top":
-							r.push(`is tied back with a scrunchy into a long ponytail that falls down `);
+							r.push(`is tied back with a scrunchy into a long ponytail that falls down`);
 							if (hasAnyLegs(slave)) {
-								r.push(`${his} leg`);
+								r.push(his);
 								if (hasBothLegs(slave)) {
-									r.push(`s`);
+									r.push(`legs.`);
+								} else {
+									r.push(`leg.`);
 								}
 							} else {
-								r.push(`past ${his} torso`);
+								r.push(`past ${his} torso.`);
 							}
-							r.push(`.`);
 							break;
 						case "a huipil":
 							r.push(`is tied into a huge ponytail, that leaves ${his} long hair to wave in the wind.`);