diff --git a/rsContext.cpp b/rsContext.cpp
index a7f380f..b4d5014 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -278,6 +278,8 @@
      rsc->props.mLogScripts = getProp("debug.rs.script");
      rsc->props.mLogObjects = getProp("debug.rs.object");
      rsc->props.mLogShaders = getProp("debug.rs.shader");
+     rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes");
+     rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms");
      rsc->props.mLogVisual = getProp("debug.rs.visual");
 
      ScriptTLSStruct *tlsStruct = new ScriptTLSStruct;
@@ -379,7 +381,7 @@
      memset(&cpuset, 0, sizeof(cpuset));
      cpuset.bits[idx / 64] |= 1ULL << (idx % 64);
      int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx],
-		       sizeof(cpuset), &cpuset);
+               sizeof(cpuset), &cpuset);
      LOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
 #endif
 
@@ -614,6 +616,11 @@
             glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &mGL.mMaxFragmentUniformVectors);
 
             mGL.OES_texture_npot = NULL != strstr((const char *)mGL.mExtensions, "GL_OES_texture_npot");
+            mGL.EXT_texture_max_aniso = 1.0f;
+            bool hasAniso = NULL != strstr((const char *)mGL.mExtensions, "GL_EXT_texture_filter_anisotropic");
+            if(hasAniso) {
+                glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &mGL.EXT_texture_max_aniso);
+            }
         }
 
     }
diff --git a/rsContext.h b/rsContext.h
index b85d2a8..2e84930 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -158,6 +158,8 @@
         bool mLogScripts;
         bool mLogObjects;
         bool mLogShaders;
+        bool mLogShadersAttr;
+        bool mLogShadersUniforms;
         bool mLogVisual;
     } props;
 
@@ -169,6 +171,7 @@
     mutable const ObjectBase * mObjHead;
 
     bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;}
+    float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; }
     uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;}
     uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;}
     uint32_t getMaxVertexUniformVectors() const {return mGL.mMaxVertexUniformVectors;}
@@ -209,6 +212,7 @@
         int32_t mMaxVertexTextureUnits;
 
         bool OES_texture_npot;
+        float EXT_texture_max_aniso;
     } mGL;
 
     uint32_t mWidth;
diff --git a/rsFont.cpp b/rsFont.cpp
index bd5713e..4f8d8df 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -575,8 +575,8 @@
     float *tex = vtx + 3;
 
     VertexArray va;
-    va.add(GL_FLOAT, 3, 20, false, (uint32_t)vtx, "position");
-    va.add(GL_FLOAT, 2, 20, false, (uint32_t)tex, "texture0");
+    va.add(GL_FLOAT, 3, 20, false, (uint32_t)vtx, "ATTRIB_position");
+    va.add(GL_FLOAT, 2, 20, false, (uint32_t)tex, "ATTRIB_texture0");
     va.setupGL2(mRSC, &mRSC->mStateVertexArray, &mRSC->mShaderCache);
 
     mIndexBuffer->uploadCheck(mRSC);
diff --git a/rsProgram.cpp b/rsProgram.cpp
index 9c66462..2531a9b 100644
--- a/rsProgram.cpp
+++ b/rsProgram.cpp
@@ -346,36 +346,61 @@
                 slot = sc->fragUniformSlot(uidx);
             }
 
