diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 31bfc57..b98a48ab 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -142,10 +142,10 @@
     native void nScriptSetClearDepth(int script, float depth);
     native void nScriptSetClearStencil(int script, int stencil);
     native void nScriptSetTimeZone(int script, byte[] timeZone);
+    native void nScriptSetType(int type, String name, int slot);
+    native void nScriptSetRoot(boolean isRoot);
 
     native void nScriptCBegin();
-    native void nScriptCAddType(int type);
-    native void nScriptCSetRoot(boolean isRoot);
     native void nScriptCSetScript(byte[] script, int offset, int length);
     native int  nScriptCCreate();
     native void nScriptCAddDefineI32(String name, int value);
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 42c58ce..47479d8 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -20,6 +20,8 @@
  * @hide
  **/
 public class Script extends BaseObj {
+    public static final int MAX_SLOT = 16;
+
     boolean mIsRoot;
     Type[] mTypes;
 
@@ -64,39 +66,36 @@
         RenderScript mRS;
         boolean mIsRoot = false;
         Type[] mTypes;
-        int mTypeCount;
+        String[] mNames;
 
         Builder(RenderScript rs) {
             mRS = rs;
-            mTypes = new Type[4];
-            mTypeCount = 0;
+            mTypes = new Type[MAX_SLOT];
+            mNames = new String[MAX_SLOT];
         }
 
-        public void addType(Type t) {
-            if(mTypeCount >= mTypes.length) {
-                Type[] nt = new Type[mTypeCount * 2];
-                for(int ct=0; ct < mTypeCount; ct++) {
-                    nt[ct] = mTypes[ct];
-                }
-                mTypes = nt;
-            }
-            mTypes[mTypeCount] = t;
-            mTypeCount++;
+        public void setType(Type t, int slot) {
+            mTypes[slot] = t;
+            mNames[slot] = null;
+        }
+
+        public void setType(Type t, String name, int slot) {
+            mTypes[slot] = t;
+            mNames[slot] = name;
         }
 
         void transferCreate() {
-            mRS.nScriptCSetRoot(mIsRoot);
-            for(int ct=0; ct < mTypeCount; ct++) {
-                mRS.nScriptCAddType(mTypes[ct].mID);
+            mRS.nScriptSetRoot(mIsRoot);
+            for(int ct=0; ct < mTypes.length; ct++) {
+                if(mTypes[ct] != null) {
+                    mRS.nScriptSetType(mTypes[ct].mID, mNames[ct], ct);
+                }
             }
         }
 
         void transferObject(Script s) {
             s.mIsRoot = mIsRoot;
-            s.mTypes = new Type[mTypeCount];
-            for(int ct=0; ct < mTypeCount; ct++) {
-                s.mTypes[ct] = mTypes[ct];
-            }
+            s.mTypes = mTypes;
         }
 
         public void setRoot(boolean r) {
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index d35d482..afb0e60 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -56,7 +56,7 @@
         mRS.nTypeDestroy(mID);
     }
 
-    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+    public static Type createFromClass(RenderScript rs, Class c, int size) {
         Element e = Element.createFromClass(rs, c);
         Builder b = new Builder(rs, e);
         b.add(Dimension.X, size);
@@ -91,10 +91,16 @@
             rs.nTypeSetupFields(t, arTypes, arBits, fields);
         }
         t.mJavaClass = c;
+        return t;
+    }
+
+    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+        Type t = createFromClass(rs, c, size);
         t.setName(scriptName);
         return t;
     }
 
+
     public static class Builder {
         RenderScript mRS;
         Entry[] mEntries;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index ef0cf68..5780e02 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -824,6 +824,29 @@
     }
 }
 
+static void
+nScriptSetType(JNIEnv *_env, jobject _this, jint type, jstring _str, jint slot)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nScriptCAddType, con(%p), type(%p), slot(%i)", con, (RsType)type, slot);
+    const char* n = NULL;
+    if (_str) {
+        n = _env->GetStringUTFChars(_str, NULL);
+    }
+    rsScriptSetType((RsType)type, slot, n);
+    if (n) {
+        _env->ReleaseStringUTFChars(_str, n);
+    }
+}
+
+static void
+nScriptSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
+    rsScriptSetRoot(isRoot);
+}
+
 // -----------------------------------
 
 static void
@@ -835,22 +858,6 @@
 }
 
 static void
