diff --git a/java/Fountain/res/raw/fountain.c b/java/Fountain/res/raw/fountain.c
index 5055c39..afb2fb3 100644
--- a/java/Fountain/res/raw/fountain.c
+++ b/java/Fountain/res/raw/fountain.c
@@ -3,8 +3,8 @@
 #pragma version(1)
 #pragma stateVertex(orthoWindow)
 #pragma stateRaster(flat)
-#pragma stateFragment(color)
-#pragma stateStore(parent)
+#pragma stateFragment(PgmFragBackground)
+#pragma stateFragmentStore(MyBlend)
 
 
 int main(void* con, int ft, int launchID) {
@@ -35,7 +35,7 @@
         }
     }
 
-    contextBindProgramFragment(con, loadI32(con, 0, 7));
+    //contextBindProgramFragment(con, loadI32(con, 0, 7));
     drawRect(con, 0, 256, 0, 512);
     contextBindProgramFragment(con, loadI32(con, 0, 6));
 
diff --git a/java/Fountain/src/com/android/fountain/FountainView.java b/java/Fountain/src/com/android/fountain/FountainView.java
index 3381525..0a6f7c5 100644
--- a/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/java/Fountain/src/com/android/fountain/FountainView.java
@@ -82,6 +82,7 @@
         mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.SRC_ALPHA, RenderScript.BlendDstFunc.ONE);
         mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
         mPFS = mRS.programFragmentStoreCreate();
+        mPFS.setName("MyBlend");
         mRS.contextBindProgramFragmentStore(mPFS);
 
         mRS.samplerBegin();
@@ -92,6 +93,7 @@
 
         mRS.programFragmentBegin(null, null);
         mPF = mRS.programFragmentCreate();
+        mPF.setName("PgmFragParts");
         //mRS.contextBindProgramFragment(mPF);
 
         mRS.programFragmentBegin(null, null);
@@ -100,6 +102,7 @@
         mRS.contextBindProgramFragment(mPF2);
         mPF2.bindTexture(mTexture, 0);
         mPF2.bindSampler(mSampler, 0);
+        mPF2.setName("PgmFragBackground");
 
         mParams[0] = 0;
         mParams[1] = partCount;
diff --git a/java/Fountain/src/com/android/fountain/RenderScript.java b/java/Fountain/src/com/android/fountain/RenderScript.java
index 796fe35..fcfb82d 100644
--- a/java/Fountain/src/com/android/fountain/RenderScript.java
+++ b/java/Fountain/src/com/android/fountain/RenderScript.java
@@ -68,6 +68,8 @@
     native private void nContextBindProgramFragmentStore(int pfs);
     native private void nContextBindProgramFragment(int pf);
 
+    native private void nAssignName(int obj, byte[] name);
+
     native private void nElementBegin();
     native private void nElementAddPredefined(int predef);
     native private void nElementAdd(int kind, int type, int norm, int bits);
@@ -135,6 +137,7 @@
     native private void nProgramFragmentStoreBlendFunc(int src, int dst);
     native private void nProgramFragmentStoreDither(boolean enable);
     native private int  nProgramFragmentStoreCreate();
+    native private void nProgramFragmentStoreDestroy(int pgm);
 
     native private void nProgramFragmentBegin(int in, int out);
     native private void nProgramFragmentBindTexture(int vpf, int slot, int a);
@@ -143,6 +146,7 @@
     native private void nProgramFragmentSetEnvMode(int slot, int env);
     native private void nProgramFragmentSetTexEnable(int slot, boolean enable);
     native private int  nProgramFragmentCreate();
+    native private void nProgramFragmentDestroy(int pgm);
 
 
     private int     mDev;
@@ -166,6 +170,26 @@
         }
 
         int mID;
