diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index aab8c21..3061b1e 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -223,6 +223,52 @@
             return this;
         }
 
+        public Builder addFloat(Element.DataKind dk) {
+            add(DataType.FLOAT, dk, false, 32, null);
+            return this;
+        }
+
+        public Builder addFloat(Element.DataKind dk, String name) {
+            add(DataType.FLOAT, dk, false, 32, name);
+            return this;
+        }
+
+        public Builder addFloatXY() {
+            add(DataType.FLOAT, DataKind.X, false, 32, null);
+            add(DataType.FLOAT, DataKind.Y, false, 32, null);
+            return this;
+        }
+
+        public Builder addFloatXYZ() {
+            add(DataType.FLOAT, DataKind.X, false, 32, null);
+            add(DataType.FLOAT, DataKind.Y, false, 32, null);
+            add(DataType.FLOAT, DataKind.Z, false, 32, null);
+            return this;
+        }
+
+        public Builder addFloatRGB() {
+            add(DataType.FLOAT, DataKind.RED, false, 32, null);
+            add(DataType.FLOAT, DataKind.GREEN, false, 32, null);
+            add(DataType.FLOAT, DataKind.BLUE, false, 32, null);
+            return this;
+        }
+
+        public Builder addFloatRGBA() {
+            add(DataType.FLOAT, DataKind.RED, false, 32, null);
+            add(DataType.FLOAT, DataKind.GREEN, false, 32, null);
+            add(DataType.FLOAT, DataKind.BLUE, false, 32, null);
+            add(DataType.FLOAT, DataKind.ALPHA, false, 32, null);
+            return this;
+        }
+
+        public Builder addUNorm8RGBA() {
+            add(DataType.UNSIGNED, DataKind.RED, true, 8, null);
+            add(DataType.UNSIGNED, DataKind.GREEN, true, 8, null);
+            add(DataType.UNSIGNED, DataKind.BLUE, true, 8, null);
+            add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, null);
+            return this;
+        }
+
         static synchronized Element internalCreate(RenderScript rs, Builder b) {
             rs.nElementBegin();
             for (int ct=0; ct < b.mEntryCount; ct++) {
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index b98a48ab..ab263ed 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -142,7 +142,7 @@
     native void nScriptSetClearDepth(int script, float depth);
     native void nScriptSetClearStencil(int script, int stencil);
     native void nScriptSetTimeZone(int script, byte[] timeZone);
-    native void nScriptSetType(int type, String name, int slot);
+    native void nScriptSetType(int type, boolean writable, String name, int slot);
     native void nScriptSetRoot(boolean isRoot);
 
     native void nScriptCBegin();
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 47479d8..5b9eb553 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -24,6 +24,7 @@
 
     boolean mIsRoot;
     Type[] mTypes;
+    boolean[] mWritable;
 
     Script(int id, RenderScript rs) {
         super(rs);
@@ -67,11 +68,13 @@
         boolean mIsRoot = false;
         Type[] mTypes;
         String[] mNames;
+        boolean[] mWritable;
 
         Builder(RenderScript rs) {
             mRS = rs;
             mTypes = new Type[MAX_SLOT];
             mNames = new String[MAX_SLOT];
+            mWritable = new boolean[MAX_SLOT];
         }
 
         public void setType(Type t, int slot) {
@@ -84,11 +87,15 @@
             mNames[slot] = name;
         }
 
+        public void setType(boolean writable, int slot) {
+            mWritable[slot] = writable;
+        }
+
         void transferCreate() {
             mRS.nScriptSetRoot(mIsRoot);
             for(int ct=0; ct < mTypes.length; ct++) {
                 if(mTypes[ct] != null) {
-                    mRS.nScriptSetType(mTypes[ct].mID, mNames[ct], ct);
+                    mRS.nScriptSetType(mTypes[ct].mID, mWritable[ct], mNames[ct], ct);
                 }
             }
         }
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 5780e02..4d6f252 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -825,15 +825,15 @@
 }
 
 static void
-nScriptSetType(JNIEnv *_env, jobject _this, jint type, jstring _str, jint slot)
+nScriptSetType(JNIEnv *_env, jobject _this, jint type, jboolean writable, jstring _str, jint slot)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCAddType, con(%p), type(%p), slot(%i)", con, (RsType)type, slot);
+    LOG_API("nScriptCAddType, con(%p), type(%p), writable(%i), slot(%i)", con, (RsType)type, writable, slot);
     const char* n = NULL;
     if (_str) {
         n = _env->GetStringUTFChars(_str, NULL);
     }
-    rsScriptSetType((RsType)type, slot, n);
+    rsScriptSetType((RsType)type, slot, writable, n);
     if (n) {
         _env->ReleaseStringUTFChars(_str, n);
     }
@@ -1381,7 +1381,7 @@
 {"nScriptSetClearDepth",           "(IF)V",                                (void*)nScriptSetClearDepth },
 {"nScriptSetClearStencil",         "(II)V",                                (void*)nScriptSetClearStencil },
 {"nScriptSetTimeZone",             "(I[B)V",                               (void*)nScriptSetTimeZone },
-{"nScriptSetType",                 "(ILjava/lang/String;I)V",              (void*)nScriptSetType },
+{"nScriptSetType",                 "(IZLjava/lang/String;I)V",             (void*)nScriptSetType },
 {"nScriptSetRoot",                 "(Z)V",                                 (void*)nScriptSetRoot },
 
 {"nScriptCBegin",                  "()V",                                  (void*)nScriptCBegin },
diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c
index 6e6afcd..e7804a5 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.c
+++ b/libs/rs/java/Fountain/res/raw/fountain.c
@@ -1,86 +1,52 @@
 // Fountain test script
-
 #pragma version(1)
 #pragma stateVertex(default)
-#pragma stateFragment(PgmFragParts)
-#pragma stateFragmentStore(PFSBlend)
-
+#pragma stateFragment(default)
+#pragma stateFragmentStore(default)
 
 int main(int launchID) {
     int ct;
-    int count = loadI32(0, OFFSETOF_SomeData_count);
-    int touch = loadI32(0, OFFSETOF_SomeData_touch);
-    int rate = 4;
-    int maxLife = (count / rate) - 1;
+    int count = Control_count - 1;
+    int rate = Control_rate;
+    float *dataF = loadArrayF(1, 0);
+    float height = getHeight();
 
-    if (touch) {
-        int x = loadI32(0, OFFSETOF_SomeData_x);
-        int y = loadI32(0, OFFSETOF_SomeData_y);
-        int newPart = loadI32(2, 0);
-        for (ct=0; ct<rate; ct++) {
-            int idx = newPart * 5 + 1;
-            storeF(2, idx, randf(1.f) - 0.5f);
-            storeF(2, idx + 1, randf(1.f) - 0.5f);
-            storeI32(2, idx + 2, maxLife);
-            storeF(2, idx + 3, x);
-            storeF(2, idx + 4, y);
+    if (rate) {
+        debugI32("rate", rate);
+        int *dataI = loadArrayI32(1, 0);
+        float rMax = ((float)rate) * 0.005f;
+        int x = Control_x;
+        int y = Control_y;
+        int newPart = loadI32(1, count * 5);
+        int c = colorFloatRGBAtoUNorm8(Control_r, Control_g, Control_b, 0.99f);
+
+        while (rate--) {
+            int idx = newPart * 5;
+            vec2Rand(dataF + idx, rMax);
+            dataF[idx + 2] = x;
+            dataF[idx + 3] = y;
+            dataI[idx + 4] = c;
             newPart++;
             if (newPart >= count) {
                 newPart = 0;
             }
         }
-        storeI32(2, 0, newPart);
+        storeI32(1, count * 5, newPart);
     }
 
-    int drawCount = 0;
-    float height = getHeight();
     for (ct=0; ct < count; ct++) {
-        int srcIdx = ct * 5 + 1;
-
-        int life = loadI32(2, srcIdx + 2);
-
-        if (life) {
-            float posx = loadF(2, srcIdx + 3);
-            float posy = loadF(2, srcIdx + 4);
-            float dx = loadF(2, srcIdx);
-            float dy = loadF(2, srcIdx + 1);
-            if (posy < height) {
-                int dstIdx = drawCount * 9;
-                int c = 0xcfcfcfcf;
-
-                storeI32(1, dstIdx, c);
-                storeF(1, dstIdx + 1, posx);
-                storeF(1, dstIdx + 2, posy);
-
-                storeI32(1, dstIdx + 3, c);
-                storeF(1, dstIdx + 4, posx + 1.f);
-                storeF(1, dstIdx + 5, posy + dy);
-
-                storeI32(1, dstIdx + 6, c);
-                storeF(1, dstIdx + 7, posx - 1.f);
-                storeF(1, dstIdx + 8, posy + dy);
-                drawCount ++;
-            } else {
-                if (dy > 0) {
-                    dy *= -0.5f;
-                }
-            }
-
-            posx = posx + dx;
-            posy = posy + dy;
-            dy = dy + 0.05f;
-            life --;
-
-            //storeI32(2, srcIdx, dx);
-            storeF(2, srcIdx + 1, dy);
-            storeI32(2, srcIdx + 2, life);
-            storeF(2, srcIdx + 3, posx);
-            storeF(2, srcIdx + 4, posy);
+        float dy = dataF[1] + 0.15f;
+        float posy = dataF[3] + dy;
+        if ((posy > height) && (dy > 0)) {
+            dy *= -0.3f;
         }
+        dataF[1] = dy;
+        dataF[2] += dataF[0];
+        dataF[3] = posy;
+        dataF += 5;
     }
 
-    //drawTriangleArray(NAMED_PartBuffer, drawCount);
     uploadToBufferObject(NAMED_PartBuffer);
-    drawSimpleMeshRange(NAMED_PartMesh, 0, drawCount * 3);
+    drawSimpleMeshRange(NAMED_PartMesh, 0, count);
     return 1;
 }
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
index da4eeb4..da9eda8 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -16,26 +16,22 @@
 
 package com.android.fountain;
 
-import java.io.Writer;
-
-import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
 import android.renderscript.*;
 import android.util.Log;
 
 
 public class FountainRS {
-    public static final int PART_COUNT = 4000;
+    public static final int PART_COUNT = 20000;
 
     static class SomeData {
         public int x;
         public int y;
-        public int touch;
         public int rate;
         public int count;
+        public float r;
+        public float g;
+        public float b;
     }
 
     public FountainRS() {
@@ -47,8 +43,18 @@
         initRS();
     }
 
-    public void newTouchPosition(int x, int y) {
-        mSD.touch = 1;
+    public void newTouchPosition(int x, int y, int rate) {
+        if (mSD.rate == 0) {
+            mSD.r = ((x & 0x1) != 0) ? 0.f : 1.f;
+            mSD.g = ((x & 0x2) != 0) ? 0.f : 1.f;
+            mSD.b = ((x & 0x4) != 0) ? 0.f : 1.f;
+            if ((mSD.r + mSD.g + mSD.b) < 0.9f) {
+                mSD.r = 0.8f;
+                mSD.g = 0.5f;
+                mSD.b = 1.f;
+            }
+        }
+        mSD.rate = rate;
         mSD.x = x;
         mSD.y = y;
         mIntAlloc.data(mSD);
@@ -62,50 +68,29 @@
     private RenderScript mRS;
     private Allocation mIntAlloc;
     private Allocation mPartAlloc;
-    private Allocation mVertAlloc;
     private Script mScript;
-    private ProgramStore mPFS;
-    private ProgramFragment mPF;
     private SimpleMesh mSM;
-
-    private Bitmap mBackground;
-
-    SomeData mSD = new SomeData();
+    private SomeData mSD;
     private Type mSDType;
 
     private void initRS() {
         mSD = new SomeData();
         mSDType = Type.createFromClass(mRS, SomeData.class, 1, "SomeData");
         mIntAlloc = Allocation.createTyped(mRS, mSDType);
-        mVertAlloc = Allocation.createSized(mRS, Element.USER_I32, PART_COUNT * 5 + 1);
-
-        ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
-        bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA, ProgramStore.BlendDstFunc.ONE);
-        bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-        bs.setDepthMask(false);
-        bs.setDitherEnable(false);
-        mPFS = bs.create();
-        mPFS.setName("PFSBlend");
-
-        ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null);
-        mPF = bf.create();
-        mPF.setName("PgmFragParts");
-
         mSD.count = PART_COUNT;
         mIntAlloc.data(mSD);
 
         Element.Builder eb = new Element.Builder(mRS);
-        eb.add(Element.DataType.UNSIGNED, Element.DataKind.RED, true, 8);
-        eb.add(Element.DataType.UNSIGNED, Element.DataKind.GREEN, true, 8);
-        eb.add(Element.DataType.UNSIGNED, Element.DataKind.BLUE, true, 8);
-        eb.add(Element.DataType.UNSIGNED, Element.DataKind.ALPHA, true, 8);
-        eb.add(Element.DataType.FLOAT, Element.DataKind.X, false, 32);
-        eb.add(Element.DataType.FLOAT, Element.DataKind.Y, false, 32);
+        eb.addFloat(Element.DataKind.USER); //dx
+        eb.addFloat(Element.DataKind.USER); //dy
+        eb.addFloatXY();
+        eb.addUNorm8RGBA();
         Element primElement = eb.create();
 
+
         SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS);
-        int vtxSlot = smb.addVertexType(primElement, PART_COUNT * 3);
-        smb.setPrimitive(Primitive.TRIANGLE);
+        int vtxSlot = smb.addVertexType(primElement, PART_COUNT);
+        smb.setPrimitive(Primitive.POINT);
         mSM = smb.create();
         mSM.setName("PartMesh");
 
@@ -118,13 +103,12 @@
         ScriptC.Builder sb = new ScriptC.Builder(mRS);
         sb.setScript(mRes, R.raw.fountain);
         sb.setRoot(true);
-        sb.setType(mSDType, 0);
+        sb.setType(mSDType, "Control", 0);
         mScript = sb.create();
         mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
         mScript.bindAllocation(mIntAlloc, 0);
         mScript.bindAllocation(mPartAlloc, 1);
-        mScript.bindAllocation(mVertAlloc, 2);
         mRS.contextBindRootScript(mScript);
     }
 
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 be8b24e..2768e2c 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
@@ -61,13 +61,18 @@
     @Override
     public boolean onTouchEvent(MotionEvent ev)
     {
-        boolean ret = true;
         int act = ev.getAction();
         if (act == ev.ACTION_UP) {
-            ret = false;
+            mRender.newTouchPosition(0, 0, 0);
+            return false;
         }
-        mRender.newTouchPosition((int)ev.getX(), (int)ev.getY());
-        return ret;
+        float rate = (ev.getPressure() * 50.f);
+        rate *= rate;
+        if(rate > 2000.f) {
+            rate = 2000.f;
+        }
+        mRender.newTouchPosition((int)ev.getX(), (int)ev.getY(), (int)rate);
+        return true;
     }
 }
 
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 105142b..0df237f 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -315,6 +315,7 @@
 ScriptSetType {
 	param RsType type
 	param uint32_t slot
+	param bool isWritable
 	param const char * name
 	}
 
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 75c994b..6bcb8f2 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -76,11 +76,12 @@
     s->mEnviroment.mClearStencil = v;
 }
 
-void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, const char *name)
+void rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name)
 {
     ScriptCState *ss = &rsc->mScriptC;
     const Type *t = static_cast<const Type *>(vt);
     ss->mConstantBufferTypes[slot].set(t);
+    ss->mSlotWritable[slot] = writable;
     if (name) {
         ss->mSlotNames[slot].setTo(name);
     } else {
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index dc66763..60f83a6 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/rsScript.h
@@ -61,6 +61,7 @@
     ObjectBaseRef<Allocation> mSlots[MAX_SCRIPT_BANKS];
     ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS];
     String8 mSlotNames[MAX_SCRIPT_BANKS];
+    bool mSlotWritable[MAX_SCRIPT_BANKS];
 
     virtual bool run(Context *, uint32_t launchID) = 0;
 };
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index ced2516..db4fd09 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -93,6 +93,7 @@
     for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
         mConstantBufferTypes[ct].clear();
         mSlotNames[ct].setTo("");
+        mSlotWritable[ct] = false;
     }
 
     memset(&mEnviroment, 0, sizeof(mEnviroment));
