diff --git a/RenderScript.h b/RenderScript.h
index f01eadd..6302b90 100644
--- a/RenderScript.h
+++ b/RenderScript.h
@@ -85,6 +85,8 @@
     RS_TYPE_UNSIGNED_32,
     RS_TYPE_UNSIGNED_64,
 
+    RS_TYPE_BOOLEAN,
+
     RS_TYPE_UNSIGNED_5_6_5,
     RS_TYPE_UNSIGNED_5_5_5_1,
     RS_TYPE_UNSIGNED_4_4_4_4,
diff --git a/java/ImageProcessing/res/raw/threshold.rs b/java/ImageProcessing/res/raw/threshold.rs
index 93a1a36..a8eb164 100644
--- a/java/ImageProcessing/res/raw/threshold.rs
+++ b/java/ImageProcessing/res/raw/threshold.rs
@@ -10,13 +10,9 @@
 int width;
 int radius;
 
-typedef struct c4u_s {
-    uint8_t r, g, b, a;
-} c4u_t;
-
-c4u_t * InPixel;
-c4u_t * OutPixel;
-c4u_t * ScratchPixel;
+uchar4 * InPixel;
+uchar4 * OutPixel;
+uchar4 * ScratchPixel;
 
 float inBlack;
 float outBlack;
@@ -31,7 +27,7 @@
 static float overInWMinInB;
 //static float3 gammaV;
 
-#pragma rs export_var(height, width, radius, InPixel, OutPixel, ScratchPixel, inBlack, outBlack, inWhite, outWhite, gamma, saturation)
+#pragma rs export_var(height, width, radius, InPixel, OutPixel, ScratchPixel, inBlack, outBlack, inWhite, outWhite, gamma, saturation, InPixel, OutPixel, ScratchPixel)
 #pragma rs export_func(filter, filterBenchmark);
 
 // Store our coefficients here
@@ -166,19 +162,21 @@
 
     for(h = 0; h < height; h ++) {
         for(w = 0; w < width; w ++) {
-            c4u_t *input = InPixel + h*width + w;
+            uchar4 *input = InPixel + h*width + w;
 
-            currentPixel.x = (float)(input->r);
-            currentPixel.y = (float)(input->g);
-            currentPixel.z = (float)(input->b);
+            //currentPixel.xyz = convert_float3(input.xyz);
+            currentPixel.x = (float)(input->x);
+            currentPixel.y = (float)(input->y);
+            currentPixel.z = (float)(input->z);
 
             currentPixel = levelsSaturation(currentPixel);
 
-            c4u_t *output = OutPixel + h*width + w;
-            output->r = (uint8_t)currentPixel.x;
-            output->g = (uint8_t)currentPixel.y;
-            output->b = (uint8_t)currentPixel.z;
-            output->a = input->a;
+            uchar4 *output = OutPixel + h*width + w;
+            //output.xyz = convert_uchar3(currentPixel.xyz);
+            output->x = (uint8_t)currentPixel.x;
+            output->y = (uint8_t)currentPixel.y;
+            output->z = (uint8_t)currentPixel.z;
+            output->w = input->w;
         }
     }
     rsSendToClient(&count, 1, 4, 0);
@@ -205,21 +203,21 @@
                     validW = width - 1;
                 }
 
-                c4u_t *input = InPixel + h*width + validW;
+                uchar4 *input = InPixel + h*width + validW;
 
                 float weight = gaussian[r + radius];
-                currentPixel.x = (float)(input->r);
-                currentPixel.y = (float)(input->g);
-                currentPixel.z = (float)(input->b);
+                currentPixel.x = (float)(input->x);
+                currentPixel.y = (float)(input->y);
+                currentPixel.z = (float)(input->z);
                 //currentPixel.w = (float)(input->a);
 
                 blurredPixel += currentPixel*weight;
             }
 
-            c4u_t *output = ScratchPixel + h*width + w;
-            output->r = (uint8_t)blurredPixel.x;
-            output->g = (uint8_t)blurredPixel.y;
-            output->b = (uint8_t)blurredPixel.z;
+            uchar4 *output = ScratchPixel + h*width + w;
+            output->x = (uint8_t)blurredPixel.x;
+            output->y = (uint8_t)blurredPixel.y;
+            output->z = (uint8_t)blurredPixel.z;
             //output->a = (uint8_t)blurredPixel.w;
         }
     }
