diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c
index 5055c39..afb2fb3 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.c
+++ b/libs/rs/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/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
index 3381525..0a6f7c5 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/libs/rs/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/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java b/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java
index 796fe35..fcfb82d 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java
+++ b/libs/rs/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/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp
index 677ce0c..2dadf07 100644
--- a/libs/rs/jni/RenderScript_jni.cpp
+++ b/libs/rs/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/libs/rs/rs.spec b/libs/rs/rs.spec
index 4ffdfce..b7eaed1 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/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/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 82d6499..ffd03d5 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/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/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 929c0f9..184740f 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/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/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp
index f9cb9c8..8660818 100644
--- a/libs/rs/rsObjectBase.cpp
+++ b/libs/rs/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/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h
index ca7acda..4c52e9c 100644
--- a/libs/rs/rsObjectBase.h
+++ b/libs/rs/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/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 3d316ea..316e791 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/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/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h
index cc08aea..ed9c49b 100644
--- a/libs/rs/rsProgramFragment.h
+++ b/libs/rs/rsProgramFragment.h
@@ -85,7 +85,7 @@
 
     ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
 
-
+    Vector<ProgramFragment *> mPrograms;
 };
 
 
diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramFragmentStore.cpp
index 7f5d5f4..a1855a6 100644
--- a/libs/rs/rsProgramFragmentStore.cpp
+++ b/libs/rs/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/libs/rs/rsProgramFragmentStore.h b/libs/rs/rsProgramFragmentStore.h
index bbd0f38..d862775 100644
--- a/libs/rs/rsProgramFragmentStore.h
+++ b/libs/rs/rsProgramFragmentStore.h
@@ -76,8 +76,6 @@
     ~ProgramFragmentStoreState();
 
     ProgramFragmentStore *mPFS;
-
-
 };
 
 
diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
index 8e2b82d..a80e2f7 100644
--- a/libs/rs/rsProgramVertex.cpp
+++ b/libs/rs/rsProgramVertex.cpp
@@ -97,7 +97,6 @@
     ProgramVertex *pv = rsc->mStateVertex.mPV;
     pv->incRef();
     rsc->mStateVertex.mPV = 0;
-
     return pv;
 }
 
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index 25a21c1..d32f116 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/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/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 49d7872..ae58e5f 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/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/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index d178c86..55a2cc6 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -74,7 +74,7 @@
     Vector<const Type *> mConstantBufferTypes;
 
     void clear();
-    void runCompiler();
+    void runCompiler(Context *rsc);
 };
 
 
