diff --git a/graphics/java/android/renderscript/Program.java b/graphics/java/android/renderscript/Program.java
index bf6aac7..88b87b0 100644
--- a/graphics/java/android/renderscript/Program.java
+++ b/graphics/java/android/renderscript/Program.java
@@ -29,10 +29,12 @@
     public static final int MAX_INPUT = 8;
     public static final int MAX_OUTPUT = 8;
     public static final int MAX_CONSTANT = 8;
+    public static final int MAX_TEXTURE = 8;
 
     Element mInputs[];
     Element mOutputs[];
     Type mConstants[];
+    int mTextureCount;
     String mShader;
 
     Program(int id, RenderScript rs) {
@@ -65,6 +67,7 @@
             mInputCount = 0;
             mOutputCount = 0;
             mConstantCount = 0;
+            mTextureCount = 0;
         }
 
         public void setShader(String s) {
@@ -95,12 +98,12 @@
             mConstants[mConstantCount++] = t;
         }
 
-        public void addTexture(Type t) throws IllegalStateException {
+        public void setTextureCount(int count) throws IllegalArgumentException {
             // Should check for consistant and non-conflicting names...
-            if(mTextureCount >= MAX_CONSTANT) {
-                throw new IllegalArgumentException("Max input count exceeded.");
+            if(count >= MAX_CONSTANT) {
+                throw new IllegalArgumentException("Max texture count exceeded.");
             }
-            mTextures[mTextureCount++] = t;
+            mTextureCount = count;
         }
 
         protected void initProgram(Program p) {
@@ -110,8 +113,7 @@
             System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
             p.mConstants = new Type[mConstantCount];
             System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
-            p.mTextures = new Type[mTextureCount];
-            System.arraycopy(mTextures, 0, p.mTextures, 0, mTextureCount);
+            p.mTextureCount = mTextureCount;
         }
     }
 
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 2b2557d..f150043 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -25,7 +25,7 @@
  * @hide
  *
  **/
-public class ProgramFragment extends BaseObj {
+public class ProgramFragment extends Program {
     public static final int MAX_SLOT = 2;
 
     public enum EnvMode {
@@ -41,8 +41,7 @@
 
 
     ProgramFragment(int id, RenderScript rs) {
-        super(rs);
-        mID = id;
+        super(id, rs);
     }
 
     public void bindTexture(Allocation va, int slot)
@@ -65,6 +64,37 @@
         mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
     }
 
+    public static class ShaderBuilder extends BaseProgramBuilder {
+        public ShaderBuilder(RenderScript rs) {
+            super(rs);
+        }
+
+        public ProgramFragment create() {
+            mRS.validate();
+            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2];
+            int idx = 0;
+
+            for (int i=0; i < mInputCount; i++) {
+                tmp[idx++] = 0;
+                tmp[idx++] = mInputs[i].mID;
+            }
+            for (int i=0; i < mOutputCount; i++) {
+                tmp[idx++] = 1;
+                tmp[idx++] = mOutputs[i].mID;
+            }
+            for (int i=0; i < mConstantCount; i++) {
+                tmp[idx++] = 2;
+                tmp[idx++] = mConstants[i].mID;
+            }
+            tmp[idx++] = 3;
+            tmp[idx++] = mTextureCount;
+
+            int id = mRS.nProgramFragmentCreate2(mShader, tmp);
+            ProgramFragment pf = new ProgramFragment(id, mRS);
+            initProgram(pf);
+            return pf;
+        }
+    }
 
     public static class Builder {
         RenderScript mRS;
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 06cfc93..101f030 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -79,10 +79,8 @@
                 tmp[idx++] = 2;
                 tmp[idx++] = mConstants[i].mID;
             }
-            for (int i=0; i < mTextureCount; i++) {
-                tmp[idx++] = 3;
-                tmp[idx++] = mTextures[i].mID;
-            }
+            tmp[idx++] = 3;
+            tmp[idx++] = mTextureCount;
 
             int id = mRS.nProgramVertexCreate2(mShader, tmp);
             ProgramVertex pv = new ProgramVertex(id, mRS);
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 75bd3d0..0e4d5b0 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -175,6 +175,7 @@
     native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
     native void nProgramFragmentSetShader(String txt);
     native int  nProgramFragmentCreate();
+    native int  nProgramFragmentCreate2(String shader, int[] params);
 
     native int  nProgramVertexCreate(boolean texMat);
     native int  nProgramVertexCreate2(String shader, int[] params);