@@ -246,12 +244,12 @@
                     validW = width - 1;
                 }
 
-                c4u_t *input = InPixel + h*width + validW;
+                uchar4 *input = InPixel + h*width + validW;
 
                 float weight = gaussian[r + radius];
-                currentPixel.x = (float)(input->r);
-                currentPixel.y = (float)(input->g);
-                currentPixel.z = (float)(input->b);
+                currentPixel.x = (float)(input->x);
+                currentPixel.y = (float)(input->y);
+                currentPixel.z = (float)(input->z);
                 //currentPixel.w = (float)(input->a);
 
                 blurredPixel += currentPixel*weight;
@@ -259,10 +257,10 @@
 
             blurredPixel = levelsSaturation(blurredPixel);
 
-            c4u_t *output = ScratchPixel + h*width + w;
-            output->r = (uint8_t)blurredPixel.x;
-            output->g = (uint8_t)blurredPixel.y;
-            output->b = (uint8_t)blurredPixel.z;
+            uchar4 *output = ScratchPixel + h*width + w;
+            output->x = (uint8_t)blurredPixel.x;
+            output->y = (uint8_t)blurredPixel.y;
+            output->z = (uint8_t)blurredPixel.z;
             //output->a = (uint8_t)blurredPixel.w;
         }
     }
@@ -287,23 +285,23 @@
                     validH = height - 1;
                 }
 
-                c4u_t *input = ScratchPixel + validH*width + w;
+                uchar4 *input = ScratchPixel + validH*width + w;
 
                 float weight = gaussian[r + radius];
 
-                currentPixel.x = (float)(input->r);
-                currentPixel.y = (float)(input->g);
-                currentPixel.z = (float)(input->b);
+                currentPixel.x = (float)(input->x);
+                currentPixel.y = (float)(input->y);
+                currentPixel.z = (float)(input->z);
                 //currentPixel.w = (float)(input->a);
 
                 blurredPixel += currentPixel*weight;
             }
 
-            c4u_t *output = OutPixel + h*width + w;
+            uchar4 *output = OutPixel + h*width + w;
 
-            output->r = (uint8_t)blurredPixel.x;
-            output->g = (uint8_t)blurredPixel.y;
-            output->b = (uint8_t)blurredPixel.z;
+            output->x = (uint8_t)blurredPixel.x;
+            output->y = (uint8_t)blurredPixel.y;
+            output->z = (uint8_t)blurredPixel.z;
             //output->a = (uint8_t)blurredPixel.w;
         }
     }
diff --git a/java/ImageProcessing/res/raw/threshold_bc.bc b/java/ImageProcessing/res/raw/threshold_bc.bc
index 4cf0629..fd60f76 100644
--- a/java/ImageProcessing/res/raw/threshold_bc.bc
+++ b/java/ImageProcessing/res/raw/threshold_bc.bc
Binary files differ
diff --git a/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
index b39d141..7bf6596 100644
--- a/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
+++ b/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
@@ -285,7 +285,7 @@
 
             long t = java.lang.System.currentTimeMillis();
             if (true) {
-                mScript.invokable_Filter();
+                mScript.invoke_filter();
                 mRS.finish();
             } else {
                 javaFilter();
@@ -355,7 +355,7 @@
 
     public void surfaceCreated(SurfaceHolder holder) {
         createScript();
-        mScript.invokable_Filter();
+        mScript.invoke_filter();
         mRS.finish();
     }
 
@@ -373,7 +373,7 @@
         mOutPixelsAllocation = Allocation.createBitmapRef(mRS, mBitmapOut);
         mScratchPixelsAllocation = Allocation.createBitmapRef(mRS, mBitmapScratch);
 
-        mScript = new ScriptC_Threshold(mRS, getResources(), false);
+        mScript = new ScriptC_Threshold(mRS, getResources(), R.raw.threshold_bc, false);
         mScript.set_width(mBitmapIn.getWidth());
         mScript.set_height(mBitmapIn.getHeight());
         mScript.set_radius(mRadius);
@@ -413,7 +413,7 @@
 
         long t = java.lang.System.currentTimeMillis();
 
-        mScript.invokable_FilterBenchmark();
+        mScript.invoke_filterBenchmark();
         mRS.finish();
 
         t = java.lang.System.currentTimeMillis() - t;
@@ -426,7 +426,7 @@
         mRadius = oldRadius;
         mScript.set_radius(mRadius);
 
-        mScript.invokable_Filter();
+        mScript.invoke_filter();
         mRS.finish();
     }
 }