+        String mName;
+
+        public void setName(String s) throws IllegalStateException, IllegalArgumentException
+        {
+            if(s.length() < 1) {
+                throw new IllegalArgumentException("setName does not accept a zero length string.");
+            }
+            if(mName != null) {
+                throw new IllegalArgumentException("setName object already has a name.");
+            }
+
+            try {
+                byte[] bytes = s.getBytes("UTF-8");
+                nAssignName(mID, bytes);
+                mName = s;
+            } catch (java.io.UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
         protected void finalize() throws Throwable
         {
             if (mID != 0) {
@@ -661,7 +685,7 @@
         }
 
         public void destroy() {
-            nScriptDestroy(mID);
+            nProgramFragmentStoreDestroy(mID);
             mID = 0;
         }
     }
@@ -712,7 +736,7 @@
         }
 
         public void destroy() {
-            nScriptDestroy(mID);
+            nProgramFragmentDestroy(mID);
             mID = 0;
         }
 
diff --git a/jni/RenderScript_jni.cpp b/jni/RenderScript_jni.cpp
index 677ce0c..2dadf07 100644
--- a/jni/RenderScript_jni.cpp
+++ b/jni/RenderScript_jni.cpp
@@ -62,6 +62,21 @@
 
 // ---------------------------------------------------------------------------
 
+static void
+nAssignName(JNIEnv *_env, jobject _this, jint obj, jbyteArray str)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nAssignName, con(%p), obj(%p)", con, obj);
+
+    jint len = _env->GetArrayLength(str);
+    jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
+    rsAssignName((void *)obj, (const char *)cptr);
+    _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
+}
+
+
+// ---------------------------------------------------------------------------
+
 static jint
 nDeviceCreate(JNIEnv *_env, jobject _this)
 {
@@ -662,9 +677,18 @@
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
     LOG_API("nProgramFragmentStoreCreate, con(%p)", con);
+
     return (jint)rsProgramFragmentStoreCreate();
 }
 
+static void
+nProgramFragmentStoreDestroy(JNIEnv *_env, jobject _this, jint pgm)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nProgramFragmentStoreDestroy, con(%p), pgm(%i)", con, pgm);
+    rsProgramFragmentStoreDestroy((RsProgramFragmentStore)pgm);
+}
+
 // ---------------------------------------------------------------------------
 
 static void
@@ -723,6 +747,14 @@
     return (jint)rsProgramFragmentCreate();
 }
 
+static void
+nProgramFragmentDestroy(JNIEnv *_env, jobject _this, jint pgm)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nProgramFragmentDestroy, con(%p), pgm(%i)", con, pgm);
+    rsProgramFragmentDestroy((RsProgramFragment)pgm);
+}
+
 
 // ---------------------------------------------------------------------------
 
@@ -796,6 +828,7 @@
 {"nDeviceDestroy",                 "(I)V",                                 (void*)nDeviceDestroy },
 {"nContextCreate",                 "(ILandroid/view/Surface;I)I",          (void*)nContextCreate },
 {"nContextDestroy",                "(I)V",                                 (void*)nContextDestroy },
+{"nAssignName",                    "(I[B)V",                               (void*)nAssignName },
 
 {"nElementBegin",                  "()V",                                  (void*)nElementBegin },
 {"nElementAddPredefined",          "(I)V",                                 (void*)nElementAddPredefined },
@@ -858,6 +891,7 @@
 {"nProgramFragmentStoreBlendFunc", "(II)V",                                (void*)nProgramFragmentStoreBlendFunc },
 {"nProgramFragmentStoreDither",    "(Z)V",                                 (void*)nProgramFragmentStoreDither },
 {"nProgramFragmentStoreCreate",    "()I",                                  (void*)nProgramFragmentStoreCreate },
+{"nProgramFragmentStoreDestroy",   "(I)V",                                 (void*)nProgramFragmentStoreDestroy },
 
 {"nProgramFragmentBegin",          "(II)V",                                (void*)nProgramFragmentBegin },
 {"nProgramFragmentBindTexture",    "(III)V",                               (void*)nProgramFragmentBindTexture },
@@ -866,6 +900,7 @@
 {"nProgramFragmentSetEnvMode",     "(II)V",                                (void*)nProgramFragmentSetEnvMode },
 {"nProgramFragmentSetTexEnable",   "(IZ)V",                                (void*)nProgramFragmentSetTexEnable },
 {"nProgramFragmentCreate",         "()I",                                  (void*)nProgramFragmentCreate },