-nScriptCAddType(JNIEnv *_env, jobject _this, jint type)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCAddType, con(%p), type(%p)", con, (RsType)type);
-    rsScriptCAddType((RsType)type);
-}
-
-static void
-nScriptCSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
-    rsScriptCSetRoot(isRoot);
-}
-
-static void
 nScriptCSetScript(JNIEnv *_env, jobject _this, jbyteArray scriptRef,
                   jint offset, jint length)
 {
@@ -1374,10 +1381,10 @@
 {"nScriptSetClearDepth",           "(IF)V",                                (void*)nScriptSetClearDepth },
 {"nScriptSetClearStencil",         "(II)V",                                (void*)nScriptSetClearStencil },
 {"nScriptSetTimeZone",             "(I[B)V",                               (void*)nScriptSetTimeZone },
+{"nScriptSetType",                 "(ILjava/lang/String;I)V",              (void*)nScriptSetType },
+{"nScriptSetRoot",                 "(Z)V",                                 (void*)nScriptSetRoot },
 
 {"nScriptCBegin",                  "()V",                                  (void*)nScriptCBegin },
-{"nScriptCAddType",                "(I)V",                                 (void*)nScriptCAddType },
-{"nScriptCSetRoot",                "(Z)V",                                 (void*)nScriptCSetRoot },
 {"nScriptCSetScript",              "([BII)V",                              (void*)nScriptCSetScript },
 {"nScriptCCreate",                 "()I",                                  (void*)nScriptCCreate },
 {"nScriptCAddDefineI32",           "(Ljava/lang/String;I)V",               (void*)nScriptCAddDefineI32 },
diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c
index 4e7c37a..255d908 100644
--- a/libs/rs/java/Film/res/raw/filmstrip.c
+++ b/libs/rs/java/Film/res/raw/filmstrip.c
@@ -22,8 +22,8 @@
 {
     float mat1[16];
 
-    float trans = loadF(1, POS_TRANSLATE);
-    float rot = loadF(1, POS_ROTATE);
+    float trans = Pos_translate;
+    float rot = Pos_rotate;
     matrixLoadScale(mat1, 2.f, 2.f, 2.f);
     matrixTranslate(mat1, 0.f, 0.f, trans);
     matrixRotate(mat1, 90.f, 0.f, 0.f, 1.f);
@@ -39,7 +39,7 @@
     bindProgramFragment(NAMED_PFImages);
     bindProgramVertex(NAMED_PVImages);
 
-    float focusPos = loadF(1, POS_FOCUS);
+    float focusPos = Pos_focus;
     int focusID = 0;
     int lastFocusID = loadI32(2, STATE_LAST_FOCUS);
     int imgCount = 13;
@@ -65,7 +65,7 @@
     */
     storeI32(2, STATE_LAST_FOCUS, focusID);
 
-    int triangleOffsetsCount = loadI32(2, STATE_TRIANGLE_OFFSET_COUNT);
+    int triangleOffsetsCount = Pos_triangleOffsetCount;
 
     int imgId = 0;
     for (imgId=1; imgId <= imgCount; imgId++) {
diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java
index 74f88c4..e6cd52d 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmRS.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java
@@ -23,25 +23,18 @@
 import android.graphics.Bitmap;
 import android.util.Log;
 
-import android.renderscript.Matrix;
-import android.renderscript.ProgramVertex;
-import android.renderscript.RenderScript;
-import android.renderscript.Element;
-import android.renderscript.Allocation;
-import android.renderscript.Dimension;
-import android.renderscript.ScriptC;
-import android.renderscript.Script;
-import android.renderscript.ProgramFragment;
-import android.renderscript.ProgramStore;
-import android.renderscript.Sampler;
-import android.renderscript.Light;
+import android.renderscript.*;
 
 public class FilmRS {
-    private final int POS_TRANSLATE = 0;
-    private final int POS_ROTATE = 1;
-    private final int POS_FOCUS = 2;
+    class StripPosition {
+        public float translate;
+        public float rotate;
+        public float focus;
+        public int triangleOffsetCount;
+    }
+    StripPosition mPos = new StripPosition();
 
-    private final int STATE_TRIANGLE_OFFSET_COUNT = 0;
+
     private final int STATE_LAST_FOCUS = 1;
 
     public FilmRS() {
@@ -63,10 +56,11 @@
         }
 
         float anim = ((float)x-50) / 270.f;
-        mBufferPos[POS_TRANSLATE] = 2f * anim + 0.5f;   // translation
-        mBufferPos[POS_ROTATE] = (anim * 40);  // rotation
-        mBufferPos[POS_FOCUS] = ((float)y) / 16.f - 10.f;  // focusPos
-        mAllocPos.data(mBufferPos);
+        mPos.translate = 2f * anim + 0.5f;   // translation
+        mPos.rotate = (anim * 40);  // rotation
+        mPos.focus = ((float)y) / 16.f - 10.f;  // focusPos
+        mPos.triangleOffsetCount = mFSM.mTriangleOffsetsCount;
+        mAllocPos.data(mPos);
     }
 
 
@@ -84,6 +78,7 @@
     private ProgramVertex mPVBackground;
     private ProgramVertex mPVImages;
     private ProgramVertex.MatrixAllocation mPVA;
+    private Type mStripPositionType;
 
     private Allocation mImages[];
     private Allocation mAllocIDs;
@@ -204,10 +199,7 @@
         mBufferState = new int[10];
         mAllocState = Allocation.createSized(mRS,
             Element.USER_FLOAT, mBufferState.length);
-
-        mBufferState[STATE_TRIANGLE_OFFSET_COUNT] = mFSM.mTriangleOffsetsCount;
         mBufferState[STATE_LAST_FOCUS] = -1;
-
         mAllocState.data(mBufferState);
     }
 
@@ -227,14 +219,16 @@
 
         Log.e("rs", "Done loading named");
 
+        mStripPositionType = Type.createFromClass(mRS, StripPosition.class, 1);
+
         ScriptC.Builder sb = new ScriptC.Builder(mRS);
         sb.setScript(mRes, R.raw.filmstrip);
         sb.setRoot(true);
+        sb.setType(mStripPositionType, "Pos", 1);
         mScriptStrip = sb.create();
         mScriptStrip.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
-        mAllocPos = Allocation.createSized(mRS,
-            Element.USER_FLOAT, mBufferPos.length);
+        mAllocPos = Allocation.createTyped(mRS, mStripPositionType);
 
         loadImages();
         initState();
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
index 3e680e35..da4eeb4 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -118,7 +118,7 @@
         ScriptC.Builder sb = new ScriptC.Builder(mRS);
         sb.setScript(mRes, R.raw.fountain);
         sb.setRoot(true);
-        sb.addType(mSDType);
+        sb.setType(mSDType, 0);
         mScript = sb.create();
         mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index d4fbf6b..105142b 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -312,14 +312,18 @@
 	param uint32_t stencil
 	}
 
-ScriptCAddType {
+ScriptSetType {
 	param RsType type
+	param uint32_t slot
+	param const char * name
 	}
 
-ScriptCSetRoot {
+ScriptSetRoot {
 	param bool isRoot
 	}
 
+
+
 ScriptCSetScript {
 	param void * codePtr
 	}
diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp
index 831580b..b88710c 100644
--- a/libs/rs/rsComponent.cpp
+++ b/libs/rs/rsComponent.cpp
@@ -42,6 +42,26 @@
     }
 }
 
+const char * Component::getCType() const
+{
+    switch(mType) {
+    case FLOAT:
+        return "float";
+    case SIGNED:
+    case UNSIGNED:
+        switch(mBits) {
+        case 32:
+            return "int";
+        case 16:
+            return "short";
+        case 8:
+            return "char";
+        }
+        break;
+    }
+    return NULL;
+}
+
 Component::~Component()
 {
 }
diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h
index 5ee95c7..6342f1b 100644
--- a/libs/rs/rsComponent.h
+++ b/libs/rs/rsComponent.h
@@ -53,6 +53,7 @@
     uint32_t getBits() const {return mBits;}
 
     uint32_t getGLType() const;
+    const char * getCType() const;
 
     const char * getComponentName() const {return mName.string();}
 
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 6ce9f61..75c994b 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -76,6 +76,25 @@
     s->mEnviroment.mClearStencil = v;
 }
 
