diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
new file mode 100644
index 0000000..1327328
--- /dev/null
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2008 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 android.renderscript;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.renderscript.Type;
+import android.util.Config;
+import android.util.Log;
+
+/**
+ * @hide
+ *
+ **/
+public class Allocation extends BaseObj {
+    Allocation(int id, RenderScript rs) {
+        super(rs);
+        mID = id;
+    }
+
+    public void uploadToTexture(int baseMipLevel) {
+        mRS.nAllocationUploadToTexture(mID, baseMipLevel);
+    }
+
+    public void destroy() {
+        mRS.nAllocationDestroy(mID);
+        mID = 0;
+    }
+
+    public void data(int[] d) {
+        mRS.nAllocationData(mID, d);
+    }
+
+    public void data(float[] d) {
+        mRS.nAllocationData(mID, d);
+    }
+
+    public void subData1D(int off, int count, int[] d) {
+        mRS.nAllocationSubData1D(mID, off, count, d);
+    }
+
+    public void subData1D(int off, int count, float[] d) {
+        mRS.nAllocationSubData1D(mID, off, count, d);
+    }
+
+    public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
+        mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d);
+    }
+
+    public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
+        mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d);
+    }
+
+    public class Adapter1D extends BaseObj {
+        Adapter1D(int id, RenderScript rs) {
+            super(rs);
+            mID = id;
+        }
+
+        public void destroy() {
+            mRS.nAdapter1DDestroy(mID);
+            mID = 0;
+        }
+
+        public void setConstraint(Dimension dim, int value) {
+            mRS.nAdapter1DSetConstraint(mID, dim.mID, value);
+        }
+
+        public void data(int[] d) {
+            mRS.nAdapter1DData(mID, d);
+        }
+
+        public void subData(int off, int count, int[] d) {
+            mRS.nAdapter1DSubData(mID, off, count, d);
+        }
+
+        public void data(float[] d) {
+            mRS.nAdapter1DData(mID, d);
+        }
+
+        public void subData(int off, int count, float[] d) {
+            mRS.nAdapter1DSubData(mID, off, count, d);
+        }
+    }
+
+    public Adapter1D createAdapter1D() {
+        int id = mRS.nAdapter1DCreate();
+        if (id != 0) {
+            mRS.nAdapter1DBindAllocation(id, mID);
+        }
+        return new Adapter1D(id, mRS);
+    }
+
+
+
+    // creation
+
+    private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
+    static {
+        mBitmapOptions.inScaled = false;
+    }
+
+    static public Allocation createTyped(RenderScript rs, Type type) {
+        int id = rs.nAllocationCreateTyped(type.mID);
+        return new Allocation(id, rs);
+    }
+
+    static public Allocation createSized(RenderScript rs, Element e, int count) {
+        int id;
+        if(e.mIsPredefined) {
+            id = rs.nAllocationCreatePredefSized(e.mPredefinedID, count);
+        } else {
+            id = rs.nAllocationCreateSized(e.mID, count);
+        }
+        return new Allocation(id, rs);
+    }
+
+    static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
+        throws IllegalArgumentException {
+        if(!dstFmt.mIsPredefined) {
+            throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
+        }
+
+        int id = rs.nAllocationCreateFromBitmap(dstFmt.mPredefinedID, genMips, b);
+        return new Allocation(id, rs);
+    }
+
+    static public Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
+        throws IllegalArgumentException {
+        if(!dstFmt.mIsPredefined) {
+            throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
+        }
+
+        int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mPredefinedID, genMips, b);
+        return new Allocation(id, rs);
+    }
+
+    static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
+        throws IllegalArgumentException {
+
+        Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
+        return createFromBitmap(rs, b, dstFmt, genMips);
+    }
+
+    static public Allocation createFromBitmapResourceBoxed(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
+        throws IllegalArgumentException {
+
+        Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
+        return createFromBitmapBoxed(rs, b, dstFmt, genMips);
+    }
+
+
+}
+
+
diff --git a/graphics/java/android/renderscript/Dimension.java b/graphics/java/android/renderscript/Dimension.java
new file mode 100644
index 0000000..f29057d
--- /dev/null
+++ b/graphics/java/android/renderscript/Dimension.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 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 android.renderscript;
+
+/**
+ * @hide
+ **/
+public enum Dimension {
+    X (0),
+    Y (1),
+    Z (2),
+    LOD (3),
+    FACE (4),
+    ARRAY_0 (100);
+
+    int mID;
+    Dimension(int id) {
+        mID = id;
+    }
+}
+
diff --git a/graphics/java/android/renderscript/ProgramVertexAlloc.java b/graphics/java/android/renderscript/ProgramVertexAlloc.java
index 424e0ad..37b037c 100644
--- a/graphics/java/android/renderscript/ProgramVertexAlloc.java
+++ b/graphics/java/android/renderscript/ProgramVertexAlloc.java
@@ -17,6 +17,8 @@
 package android.renderscript;
 
 import java.lang.Math;