-            //LOGE("Uniform  slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", slot, offset, ct, field, uidx, fieldName);
+            if(rsc->props.mLogShadersUniforms) {
+                LOGV("Uniform  slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", slot, offset, ct, field, uidx, fieldName);
+            }
             if (slot >= 0) {
                 if(f->getType() == RS_TYPE_MATRIX_4X4) {
+                    if(rsc->props.mLogShadersUniforms) {
+                        LOGV("Matrix4x4");
+                        LOGV("{%f, %f, %f, %f",  fd[0], fd[4], fd[8], fd[12]);
+                        LOGV(" %f, %f, %f, %f",  fd[1], fd[5], fd[9], fd[13]);
+                        LOGV(" %f, %f, %f, %f",  fd[2], fd[6], fd[10], fd[14]);
+                        LOGV(" %f, %f, %f, %f}", fd[3], fd[7], fd[11], fd[15]);
+                    }
                     glUniformMatrix4fv(slot, 1, GL_FALSE, fd);
-                    /*for(int i = 0; i < 4; i++) {
-                        LOGE("Mat = %f %f %f %f", fd[i*4 + 0], fd[i*4 + 1], fd[i*4 + 2], fd[i*4 + 3]);
-                    }*/
                 }
                 else if(f->getType() == RS_TYPE_MATRIX_3X3) {
+                    if(rsc->props.mLogShadersUniforms) {
+                        LOGV("Matrix3x3");
+                        LOGV("{%f, %f, %f",  fd[0], fd[3], fd[6]);
+                        LOGV(" %f, %f, %f",  fd[1], fd[4], fd[7]);
+                        LOGV(" %f, %f, %f}", fd[2], fd[5], fd[8]);
+                    }
                     glUniformMatrix3fv(slot, 1, GL_FALSE, fd);
                 }
                 else if(f->getType() == RS_TYPE_MATRIX_2X2) {
+                    if(rsc->props.mLogShadersUniforms){
+                        LOGV("Matrix2x2");
+                        LOGV("{%f, %f",  fd[0], fd[2]);
+                        LOGV(" %f, %f}", fd[1], fd[3]);
+                    }
                     glUniformMatrix2fv(slot, 1, GL_FALSE, fd);
                 }
                 else {
                     switch(f->getComponent().getVectorSize()) {
                     case 1:
-                        //LOGE("Uniform 1 = %f", fd[0]);
+                        if(rsc->props.mLogShadersUniforms) {
+                            LOGV("Uniform 1 = %f", fd[0]);
+                        }
                         glUniform1fv(slot, 1, fd);
                         break;
                     case 2:
-                        //LOGE("Uniform 2 = %f %f", fd[0], fd[1]);
+                        if(rsc->props.mLogShadersUniforms) {
+                            LOGV("Uniform 2 = %f %f", fd[0], fd[1]);
+                        }
                         glUniform2fv(slot, 1, fd);
                         break;
                     case 3:
-                        //LOGE("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]);
+                        if(rsc->props.mLogShadersUniforms) {
+                            LOGV("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]);
+                        }
                         glUniform3fv(slot, 1, fd);
                         break;
                     case 4:
-                        //LOGE("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]);
+                        if(rsc->props.mLogShadersUniforms) {
+                            LOGV("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]);
+                        }
                         glUniform4fv(slot, 1, fd);
                         break;
                     default:
diff --git a/rsProgram.h b/rsProgram.h
index a8f34c3..c93033b 100644
--- a/rsProgram.h
+++ b/rsProgram.h
@@ -26,6 +26,8 @@
 class ShaderCache;
 
 #define RS_SHADER_INTERNAL "//rs_shader_internal\n"
+#define RS_SHADER_ATTR "ATTRIB_"
+#define RS_SHADER_UNI "UNI_"
 
 class Program : public ObjectBase
 {
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index d511d21..275a1df 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -149,7 +149,7 @@
     mUniformCount = 0;
     if (mUserShader.size() > 0) {
         for (uint32_t ct=0; ct < mConstantCount; ct++) {
-            initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
+            initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, RS_SHADER_UNI);
         }
     }
     mTextureUniformIndexStart = mUniformCount;
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index 918625c..bd12989 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -214,12 +214,11 @@
     mAttribCount = 0;
     if (mUserShader.size() > 0) {
         for (uint32_t ct=0; ct < mInputCount; ct++) {
-            initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, "ATTRIB_");
+            initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, RS_SHADER_ATTR);
         }
-
         mUniformCount = 0;
         for (uint32_t ct=0; ct < mConstantCount; ct++) {
-            initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
+            initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, RS_SHADER_UNI);
         }
     }
     createShader();
diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp
index 4be5059..fd4c379 100644
--- a/rsScriptC_LibGL.cpp
+++ b/rsScriptC_LibGL.cpp
@@ -151,8 +151,8 @@
     const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
 
     VertexArray va;
-    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position");
-    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0");
+    va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
+    va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
     va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
 
     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
diff --git a/rsShaderCache.cpp b/rsShaderCache.cpp
index 5c073b3..28e3b1d 100644
--- a/rsShaderCache.cpp
+++ b/rsShaderCache.cpp
@@ -53,6 +53,11 @@
     if (!frag->getShaderID()) {
         frag->loadShader(rsc);
     }
+
+    // Don't try to cache if shaders failed to load
+    if(!vtx->getShaderID() || !frag->getShaderID()) {
+        return false;
+    }
     //LOGV("ShaderCache lookup  vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID());
 
     for (uint32_t ct=0; ct < mEntryCount; ct++) {
@@ -90,7 +95,7 @@
     e->vtx = vtx->getShaderID();
     e->frag = frag->getShaderID();
     e->program = glCreateProgram();
-    e->mUserVertexProgram = vtx->isUserProgram();
+    e->vtxAttrCount = vtx->getAttribCount();
     if (mEntries[mEntryCount].program) {
         GLuint pgm = e->program;
         glAttachShader(pgm, vtx->getShaderID());
@@ -124,14 +129,15 @@
             rsc->setError(RS_ERROR_BAD_SHADER, "Error linking GL Programs");
             return false;
         }
-        if (vtx->isUserProgram()) {
-            for (uint32_t ct=0; ct < vtx->getAttribCount(); ct++) {
-                e->mVtxAttribSlots[ct] = glGetAttribLocation(pgm, vtx->getAttribName(ct));
-                if (rsc->props.mLogShaders) {
-                    LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->mVtxAttribSlots[ct]);
-                }
+
+        for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) {
+            e->mVtxAttribSlots[ct] = glGetAttribLocation(pgm, vtx->getAttribName(ct));
+            e->mVtxAttribNames[ct] = vtx->getAttribName(ct).string();
+            if (rsc->props.mLogShaders) {
+                LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->mVtxAttribSlots[ct]);
             }
         }
+
         for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) {
             e->mVtxUniformSlots[ct] = glGetUniformLocation(pgm, vtx->getUniformName(ct));
             if (rsc->props.mLogShaders) {
@@ -154,6 +160,15 @@
     return true;
 }
 
+int32_t ShaderCache::vtxAttribSlot(const String8 &attrName) const {
+    for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) {
+        if(attrName == mCurrent->mVtxAttribNames[ct]) {
+            return mCurrent->mVtxAttribSlots[ct];
+        }
+    }
+    return -1;
+}
+
 void ShaderCache::cleanupVertex(uint32_t id)
 {
 }
diff --git a/rsShaderCache.h b/rsShaderCache.h
index df99ccc..312c251 100644
--- a/rsShaderCache.h
+++ b/rsShaderCache.h
@@ -40,22 +40,22 @@
 
     void cleanupAll();
 
-    int32_t vtxAttribSlot(uint32_t a) const {return mCurrent->mVtxAttribSlots[a];}
+    int32_t vtxAttribSlot(const String8 &attrName) const;
     int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->mVtxUniformSlots[a];}
     int32_t fragAttribSlot(uint32_t a) const {return mCurrent->mFragAttribSlots[a];}
     int32_t fragUniformSlot(uint32_t a) const {return mCurrent->mFragUniformSlots[a];}