+{"nProgramFragmentDestroy",        "(I)V",                                 (void*)nProgramFragmentDestroy },
 
 {"nContextBindRootScript",         "(I)V",                                 (void*)nContextBindRootScript },
 {"nContextBindProgramFragmentStore","(I)V",                                (void*)nContextBindProgramFragmentStore },
diff --git a/rs.spec b/rs.spec
index 4ffdfce..b7eaed1 100644
--- a/rs.spec
+++ b/rs.spec
@@ -16,6 +16,10 @@
 	param RsProgramVertex pgm
 	}
 
+AssignName {
+	param void *obj
+	param const char *name
+	}
 
 ElementBegin {
 }
@@ -332,6 +336,9 @@
 	ret RsProgramFragmentStore
 	}
 
+ProgramFragmentStoreDestroy {
+	param RsProgramFragmentStore pfs
+	}
 
 
 ProgramFragmentBegin {
@@ -370,6 +377,9 @@
 	ret RsProgramFragment
 	}
 
+ProgramFragmentDestroy {
+	param RsProgramFragment pf
+	}
 
 
 ProgramVertexBegin {
diff --git a/rsContext.cpp b/rsContext.cpp
index 82d6499..ffd03d5 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -57,14 +57,17 @@
      eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight);
 }
 
-bool Context::runScript(Script *s)
+bool Context::runScript(Script *s, uint32_t launchID)
 {
     ObjectBaseRef<ProgramFragment> frag(mFragment);
     ObjectBaseRef<ProgramVertex> vtx(mVertex);
     ObjectBaseRef<ProgramFragmentStore> store(mFragmentStore);
 
+    bool ret = s->run(this, launchID);
 
-
+    mFragment.set(frag);
+    mVertex.set(vtx);
+    mFragmentStore.set(store);
     return true;
 
 }
@@ -107,7 +110,7 @@
     glClear(GL_COLOR_BUFFER_BIT);
     glClear(GL_DEPTH_BUFFER_BIT);
 
-    return mRootScript->run(this, 0);
+    return runScript(mRootScript.get(), 0);
 }
 
 void Context::setupCheck()
@@ -243,6 +246,33 @@
     pv->setupGL();
 }
 
+void Context::assignName(ObjectBase *obj, const char *name)
+{
+    rsAssert(!obj->getName());
+    obj->setName(name);
+    mNames.add(obj);
+}
+
+void Context::removeName(ObjectBase *obj)
+{
+    for(size_t ct=0; ct < mNames.size(); ct++) {
+        if (obj == mNames[ct]) {
+            mNames.removeAt(ct);
+            return;
+        }
+    }
+}
+
+ObjectBase * Context::lookupName(const char *name) const
+{
+    for(size_t ct=0; ct < mNames.size(); ct++) {
+        if (!strcmp(name, mNames[ct]->getName())) {
+            return mNames[ct];
+        }
+    }
+    return NULL;
+}
+
 ///////////////////////////////////////////////////////////////////////////////////////////
 //
 
@@ -286,6 +316,11 @@
     rsc->setVertex(pv);
 }
 
+void rsi_AssignName(Context *rsc, void * obj, const char *name)
+{
+    ObjectBase *ob = static_cast<ObjectBase *>(obj);
+    rsc->assignName(ob, name);
+}
 
 
 }