+
+import android.renderscript.Element;
 import android.util.Log;
 
 
@@ -33,14 +35,14 @@
     Matrix mProjection;
     Matrix mTexture;
 
-    public RenderScript.Allocation mAlloc;
+    public Allocation mAlloc;
 
     public ProgramVertexAlloc(RenderScript rs) {
         mModel = new Matrix();
         mProjection = new Matrix();
         mTexture = new Matrix();
 
-        mAlloc = rs.allocationCreateSized(Element.USER_FLOAT, 48);
+        mAlloc = Allocation.createSized(rs, Element.USER_FLOAT, 48);
         mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
         mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
         mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 3d4f333..dc87b6a 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -20,15 +20,11 @@
 import java.io.InputStream;
 
 import android.content.res.Resources;
-import android.os.Bundle;
+import android.graphics.Bitmap;
 import android.util.Config;
 import android.util.Log;
 import android.view.Surface;
 
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-
 
 /**
  * @hide
@@ -48,7 +44,6 @@
     private static boolean sInitialized;
     native private static void _nInit();
 
-    private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
 
     static {
         sInitialized = false;
@@ -59,7 +54,6 @@
         } catch (UnsatisfiedLinkError e) {
             Log.d(LOG_TAG, "RenderScript JNI library not found!");
         }
-        mBitmapOptions.inScaled = false;
     }
 
     native int  nDeviceCreate();
@@ -206,6 +200,11 @@
         return mElementBuilder;
     }
 
+    Type.Builder mTypeBuilder = new Type.Builder(this);
+    public Type.Builder typeBuilderCreate(Element e) throws IllegalStateException {
+        mTypeBuilder.begin(e);
+        return mTypeBuilder;
+    }
 
 
 
@@ -295,187 +294,6 @@
     }
 
     //////////////////////////////////////////////////////////////////////////////////
-    // Type
-
-    public enum Dimension {
-        X (0),
-        Y (1),
-        Z (2),
-        LOD (3),
-        FACE (4),
-        ARRAY_0 (100);
-
-        int mID;
-        Dimension(int id) {
-            mID = id;
-        }
-    }
-
-    public class Type extends BaseObj {
-        Type(int id) {
-            super(RenderScript.this);
-            mID = id;
-        }
-
-        public void destroy() {
-            nTypeDestroy(mID);
-            mID = 0;
-        }
-    }
-
-    public void typeBegin(Element e) {
-        nTypeBegin(e.mID);
-    }
-
-    public void typeAdd(Dimension d, int value) {
-        nTypeAdd(d.mID, value);
-    }
-
-    public Type typeCreate() {
-        int id = nTypeCreate();
-        return new Type(id);
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////
-    // Allocation
-
-    public class Allocation extends BaseObj {
-        Allocation(int id) {
-            super(RenderScript.this);
-            mID = id;
-        }
-
-        public void uploadToTexture(int baseMipLevel) {
-            nAllocationUploadToTexture(mID, baseMipLevel);
-        }
-
-        public void destroy() {
-            nAllocationDestroy(mID);
-            mID = 0;
-        }
-
-        public void data(int[] d) {
-            nAllocationData(mID, d);
-        }
-
-        public void data(float[] d) {
-            nAllocationData(mID, d);
-        }
-
-        public void subData1D(int off, int count, int[] d) {
-            nAllocationSubData1D(mID, off, count, d);
-        }
-
-        public void subData1D(int off, int count, float[] d) {
-            nAllocationSubData1D(mID, off, count, d);
-        }
-
-        public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
-            nAllocationSubData2D(mID, xoff, yoff, w, h, d);
-        }
-
-        public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
-            nAllocationSubData2D(mID, xoff, yoff, w, h, d);
-        }
-    }
-
-    public Allocation allocationCreateTyped(Type type) {
-        int id = nAllocationCreateTyped(type.mID);
-        return new Allocation(id);
-    }
-
-    public Allocation allocationCreateSized(Element e, int count) {
-        int id;
-        if(e.mIsPredefined) {
-            id = nAllocationCreatePredefSized(e.mPredefinedID, count);
-        } else {
-            id = nAllocationCreateSized(e.mID, count);
-        }
-        return new Allocation(id);
-    }
-
-    public Allocation allocationCreateFromBitmap(Bitmap b, Element dstFmt, boolean genMips)
-        throws IllegalArgumentException {
-        if(!dstFmt.mIsPredefined) {
-            throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
-        }
-
-        int id = nAllocationCreateFromBitmap(dstFmt.mPredefinedID, genMips, b);
-        return new Allocation(id);
-    }
-
-    public Allocation allocationCreateFromBitmapBoxed(Bitmap b, Element dstFmt, boolean genMips)
-        throws IllegalArgumentException {
-        if(!dstFmt.mIsPredefined) {
-            throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
-        }
-
-        int id = nAllocationCreateFromBitmapBoxed(dstFmt.mPredefinedID, genMips, b);
-        return new Allocation(id);
-    }
-
-    public Allocation allocationCreateFromBitmapResource(Resources res, int id, Element dstFmt, boolean genMips)
-        throws IllegalArgumentException {
-
-        Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
-        return allocationCreateFromBitmap(b, dstFmt, genMips);
-    }
-
-    public Allocation allocationCreateFromBitmapResourceBoxed(Resources res, int id, Element dstFmt, boolean genMips)
-        throws IllegalArgumentException {
-
-        Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
-        return allocationCreateFromBitmapBoxed(b, dstFmt, genMips);
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////
-    // Adapter1D
-
-    public class Adapter1D extends BaseObj {
-        Adapter1D(int id) {
-            super(RenderScript.this);
-            mID = id;
-        }
-
-        public void destroy() {
-            nAdapter1DDestroy(mID);
-            mID = 0;
-        }
-
-        public void bindAllocation(Allocation a) {
-            nAdapter1DBindAllocation(mID, a.mID);
-        }
-
-        public void setConstraint(Dimension dim, int value) {
-            nAdapter1DSetConstraint(mID, dim.mID, value);
-        }
-
-        public void data(int[] d) {
-            nAdapter1DData(mID, d);
-        }
-
-        public void subData(int off, int count, int[] d) {
-            nAdapter1DSubData(mID, off, count, d);
-        }
-
-        public void data(float[] d) {
-            nAdapter1DData(mID, d);
-        }
-
-        public void subData(int off, int count, float[] d) {
-            nAdapter1DSubData(mID, off, count, d);
-        }
-    }
-
-    public Adapter1D adapter1DCreate() {
-        int id = nAdapter1DCreate();
-        return new Adapter1D(id);
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////
     // Triangle Mesh
 
     public class TriangleMesh extends BaseObj {
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
new file mode 100644
index 0000000..86932c4
--- /dev/null
+++ b/graphics/java/android/renderscript/Type.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2008 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 android.renderscript;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.util.Config;
+import android.util.Log;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+/**
+ * @hide
+ *
+ **/
+public class Type extends BaseObj {
+    Type(int id, RenderScript rs) {
+        super(rs);
+        mID = id;
+    }
+
+    public void destroy() {
+        mRS.nTypeDestroy(mID);
+        mID = 0;
+    }
+
+    public static class Builder {
+        RenderScript mRS;
+        boolean mActive = true;
+
+        Builder(RenderScript rs) {
+            mRS = rs;
+        }
+
+        public void begin(Element e) {
+            mRS.nTypeBegin(e.mID);
+        }
+
+        public void add(Dimension d, int value) {
+            mRS.nTypeAdd(d.mID, value);
+        }
+
+        public Type create() {
+            int id = mRS.nTypeCreate();
+            return new Type(id, mRS);
+        }
+    }
+
+}
