diff --git a/src/js/porn.js b/src/js/porn.js
index 7a4cf1597aead1fd4ddd50a55f51c58f08f116a8..6a48d23fd9d9d41394e1e13638e8afcfa6b442ca 100644
--- a/src/js/porn.js
+++ b/src/js/porn.js
@@ -404,6 +404,58 @@ App.Porn.Genre.stud = {
 	uiName: function() { return capFirstChar(this.fameName); }
 };
 
+App.Porn.Genre.muscle = {
+	fameVar: "muscle",
+	fameName: "muscle",
+	focusName: "muscle",
+	type: App.Porn.GenreType.general,
+	prestigeDesc1: "Thousands have enjoyed the sight of $his hard muscles",
+	prestigeDesc2: "$His many fans relish the sight of $his hard muscles",
+	prestigeDesc3: "Millions are intimately familiar with the sight of $his hard muscles",
+	hitText: function(slave) { return `${getPronouns(slave).His} powerful muscles and bodybuilder physique attracts a dedicated audience.`; },
+	trinketShotDesc: function(slave) { return `showing ${getPronouns(slave).him} holding ${getPronouns(slave).his} partner in the air during sex`; },
+	valid: function(slave) { return slave.muscles > 80; },
+	uiName: function() { return capFirstChar(this.fameName); }
+};
+
+App.Porn.Genre.incest = {
+	fameVar: "incest",
+	fameName: "taboo",
+	focusName: "incest",
+	type: App.Porn.GenreType.general,
+	prestigeDesc1: "Thousands have enjoyed seeing the love $he shares with $his family members",
+	prestigeDesc2: "$His many fans relish the sight of $him loving $his family members",
+	prestigeDesc3: "Millions are intimately familiar with the sight of $him loving $his family members",
+	hitText: function(slave) {
+		if (App.Utils.hasPartnerSex(slave) && areRelated(slave, getSlave(slave.relationshipTarget))) {
+			const partner = getSlave(slave.relationshipTarget);
+			return `${getPronouns(slave).His} sexual escapades with ${getPronouns(slave).his} ${relativeTerm(slave, partner)} ${partner.slaveName} excite viewers attracted to incestuous relationships.`;
+		} else if (App.Utils.hasFamilySex(slave)) {
+			return `${getPronouns(slave).His} sexual escapades with ${getPronouns(slave).his} close family members excite viewers attracted to incest.`;
+		} else {
+			return `${getPronouns(slave).His} sexual escapades with you, ${getPronouns(slave).his} own ${relativeTerm(slave, V.PC)}, excite viewers attracted to incestuous relationships.`;
+		}
+	},
+	trinketShotDesc: function(slave) {
+		if (App.Utils.hasPartnerSex(slave) && areRelated(slave, getSlave(slave.relationshipTarget))) {
+			const partner = getSlave(slave.relationshipTarget);
+			return `showing ${getPronouns(slave).him} having fun with ${getPronouns(slave).his} ${relativeTerm(slave, partner)} ${partner.slaveName}`;
+		} else if (App.Utils.hasFamilySex(slave)) {
+			return `showing ${getPronouns(slave).him} having incestuous fun with ${getPronouns(slave).his} family`;
+		} else {
+			return `showing ${getPronouns(slave).him} having incestuous fun with you`;
+		}
+	},
+	valid: function(slave) {
+		return (V.seeIncest !== 0) && (
+			(App.Utils.hasFamilySex(slave)) // has sex with family
+			|| (App.Utils.hasPartnerSex(slave) && areRelated(slave, getSlave(slave.relationshipTarget))) // or with her partner, who is related to her
+			|| (App.Utils.sexAllowed(slave, V.PC) && areRelated(slave, V.PC)) // or with you, and is related to you
+		);
+	},
+	uiName: function() { return capFirstChar(this.fameName); }
+};
+
 /* quirk genres */
 
 App.Porn.Genre.deepThroat = {