+void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, const char *name)
+{
+    ScriptCState *ss = &rsc->mScriptC;
+    const Type *t = static_cast<const Type *>(vt);
+    ss->mConstantBufferTypes[slot].set(t);
+    if (name) {
+        ss->mSlotNames[slot].setTo(name);
+    } else {
+        ss->mSlotNames[slot].setTo("");
+    }
+}
+
+void rsi_ScriptSetRoot(Context * rsc, bool isRoot)
+{
+    ScriptCState *ss = &rsc->mScriptC;
+    ss->mEnviroment.mIsRoot = isRoot;
+}
+
+
 }
 }
 
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index 6983ef4..dc66763 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/rsScript.h
@@ -56,11 +56,11 @@
     };
     Enviroment_t mEnviroment;
 
-    const Type * mConstantBufferTypes;
     uint32_t mCounstantBufferCount;
 
     ObjectBaseRef<Allocation> mSlots[MAX_SCRIPT_BANKS];
-    ObjectBaseRef<Type> mTypes[MAX_SCRIPT_BANKS];
+    ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS];
+    String8 mSlotNames[MAX_SCRIPT_BANKS];
 
     virtual bool run(Context *, uint32_t launchID) = 0;
 };
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 652283d..ced2516 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -90,9 +90,9 @@
 {
     memset(&mProgram, 0, sizeof(mProgram));
 
-    mConstantTypeCount = 0;
     for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
         mConstantBufferTypes[ct].clear();
+        mSlotNames[ct].setTo("");
     }
 
     memset(&mEnviroment, 0, sizeof(mEnviroment));