diff --git a/rsContext.h b/rsContext.h
index 929c0f9..184740f 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -42,7 +42,6 @@
 namespace android {
 namespace renderscript {
 
-
 class Context 
 {
 public:
@@ -77,6 +76,10 @@
 
     void setupCheck();
 
+    void assignName(ObjectBase *obj, const char *name);
+    void removeName(ObjectBase *obj);
+    ObjectBase * lookupName(const char *name) const;
+
 protected:
     Device *mDev;
 
@@ -112,7 +115,7 @@
 
     void initEGL();
 
-    bool runScript(Script *s);
+    bool runScript(Script *s, uint32_t launchID);
     bool runRootScript();
 
     static void * threadProc(void *);
@@ -120,6 +123,8 @@
     // todo: put in TLS
     static Context *gCon;
     Surface *mWndSurface;
+
+    Vector<ObjectBase *> mNames;
 };
 
 
diff --git a/rsObjectBase.cpp b/rsObjectBase.cpp
index f9cb9c8..8660818 100644
--- a/rsObjectBase.cpp
+++ b/rsObjectBase.cpp
@@ -23,6 +23,7 @@
 ObjectBase::ObjectBase()
 {
     mRefCount = 0;
+    mName = NULL;
 }
 
 ObjectBase::~ObjectBase()
@@ -46,3 +47,12 @@
     }
 }
 
+void ObjectBase::setName(const char *name)
+{
+    delete mName;
+    mName = NULL;
+    if (name) {
+        mName = new char[strlen(name) +1];
+        strcpy(mName, name);
+    }
+}
diff --git a/rsObjectBase.h b/rsObjectBase.h
index ca7acda..4c52e9c 100644
--- a/rsObjectBase.h
+++ b/rsObjectBase.h
@@ -33,7 +33,13 @@
     void incRef() const;
     void decRef() const;
 
+    const char * getName() const {
+        return mName;
+    }
+    void setName(const char *);
+
 private:
+    char * mName;
     mutable int32_t mRefCount;
 
 
@@ -49,12 +55,16 @@
 
     ObjectBaseRef(const ObjectBaseRef &ref) {
         mRef = ref.get();
-        mRef->incRef();
+        if (mRef) {
+            mRef->incRef();
+        }
     }
 
     ObjectBaseRef(T *ref) {
         mRef = ref;
-        ref->incRef();
+        if (mRef) {
+            ref->incRef();
+        }
     }
 
     ~ObjectBaseRef() {
@@ -65,10 +75,16 @@
         if (mRef != ref) {
             clear();
             mRef = ref;
-            ref->incRef();
+            if (mRef) {
+                ref->incRef();
+            }
         }
     }
 
+    void set(const ObjectBaseRef &ref) {
+        set(ref.mRef);
+    }
+
     void clear() {
         if (mRef) {
             mRef->decRef();
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index 3d316ea..316e791 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -212,6 +212,14 @@
     return pf;
 }
 
+void rsi_ProgramFragmentDestroy(Context *rsc, RsProgramFragment vpf)
+{
+    ProgramFragment *pf = (ProgramFragment *)vpf;
+    if (pf->getName()) {
+        rsc->removeName(pf);
+    }
+    pf->decRef();
+}
 
 
 }
diff --git a/rsProgramFragment.h b/rsProgramFragment.h
index cc08aea..ed9c49b 100644
--- a/rsProgramFragment.h
+++ b/rsProgramFragment.h
@@ -85,7 +85,7 @@
 
     ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
 
-
+    Vector<ProgramFragment *> mPrograms;
 };
 
 
diff --git a/rsProgramFragmentStore.cpp b/rsProgramFragmentStore.cpp
index 7f5d5f4..a1855a6 100644
--- a/rsProgramFragmentStore.cpp
+++ b/rsProgramFragmentStore.cpp
@@ -202,7 +202,6 @@
 }
 
 
-
 namespace android {
 namespace renderscript {
 
@@ -238,7 +237,6 @@
     ProgramFragmentStore *pfs = rsc->mStateFragmentStore.mPFS;
     pfs->incRef();
     rsc->mStateFragmentStore.mPFS = 0;
-
     return pfs;
 }
 
@@ -247,6 +245,17 @@
     rsc->mStateFragmentStore.mPFS->setDitherEnable(enable);
 }
 
+void rsi_ProgramFragmentStoreDestroy(Context *rsc, RsProgramFragmentStore vpfs)
+{
+    ProgramFragmentStore *pfs = (ProgramFragmentStore *)vpfs;
+    if (pfs->getName()) {
+        rsc->removeName(pfs);
+    }
+    pfs->decRef();
+}
+
+
+
 
 }
 }