@@ -341,6 +342,7 @@
     for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
         s->mTypes[ct].set(ss->mConstantBufferTypes[ct].get());
         s->mSlotNames[ct] = ss->mSlotNames[ct];
+        s->mSlotWritable[ct] = ss->mSlotWritable[ct];
     }
 
     ss->clear();
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 32a9079..302515e 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -70,6 +70,7 @@
 
     ObjectBaseRef<const Type> mConstantBufferTypes[MAX_SCRIPT_BANKS];
     String8 mSlotNames[MAX_SCRIPT_BANKS];
+    bool mSlotWritable[MAX_SCRIPT_BANKS];
 
     void clear();
     void runCompiler(Context *rsc);
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index c13894b..0ecdf9a 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -465,6 +465,14 @@
 }
 
 
+static void SC_vec2Rand(float *vec, float maxLen)
+{
+    float angle = SC_randf(PI * 2);
+    float len = SC_randf(maxLen);
+    vec[0] = len * sinf(angle);
+    vec[1] = len * cosf(angle);
+}
+
 
 
 //////////////////////////////////////////////////////////////////////////////
@@ -780,6 +788,24 @@
     return rsc->getHeight();
 }
 
+static uint32_t SC_colorFloatRGBAtoUNorm8(float r, float g, float b, float a)
+{
+    uint32_t c = 0;
+    c |= (uint32_t)(r * 255.f + 0.5f);
+    c |= ((uint32_t)(g * 255.f + 0.5f)) << 8;
+    c |= ((uint32_t)(b * 255.f + 0.5f)) << 16;
+    c |= ((uint32_t)(a * 255.f + 0.5f)) << 24;
+    return c;
+}
+
+static uint32_t SC_colorFloatRGBAto565(float r, float g, float b)
+{
+    uint32_t ir = (uint32_t)(r * 255.f + 0.5f);
+    uint32_t ig = (uint32_t)(g * 255.f + 0.5f);
+    uint32_t ib = (uint32_t)(b * 255.f + 0.5f);
+    return rs888to565(ir, ig, ib);
+}
+
 //////////////////////////////////////////////////////////////////////////////
 // Class implementation
 //////////////////////////////////////////////////////////////////////////////
@@ -937,6 +963,10 @@
     { "matrixTranslate", (void *)&SC_matrixTranslate,
         "void", "(float *mat, float x, float y, float z)" },
 
+    // vector
+    { "vec2Rand", (void *)&SC_vec2Rand,
+        "void", "(float *vec, float maxLen)" },
+
     // context
     { "bindProgramFragment", (void *)&SC_bindProgramFragment,
         "void", "(int)" },
@@ -999,6 +1029,12 @@
     { "uploadToBufferObject", (void *)&SC_uploadToBufferObject,
         "void", "(int)" },
 
+    { "colorFloatRGBAtoUNorm8", (void *)&SC_colorFloatRGBAtoUNorm8,
+        "int", "(float, float, float, float)" },
+    { "colorFloatRGBto565", (void *)&SC_colorFloatRGBAto565,
+        "int", "(float, float, float)" },
+
+
     { "getWidth", (void *)&SC_getWidth,
         "int", "()" },
     { "getHeight", (void *)&SC_getHeight,