diff --git a/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java b/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
index 42adb27..ea363d3 100644
--- a/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
+++ b/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
@@ -1,115 +1,175 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 package com.android.rs.image;
 
-import android.content.res.Resources;
 import android.renderscript.*;
+import android.content.res.Resources;
 import android.util.Log;
 
-public class ScriptC_Threshold
-    extends android.renderscript.ScriptC
-{
-    private final static int mFieldIndex_height = 0;
-    private final static int mFieldIndex_width = 1;
-    private final static int mFieldIndex_radius = 2;
-    private final static int mFieldIndex_InPixel = 3;
-    private final static int mFieldIndex_OutPixel = 4;
-    private final static int mFieldIndex_ScratchPixel = 5;
-
-    private final static int mFieldIndex_inBlack = 6;
-    private final static int mFieldIndex_outBlack = 7;
-    private final static int mFieldIndex_inWhite = 8;
-    private final static int mFieldIndex_outWhite = 9;
-    private final static int mFieldIndex_gamma = 10;
-
-    private final static int mFieldIndex_saturation = 11;
-    private final static int mFieldIndex_hue = 12;
-
-    private Allocation mField_InPixel;
-    private Allocation mField_OutPixel;
-    private Allocation mField_ScratchPixel;
-
-    public ScriptC_Threshold(RenderScript rs, Resources resources, boolean isRoot) {
-        super(rs, resources, R.raw.threshold_bc, isRoot);
+public class ScriptC_Threshold extends ScriptC {
+    // Constructor
+    public  ScriptC_Threshold(RenderScript rs, Resources resources, int id, boolean isRoot) {
+        super(rs, resources, id, isRoot);
     }
 
-    public void bind_InPixel(Allocation f) {
-        if (f != null) {
-            //if (f.getType().getElement() != Element.ATTRIB_COLOR_U8_4(mRS)) {
-                //throw new IllegalArgumentException("Element type mismatch.");
-            //}
-        }
-        bindAllocation(f, mFieldIndex_InPixel);
-        mField_InPixel = f;
-    }
-    public Allocation get_InPixel() {
-        return mField_InPixel;
-    }
-
-    public void bind_OutPixel(Allocation f) {
-        if (f != null) {
-            //if (f.getType().getElement() != Element.ATTRIB_COLOR_U8_4(mRS)) {
-                //throw new IllegalArgumentException("Element type mismatch.");
-            //}
-        }
-        bindAllocation(f, mFieldIndex_OutPixel);
-        mField_OutPixel = f;
-    }
-    public void bind_ScratchPixel(Allocation f) {
-        if (f != null) {
-            //if (f.getType().getElement() != Element.ATTRIB_COLOR_U8_4(mRS)) {
-                //throw new IllegalArgumentException("Element type mismatch.");
-            //}
-        }
-        bindAllocation(f, mFieldIndex_ScratchPixel);
-        mField_ScratchPixel = f;
-    }
-    public Allocation get_OutPixel() {
-        return mField_OutPixel;
-    }
-
+    private final static int mExportVarIdx_height = 0;
+    private int mExportVar_height;
     public void set_height(int v) {
-        setVar(mFieldIndex_height, v);
+        mExportVar_height = v;
+        setVar(mExportVarIdx_height, v);
     }
 
+    public int get_height() {
+        return mExportVar_height;
+    }
+
+    private final static int mExportVarIdx_width = 1;
+    private int mExportVar_width;
     public void set_width(int v) {
-        setVar(mFieldIndex_width, v);
+        mExportVar_width = v;
+        setVar(mExportVarIdx_width, v);
     }
 
+    public int get_width() {
+        return mExportVar_width;
+    }
+
+    private final static int mExportVarIdx_radius = 2;
+    private int mExportVar_radius;
     public void set_radius(int v) {
-        setVar(mFieldIndex_radius, v);
+        mExportVar_radius = v;
+        setVar(mExportVarIdx_radius, v);
     }
 
+    public int get_radius() {
+        return mExportVar_radius;
+    }
+
+    private final static int mExportVarIdx_InPixel = 3;
+    private Allocation mExportVar_InPixel;
+    public void bind_InPixel(Allocation v) {
+        mExportVar_InPixel = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_InPixel);
+        else bindAllocation(v, mExportVarIdx_InPixel);
+    }
+
+    public Allocation get_InPixel() {
+        return mExportVar_InPixel;
+    }
+
+    private final static int mExportVarIdx_OutPixel = 4;
+    private Allocation mExportVar_OutPixel;
+    public void bind_OutPixel(Allocation v) {
+        mExportVar_OutPixel = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_OutPixel);
+        else bindAllocation(v, mExportVarIdx_OutPixel);
+    }
+
+    public Allocation get_OutPixel() {
+        return mExportVar_OutPixel;
+    }
+
+    private final static int mExportVarIdx_ScratchPixel = 5;
+    private Allocation mExportVar_ScratchPixel;
+    public void bind_ScratchPixel(Allocation v) {
+        mExportVar_ScratchPixel = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_ScratchPixel);
+        else bindAllocation(v, mExportVarIdx_ScratchPixel);
+    }
+
+    public Allocation get_ScratchPixel() {
+        return mExportVar_ScratchPixel;
+    }
+
+    private final static int mExportVarIdx_inBlack = 6;
+    private float mExportVar_inBlack;
     public void set_inBlack(float v) {
-        setVar(mFieldIndex_inBlack, v);
+        mExportVar_inBlack = v;
+        setVar(mExportVarIdx_inBlack, v);
     }
