diff --git a/src/art/artJS.tw b/src/art/artJS.tw
index 35f089f467e5b2ac50bde9a71129a9450ab6b914..102da9ccb014acdc7c4b662699b67bfe60cd2eaa 100644
--- a/src/art/artJS.tw
+++ b/src/art/artJS.tw
@@ -1953,6 +1953,205 @@ window.ArtVectorBalls = function(slave) {
 	}
 };
 
+window.ArtVectorBelly = function(slave) {
+	const T = State.temporary;
+	let r = "";
+
+	if (slave.belly >= 2000) {
+		/* add pregnancy belly, scale dynamically (clothing and addons can be scaled, too) */
+		/* TODO: add check in penis control. do not draw penis atop belly if _art_belly_scale_factor > 1. */
+		T.art_belly_scale_factor = 0.300 * Math.log(0.011 * slave.belly);
+		let artScaleFactor = T.art_belly_scale_factor;
+		let artTranslationX = -262 * (artScaleFactor - 1);
+		let artTranslationY = -284 * (artScaleFactor - 1);
+		T.art_transform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`;
+
+		if (slave.navelPiercing === 1)
+			r += jsInclude("Art_Vector_Belly_Pregnant_Piercing");
+		else if (slave.navelPiercing === 2)
+			r += jsInclude("Art_Vector_Belly_Pregnant_Piercing_Heavy");
+		else
+			r += jsInclude("Art_Vector_Belly");
+
+		switch (slave.clothes) {
+			case "a bra":
+			case "a cybersuit":
+			case "a Fuckdoll suit":
+			case "a latex catsuit":
+			case "a nice pony outfit":
+			case "a scalemail bikini":
+			case "a skimpy loincloth":
+			case "a slutty klan robe":
+			case "a slutty outfit":
+			case "a slutty pony outfit":
+			case "a sports bra":
+			case "a string bikini":
+			case "a striped bra":
+			case "a thong":
+			case "a tube top":
+			case "a tube top and thong":
+			case "attractive lingerie":
+			case "attractive lingerie for a pregnant woman":
+			case "body oil":
+			case "boyshorts":
+			case "chains":
+			case "cutoffs":
+			case "jeans":
+			case "kitty lingerie":
+			case "leather pants":
+			case "leather pants and a tube top":
+			case "leather pants and pasties":
+			case "no clothing":
+			case "panties":
+			case "panties and pasties":
+			case "restrictive latex":
+			case "shibari ropes":
+			case "slutty jewelry":
+			case "sport shorts":
+			case "sport shorts and a sports bra":
+			case "stretch pants and a crop-top":
+			case "striped panties":
+			case "striped underwear":
+			case "uncomfortable straps":
+				break; /* do nothing for these choices */
+			default:
+				let clothes = slave.clothes;
+				if (clothes === "a slutty schutzstaffel uniform") /* slutty schutzstaffel uniform uses schutzstaffel uniform art */
+					clothes = "a schutzstaffel uniform";
+				else if (clothes === "a niqab and abaya" || clothes === "a burqa")
+					clothes = "a hijab and abaya";
+				r += jsInclude(`Art_Vector_Belly_Outfit_${clothing2artSuffix(clothes)}`);
+		}
+		/* shiny clothing */
+		if (State.variables.seeVectorArtHighlights === 1) {
+			if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") {
+				r += jsInclude("Art_Vector_Belly_Outfit_Shine");
+			}
+		}
+	}
+	/* belly piercings for flat bellies */
+	if (slave.belly === 0) {
+		if (slave.navelPiercing === 1)
+			r += jsInclude("Art_Vector_Belly_Piercing");
+		else if (slave.navelPiercing === 2)
+			r += jsInclude("Art_Vector_Belly_Piercing_Heavy");
+	}
+	/* Torso Accessories */
+	if ((slave.bellyAccessory === "a corset" || slave.bellyAccessory === "an extreme corset") && slave.belly === 0) {
+		if (T.torsoSize === "Normal")
+			r += jsInclude("Art_Vector_Corsetnormal");
+		else if (T.torsoSize === "Hourglass")
+			r += jsInclude("Art_Vector_Corsethourglass");
+		else if (T.torsoSize === "Unnatural")
+			r += jsInclude("Art_Vector_Corsetunnatural");
+	} else if (slave.bellyAccessory === "a small empathy belly") {
+		r += jsInclude("Art_Vector_Empathy_Belly_Small");
+	} else if (slave.bellyAccessory === "a medium empathy belly") {
+		r += jsInclude("Art_Vector_Empathy_Belly_Medium");
+	} else if (slave.bellyAccessory === "a large empathy belly") {
+		r += jsInclude("Art_Vector_Empathy_Belly_Large");
+	} else if (slave.bellyAccessory === "a huge empathy belly") {
+		r += jsInclude("Art_Vector_Empathy_Belly_Huge");
+	}
+	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/Belly.tw b/src/art/vector/Belly.tw
index 04491ed307249139d59c23225f3fac089fd8a0ce..6543da471363197ff3c288ab6b5da8beb0936239 100644
--- a/src/art/vector/Belly.tw
+++ b/src/art/vector/Belly.tw
@@ -3,84 +3,4 @@
 /* default: do no scaling (for addons on flat bellies) */
 <<set _art_transform = "">>
 
-<<if _artSlave.belly >= 2000>>
-	/* add pregnancy belly, scale dynamically (clothing and addons can be scaled, too) */
-	<<set _art_belly_scale_factor = 0.300*Math.log(0.011*_artSlave.belly) >>
-	/* TODO: add check in penis control. do not draw penis atop belly if _art_belly_scale_factor > 1. */
-	<<set _art_scale_factor = _art_belly_scale_factor >>
-	<<set _art_translation_x = -262*(_art_scale_factor-1) >>
-	<<set _art_translation_y = -284*(_art_scale_factor-1) >>
-	<<set _art_belly_transform = "matrix(" + _art_scale_factor +",0,0," + _art_scale_factor + "," + _art_translation_x + "," + _art_translation_y + ")">>
-	<<set _art_transform = _art_belly_transform>>
-	<<if _artSlave.navelPiercing == 1>>
-		<<include Art_Vector_Belly_Pregnant_Piercing>>
-	<<elseif _artSlave.navelPiercing == 2>>
-		<<include Art_Vector_Belly_Pregnant_Piercing_Heavy>>
-	<<else>>
-			<<include Art_Vector_Belly>>
-	<</if>>
-
-	<<set _clothes = _artSlave.clothes>>
-	<<switch _artSlave.clothes >>
-	/* handling special cases */
-	<<case "a slutty schutzstaffel uniform" >>
-		<<set _clothes = "a schutzstaffel uniform">> /* slutty schutzstaffel uniform uses schutzstaffel uniform art */
-	<<case "a niqab and abaya" "a burqa" >>
-		<<set _clothes = "a hijab and abaya">>
-	<</switch>>
-	<<switch _clothes >> /* select available clothes */
-	<<case "a ball gown" "a bunny outfit" "a chattel habit" "a cheerleader outfit" "a fallen nuns habit" "a halter top dress" "a hijab and abaya" "a huipil" "a kimono" "a leotard" "a maternity dress" "a military uniform" "a mini dress" "a monokini" "an apron" "a nice maid outfit" "a nice nurse outfit" "a penitent nuns habit" "a red army uniform" "a schoolgirl outfit" "a schutzstaffel uniform" "a slave gown" "a slutty maid outfit" "a slutty nurse outfit" "a slutty qipao" "a succubus outfit" "a toga" "battledress" "clubslut netting" "conservative clothing" "cutoffs and a t-shirt" "nice business attire" "slutty business attire" "spats and a tank top" "Western clothing" "a long qipao" "battlearmor" "a biyelgee costume" "lederhosen" "a dirndl" "a mounty outfit" "a button-up shirt" "a button-up shirt and panties" "a comfortable bodysuit" "a police uniform" "harem gauze" "a sweater and cutoffs" "a tank-top" "a tank-top and panties" "a t-shirt" "a t-shirt and thong" "a t-shirt and panties" "a t-shirt and jeans" "a sweater" "a sweater and cutoffs" "a sweater and panties" "sport shorts and a t-shirt" "an oversized t-shirt" "an oversized t-shirt and boyshorts" "a one-piece swimsuit" "a mounty outfit" "a klan robe" "a hijab and blouse" "a burkini" "a hanbok" "a gothic lolita dress">>
-		<<set _art_outfit = clothing2artSuffix(_clothes) >>
-		<<set _art = "Art_Vector_Belly_Outfit_"+_art_outfit >>
-		<<include _art >>
-	<</switch>>
-
-	/* shiny clothing */
-	<<if $seeVectorArtHighlights == 1>>
-		<<if _artSlave.fuckdoll != 0 || _artSlave.clothes == "restrictive latex" || _artSlave.clothes == "a latex catsuit" || _artSlave.clothes == "body oil">>
-			<<include Art_Vector_Belly_Outfit_Shine >>
-		<</if>>
-	<</if>>
-<</if>>
-
-/* belly piercings for flat bellies */
-<<if _artSlave.belly == 0>>
-	<<if _artSlave.navelPiercing == 1>>
-		<<include Art_Vector_Belly_Piercing>>
-	<</if>>
-	<<if _artSlave.navelPiercing == 2>>
-		<<include Art_Vector_Belly_Piercing_Heavy>>
-	<</if>>
-<</if>>
-
-/* Torso Accessories */
-<<if _artSlave.bellyAccessory == "a corset" && _torsoSize == "Normal" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsetnormal>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a corset" && _torsoSize == "Hourglass" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsethourglass>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a corset" && _torsoSize == "Unnatural" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsetunnatural>>
-<</if>>
-<<if _artSlave.bellyAccessory == "an extreme corset" && _torsoSize == "Normal" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsetnormal>>
-<</if>>
-<<if _artSlave.bellyAccessory == "an extreme corset" && _torsoSize == "Hourglass" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsethourglass>>
-<</if>>
-<<if _artSlave.bellyAccessory == "an extreme corset" && _torsoSize == "Unnatural" && _artSlave.belly == 0>>
-	<<include Art_Vector_Corsetunnatural>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a small empathy belly">>
-	<<include Art_Vector_Empathy_Belly_Small>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a medium empathy belly">>
-	<<include Art_Vector_Empathy_Belly_Medium>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a large empathy belly">>
-	<<include Art_Vector_Empathy_Belly_Large>>
-<</if>>
-<<if _artSlave.bellyAccessory == "a huge empathy belly">>
-	<<include Art_Vector_Empathy_Belly_Huge>>
-<</if>>
+<<= ArtVectorBelly(_artSlave)>>
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 = "">>