diff --git a/java/Fountain/res/raw/fountain.c b/java/Fountain/res/raw/fountain.c
index afb2fb3..e7920fd 100644
--- a/java/Fountain/res/raw/fountain.c
+++ b/java/Fountain/res/raw/fountain.c
@@ -37,7 +37,7 @@
 
     //contextBindProgramFragment(con, loadI32(con, 0, 7));
     drawRect(con, 0, 256, 0, 512);
-    contextBindProgramFragment(con, loadI32(con, 0, 6));
+    contextBindProgramFragment(con, NAMED_PgmFragParts);
 
     if (touch) {
         newPart = loadI32(con, 2, 0);
@@ -106,6 +106,6 @@
         }
     }
 
-    drawTriangleArray(con, loadI32(con, 0, 5), drawCount);
+    drawTriangleArray(con, NAMED_PartBuffer, drawCount);
     return 1;
 }
diff --git a/java/Fountain/src/com/android/fountain/FountainView.java b/java/Fountain/src/com/android/fountain/FountainView.java
index f8b488a..46f6fca 100644
--- a/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/java/Fountain/src/com/android/fountain/FountainView.java
@@ -68,6 +68,7 @@
 
         mIntAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, 10);
         mPartAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 3 * 3);
+        mPartAlloc.setName("PartBuffer");
         mVertAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 5 + 1);
 
         {
@@ -97,7 +98,6 @@
         mRS.programFragmentBegin(null, null);
         mPF = mRS.programFragmentCreate();
         mPF.setName("PgmFragParts");
-        //mRS.contextBindProgramFragment(mPF);
 
         mRS.programFragmentBegin(null, null);
         mRS.programFragmentSetTexEnable(0, true);
@@ -113,8 +113,6 @@
         mParams[3] = 0;
         mParams[4] = 0;
         mParams[5] = mPartAlloc.getID();
-        mParams[6] = mPF.getID();
-        mParams[7] = mPF2.getID();
         mIntAlloc.data(mParams);
 
         int t2[] = new int[partCount * 4*3];
diff --git a/jni/RenderScript_jni.cpp b/jni/RenderScript_jni.cpp
index dcd6e2f..fd19d88 100644
--- a/jni/RenderScript_jni.cpp
+++ b/jni/RenderScript_jni.cpp
@@ -70,7 +70,7 @@
 
     jint len = _env->GetArrayLength(str);
     jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
-    rsAssignName((void *)obj, (const char *)cptr);
+    rsAssignName((void *)obj, (const char *)cptr, len);
     _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
 }
 
diff --git a/rs.spec b/rs.spec
index b7eaed1..74445d3 100644
--- a/rs.spec
+++ b/rs.spec
@@ -19,6 +19,7 @@
 AssignName {
 	param void *obj
 	param const char *name
+	param size_t len
 	}
 
 ElementBegin {
diff --git a/rsContext.cpp b/rsContext.cpp
index ffd03d5..266c455 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -17,7 +17,7 @@
 #include "rsDevice.h"
 #include "rsContext.h"
 #include "rsThreadIO.h"
-
+#include "utils/String8.h"
 
 using namespace android;
 using namespace android::renderscript;
@@ -246,10 +246,10 @@
     pv->setupGL();
 }
 
-void Context::assignName(ObjectBase *obj, const char *name)
+void Context::assignName(ObjectBase *obj, const char *name, uint32_t len)
 {
     rsAssert(!obj->getName());
-    obj->setName(name);
+    obj->setName(name, len);
     mNames.add(obj);
 }
 
@@ -273,6 +273,19 @@
     return NULL;
 }
 
+void Context::appendNameDefines(String8 *str) const
+{
+    char buf[256];
+    for (size_t ct=0; ct < mNames.size(); ct++) {
+        str->append("#define NAMED_");
+        str->append(mNames[ct]->getName());
+        str->append(" ");
+        sprintf(buf, "%i\n", (int)mNames[ct]);
+        str->append(buf);
+    }
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////////////////
 //
 
@@ -316,10 +329,10 @@
     rsc->setVertex(pv);
 }
 
-void rsi_AssignName(Context *rsc, void * obj, const char *name)
+void rsi_AssignName(Context *rsc, void * obj, const char *name, uint32_t len)
 {
     ObjectBase *ob = static_cast<ObjectBase *>(obj);
-    rsc->assignName(ob, name);
+    rsc->assignName(ob, name, len);
 }
 
 
diff --git a/rsContext.h b/rsContext.h
index 184740f..21ae8c5 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -76,9 +76,10 @@
 
     void setupCheck();
 
-    void assignName(ObjectBase *obj, const char *name);
+    void assignName(ObjectBase *obj, const char *name, uint32_t len);
     void removeName(ObjectBase *obj);
     ObjectBase * lookupName(const char *name) const;
+    void appendNameDefines(String8 *str) const;
 
 protected:
     Device *mDev;
diff --git a/rsObjectBase.cpp b/rsObjectBase.cpp
index 8660818..8f5232a 100644
--- a/rsObjectBase.cpp
+++ b/rsObjectBase.cpp
@@ -56,3 +56,15 @@
         strcpy(mName, name);
     }
 }
+
+void ObjectBase::setName(const char *name, uint32_t len)
+{
+    delete mName;
+    mName = NULL;
+    if (name) {
+        mName = new char[len + 1];
+        memcpy(mName, name, len);
+        mName[len] = 0;
+    }
+}
+
diff --git a/rsObjectBase.h b/rsObjectBase.h
index 4c52e9c..b2c3338 100644
--- a/rsObjectBase.h
+++ b/rsObjectBase.h
@@ -37,6 +37,7 @@
         return mName;
     }
     void setName(const char *);
+    void setName(const char *, uint32_t len);
 
 private:
     char * mName;
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index ae58e5f..d29eb9f 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -19,6 +19,7 @@
 #include "rsMatrix.h"
 
 #include "acc/acc.h"
+#include "utils/String8.h"
 
 using namespace android;
 using namespace android::renderscript;
@@ -433,17 +434,22 @@
 
 }
 
+
 void ScriptCState::runCompiler(Context *rsc)
 {
     mAccScript = accCreateScript();
+    String8 tmp;
 
-    const char* scriptSource[] = {mProgram.mScriptText};
-    int scriptLength[] = {mProgram.mScriptTextLength} ;
-    accScriptSource(mAccScript, 1, scriptSource, scriptLength);
+    rsc->appendNameDefines(&tmp);
+
+    const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
+    int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
+    accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
     accCompileScript(mAccScript);
     accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
     rsAssert(mProgram.mScript);
 
+
     if (mProgram.mScript) {
         const static int pragmaMax = 16;
         ACCsizei pragmaCount;