-    bool isUserVertexProgram() const {return mCurrent->mUserVertexProgram;}
 
 protected:
     typedef struct {
         uint32_t vtx;
         uint32_t frag;
         uint32_t program;
+        uint32_t vtxAttrCount;
+        const char* mVtxAttribNames[Program::MAX_ATTRIBS];
         int32_t mVtxAttribSlots[Program::MAX_ATTRIBS];
         int32_t mVtxUniformSlots[Program::MAX_UNIFORMS];
         int32_t mFragAttribSlots[Program::MAX_ATTRIBS];
         int32_t mFragUniformSlots[Program::MAX_UNIFORMS];
-        bool mUserVertexProgram;
         bool mIsValid;
     } entry_t;
     entry_t *mEntries;
diff --git a/rsType.cpp b/rsType.cpp
index 478cc95..1ee07cd 100644
--- a/rsType.cpp
+++ b/rsType.cpp
@@ -145,21 +145,26 @@
 
 void Type::makeGLComponents()
 {
-    if(getElement()->getFieldCount() >= RS_MAX_ATTRIBS) {
-        return;
-    }
-
     uint32_t userNum = 0;
-
     for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
         const Component &c = getElement()->getField(ct)->getComponent();
 
+        if(getElement()->getFieldName(ct)[0] == '#') {
+            continue;
+        }
+
         mAttribs[userNum].size = c.getVectorSize();
         mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct);
         mAttribs[userNum].type = c.getGLType();
         mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