+
+    public float get_inBlack() {
+        return mExportVar_inBlack;
+    }
+
+    private final static int mExportVarIdx_outBlack = 7;
+    private float mExportVar_outBlack;
     public void set_outBlack(float v) {
-        setVar(mFieldIndex_outBlack, v);
+        mExportVar_outBlack = v;
+        setVar(mExportVarIdx_outBlack, v);
     }
+
+    public float get_outBlack() {
+        return mExportVar_outBlack;
+    }
+
+    private final static int mExportVarIdx_inWhite = 8;
+    private float mExportVar_inWhite;
     public void set_inWhite(float v) {
-        setVar(mFieldIndex_inWhite, v);
+        mExportVar_inWhite = v;
+        setVar(mExportVarIdx_inWhite, v);
     }
+
+    public float get_inWhite() {
+        return mExportVar_inWhite;
+    }
+
+    private final static int mExportVarIdx_outWhite = 9;
+    private float mExportVar_outWhite;
     public void set_outWhite(float v) {
-        setVar(mFieldIndex_outWhite, v);
+        mExportVar_outWhite = v;
+        setVar(mExportVarIdx_outWhite, v);
     }
+
+    public float get_outWhite() {
+        return mExportVar_outWhite;
+    }
+
+    private final static int mExportVarIdx_gamma = 10;
+    private float mExportVar_gamma;
     public void set_gamma(float v) {
-        setVar(mFieldIndex_gamma, v);
+        mExportVar_gamma = v;
+        setVar(mExportVarIdx_gamma, v);
     }
 
+    public float get_gamma() {
+        return mExportVar_gamma;
+    }
+
+    private final static int mExportVarIdx_saturation = 11;
+    private float mExportVar_saturation;
     public void set_saturation(float v) {
-        setVar(mFieldIndex_saturation, v);
-    }
-    public void set_hue(float v) {
-        setVar(mFieldIndex_hue, v);
+        mExportVar_saturation = v;
+        setVar(mExportVarIdx_saturation, v);
     }
 