diff --git a/rsProgramFragmentStore.h b/rsProgramFragmentStore.h
index bbd0f38..d862775 100644
--- a/rsProgramFragmentStore.h
+++ b/rsProgramFragmentStore.h
@@ -76,8 +76,6 @@
     ~ProgramFragmentStoreState();
 
     ProgramFragmentStore *mPFS;
-
-
 };
 
 
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index 8e2b82d..a80e2f7 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -97,7 +97,6 @@
     ProgramVertex *pv = rsc->mStateVertex.mPV;
     pv->incRef();
     rsc->mStateVertex.mPV = 0;
-
     return pv;
 }
 
diff --git a/rsScript.h b/rsScript.h
index 25a21c1..d32f116 100644
--- a/rsScript.h
+++ b/rsScript.h
@@ -19,11 +19,15 @@
 
 #include "rsAllocation.h"
 
+
 // ---------------------------------------------------------------------------
 namespace android {
 namespace renderscript {
 
-    
+class ProgramVertex;
+class ProgramFragment;
+class ProgramRaster;
+class ProgramFragmentStore;
 
 class Script : public ObjectBase
 {
@@ -40,37 +44,10 @@
         float mClearDepth;
         uint32_t mClearStencil;
 
-        enum StateVertex {
-            VTX_ORTHO_WINDOW,
-            VTX_ORTHO_NORMALIZED,
-            VTX_PROJECTION,
-            VTX_PARENT
-        };
-        StateVertex mStateVertex;
-
-        enum StateRaster {
-            RASTER_FLAT,
-            RASTER_SMOOTH,
-            RASTER_PARENT
-        };
-        StateRaster mStateRaster;
-
-        enum StateFragment {
-            FRAGMENT_COLOR,
-            FRAGMENT_TEX_REPLACE,
-            FRAGMENT_TEX_MODULATE,
-            FRAGMENT_PARENT
-        };
-        StateFragment mStateFragment;
-
-        enum StateFragmentStore {
-            FRAGMENT_STORE_ALWAYS_REPLACE,
-            FRAGMENT_STORE_ALWAYS_BLEND,
-            FRAGMENT_STORE_DEPTH_LESS_REPLACE,
-            FRAGMENT_STORE_DEPTH_LESS_BLEND,
-            FRAGMENT_STORE_PARENT
-        };
-        StateFragmentStore mStateFragmentStore;
+        ObjectBaseRef<ProgramVertex> mVertex;
+        ObjectBaseRef<ProgramFragment> mFragment;
+        //ObjectBaseRef<ProgramRaster> mRaster;
+        ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
 
     };
     Enviroment_t mEnviroment;
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index 49d7872..ae58e5f 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -390,6 +390,14 @@
 bool ScriptC::run(Context *rsc, uint32_t launchID)
 {
     Env e = {rsc, this};
+
+    if (mEnviroment.mFragmentStore.get()) {
+        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
+    }
+    if (mEnviroment.mFragment.get()) {
+        rsc->setFragment(mEnviroment.mFragment.get());
+    }
+
     return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
 }
 
@@ -425,7 +433,7 @@
 
 }
 
-void ScriptCState::runCompiler()
+void ScriptCState::runCompiler(Context *rsc)
 {
     mAccScript = accCreateScript();
 
@@ -442,16 +450,6 @@
         ACCchar * str[pragmaMax];
         accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
 
-        // Start with defaults
-        mEnviroment.mStateVertex = 
-            Script::Enviroment_t::VTX_ORTHO_WINDOW;
-        mEnviroment.mStateRaster = 
-            Script::Enviroment_t::RASTER_FLAT;
-        mEnviroment.mStateFragment = 
-            Script::Enviroment_t::FRAGMENT_COLOR;
-        mEnviroment.mStateFragmentStore = 
-            Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_REPLACE;
-
         for (int ct=0; ct < pragmaCount; ct+=2) {
             LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
 
@@ -462,96 +460,34 @@
 
 
             if (!strcmp(str[ct], "stateVertex")) {
-                if (!strcmp(str[ct+1], "orthoWindow")) {
-                    mEnviroment.mStateVertex = 
-                        Script::Enviroment_t::VTX_ORTHO_WINDOW;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "orthoNormalized")) {
-                    mEnviroment.mStateVertex = 
-                        Script::Enviroment_t::VTX_ORTHO_NORMALIZED;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "projection")) {
-                    mEnviroment.mStateVertex = 
-                        Script::Enviroment_t::VTX_PROJECTION;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "parent")) {
-                    mEnviroment.mStateVertex = 
-                        Script::Enviroment_t::VTX_PARENT;
-                    continue;
-                }
                 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
             }
 
             if (!strcmp(str[ct], "stateRaster")) {
-                if (!strcmp(str[ct+1], "flat")) {
-                    mEnviroment.mStateRaster = 
-                        Script::Enviroment_t::RASTER_FLAT;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "smooth")) {
-                    mEnviroment.mStateRaster = 
-                        Script::Enviroment_t::RASTER_SMOOTH;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "parent")) {
-                    mEnviroment.mStateRaster = 
-                        Script::Enviroment_t::RASTER_PARENT;
-                    continue;
-                }
                 LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
             }
 
             if (!strcmp(str[ct], "stateFragment")) {
-                if (!strcmp(str[ct+1], "color")) {
-                    mEnviroment.mStateFragment = 
-                        Script::Enviroment_t::FRAGMENT_COLOR;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "texReplace")) {
-                    mEnviroment.mStateFragment = 
-                        Script::Enviroment_t::FRAGMENT_TEX_REPLACE;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "texModulate")) {
-                    mEnviroment.mStateFragment = 
-                        Script::Enviroment_t::FRAGMENT_TEX_MODULATE;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "parent")) {
-                    mEnviroment.mStateFragment = 
-                        Script::Enviroment_t::FRAGMENT_PARENT;
+                ProgramFragment * pf = 
+                    (ProgramFragment *)rsc->lookupName(str[ct+1]);
+                if (pf != NULL) {
+                    mEnviroment.mFragment.set(pf);
                     continue;
                 }
                 LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
             }
 
             if (!strcmp(str[ct], "stateFragmentStore")) {
-                if (!strcmp(str[ct+1], "alwaysReplace")) {
-                    mEnviroment.mStateFragmentStore = 
-                        Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_REPLACE;
+                ProgramFragmentStore * pfs = 
+                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
+                if (pfs != NULL) {
+                    mEnviroment.mFragmentStore.set(pfs);
                     continue;
                 }
-                if (!strcmp(str[ct+1], "alwaysBlend")) {
-                    mEnviroment.mStateFragmentStore = 
-                        Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_BLEND;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "depthLessReplace")) {
-                    mEnviroment.mStateFragmentStore = 
-                        Script::Enviroment_t::FRAGMENT_STORE_DEPTH_LESS_REPLACE;
-                    continue;
-                }
-                if (!strcmp(str[ct+1], "depthLessBlend")) {
-                    mEnviroment.mStateFragmentStore = 
-                        Script::Enviroment_t::FRAGMENT_STORE_DEPTH_LESS_BLEND;
-                    continue;
-                }
+
                 if (!strcmp(str[ct+1], "parent")) {
-                    mEnviroment.mStateFragmentStore = 
-                        Script::Enviroment_t::FRAGMENT_STORE_PARENT;
+                    //mEnviroment.mStateFragmentStore = 
+                        //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
                     continue;
                 }
                 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
@@ -632,7 +568,7 @@
 {
     ScriptCState *ss = &rsc->mScriptC;
 
-    ss->runCompiler();
+    ss->runCompiler(rsc);
 
     ScriptC *s = new ScriptC();
     s->incRef();
diff --git a/rsScriptC.h b/rsScriptC.h
index d178c86..55a2cc6 100644
--- a/rsScriptC.h
+++ b/rsScriptC.h
@@ -74,7 +74,7 @@
     Vector<const Type *> mConstantBufferTypes;
 
     void clear();
-    void runCompiler();
+    void runCompiler(Context *rsc);
 };
 
 