-        mAttribs[userNum].name.setTo(getElement()->getFieldName(ct));
+        String8 tmp(RS_SHADER_ATTR);
+        tmp.append(getElement()->getFieldName(ct));
+        mAttribs[userNum].name.setTo(tmp.string());
         userNum ++;
+
+        if(userNum == RS_MAX_ATTRIBS) {
+            return;
+        }
     }
 }
 
diff --git a/rsVertexArray.cpp b/rsVertexArray.cpp
index 16be5ea..4d50124 100644
--- a/rsVertexArray.cpp
+++ b/rsVertexArray.cpp
@@ -84,10 +84,6 @@
 
 void VertexArray::add(const Attrib &a, uint32_t stride)
 {
-    // Skip padding
-    if(a.name[0] == '#') {
-        return;
-    }
     rsAssert(mCount < RS_MAX_ATTRIBS);
     mAttribs[mCount].set(a);
     mAttribs[mCount].buffer = mActiveBuffer;
@@ -98,10 +94,6 @@
 
 void VertexArray::add(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name)
 {
-    // Skip padding
-    if(name[0] == '#') {
-        return;
-    }
     rsAssert(mCount < RS_MAX_ATTRIBS);
     mAttribs[mCount].clear();
     mAttribs[mCount].type = type;
@@ -117,7 +109,11 @@
 }
 
 void VertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
-    LOGE("va %i: slot=%i name=%s buf=%i ptr=%p size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%x", idx, slot,
+    if(idx == 0) {
+        LOGV("Starting vertex attribute binding");
+    }
+    LOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%x",
+         idx, slot,
          mAttribs[idx].name.string(),
          mAttribs[idx].buffer,
          mAttribs[idx].ptr,
@@ -137,24 +133,13 @@
 
     rsc->checkError("VertexArray::setupGL2 disabled");
     for (uint32_t ct=0; ct < mCount; ct++) {
-        int32_t slot = -1;
-        if (sc->isUserVertexProgram()) {
-            slot = sc->vtxAttribSlot(ct);
-        } else {
-            if (mAttribs[ct].name == "position") {
-                slot = 0;
-            } else if (mAttribs[ct].name == "color") {
-                slot = 1;
-            } else if (mAttribs[ct].name == "normal") {
-                slot = 2;
-            } else if (mAttribs[ct].name == "texture0") {
-                slot = 3;
-            }
+        int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name);
+        if(rsc->props.mLogShadersAttr) {
+            logAttrib(ct, slot);
         }
         if(slot < 0) {
             continue;
         }
-        //logAttrib(ct, slot);
         glEnableVertexAttribArray(slot);
         glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer);
         glVertexAttribPointer(slot,
