diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js
index cc2f87682395b57723e43f9efe4babd4dc20a983..d26af595b5b4dce4897beb659e0daa5711b8e958 100644
--- a/src/art/webgl/art.js
+++ b/src/art/webgl/art.js
@@ -768,11 +768,12 @@ App.Art.applyFigures = function(slave, scene, p) {
 	if (slave.piercing.areola.weight === 1) { figures.push("Light Piercing Left Areola"); }
 	if (slave.piercing.nipple.weight === 1) { figures.push("Light Piercing Left Nipple", "Light Piercing Right Nipple"); }
 	if (slave.piercing.nipple.weight === 2) { figures.push("Heavy Piercing Left Nipple", "Heavy Piercing Right Nipple"); }
+	if (slave.piercing.corset.weight === 2) { figures.push("Heavy Piercing Corset"); }
 	if (slave.piercing.dick.weight === 2 && slave.dick > 0 && !p.hideDick) { figures.push("Heavy Piercing Dick"); }
 
 	switch (slave.bellyAccessory) {
-		// case "a corset": figures.push("Corset A_80240"); break;
-		// case "an extreme corset": figures.push("corset1_112951"); break;
+		case "a corset": figures.push("Corset Tight"); break;
+		case "an extreme corset": figures.push("Corset Extreme"); break;
 		default: break;
 	}
 
@@ -876,7 +877,7 @@ App.Art.applyFigures = function(slave, scene, p) {
 				case "neat": figures.push("Samira Hair"); break;
 				case "strip": figures.push("Wanda"); break;
 				case "tails": figures.push("Suckerpunch"); break;
-				case "up": figures.push("Pina Hair G8F"); break;
+				case "up": figures.push("Inkstone"); break;
 				case "ponytail": figures.push("Paraguay"); break;
 				case "braided": figures.push("Butterfly160"); break;
 				case "dreadlocks": figures.push("Sparks"); break;
@@ -1813,7 +1814,7 @@ App.Art.applyMaterials = function(slave, scene, p) {
 	// calculate lips and areola color based on skin color and brightness
 	let lbrf = Math.min((O[0] + O[1] + O[2])/3+0.4, 1);
 	lipsColor = [O[0]*0.76*lbrf, O[1]*0.55*lbrf, O[2]*0.6*lbrf];
-	areolaColor = lipsColor;
+	areolaColor = clone(lipsColor);
 
 	lipsColor[0] = makeupColor[0] * makeupOpacity + lipsColor[0] * (1 - makeupOpacity);
 	lipsColor[1] = makeupColor[1] * makeupOpacity + lipsColor[1] * (1 - makeupOpacity);
@@ -2764,7 +2765,7 @@ App.Art.applyMorphs = function(slave, scene, p, isAnimating) {
 	if (slave.lips < 15) {
 		morphs.push(["lips", (slave.lips-15)/30]);
 	} else {
-		morphs.push(["lips", (slave.lips-15)/42]);
+		morphs.push(["lips", (slave.lips-15)/75]);
 	}
 
 	/*
diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js
index 9028671500489fdc061f6ed22bea2f4dc1fac8df..ab77c0cc96897b0a2d0aea115cd4647f0c65a8b4 100644
--- a/src/art/webgl/engine.js
+++ b/src/art/webgl/engine.js
@@ -544,7 +544,7 @@ App.Art.Engine = class {
 
 						// kS is equal to Fresnel
 						vec3 kD = vec3(1.0) - F;
-						kD *= 1.0 - metallic;	  
+						kD *= min(1.0 - metallic, 0.9999);	  
 						
 						// add to outgoing radiance Lo
 						float NdotL = max(dot(N, L), 0.0);
@@ -593,7 +593,7 @@ App.Art.Engine = class {
 
 						// kS is equal to Fresnel
 						vec3 kD = vec3(1.0) - F;
-						kD *= 1.0 - metallic;
+						kD *= min(1.0 - metallic, 0.9999);;
 				
 						// add to outgoing radiance Lo
 						float NdotL = max(dot(N, L), 0.0);
@@ -717,7 +717,7 @@ App.Art.Engine = class {
 				let seems = this.base64ToInt(modelData.figures[i].seems);
 				let seemMap = new Int32Array(seems.length*2);
 				let indices = modelBuffers.figureIndices[i];
-				for (let j=0, h=0; j <= seems.length-3; j+=3, h+=6) {
+				for (let j=0, h=0; j < seems.length; j+=3, h+=6) {
 					let idx = seems[j+1];
 					let value = seems[j+2];
 					indices[seems[j]] = value/3;
@@ -1819,7 +1819,7 @@ App.Art.Engine = class {
 				if (!isRoot) {
 					let targets = modelBuffers.figureTargets[f];
 					let weights = modelBuffers.figureWeights[f];
-					let target = targets[modelBuffers.figureTarget[f]];
+					let target = modelBuffers.figureTarget[f];
 					let pDelta = modelBuffers.posDelta;
 					let nDelta = modelBuffers.normDelta;
 					let mA = sceneParams.settings.morphOffsetA;
@@ -1858,13 +1858,23 @@ App.Art.Engine = class {
 							}
 						}
 					} else { // static morph, follow one vertex
-						let pDeltaX = pDelta[target];
-						let pDeltaY = pDelta[target+1];
-						let pDeltaZ = pDelta[target+2];
+						let t1 = targets[target];
+						let t2 = targets[target+1];
+						let t3 = targets[target+2];
+
+						let w1 = weights[target];
+						let w2 = weights[target+1];
+						let w3 = weights[target+2];
+
+						// find precomputed baricentric point
+						let p1 = pDelta[t1]*w1 + pDelta[t2]*w2 + pDelta[t3]*w3;
+						let p2 = pDelta[t1+1]*w1 + pDelta[t2+1]*w2 + pDelta[t3+1]*w3;
+						let p3 = pDelta[t1+2]*w1 + pDelta[t2+2]*w2 + pDelta[t3+2]*w3;
+
 						for (let j = 0; j < vertexPosition.length; j+=3) {
-							vertexPosition[j]   += pDeltaX;
-							vertexPosition[j+1] += pDeltaY;
-							vertexPosition[j+2] += pDeltaZ;
+							vertexPosition[j]   += p1;
+							vertexPosition[j+1] += p2;
+							vertexPosition[j+2] += p3;
 						}
 					}
 				}
@@ -1881,6 +1891,9 @@ App.Art.Engine = class {
 					let v3 = [vertexPosition[idx3], vertexPosition[idx3+1], vertexPosition[idx3+2]];
 
 					let n = this.vectorNormalize(this.vectorCrossProduct(this.vectorSub(v2, v1), this.vectorSub(v1, v3)));
+					if (isNaN(n[0])) { // when area of triangle is 0
+						continue;
+					}
 
 					vertexNormal[idx1] += n[0];
 					vertexNormal[idx1+1] += n[1];
@@ -1895,7 +1908,7 @@ App.Art.Engine = class {
 
 				// fix edge normals
 				let seemMap = modelBuffers.figureSeemMaps[f];
-				for (let j=0; j <= seemMap.length-2; j+=2) {
+				for (let j=0; j < seemMap.length; j+=2) {
 					vertexNormal[seemMap[j]] = vertexNormal[seemMap[j+1]];
 				}