@@ -248,24 +248,56 @@
 void ScriptCState::appendTypes(String8 *str)
 {
     char buf[256];
+    String8 tmp;
 
-    for (size_t ct=0; ct < mConstantTypeCount; ct++) {
+    for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
         const Type *t = mConstantBufferTypes[ct].get();
-        const Element *e = t->getElement();
-
-        if (!t->getName()) {
+        if (!t) {
             continue;
         }
-        for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
-            const Component *c = e->getComponent(ct2);
-            str->append("#define OFFSETOF_");
-            str->append(t->getName());
-            str->append("_");
-            str->append(c->getComponentName());
-            sprintf(buf, " %i\n", ct2);
-            str->append(buf);
+        const Element *e = t->getElement();
+
+        if (t->getName()) {
+            for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
+                const Component *c = e->getComponent(ct2);
+                tmp.setTo("#define OFFSETOF_");
+                tmp.append(t->getName());
+                tmp.append("_");
+                tmp.append(c->getComponentName());
+                sprintf(buf, " %i\n", ct2);
+                tmp.append(buf);
+                LOGD(tmp);
+                str->append(tmp);
+            }
         }
 
+        if (mSlotNames[ct].length() > 0) {
+            for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
+                const Component *c = e->getComponent(ct2);
+                tmp.setTo("#define ");
+                tmp.append(mSlotNames[ct]);
+                tmp.append("_");
+                tmp.append(c->getComponentName());
+                switch (c->getType()) {
+                case Component::FLOAT:
+                    tmp.append(" loadF(");
+                    break;
+                case Component::SIGNED:
+                    sprintf(buf, " loadI%i(", c->getBits());
+                    tmp.append(buf);
+                    break;
+                case Component::UNSIGNED:
+                    sprintf(buf, " loadU%i(", c->getBits());
+                    tmp.append(buf);
+                    break;
+                }
+                sprintf(buf, "%i, %i)\n", ct, ct2);
+                tmp.append(buf);
+
+                LOGD(tmp);
+                str->append(tmp);
+            }
+        }
     }
 
 }
@@ -280,27 +312,12 @@
     ss->clear();
 }
 
-void rsi_ScriptCAddType(Context * rsc, RsType vt)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    const Type *t = static_cast<const Type *>(vt);
-
-    ss->mConstantBufferTypes[ss->mConstantTypeCount].set(t);
-    ss->mConstantTypeCount ++;
-}
-
 void rsi_ScriptCSetScript(Context * rsc, void *vp)
 {
     ScriptCState *ss = &rsc->mScriptC;
     ss->mProgram.mScript = reinterpret_cast<ScriptC::RunScript_t>(vp);
 }
 
-void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mIsRoot = isRoot;
-}
-
 void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
 {
     ScriptCState *ss = &rsc->mScriptC;
@@ -321,8 +338,12 @@
     ss->mAccScript = NULL;
     s->mEnviroment = ss->mEnviroment;
     s->mProgram = ss->mProgram;
-    ss->clear();
+    for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
+        s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
+        s->mSlotNames[ct] = ss->mSlotNames[ct];
+    }
 
+    ss->clear();
     return s;
 }
 
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 60a6fba..32a9079 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -69,7 +69,7 @@
     Script::Enviroment_t mEnviroment;
 
     ObjectBaseRef<const Type> mConstantBufferTypes[MAX_SCRIPT_BANKS];
-    uint32_t mConstantTypeCount;
+    String8 mSlotNames[MAX_SCRIPT_BANKS];
 
     void clear();
     void runCompiler(Context *rsc);