-    private final static int mInvokableIndex_Filter = 4;
-    public void invokable_Filter() {
-        invoke(mInvokableIndex_Filter);
+    public float get_saturation() {
+        return mExportVar_saturation;
     }
 
-    private final static int mInvokableIndex_FilterBenchmark = 5;
-    public void invokable_FilterBenchmark() {
-        invoke(mInvokableIndex_FilterBenchmark);
+    private final static int mExportFuncIdx_filter = 0;
+    public void invoke_filter() {
+        invoke(mExportFuncIdx_filter);
     }
+
+    private final static int mExportFuncIdx_filterBenchmark = 1;
+    public void invoke_filterBenchmark() {
+        invoke(mExportFuncIdx_filterBenchmark);
+    }
+
 }
 
diff --git a/java/ModelViewer/res/raw/modelviewer_bc.bc b/java/ModelViewer/res/raw/modelviewer_bc.bc
index b02250b..367a3f4 100644
--- a/java/ModelViewer/res/raw/modelviewer_bc.bc
+++ b/java/ModelViewer/res/raw/modelviewer_bc.bc
Binary files differ
diff --git a/java/ModelViewer/src/com/android/modelviewer/ModelViewerRS.java b/java/ModelViewer/src/com/android/modelviewer/ModelViewerRS.java
index dd52955..e581520 100644
--- a/java/ModelViewer/src/com/android/modelviewer/ModelViewerRS.java
+++ b/java/ModelViewer/src/com/android/modelviewer/ModelViewerRS.java
@@ -57,7 +57,7 @@
 
     private SimpleMesh mMesh;
 
-    private ScriptC_ModelViewer mScript;
+    private ScriptC_Modelviewer mScript;
 
     int mLastX;
     int mLastY;
@@ -130,7 +130,7 @@
 
     private void initRS() {
 
-        mScript = new ScriptC_ModelViewer(mRS, mRes, true);
+        mScript = new ScriptC_Modelviewer(mRS, mRes, R.raw.modelviewer_bc, true);
 
         initPFS();
         initPF();
diff --git a/java/ModelViewer/src/com/android/modelviewer/ScriptC_ModelViewer.java b/java/ModelViewer/src/com/android/modelviewer/ScriptC_ModelViewer.java
deleted file mode 100644
index f617c77..0000000
--- a/java/ModelViewer/src/com/android/modelviewer/ScriptC_ModelViewer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-
-package com.android.modelviewer;
-
-import android.content.res.Resources;
-import android.renderscript.*;
-import android.util.Log;
-
-
-
-public class ScriptC_ModelViewer
-    extends android.renderscript.ScriptC
-{
-    public ScriptC_ModelViewer(RenderScript rs, Resources resources, boolean isRoot) {
-        super(rs, resources, R.raw.modelviewer_bc, isRoot);
-    }
-
-    public void set_gPVBackground(ProgramVertex v) {
-        setVar(0, v.getID());
-    }
-
-    public void set_gPFBackground(ProgramFragment v) {
-        setVar(1, v.getID());
-    }
-
-    public void set_gTGrid(Allocation v) {
-        setVar(2, v.getID());
-    }
-
-    public void set_gTestMesh(SimpleMesh v) {
-        setVar(3, v.getID());
-    }
-
-    public void set_gPFSBackground(ProgramStore v) {
-        setVar(4, v.getID());
-    }
-
-    public void set_gRotate(float v) {
-        setVar(5, v);
-    }
-
-}
-
diff --git a/java/ModelViewer/src/com/android/modelviewer/ScriptC_Modelviewer.java b/java/ModelViewer/src/com/android/modelviewer/ScriptC_Modelviewer.java
new file mode 100644
index 0000000..7a965b8
--- /dev/null
+++ b/java/ModelViewer/src/com/android/modelviewer/ScriptC_Modelviewer.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.modelviewer;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+import android.util.Log;
+
+public class ScriptC_Modelviewer extends ScriptC {
+    // Constructor
+    public  ScriptC_Modelviewer(RenderScript rs, Resources resources, int id, boolean isRoot) {
+        super(rs, resources, id, isRoot);
+    }
+
+    private final static int mExportVarIdx_gPVBackground = 0;
+    private ProgramVertex mExportVar_gPVBackground;
+    public void set_gPVBackground(ProgramVertex v) {
+        mExportVar_gPVBackground = v;
+        setVar(mExportVarIdx_gPVBackground, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramVertex get_gPVBackground() {
+        return mExportVar_gPVBackground;
+    }
+
+    private final static int mExportVarIdx_gPFBackground = 1;
+    private ProgramFragment mExportVar_gPFBackground;
+    public void set_gPFBackground(ProgramFragment v) {
+        mExportVar_gPFBackground = v;
+        setVar(mExportVarIdx_gPFBackground, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramFragment get_gPFBackground() {
+        return mExportVar_gPFBackground;
+    }
+
+    private final static int mExportVarIdx_gTGrid = 2;
+    private Allocation mExportVar_gTGrid;
+    public void set_gTGrid(Allocation v) {
+        mExportVar_gTGrid = v;
+        setVar(mExportVarIdx_gTGrid, (v == null) ? 0 : v.getID());
+    }
+
+    public Allocation get_gTGrid() {
+        return mExportVar_gTGrid;
+    }
+
+    private final static int mExportVarIdx_gTestMesh = 3;
+    private SimpleMesh mExportVar_gTestMesh;
+    public void set_gTestMesh(SimpleMesh v) {
+        mExportVar_gTestMesh = v;
+        setVar(mExportVarIdx_gTestMesh, (v == null) ? 0 : v.getID());
+    }
+
+    public SimpleMesh get_gTestMesh() {
+        return mExportVar_gTestMesh;
+    }
+
+    private final static int mExportVarIdx_gPFSBackground = 4;
+    private ProgramStore mExportVar_gPFSBackground;
+    public void set_gPFSBackground(ProgramStore v) {
+        mExportVar_gPFSBackground = v;
+        setVar(mExportVarIdx_gPFSBackground, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramStore get_gPFSBackground() {
+        return mExportVar_gPFSBackground;
+    }
+
+    private final static int mExportVarIdx_gRotate = 5;
+    private float mExportVar_gRotate;
+    public void set_gRotate(float v) {
+        mExportVar_gRotate = v;
+        setVar(mExportVarIdx_gRotate, v);
+    }
+
+    public float get_gRotate() {
+        return mExportVar_gRotate;
+    }
+
+}
+
diff --git a/rsComponent.cpp b/rsComponent.cpp
index b120c21..8e509ad 100644
--- a/rsComponent.cpp
+++ b/rsComponent.cpp
@@ -152,6 +152,10 @@
     case RS_TYPE_UNSIGNED_64:
         mTypeBits = 64;
         break;
+
+    case RS_TYPE_BOOLEAN:
+        mTypeBits = 8;
+        break;
     }
 
     mBits = mTypeBits * mVectorSize;
@@ -192,82 +196,6 @@
     return 0;
 }
 
-static const char * gCTypeStrings[] = {
-    0,
-    0,//"F16",
-    "float",
-    "double",
-    "char",
-    "short",
-    "int",
-    0,//"S64",
-    "char",//U8",
-    "short",//U16",
-    "int",//U32",
-    0,//"U64",
-    0,//"UP_565",
-    0,//"UP_5551",
-    0,//"UP_4444",
-    0,//"ELEMENT",
-    0,//"TYPE",
-    0,//"ALLOCATION",
-    0,//"SAMPLER",
-    0,//"SCRIPT",
-    0,//"MESH",
-    0,//"PROGRAM_FRAGMENT",
-    0,//"PROGRAM_VERTEX",
-    0,//"PROGRAM_RASTER",
-    0,//"PROGRAM_STORE",
-};
-
-static const char * gCVecTypeStrings[] = {
-    0,
-    0,//"F16",
-    "vecF32",
-    "vecF64",
-    "vecI8",
-    "vecI16",
-    "vecI32",
-    0,//"S64",
-    "vecU8",//U8",
-    "vecU16",//U16",
-    "vecU32",//U32",
-    0,//"U64",
-    0,//"UP_565",
-    0,//"UP_5551",
-    0,//"UP_4444",
-    0,//"ELEMENT",
-    0,//"TYPE",
-    0,//"ALLOCATION",
-    0,//"SAMPLER",
-    0,//"SCRIPT",
-    0,//"MESH",
-    0,//"PROGRAM_FRAGMENT",
-    0,//"PROGRAM_VERTEX",
-    0,//"PROGRAM_RASTER",
-    0,//"PROGRAM_STORE",
-};
-
-String8 Component::getCType() const
-{
-    char buf[64];
-    if (mVectorSize == 1) {
-        return String8(gCTypeStrings[mType]);
-    }
-
-    // Yuck, acc WAR
-    // Appears to have problems packing chars
-    if (mVectorSize == 4 && mType == RS_TYPE_UNSIGNED_8) {
-        return String8("int");
-    }
-
-
-    String8 s(gCVecTypeStrings[mType]);
-    sprintf(buf, "_%i_t", mVectorSize);
-    s.append(buf);
-    return s;
-}
-
 String8 Component::getGLSLType() const
 {
     if (mType == RS_TYPE_SIGNED_32) {
@@ -302,6 +230,7 @@
     "U16",
     "U32",
     "U64",
+    "BOOLEAN",
     "UP_565",
     "UP_5551",
     "UP_4444",
diff --git a/rsComponent.h b/rsComponent.h
index 0f93a91..15fd5dd 100644
--- a/rsComponent.h
+++ b/rsComponent.h
@@ -35,7 +35,6 @@
 
     uint32_t getGLType() const;
     uint32_t getGLFormat() const;
-    String8 getCType() const;
     String8 getGLSLType() const;
     void dumpLOGV(const char *prefix) const;
 
diff --git a/rsElement.cpp b/rsElement.cpp
index 8fbf004..aa20275 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -232,45 +232,6 @@
     return e;
 }
 
-String8 Element::getCStructBody(uint32_t indent) const
-{
-    String8 si;
-    for (uint32_t ct=0; ct < indent; ct++) {
-        si.append(" ");
-    }
-
-    String8 s(si);
-    s.append("{\n");
-    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
-        s.append(si);
-        s.append(mFields[ct].e->getCType(indent+4));
-        s.append(" ");
-        s.append(mFields[ct].name);
-        s.append(";\n");
-    }
-    s.append(si);
-    s.append("}");
-    return s;
-}
-
-String8 Element::getCType(uint32_t indent) const
-{
-    String8 s;
-    for (uint32_t ct=0; ct < indent; ct++) {
-        s.append(" ");
-    }
-
-    if (!mFieldCount) {
-        // Basic component.
-        s.append(mComponent.getCType());
-    } else {
-        s.append("struct ");
-        s.append(getCStructBody(indent));
-    }
-
-    return s;
-}
-
 String8 Element::getGLSLType(uint32_t indent) const
 {
     String8 s;
diff --git a/rsElement.h b/rsElement.h
index 5c4f5c4..90e7cc8 100644
--- a/rsElement.h
+++ b/rsElement.h
@@ -54,8 +54,6 @@
     RsDataKind getKind() const {return mComponent.getKind();}
     uint32_t getBits() const {return mBits;}
 
-    String8 getCType(uint32_t indent=0) const;
-    String8 getCStructBody(uint32_t indent=0) const;
     String8 getGLSLType(uint32_t indent=0) const;
 
     void dumpLOGV(const char *prefix) const;
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index e7292c0..b8d1461 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -138,6 +138,11 @@
             const Element *e = mConstantTypes[ct]->getElement();
             for (uint32_t field=0; field < e->getFieldCount(); field++) {
                 const Element *f = e->getField(field);
+                const char *fn = e->getFieldName(field);
+
+                if (fn[0] == '#') {
+                    continue;
+                }
 
                 // Cannot be complex
                 rsAssert(!f->getFieldCount());
@@ -150,7 +155,7 @@
                     rsAssert(0);
                 }
 
-                mShader.append(e->getFieldName(field));
+                mShader.append(fn);
                 mShader.append(";\n");
             }
         }
diff --git a/scriptc/rs_cl.rsh b/scriptc/rs_cl.rsh
index 69e7902..64844a4 100644
--- a/scriptc/rs_cl.rsh
+++ b/scriptc/rs_cl.rsh
@@ -7,15 +7,15 @@
 // Conversions
 #define CVT_FUNC_2(typeout, typein) \
 static typeout##2 __attribute__((overloadable)) convert_##typeout##2(typein##2 v) { \
-    typeout##2 r = {v.x, v.y}; \
+    typeout##2 r = {(typeout)v.x, (typeout)v.y}; \
     return r; \
 } \
 static typeout##3 __attribute__((overloadable)) convert_##typeout##3(typein##3 v) { \
-    typeout##3 r = {v.x, v.y, v.z}; \
+    typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \
     return r; \
 } \
 static typeout##4 __attribute__((overloadable)) convert_##typeout##4(typein##4 v) { \
-    typeout##4 r = {v.x, v.y, v.z, v.w}; \
+    typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, (typeout)v.w}; \
     return r; \
 }
 
