diff --git a/src/art/artJS.tw b/src/art/artJS.tw
index cc074d0bfbeea4af91b90c1ef3df4365d50c647b..102da9ccb014acdc7c4b662699b67bfe60cd2eaa 100644
--- a/src/art/artJS.tw
+++ b/src/art/artJS.tw
@@ -2056,6 +2056,102 @@ window.ArtVectorBelly = function(slave) {
 	return r;
 };
 
+window.ArtVectorBoob = function(slave) {
+	const T = State.temporary;
+	let r = "";
+	let artScaleFactor, artTranslationX, artTranslationY;
+
+	/*
+	Prepare SVG transform matrix for continuous boob scaling.
+	This transform affects boobs, areolae and piercings.
+	The parameters were fit by points (300,1.0) and (15000,2.5).
+	See https://www.wolframalpha.com/input/?i=log+fit+%7B%7B300,1%7D,%7B15000,2.5%7D%7D .
+	Boobs start at 300cc as of "flesh description widgets".
+	Upper value was discussed at https://github.com/Free-Cities/Free-Cities/issues/950#issuecomment-321359466 .
+	*/
+	if (slave.boobs < 300) {
+		artScaleFactor = 1;
+		artTranslationX = 22; /* a little shift to the right is needed due to perspective */
+		artTranslationY = 0;
+	} else {
+		artScaleFactor = 0.383433 * Math.log(0.0452403 * slave.boobs);
+		artTranslationX = -282.841 * artScaleFactor + 292.349;
+		artTranslationY = -225.438 * artScaleFactor + 216.274;
+	}
+	T.art_transform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`;
+	T.art_boob_transform = T.art_transform; /* used in Boob_Addons.tw */
+	T.art_scale_factor = artScaleFactor; /* used in Penis.tw */
+
+	if (slave.boobs < 300) {
+		/* BEWARE: this threshold may be used in other art-related code, too */
+		/* boobs too small - draw areolae directly onto torso */
+	} else {
+		r += jsInclude("Art_Vector_Boob_Alt");
+		/* shiny clothing */
+		if (State.variables.seeVectorArtHighlights === 1) {
+			if (slave.fuckdoll !== 0 || slave.clothes === "a latex catsuit" || slave.clothes === "body oil")
+				r += jsInclude("Art_Vector_Boob_Outfit_Shine");
+		}
+	}
+	switch (slave.clothes) { /* display nipples/areola for the following clothes */
+		case "a chattel habit":
+		case "a fallen nuns habit":
+		case "a Fuckdoll suit":
+		case "a monokini":
+		case "a nice pony outfit":
+		case "a skimpy loincloth":
+		case "a slutty pony outfit":
+		case "a string bikini":
+		case "a succubus outfit":
+		case "a thong":
+		case "a toga":
+		case "attractive lingerie for a pregnant woman":
+		case "body oil":
+		case "boyshorts":
+		case "chains":
+		case "clubslut netting":
+		case "cutoffs":
+		case "jeans":
+		case "leather pants":
+		case "no clothing":
+		case "panties":
+		case "restrictive latex":
+		case "shibari ropes":
+		case "slutty jewelry":
+		case "sport shorts":
+		case "striped panties":
+		case "uncomfortable straps":
+			if (slave.areolaeShape === "star")
+				r += jsInclude("Art_Vector_Boob_Areola_Star");
+			else if (slave.areolaeShape === "heart")
+				r += jsInclude("Art_Vector_Boob_Areola_Heart");
+			else if (slave.areolae === 0)
+				r += jsInclude("Art_Vector_Boob_Areola");
+			else if (slave.areolae === 1)
+				r += jsInclude("Art_Vector_Boob_Areola_Large");
+			else if (slave.areolae === 2)
+				r += jsInclude("Art_Vector_Boob_Areola_Wide");
+			else if (slave.areolae === 3)
+				r += jsInclude("Art_Vector_Boob_Areola_Huge");
+			
+			if (slave.nipples === "tiny")
+				r += jsInclude("Art_Vector_Boob_NippleTiny");
+			else if (slave.nipples === "cute")
+				r += jsInclude("Art_Vector_Boob_NippleCute");
+			else if (slave.nipples === "puffy")
+				r += jsInclude("Art_Vector_Boob_NipplePuffy");
+			else if (slave.nipples === "inverted")
+				r += jsInclude("Art_Vector_Boob_NippleInverted");
+			else if (slave.nipples === "huge")
+				r += jsInclude("Art_Vector_Boob_NippleHuge");
+			else if (slave.nipples === "partially inverted")
+				r += jsInclude("Art_Vector_Boob_NipplePartiallyInverted");
+			else if (slave.nipples === "fuckable")
+				r += jsInclude("Art_Vector_Boob_NippleFuckable");
+	}
+	return r;
+};
+
 window.ArtVectorBoobAddons = function(slave) {
 	let r = "";
 
diff --git a/src/art/vector/Boob.tw b/src/art/vector/Boob.tw
index 7d12da83858f2119ce12abf35ba47ef9789a8b38..0331b94404d88ecb1e031aead288dda3156d82e2 100644
--- a/src/art/vector/Boob.tw
+++ b/src/art/vector/Boob.tw
@@ -3,90 +3,7 @@
 /* BEWARE: _art_have_boobs and _art_scale_factor interfere with Art_Vector_Penis_ */
 <<set _art_have_boobs = true>>
 
-/* BEWARE: _art_boob_transform is also read by Art_Vector_Boob_Addons_ */
-
-/*
-Prepare SVG transform matrix for continuous boob scaling.
-This transform affects boobs, areolae and piercings.
-The parameters were fit by points (300,1.0) and (15000,2.5).
-See https://www.wolframalpha.com/input/?i=log+fit+%7B%7B300,1%7D,%7B15000,2.5%7D%7D .
-Boobs start at 300cc as of "flesh description widgets".
-Upper value was discussed at https://github.com/Free-Cities/Free-Cities/issues/950#issuecomment-321359466 .
-*/
-<<if _artSlave.boobs < 300>>
-	<<set _art_scale_factor = 1 >>
-	<<set _art_translation_x = 22 >> /* a little shift to the right is needed due to perspective */
-	<<set _art_translation_y = 0 >>
-<<else>>
-	<<set _art_scale_factor = 0.383433*Math.log(0.0452403*_artSlave.boobs) >>
-	<<set _art_translation_x = -282.841*_art_scale_factor+292.349 >>
-	<<set _art_translation_y = -225.438*_art_scale_factor+216.274 >>
-<</if>>
-/*
-_art_boob_transform is for internal program usage.
-_art_transform will affect the display.
-*/
-<<set _art_boob_transform = "matrix(" + _art_scale_factor +",0,0," + _art_scale_factor + "," + _art_translation_x + "," + _art_translation_y + ")">>
-<<set _art_transform = _art_boob_transform>>
-
-<<if _artSlave.boobs < 300 >>
-	/* BEWARE: this threshold may be used in other art-related code, too */
-	/* boobs too small - draw areolae directly onto torso */
-<<else>>
-	<<include Art_Vector_Boob_Alt>>
-	/* shiny clothing */
-	<<if $seeVectorArtHighlights == 1>>
-		<<if _artSlave.fuckdoll != 0 || _artSlave.clothes == "a latex catsuit" || _artSlave.clothes == "body oil">>
-			<<include Art_Vector_Boob_Outfit_Shine>>
-		<</if>>
-	<</if>>
-<</if>>
-<<if _artSlave.clothes != "a cheerleader outfit" && _artSlave.clothes != "a hijab and abaya" && _artSlave.clothes != "cutoffs and a t-shirt" && _artSlave.clothes != "a halter top dress" && _artSlave.clothes != "a mini dress" && _artSlave.clothes != "a leotard" && _artSlave.clothes != "a nice maid outfit" && _artSlave.clothes != "a slutty maid outfit" && _artSlave.clothes != "a military uniform" && _artSlave.clothes != "a nice nurse outfit" && _artSlave.clothes != "a schoolgirl outfit" && _artSlave.clothes != "a scalemail bikini" && _artSlave.clothes != "a slutty nurse outfit" && _artSlave.clothes != "a ball gown" && _artSlave.clothes != "battledress" && _artSlave.clothes != "spats and a tank top" && _artSlave.clothes != "nice business attire" && _artSlave.clothes != "slutty business attire" && _artSlave.clothes != "a bunny outfit" && _artSlave.clothes != "conservative clothing" && _artSlave.clothes != "a huipil" && _artSlave.clothes != "a kimono" && _artSlave.clothes != "a slave gown" && _artSlave.clothes != "stretch pants and a crop-top" && _artSlave.clothes != "a maternity dress" && _artSlave.clothes != "a slutty qipao" && _artSlave.clothes != "a slutty outfit" && _artSlave.clothes != "harem gauze" && _artSlave.clothes != "attractive lingerie" && _artSlave.clothes != "a penitent nuns habit" && _artSlave.clothes != "Western clothing" && _artSlave.clothes != "an apron" && _artSlave.clothes != "a schutzstaffel uniform" && _artSlave.clothes != "a slutty schutzstaffel uniform" && _artSlave.clothes != "a red army uniform" && _artSlave.clothes != "a long qipao" && _artSlave.clothes != "battlearmor" && _artSlave.clothes != "a mounty outfit" && _artSlave.clothes != "lederhosen" && _artSlave.clothes != "a dirndl" && _artSlave.clothes != "a biyelgee costume" && _artSlave.clothes != "a latex catsuit" && _artSlave.clothes != "a comfortable bodysuit" && _artSlave.clothes != "a cybersuit" && _artSlave.clothes != "a niqab and abaya" && _artSlave.clothes != "a burqa" && _artSlave.clothes != "a klan robe" && _artSlave.clothes != "a hijab and blouse" && _artSlave.clothes != "a burkini" && _artSlave.clothes != "panties and pasties" && _artSlave.clothes != "a bra" && _artSlave.clothes != "a slutty klan robe" && _artSlave.clothes != "striped underwear" && _artSlave.clothes != "a button-up shirt and panties" && _artSlave.clothes != "a striped bra" && _artSlave.clothes != "a t-shirt" && _artSlave.clothes != "a t-shirt and thong" && _artSlave.clothes != "a t-shirt and panties" && _artSlave.clothes != "sport shorts and a sports bra" && _artSlave.clothes != "sport shorts and a t-shirt" && _artSlave.clothes != "a sports bra" && _artSlave.clothes != "leather pants and pasties" && _artSlave.clothes != "leather pants and a tube top" && _artSlave.clothes != "a button-up shirt" && _artSlave.clothes != "a tube top and thong" && _artSlave.clothes != "a tube top" && _artSlave.clothes != "a tank-top" && _artSlave.clothes != "a tank-top and panties" && _artSlave.clothes != "a t-shirt and jeans" && _artSlave.clothes != "an oversized t-shirt" && _artSlave.clothes != "an oversized t-shirt and boyshorts" && _artSlave.clothes != "a sweater and cutoffs" && _artSlave.clothes != "a sweater and panties" && _artSlave.clothes != "a sweater" && _artSlave.clothes != "a police uniform" && _artSlave.clothes != "a one-piece swimsuit" && _artSlave.clothes != "a hanbok" && _artSlave.clothes != "a gothic lolita dress" && _artSlave.clothes != "kitty lingerie">>
-	<<if _artSlave.areolaeShape == "star">>
-		<<include Art_Vector_Boob_Areola_Star>>
-	<<elseif _artSlave.areolaeShape == "heart">>
-		<<include Art_Vector_Boob_Areola_Heart>>
-	<<elseif _artSlave.areolae == "0">>
-		<<include Art_Vector_Boob_Areola>>
-	<<elseif _artSlave.areolae == "2">>
-		<<include Art_Vector_Boob_Areola_Wide>>
-	<<elseif _artSlave.areolae == "1">>
-		<<include Art_Vector_Boob_Areola_Large>>
-	<<elseif _artSlave.areolae == "3">>
-		<<include Art_Vector_Boob_Areola_Huge>>
-	<</if>>
-	<<if _artSlave.nipples == "tiny">>
-		<<include Art_Vector_Boob_NippleTiny>>
-	<<elseif _artSlave.nipples == "cute">>
-		<<include Art_Vector_Boob_NippleCute>>
-	<<elseif _artSlave.nipples == "puffy">>
-		<<include Art_Vector_Boob_NipplePuffy>>
-	<<elseif _artSlave.nipples == "inverted">>
-		<<include Art_Vector_Boob_NippleInverted>>
-	<<elseif _artSlave.nipples == "huge">>
-		<<include Art_Vector_Boob_NippleHuge>>
-	<<elseif _artSlave.nipples == "partially inverted">>
-		<<include Art_Vector_Boob_NipplePartiallyInverted>>
-	<<elseif _artSlave.nipples == "fuckable">>
-		<<include Art_Vector_Boob_NippleFuckable>>
-	<</if>>
-<</if>>
-
-/*
-<<switch _artSlave.areolaStyle>>
-	<<case "normal">>
-		<<include Art_Vector_Boob_Areola>>
-	<<case "unusually wide">>
-		<<include Art_Vector_Boob_Areola_Wide>>
-	<<case "large">>
-		<<include Art_Vector_Boob_Areola_Large>>
-	<<case "huge">>
-		<<include Art_Vector_Boob_Areola_Huge>>
-	<<case "star shaped">>
-		<<include Art_Vector_Boob_Areola_Star>>
-	<<case "heart shaped">>
-		<<include Art_Vector_Boob_Areola_Heart>>
-<</switch>> */
+<<= ArtVectorBoob(_artSlave)>>
 
 /* set _art_transform to empty string so stray SVG groups in other passages are not affected */
 <<set _art_transform = "">>