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();
