diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 43bb09e..0e76dae 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -24,10 +24,37 @@
     mAllocFile = __FILE__;
     mAllocLine = __LINE__;
     memset(&mEnviroment, 0, sizeof(mEnviroment));
+
+    mSlots = NULL;
+    mTypes = NULL;
 }
 
 Script::~Script()
 {
+    if(mSlots) {
+        delete [] mSlots;
+        mSlots = NULL;
+    }
+    if(mTypes) {
+        delete [] mTypes;
+        mTypes = NULL;
+    }
+}
+
+void Script::initSlots() {
+    if(mEnviroment.mFieldCount > 0) {
+        mSlots = new ObjectBaseRef<Allocation>[mEnviroment.mFieldCount];
+        mTypes = new ObjectBaseRef<const Type>[mEnviroment.mFieldCount];
+    }
+}
+
+void Script::setSlot(uint32_t slot, Allocation *a) {
+    if(slot >= mEnviroment.mFieldCount) {
+        LOGE("Script::setSlot unable to set allocation, invalid slot index");
+        return;
+    }
+
+    mSlots[slot].set(a);
 }
 
 void Script::setVar(uint32_t slot, const void *val, uint32_t len)
@@ -51,7 +78,7 @@
 {
     Script *s = static_cast<Script *>(vs);
     Allocation *a = static_cast<Allocation *>(va);
-    s->mSlots[slot].set(a);
+    s->setSlot(slot, a);
     //LOGE("rsi_ScriptBindAllocation %i  %p  %p", slot, a, a->getPtr());
 }
 
@@ -61,15 +88,6 @@
     s->mEnviroment.mTimeZone = timeZone;
 }
 
-void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    const Type *t = static_cast<const Type *>(vt);
-    ss->mConstantBufferTypes[slot].set(t);
-    ss->mSlotWritable[slot] = writable;
-    LOGE("rsi_ScriptSetType");
-}
-
 void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
 {
     Script *s = static_cast<Script *>(vs);
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index 0a20344..c73bb5e 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/rsScript.h
@@ -29,8 +29,6 @@
 class ProgramRaster;
 class ProgramStore;
 
-#define MAX_SCRIPT_BANKS 32
-
 class Script : public ObjectBase
 {
 public:
@@ -61,10 +59,8 @@
     };
     Enviroment_t mEnviroment;
 
-    ObjectBaseRef<Allocation> mSlots[MAX_SCRIPT_BANKS];
-    ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS];
-    bool mSlotWritable[MAX_SCRIPT_BANKS];
-
+    void initSlots();
+    void setSlot(uint32_t slot, Allocation *a);
     void setVar(uint32_t slot, const void *val, uint32_t len);
 
     virtual void runForEach(Context *rsc,
@@ -76,6 +72,10 @@
     virtual void Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len) = 0;
     virtual void setupScript(Context *rsc) = 0;
     virtual uint32_t run(Context *) = 0;
+protected:
+    ObjectBaseRef<Allocation> *mSlots;
+    ObjectBaseRef<const Type> *mTypes;
+
 };
 
 
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index c6418be..d961fed 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -365,11 +365,6 @@
 void ScriptCState::clear(Context *rsc)
 {
     rsAssert(rsc);
-    for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
-        mConstantBufferTypes[ct].clear();
-        mSlotWritable[ct] = false;
-    }
-
     mScript.clear();
     mScript.set(new ScriptC(rsc));
 }
@@ -428,6 +423,7 @@
     else {
         s->mEnviroment.mFieldAddress = (void **) calloc(s->mEnviroment.mFieldCount, sizeof(void *));
         bccGetExportVars(s->mBccScript, NULL, s->mEnviroment.mFieldCount, (BCCvoid **) s->mEnviroment.mFieldAddress);
+        s->initSlots();
     }
 
     s->mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
@@ -532,10 +528,6 @@
     ss->runCompiler(rsc, s.get());
     s->incUserRef();
     s->setContext(rsc);
-    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
-        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
-        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
-    }
 
     ss->clear(rsc);
     return s.get();
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 7ec80aa..e5b5ba9 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -81,11 +81,6 @@
 
     ObjectBaseRef<ScriptC> mScript;
 
-    ObjectBaseRef<const Type> mConstantBufferTypes[MAX_SCRIPT_BANKS];
-    //String8 mSlotNames[MAX_SCRIPT_BANKS];
-    bool mSlotWritable[MAX_SCRIPT_BANKS];
-    //String8 mInvokableNames[MAX_SCRIPT_BANKS];
-
     void init(Context *rsc);
 
     void clear(Context *rsc);
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index 8cdb48a..33776c3 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -31,6 +31,8 @@
     mAllocLine = __LINE__;
     mLODs = 0;
     mLODCount = 0;
+    mAttribs = NULL;
+    mAttribsSize = 0;
     clear();
 }
 
@@ -44,6 +46,11 @@
     }
     if (mLODs) {
         delete [] mLODs;
+        mLODs = NULL;
+    }
+    if(mAttribs) {
+        delete [] mAttribs;
+        mAttribs = NULL;
     }
 }
 
@@ -145,6 +152,21 @@
 
 void Type::makeGLComponents()
 {
+    // Count the number of gl attrs to initialize
+    mAttribsSize = 0;
+    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
+        if(getElement()->getFieldName(ct)[0] != '#') {
+            mAttribsSize ++;
+        }
+    }
+    if(mAttribs) {
+        delete [] mAttribs;
+        mAttribs = NULL;
+    }
+    if(mAttribsSize) {
+        mAttribs = new VertexArray::Attrib[mAttribsSize];
+    }
+
     uint32_t userNum = 0;
     for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
         const Component &c = getElement()->getField(ct)->getComponent();
@@ -160,11 +182,8 @@
         String8 tmp(RS_SHADER_ATTR);
         tmp.append(getElement()->getFieldName(ct));
         mAttribs[userNum].name.setTo(tmp.string());
-        userNum ++;
 
-        if(userNum == RS_MAX_ATTRIBS) {
-            return;
-        }
+        userNum ++;
     }
 }
 
@@ -172,7 +191,13 @@
 void Type::enableGLVertexBuffer(VertexArray *va) const
 {
     uint32_t stride = mElement->getSizeBytes();
-    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
+    for (uint32_t ct=0; ct < mAttribsSize; ct++) {
+        // Load up to RS_MAX_ATTRIBS inputs
+        // TODO: grow vertexarray dynamically
+        if(ct >= RS_MAX_ATTRIBS) {
+            LOGE("More GL attributes than we can handle");
+            break;
+        }
         if (mAttribs[ct].size) {
             va->add(mAttribs[ct], stride);
         }
diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h
index b5548c0..9099bf1 100644
--- a/libs/rs/rsType.h
+++ b/libs/rs/rsType.h
@@ -119,7 +119,8 @@
     LOD *mLODs;
     uint32_t mLODCount;
 
-    VertexArray::Attrib mAttribs[RS_MAX_ATTRIBS];
+    VertexArray::Attrib *mAttribs;
+    uint32_t mAttribsSize;
     void makeGLComponents();
 
 private:
