diff --git a/libraries/graphics/src/graphics/Material.slh b/libraries/graphics/src/graphics/Material.slh
index e147860730..ea59059cf1 100644
--- a/libraries/graphics/src/graphics/Material.slh
+++ b/libraries/graphics/src/graphics/Material.slh
@@ -24,11 +24,6 @@ struct TexMapArray {
 
 <@func declareMaterialTexMapArrayBuffer()@>
 
-//layout(binding=GRAPHICS_BUFFER_TEXMAPARRAY) uniform texMapArrayBuffer {
-//    TexMapArray _texMapArray;
-//};
-
-
 <@func evalTexMapArrayTexcoord0(texMapArray, inTexcoord0, outTexcoord0)@>
 {
     <$outTexcoord0$> = (<$texMapArray$>._texcoordTransforms0 * vec4(<$inTexcoord0$>.st, 0.0, 1.0)).st;
diff --git a/libraries/graphics/src/graphics/MaterialTextures.slh b/libraries/graphics/src/graphics/MaterialTextures.slh
index 1c381e9d98..0a60feccfc 100644
--- a/libraries/graphics/src/graphics/MaterialTextures.slh
+++ b/libraries/graphics/src/graphics/MaterialTextures.slh
@@ -11,44 +11,8 @@
 <@if not MODEL_MATERIAL_TEXTURES_SLH@>
 <@def MODEL_MATERIAL_TEXTURES_SLH@>
 
-<!<@include graphics/ShaderConstants.h@>!>
 <@include graphics/Material.slh@>
 
-<!
-<@func declareMaterialTexMapArrayBuffer()@>
-
-const int MAX_TEXCOORDS = 2;
-
-struct TexMapArray { 
-//    mat4 _texcoordTransforms[MAX_TEXCOORDS];
-    mat4 _texcoordTransforms0;
-    mat4 _texcoordTransforms1;
-    vec4 _lightmapParams;
-};
-
-layout(binding=GRAPHICS_BUFFER_TEXMAPARRAY) uniform texMapArrayBuffer {
-    TexMapArray _texMapArray;
-};
-
-TexMapArray getTexMapArray() {
-    return _texMapArray;
-}
-
-<@func evalTexMapArrayTexcoord0(texMapArray, inTexcoord0, outTexcoord0)@>
-{
-    <$outTexcoord0$> = (<$texMapArray$>._texcoordTransforms0 * vec4(<$inTexcoord0$>.st, 0.0, 1.0)).st;
-}
-<@endfunc@>
-
-<@func evalTexMapArrayTexcoord1(texMapArray, inTexcoord1, outTexcoord1)@>
-{
-    <$outTexcoord1$> = (<$texMapArray$>._texcoordTransforms1 * vec4(<$inTexcoord1$>.st, 0.0, 1.0)).st;
-}
-<@endfunc@>
-
-<@endfunc@>
-!>
-
 <@func declareMaterialTextures(withAlbedo, withRoughness, withNormal, withMetallic, withEmissive, withOcclusion, withScattering)@>
 
 #define TAA_TEXTURE_LOD_BIAS    -1.0
diff --git a/libraries/render-utils/src/Blendshape.slh b/libraries/render-utils/src/Blendshape.slh
index 8f62626829..2dfb0c1540 100644
--- a/libraries/render-utils/src/Blendshape.slh
+++ b/libraries/render-utils/src/Blendshape.slh
@@ -8,7 +8,7 @@
 <@if not BLENDSHAPE_SLH@>
 <@def BLENDSHAPE_SLH@>
 
-<@func declareApplyBlendshapeOffsets(USE_NORMAL, USE_TANGENT)@>
+<@func declareBlendshape(USE_NORMAL, USE_TANGENT)@>
 
 struct BlendshapeOffset {
     vec4 position;
@@ -39,7 +39,7 @@ BlendshapeOffset getBlendshapeOffset(int i) {
 }
 #endif
 
-void applyBlendshapeOffset(int i, vec4 inPosition, out vec4 position
+void evalBlendshape(int i, vec4 inPosition, out vec4 position
 <@if USE_NORMAL@>
                            , vec3 inNormal, out vec3 normal
 <@endif@>
diff --git a/libraries/render-utils/src/MeshDeformer.slh b/libraries/render-utils/src/MeshDeformer.slh
index fb96b63a1b..1041522a5a 100644
--- a/libraries/render-utils/src/MeshDeformer.slh
+++ b/libraries/render-utils/src/MeshDeformer.slh
@@ -14,12 +14,12 @@
 
 <@if USE_SKINNING@>
 <@include Skinning.slh@>
-<$declareUseDualQuaternionSkinning($USE_DUAL_QUATERNION$) $>
+<$declareSkinning($USE_DUAL_QUATERNION$, $USE_NORMAL$, $USE_TANGENT$)$>
 <@endif@>
 
 <@if USE_BLENDSHAPE@>
 <@include Blendshape.slh@>
-<$declareApplyBlendshapeOffsets($USE_NORMAL$, $USE_TANGENT$)$>
+<$declareBlendshape($USE_NORMAL$, $USE_TANGENT$)$>
 <@endif@>
 
 void evalMeshDeformer(vec4 inPosition, out vec4 outPosition
@@ -47,30 +47,28 @@ void evalMeshDeformer(vec4 inPosition, out vec4 outPosition
 
 <@if USE_BLENDSHAPE@>
     if (isBlendshapeEnabled) {
-
-    <@if USE_TANGENT@>
-        applyBlendshapeOffset(vertexIndex, inPosition, _deformedPosition, inNormal, _deformedNormal, inTangent, _deformedTangent);
-    <@else@>
+        evalBlendshape(vertexIndex, inPosition, _deformedPosition
     <@if USE_NORMAL@>
-        applyBlendshapeOffset(vertexIndex, inPosition, _deformedPosition, inNormal, _deformedNormal);
-    <@else@>
-        applyBlendshapeOffset(vertexIndex, inPosition, _deformedPosition);
+                        , inNormal, _deformedNormal
     <@endif@>
+    <@if USE_TANGENT@>
+                        , inTangent, _deformedTangent
     <@endif@>
+        );
     }
 <@endif@>
 
 <@if USE_SKINNING@>
     if (isSkinningEnabled) {
-    <@if USE_TANGENT@>
-        skinPositionNormalTangent(inSkinClusterIndex, inSkinClusterWeight, _deformedPosition, _deformedNormal, _deformedTangent, _deformedPosition, _deformedNormal, _deformedTangent);
-    <@else@>
+
+        evalSkinning(inSkinClusterIndex, inSkinClusterWeight, _deformedPosition, _deformedPosition
     <@if USE_NORMAL@>
-        skinPositionNormal(inSkinClusterIndex, inSkinClusterWeight, _deformedPosition, _deformedNormal, _deformedPosition, _deformedNormal);
-    <@else@>
-        skinPosition(inSkinClusterIndex, inSkinClusterWeight, _deformedPosition, _deformedPosition);
+                        , _deformedNormal, _deformedNormal
     <@endif@>
+    <@if USE_TANGENT@>
+                        , _deformedTangent, _deformedTangent
     <@endif@>
+        );
     }
 <@endif@>
 
diff --git a/libraries/render-utils/src/Skinning.slh b/libraries/render-utils/src/Skinning.slh
index a35948f026..622ca946c2 100644
--- a/libraries/render-utils/src/Skinning.slh
+++ b/libraries/render-utils/src/Skinning.slh
@@ -13,11 +13,11 @@
 
 <@include graphics/ShaderConstants.h@>
 
+<@func declareSkinning(USE_DUAL_QUATERNION_SKINNING, USE_NORMAL, USE_TANGENT)@>
+
 const int MAX_CLUSTERS = 128;
 const int INDICES_PER_VERTEX = 4;
 
-<@func declareUseDualQuaternionSkinning(USE_DUAL_QUATERNION_SKINNING)@>
-
 layout(std140, binding=GRAPHICS_BUFFER_SKINNING) uniform skinClusterBuffer {
     mat4 clusterMatrices[MAX_CLUSTERS];
 };
@@ -55,7 +55,14 @@ mat4 dualQuatToMat4(vec4 real, vec4 dual) {
 }
 
 // dual quaternion linear blending
-void skinPosition(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, out vec4 skinnedPosition) {
+void evalSkinning(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, out vec4 skinnedPosition
+<@if USE_NORMAL@>
+    , vec3 inNormal, out vec3 skinnedNormal
+<@endif@>
+<@if USE_TANGENT@>
+    , vec3 inTangent, out vec3 skinnedTangent
+<@endif@>
+) {
 
     // linearly blend scale and dual quaternion components
     vec4 sAccum = vec4(0.0, 0.0, 0.0, 0.0);
@@ -102,166 +109,57 @@ void skinPosition(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPositio
         sAccum.w = 1.0;
         skinnedPosition = m * (sAccum * inPosition);
     }
-}
-
-void skinPositionNormal(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, vec3 inNormal,
-                        out vec4 skinnedPosition, out vec3 skinnedNormal) {
-
-    // linearly blend scale and dual quaternion components
-    vec4 sAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 rAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 dAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 cAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 polarityReference = clusterMatrices[skinClusterIndex[0]][1];
-
-    for (int i = 0; i < INDICES_PER_VERTEX; i++) {
-        mat4 clusterMatrix = clusterMatrices[(skinClusterIndex[i])];
-        float clusterWeight = skinClusterWeight[i];
-
-        vec4 scale = clusterMatrix[0];
-        vec4 real = clusterMatrix[1];
-        vec4 dual = clusterMatrix[2];
-        vec4 cauterizedPos = clusterMatrix[3];
-
-        // to ensure that we rotate along the shortest arc, reverse dual quaternions with negative polarity.
-        float dqClusterWeight = clusterWeight;
-        if (dot(real, polarityReference) < 0.0) {
-            dqClusterWeight = -clusterWeight;
-        }
-
-        sAccum += scale * clusterWeight;
-        rAccum += real * dqClusterWeight;
-        dAccum += dual * dqClusterWeight;
-        cAccum += cauterizedPos * clusterWeight;
-    }
-
-    // normalize dual quaternion
-    float norm = length(rAccum);
-    rAccum /= norm;
-    dAccum /= norm;
-
-    // conversion from dual quaternion to 4x4 matrix.
-    mat4 m = dualQuatToMat4(rAccum, dAccum);
-
-    // sAccum.w indicates the amount of cauterization for this vertex.
-    // 0 indicates no cauterization and 1 indicates full cauterization.
-    // TODO: make this cauterization smoother or implement full dual-quaternion scale support.
-    const float CAUTERIZATION_THRESHOLD = 0.1;
-    if (sAccum.w > CAUTERIZATION_THRESHOLD) {
-        skinnedPosition = cAccum;
-    } else {
-        sAccum.w = 1.0;
-        skinnedPosition = m * (sAccum * inPosition);
-    }
-
-    skinnedNormal = vec3(m * vec4(inNormal, 0));
-}
-
-void skinPositionNormalTangent(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, vec3 inNormal, vec3 inTangent,
-                               out vec4 skinnedPosition, out vec3 skinnedNormal, out vec3 skinnedTangent) {
-
-    // linearly blend scale and dual quaternion components
-    vec4 sAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 rAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 dAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 cAccum = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 polarityReference = clusterMatrices[skinClusterIndex[0]][1];
-
-    for (int i = 0; i < INDICES_PER_VERTEX; i++) {
-        mat4 clusterMatrix = clusterMatrices[(skinClusterIndex[i])];
-        float clusterWeight = skinClusterWeight[i];
-
-        vec4 scale = clusterMatrix[0];
-        vec4 real = clusterMatrix[1];
-        vec4 dual = clusterMatrix[2];
-        vec4 cauterizedPos = clusterMatrix[3];
-
-        // to ensure that we rotate along the shortest arc, reverse dual quaternions with negative polarity.
-        float dqClusterWeight = clusterWeight;
-        if (dot(real, polarityReference) < 0.0) {
-            dqClusterWeight = -clusterWeight;
-        }
-
-        sAccum += scale * clusterWeight;
-        rAccum += real * dqClusterWeight;
-        dAccum += dual * dqClusterWeight;
-        cAccum += cauterizedPos * clusterWeight;
-    }
-
-    // normalize dual quaternion
-    float norm = length(rAccum);
-    rAccum /= norm;
-    dAccum /= norm;
-
-    // conversion from dual quaternion to 4x4 matrix.
-    mat4 m = dualQuatToMat4(rAccum, dAccum);
-
-    // sAccum.w indicates the amount of cauterization for this vertex.
-    // 0 indicates no cauterization and 1 indicates full cauterization.
-    // TODO: make this cauterization smoother or implement full dual-quaternion scale support.
-    const float CAUTERIZATION_THRESHOLD = 0.1;
-    if (sAccum.w > CAUTERIZATION_THRESHOLD) {
-        skinnedPosition = cAccum;
-    } else {
-        sAccum.w = 1.0;
-        skinnedPosition = m * (sAccum * inPosition);
-    }
 
+ <@if USE_NORMAL@>
     skinnedNormal = vec3(m * vec4(inNormal, 0));
+<@endif@>
+<@if USE_TANGENT@>
     skinnedTangent = vec3(m * vec4(inTangent, 0));
+<@endif@>
 }
 
-<@else@>  // USE_DUAL_QUATERNION_SKINNING
+<@else@>  // NOT USE_DUAL_QUATERNION_SKINNING
 
-void skinPosition(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, out vec4 skinnedPosition) {
-    vec4 newPosition = vec4(0.0, 0.0, 0.0, 0.0);
-
-    for (int i = 0; i < INDICES_PER_VERTEX; i++) {
-        mat4 clusterMatrix = clusterMatrices[(skinClusterIndex[i])];
-        float clusterWeight = skinClusterWeight[i];
-        newPosition += clusterMatrix * inPosition * clusterWeight;
-    }
-
-    skinnedPosition = newPosition;
-}
-
-void skinPositionNormal(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, vec3 inNormal,
-                        out vec4 skinnedPosition, out vec3 skinnedNormal) {
-    vec4 newPosition = vec4(0.0, 0.0, 0.0, 0.0);
-    vec4 newNormal = vec4(0.0, 0.0, 0.0, 0.0);
-
-    for (int i = 0; i < INDICES_PER_VERTEX; i++) {
-        mat4 clusterMatrix = clusterMatrices[(skinClusterIndex[i])];
-        float clusterWeight = skinClusterWeight[i];
-        newPosition += clusterMatrix * inPosition * clusterWeight;
-        newNormal += clusterMatrix * vec4(inNormal.xyz, 0.0) * clusterWeight;
-    }
-
-    skinnedPosition = newPosition;
-    skinnedNormal = newNormal.xyz;
-}
-
-void skinPositionNormalTangent(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, vec3 inNormal, vec3 inTangent,
-                               out vec4 skinnedPosition, out vec3 skinnedNormal, out vec3 skinnedTangent) {
+// LiNEAR BLENDING
+void evalSkinning(ivec4 skinClusterIndex, vec4 skinClusterWeight, vec4 inPosition, out vec4 skinnedPosition
+<@if USE_NORMAL@>
+    , vec3 inNormal, out vec3 skinnedNormal
+<@endif@>
+<@if USE_TANGENT@>
+    , vec3 inTangent, out vec3 skinnedTangent
+<@endif@>
+) {
     vec4 newPosition = vec4(0.0, 0.0, 0.0, 0.0);
+<@if USE_NORMAL@>
     vec4 newNormal = vec4(0.0, 0.0, 0.0, 0.0);
+<@endif@>
+<@if USE_TANGENT@>
     vec4 newTangent = vec4(0.0, 0.0, 0.0, 0.0);
+<@endif@>
 
     for (int i = 0; i < INDICES_PER_VERTEX; i++) {
         mat4 clusterMatrix = clusterMatrices[(skinClusterIndex[i])];
         float clusterWeight = skinClusterWeight[i];
         newPosition += clusterMatrix * inPosition * clusterWeight;
+<@if USE_NORMAL@>
         newNormal += clusterMatrix * vec4(inNormal.xyz, 0.0) * clusterWeight;
+<@endif@>
+<@if USE_TANGENT@>
         newTangent += clusterMatrix * vec4(inTangent.xyz, 0.0) * clusterWeight;
+<@endif@>
     }
 
     skinnedPosition = newPosition;
+<@if USE_NORMAL@>
     skinnedNormal = newNormal.xyz;
+<@endif@>
+<@if USE_TANGENT@>
     skinnedTangent = newTangent.xyz;
+<@endif@>
 }
 
 <@endif@> // if USE_DUAL_QUATERNION_SKINNING
 
-<@endfunc@> // func declareUseDualQuaternionSkinning(USE_DUAL_QUATERNION_SKINNING)
+<@endfunc@> // func declareSkinning()
 
 <@endif@> // if not SKINNING_SLH