diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 50d39b7..81848b9 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -47,14 +47,6 @@
         mRS.nAllocationUploadToTexture(mID, baseMipLevel);
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nAllocationDestroy(mID);
-    }
-
     public void data(int[] d) {
         mRS.nAllocationData(mID, d);
     }
@@ -98,11 +90,6 @@
             mID = id;
         }
 
-        public void destroy() {
-            mRS.nAdapter1DDestroy(mID);
-            mID = 0;
-        }
-
         public void setConstraint(Dimension dim, int value) {
             mRS.nAdapter1DSetConstraint(mID, dim.mID, value);
         }
@@ -139,11 +126,6 @@
             mID = id;
         }
 
-        public void destroy() {
-            mRS.nAdapter2DDestroy(mID);
-            mID = 0;
-        }
-
         public void setConstraint(Dimension dim, int value) {
             mRS.nAdapter2DSetConstraint(mID, dim.mID, value);
         }
@@ -251,7 +233,7 @@
         Allocation alloc = createTyped(rs, t);
         t.destroy();
         return alloc;
-    } 
+    }
 */
 }
 
diff --git a/graphics/java/android/renderscript/BaseObj.java b/graphics/java/android/renderscript/BaseObj.java
index f760035..eaeb401 100644
--- a/graphics/java/android/renderscript/BaseObj.java
+++ b/graphics/java/android/renderscript/BaseObj.java
@@ -61,9 +61,18 @@
     {
         if (!mDestroyed) {
             Log.v(RenderScript.LOG_TAG,
-                  "Element finalized without having released the RS reference.");
+                  getClass() + " finalized without having released the RS reference.");
         }
         super.finalize();
     }
+
+    public void destroy() {
+        if(mDestroyed) {
+            throw new IllegalStateException("Object already destroyed.");
+        }
+        mDestroyed = true;
+        mRS.nObjDestroy(mID);
+    }
+
 }
 
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index cf181b7..3f75069 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -138,11 +138,7 @@
         if(mIsPredefined) {
             throw new IllegalStateException("Attempting to destroy a predefined Element.");
         }
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nElementDestroy(mID);
+        super.destroy();
     }
 
     public static Element createFromClass(RenderScript rs, Class c) {
diff --git a/graphics/java/android/renderscript/Light.java b/graphics/java/android/renderscript/Light.java
index 8067f19..115ae03 100644
--- a/graphics/java/android/renderscript/Light.java
+++ b/graphics/java/android/renderscript/Light.java
@@ -29,11 +29,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        mRS.nLightDestroy(mID);
-        mID = 0;
-    }
-
     public void setColor(float r, float g, float b) {
         mRS.nLightSetColor(mID, r, g, b);
     }
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 09c4d9a..aad09f6 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -45,14 +45,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nProgramFragmentStoreDestroy(mID);
-    }
-
     public void bindTexture(Allocation va, int slot)
         throws IllegalArgumentException {
         if((slot < 0) || (slot >= MAX_SLOT)) {
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
index f8b59bd..b7d987e 100644
--- a/graphics/java/android/renderscript/ProgramStore.java
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -80,14 +80,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nProgramFragmentStoreDestroy(mID);
-    }
-
 
 
     public static class Builder {
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 74c005f..2a11bfb 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -33,14 +33,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nProgramVertexDestroy(mID);
-    }
-
     public void bindAllocation(MatrixAllocation va) {
         mRS.nProgramVertexBindAllocation(mID, va.mAlloc.mID);
     }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index ab263ed..08418c6 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -74,6 +74,7 @@
     native void nContextAddDefineF(String name, float value);
 
     native void nAssignName(int obj, byte[] name);
+    native void nObjDestroy(int id);
     native int  nFileOpen(byte[] name);
 
     native void nElementBegin();
@@ -81,12 +82,10 @@
     native void nElementAdd(int kind, int type, int norm, int bits, String s);
     native int  nElementCreate();
     native int  nElementGetPredefined(int predef);
-    native void nElementDestroy(int obj);
 
     native void nTypeBegin(int elementID);
     native void nTypeAdd(int dim, int val);
     native int  nTypeCreate();
-    native void nTypeDestroy(int id);
     native void nTypeFinalDestroy(Type t);
     native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs);
 
@@ -97,7 +96,6 @@
     native int  nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
 
     native void nAllocationUploadToTexture(int alloc, int baseMioLevel);
-    native void nAllocationDestroy(int alloc);
     native void nAllocationData(int id, int[] d);
     native void nAllocationData(int id, float[] d);
     native void nAllocationSubData1D(int id, int off, int count, int[] d);
@@ -108,7 +106,6 @@
     native void nAllocationRead(int id, float[] d);
     native void nAllocationDataFromObject(int id, Type t, Object o);
 
-    native void nTriangleMeshDestroy(int id);
     native void nTriangleMeshBegin(int vertex, int index);
     native void nTriangleMeshAddVertex_XY (float x, float y);
     native void nTriangleMeshAddVertex_XYZ (float x, float y, float z);
@@ -118,7 +115,6 @@
     native void nTriangleMeshAddTriangle(int i1, int i2, int i3);
     native int  nTriangleMeshCreate();
 
-    native void nAdapter1DDestroy(int id);
     native void nAdapter1DBindAllocation(int ad, int alloc);
     native void nAdapter1DSetConstraint(int ad, int dim, int value);
     native void nAdapter1DData(int ad, int[] d);
@@ -127,7 +123,6 @@
     native void nAdapter1DSubData(int ad, int off, int count, float[] d);
     native int  nAdapter1DCreate();
 
-    native void nAdapter2DDestroy(int id);
     native void nAdapter2DBindAllocation(int ad, int alloc);
     native void nAdapter2DSetConstraint(int ad, int dim, int value);
     native void nAdapter2DData(int ad, int[] d);
@@ -136,7 +131,6 @@
     native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d);
     native int  nAdapter2DCreate();
 
-    native void nScriptDestroy(int script);
     native void nScriptBindAllocation(int script, int alloc, int slot);
     native void nScriptSetClearColor(int script, float r, float g, float b, float a);
     native void nScriptSetClearDepth(int script, float depth);
@@ -151,7 +145,6 @@
     native void nScriptCAddDefineI32(String name, int value);
     native void nScriptCAddDefineF(String name, float value);
 
-    native void nSamplerDestroy(int sampler);
     native void nSamplerBegin();
     native void nSamplerSet(int param, int value);
     native int  nSamplerCreate();
@@ -163,7 +156,6 @@
     native void nProgramFragmentStoreBlendFunc(int src, int dst);
     native void nProgramFragmentStoreDither(boolean enable);
     native int  nProgramFragmentStoreCreate();
-    native void nProgramFragmentStoreDestroy(int pgm);
 
     native void nProgramFragmentBegin(int in, int out);
     native void nProgramFragmentBindTexture(int vpf, int slot, int a);
@@ -172,9 +164,7 @@
     native void nProgramFragmentSetEnvMode(int slot, int env);
     native void nProgramFragmentSetTexEnable(int slot, boolean enable);
     native int  nProgramFragmentCreate();
-    native void nProgramFragmentDestroy(int pgm);
 
-    native void nProgramVertexDestroy(int pv);
     native void nProgramVertexBindAllocation(int pv, int mID);
     native void nProgramVertexBegin(int inID, int outID);
     native void nProgramVertexSetTextureMatrixEnable(boolean enable);
@@ -185,16 +175,13 @@
     native void nLightSetIsMono(boolean isMono);
     native void nLightSetIsLocal(boolean isLocal);
     native int  nLightCreate();
-    native void nLightDestroy(int l);
     native void nLightSetColor(int l, float r, float g, float b);
     native void nLightSetPosition(int l, float x, float y, float z);
 
-    native void nSimpleMeshDestroy(int id);
     native int  nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim);
     native void nSimpleMeshBindVertex(int id, int alloc, int slot);
     native void nSimpleMeshBindIndex(int id, int alloc);
 
-    native void nAnimationDestroy(int id);
     native void nAnimationBegin(int attribCount, int keyframeCount);
     native void nAnimationAdd(float time, float[] attribs);
     native int  nAnimationCreate();
@@ -229,11 +216,6 @@
             super(RenderScript.this);
             mID = id;
         }
-
-        public void destroy() {
-            nTriangleMeshDestroy(mID);
-            mID = 0;
-        }
     }
 
     public void triangleMeshBegin(Element vertex, Element index) {
@@ -278,11 +260,6 @@
             super(RenderScript.this);
             mID = id;
         }
-
-        public void destroy() {
-            //nLightDestroy(mID);
-            mID = 0;
-        }
     }
 
     public File fileOpen(String s) throws IllegalStateException, IllegalArgumentException
diff --git a/graphics/java/android/renderscript/Sampler.java b/graphics/java/android/renderscript/Sampler.java
index dfeac81..5e0b110 100644
--- a/graphics/java/android/renderscript/Sampler.java
+++ b/graphics/java/android/renderscript/Sampler.java
@@ -51,11 +51,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        mRS.nSamplerDestroy(mID);
-        mID = 0;
-    }
-
     public static class Builder {
         RenderScript mRS;
         Value mMin;
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 5b9eb55..a402471 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -31,14 +31,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nScriptDestroy(mID);
-    }
-
     public void bindAllocation(Allocation va, int slot) {
         mRS.nScriptBindAllocation(mID, va.mID, slot);
     }
diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java
index 484849b..d80551e 100644
--- a/graphics/java/android/renderscript/SimpleMesh.java
+++ b/graphics/java/android/renderscript/SimpleMesh.java
@@ -34,14 +34,6 @@
         mID = id;
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nSimpleMeshDestroy(mID);
-    }
-
     public void bindVertexAllocation(Allocation a, int slot) {
         mRS.nSimpleMeshBindVertex(mID, a.mID, slot);
     }
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index afb0e60..30b952d 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -48,14 +48,6 @@
         super.finalize();
     }
 
-    public void destroy() {
-        if(mDestroyed) {
-            throw new IllegalStateException("Object already destroyed.");
-        }
-        mDestroyed = true;
-        mRS.nTypeDestroy(mID);
-    }
-
     public static Type createFromClass(RenderScript rs, Class c, int size) {
         Element e = Element.createFromClass(rs, c);
         Builder b = new Builder(rs, e);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index ff997e7..2d48165 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -78,6 +78,14 @@
     _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
 }
 
+static void
+nObjDestroy(JNIEnv *_env, jobject _this, jint obj)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nObjDestroy, con(%p) obj(%p)", con, (void *)obj);
+    rsObjDestroy(con, (void *)obj);
+}
+
 
 static jint
 nFileOpen(JNIEnv *_env, jobject _this, jbyteArray str)
@@ -183,14 +191,6 @@
     return (jint)rsElementGetPredefined(con, (RsElementPredefined)predef);
 }
 
-static void
-nElementDestroy(JNIEnv *_env, jobject _this, jint e)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nElementDestroy, con(%p) e(%p)", con, (RsElement)e);
-    rsElementDestroy(con, (RsElement)e);
-}
-
 // -----------------------------------
 
 static void
@@ -217,14 +217,6 @@
     return (jint)rsTypeCreate(con);
 }
 
-static void
-nTypeDestroy(JNIEnv *_env, jobject _this, jint eID)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nTypeDestroy, con(%p), t(%p)", con, (RsType)eID);
-    rsTypeDestroy(con, (RsType)eID);
-}
-
 static void * SF_LoadInt(JNIEnv *_env, jobject _obj, jfieldID _field, void *buffer)
 {
     ((int32_t *)buffer)[0] = _env->GetIntField(_obj, _field);
@@ -412,14 +404,6 @@
 
 
 static void
-nAllocationDestroy(JNIEnv *_env, jobject _this, jint a)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nAllocationDestroy, con(%p), a(%p)", con, (RsAllocation)a);
-    rsAllocationDestroy(con, (RsAllocation)a);
-}
-
-static void
 nAllocationData_i(JNIEnv *_env, jobject _this, jint alloc, jintArray data)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -531,14 +515,6 @@
 // -----------------------------------
 
 static void
-nTriangleMeshDestroy(JNIEnv *_env, jobject _this, jint tm)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nTriangleMeshDestroy, con(%p), tm(%p)", con, (RsAllocation)tm);
-    rsTriangleMeshDestroy(con, (RsTriangleMesh)tm);
-}
-
-static void
 nTriangleMeshBegin(JNIEnv *_env, jobject _this, jint v, jint i)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -610,14 +586,6 @@
 // -----------------------------------
 
 static void
-nAdapter1DDestroy(JNIEnv *_env, jobject _this, jint adapter)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nAdapter1DDestroy, con(%p), adapter(%p)", con, (RsAdapter1D)adapter);
-    rsAdapter1DDestroy(con, (RsAdapter1D)adapter);
-}
-
-static void
 nAdapter1DBindAllocation(JNIEnv *_env, jobject _this, jint adapter, jint alloc)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -688,14 +656,6 @@
 // -----------------------------------
 
 static void
-nAdapter2DDestroy(JNIEnv *_env, jobject _this, jint adapter)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nAdapter2DDestroy, con(%p), adapter(%p)", con, (RsAdapter2D)adapter);
-    rsAdapter2DDestroy(con, (RsAdapter2D)adapter);
-}
-
-static void
 nAdapter2DBindAllocation(JNIEnv *_env, jobject _this, jint adapter, jint alloc)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -768,14 +728,6 @@
 // -----------------------------------
 
 static void
-nScriptDestroy(JNIEnv *_env, jobject _this, jint script)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptDestroy, con(%p), script(%p)", con, (RsScript)script);
-    rsScriptDestroy(con, (RsScript)script);
-}
-
-static void
 nScriptBindAllocation(JNIEnv *_env, jobject _this, jint script, jint alloc, jint slot)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -988,14 +940,6 @@
     return (jint)rsProgramFragmentStoreCreate(con);
 }
 
-static void
-nProgramFragmentStoreDestroy(JNIEnv *_env, jobject _this, jint pgm)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentStoreDestroy, con(%p), pgm(%i)", con, pgm);
-    rsProgramFragmentStoreDestroy(con, (RsProgramFragmentStore)pgm);
-}
-
 // ---------------------------------------------------------------------------
 
 static void
@@ -1054,14 +998,6 @@
     return (jint)rsProgramFragmentCreate(con);
 }
 
-static void
-nProgramFragmentDestroy(JNIEnv *_env, jobject _this, jint pgm)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentDestroy, con(%p), pgm(%i)", con, pgm);
-    rsProgramFragmentDestroy(con, (RsProgramFragment)pgm);
-}
-
 // ---------------------------------------------------------------------------
 
 static void
@@ -1104,15 +1040,6 @@
     return (jint)rsProgramVertexCreate(con);
 }
 
-static void
-nProgramVertexDestroy(JNIEnv *_env, jobject _this, jint pgm)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentDestroy, con(%p), pgm(%i)", con, pgm);
-    rsProgramFragmentDestroy(con, (RsProgramFragment)pgm);
-}
-
-
 
 
 // ---------------------------------------------------------------------------
@@ -1173,14 +1100,6 @@
 // ---------------------------------------------------------------------------
 
 static void
-nSamplerDestroy(JNIEnv *_env, jobject _this, jint s)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nSamplerDestroy, con(%p), sampler(%p)", con, (RsSampler)s);
-    rsSamplerDestroy(con, (RsSampler)s);
-}
-
-static void
 nSamplerBegin(JNIEnv *_env, jobject _this)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -1239,14 +1158,6 @@
 }
 
 static void
-nLightDestroy(JNIEnv *_env, jobject _this, jint light)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nLightDestroy, con(%p), light(%p)", con, (RsLight)light);
-    rsLightDestroy(con, (RsLight)light);
-}
-
-static void
 nLightSetColor(JNIEnv *_env, jobject _this, jint light, float r, float g, float b)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -1264,14 +1175,6 @@
 
 // ---------------------------------------------------------------------------
 
-static void
-nSimpleMeshDestroy(JNIEnv *_env, jobject _this, jint s)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nSimpleMeshDestroy, con(%p), SimpleMesh(%p)", con, (RsSimpleMesh)s);
-    rsSimpleMeshDestroy(con, (RsSimpleMesh)s);
-}
-
 static jint
 nSimpleMeshCreate(JNIEnv *_env, jobject _this, jint batchID, jint indexID, jintArray vtxIDs, jint primID)
 {
@@ -1313,6 +1216,7 @@
 {"nContextCreate",                 "(ILandroid/view/Surface;I)I",          (void*)nContextCreate },
 {"nContextDestroy",                "(I)V",                                 (void*)nContextDestroy },
 {"nAssignName",                    "(I[B)V",                               (void*)nAssignName },
+{"nObjDestroy",                    "(I)V",                                 (void*)nObjDestroy },
 
 {"nFileOpen",                      "([B)I",                                (void*)nFileOpen },
 
@@ -1321,12 +1225,10 @@
 {"nElementAdd",                    "(IIIILjava/lang/String;)V",            (void*)nElementAdd },
 {"nElementCreate",                 "()I",                                  (void*)nElementCreate },
 {"nElementGetPredefined",          "(I)I",                                 (void*)nElementGetPredefined },
-{"nElementDestroy",                "(I)V",                                 (void*)nElementDestroy },
 
 {"nTypeBegin",                     "(I)V",                                 (void*)nTypeBegin },
 {"nTypeAdd",                       "(II)V",                                (void*)nTypeAdd },
 {"nTypeCreate",                    "()I",                                  (void*)nTypeCreate },
-{"nTypeDestroy",                   "(I)V",                                 (void*)nTypeDestroy },
 {"nTypeFinalDestroy",              "(Landroid/renderscript/Type;)V",       (void*)nTypeFinalDestroy },
 {"nTypeSetupFields",               "(Landroid/renderscript/Type;[I[I[Ljava/lang/reflect/Field;)V", (void*)nTypeSetupFields },
 
@@ -1336,7 +1238,6 @@
 {"nAllocationCreateFromBitmap",    "(IZLandroid/graphics/Bitmap;)I",       (void*)nAllocationCreateFromBitmap },
 {"nAllocationCreateFromBitmapBoxed","(IZLandroid/graphics/Bitmap;)I",       (void*)nAllocationCreateFromBitmapBoxed },
 {"nAllocationUploadToTexture",     "(II)V",                                (void*)nAllocationUploadToTexture },
-{"nAllocationDestroy",             "(I)V",                                 (void*)nAllocationDestroy },
 {"nAllocationData",                "(I[I)V",                               (void*)nAllocationData_i },
 {"nAllocationData",                "(I[F)V",                               (void*)nAllocationData_f },
 {"nAllocationSubData1D",           "(III[I)V",                             (void*)nAllocationSubData1D_i },
@@ -1347,7 +1248,6 @@
 {"nAllocationRead",                "(I[F)V",                               (void*)nAllocationRead_f },
 {"nAllocationDataFromObject",      "(ILandroid/renderscript/Type;Ljava/lang/Object;)V",   (void*)nAllocationDataFromObject },
 
-{"nTriangleMeshDestroy",           "(I)V",                                 (void*)nTriangleMeshDestroy },
 {"nTriangleMeshBegin",             "(II)V",                                (void*)nTriangleMeshBegin },
 {"nTriangleMeshAddVertex_XY",      "(FF)V",                                (void*)nTriangleMeshAddVertex_XY },
 {"nTriangleMeshAddVertex_XYZ",     "(FFF)V",                               (void*)nTriangleMeshAddVertex_XYZ },
@@ -1357,7 +1257,6 @@
 {"nTriangleMeshAddTriangle",       "(III)V",                               (void*)nTriangleMeshAddTriangle },
 {"nTriangleMeshCreate",            "()I",                                  (void*)nTriangleMeshCreate },
 
-{"nAdapter1DDestroy",              "(I)V",                                 (void*)nAdapter1DDestroy },
 {"nAdapter1DBindAllocation",       "(II)V",                                (void*)nAdapter1DBindAllocation },
 {"nAdapter1DSetConstraint",        "(III)V",                               (void*)nAdapter1DSetConstraint },
 {"nAdapter1DData",                 "(I[I)V",                               (void*)nAdapter1DData_i },
@@ -1366,7 +1265,6 @@
 {"nAdapter1DSubData",              "(III[F)V",                             (void*)nAdapter1DSubData_f },
 {"nAdapter1DCreate",               "()I",                                  (void*)nAdapter1DCreate },
 
-{"nAdapter2DDestroy",              "(I)V",                                 (void*)nAdapter2DDestroy },
 {"nAdapter2DBindAllocation",       "(II)V",                                (void*)nAdapter2DBindAllocation },
 {"nAdapter2DSetConstraint",        "(III)V",                               (void*)nAdapter2DSetConstraint },
 {"nAdapter2DData",                 "(I[I)V",                               (void*)nAdapter2DData_i },
@@ -1375,7 +1273,6 @@
 {"nAdapter2DSubData",              "(IIIII[F)V",                           (void*)nAdapter2DSubData_f },
 {"nAdapter2DCreate",               "()I",                                  (void*)nAdapter2DCreate },
 
-{"nScriptDestroy",                 "(I)V",                                 (void*)nScriptDestroy },
 {"nScriptBindAllocation",          "(III)V",                               (void*)nScriptBindAllocation },
 {"nScriptSetClearColor",           "(IFFFF)V",                             (void*)nScriptSetClearColor },
 {"nScriptSetClearDepth",           "(IF)V",                                (void*)nScriptSetClearDepth },
@@ -1397,7 +1294,6 @@
 {"nProgramFragmentStoreBlendFunc", "(II)V",                                (void*)nProgramFragmentStoreBlendFunc },
 {"nProgramFragmentStoreDither",    "(Z)V",                                 (void*)nProgramFragmentStoreDither },
 {"nProgramFragmentStoreCreate",    "()I",                                  (void*)nProgramFragmentStoreCreate },
-{"nProgramFragmentStoreDestroy",   "(I)V",                                 (void*)nProgramFragmentStoreDestroy },
 
 {"nProgramFragmentBegin",          "(II)V",                                (void*)nProgramFragmentBegin },
 {"nProgramFragmentBindTexture",    "(III)V",                               (void*)nProgramFragmentBindTexture },
@@ -1406,9 +1302,7 @@
 {"nProgramFragmentSetEnvMode",     "(II)V",                                (void*)nProgramFragmentSetEnvMode },
 {"nProgramFragmentSetTexEnable",   "(IZ)V",                                (void*)nProgramFragmentSetTexEnable },
 {"nProgramFragmentCreate",         "()I",                                  (void*)nProgramFragmentCreate },
-{"nProgramFragmentDestroy",        "(I)V",                                 (void*)nProgramFragmentDestroy },
 
-{"nProgramVertexDestroy",          "(I)V",                                 (void*)nProgramVertexDestroy },
 {"nProgramVertexBindAllocation",   "(II)V",                                (void*)nProgramVertexBindAllocation },
 {"nProgramVertexBegin",            "(II)V",                                (void*)nProgramVertexBegin },
 {"nProgramVertexSetTextureMatrixEnable",   "(Z)V",                         (void*)nProgramVertexSetTextureMatrixEnable },
@@ -1419,7 +1313,6 @@
 {"nLightSetIsMono",                "(Z)V",                                 (void*)nLightSetIsMono },
 {"nLightSetIsLocal",               "(Z)V",                                 (void*)nLightSetIsLocal },
 {"nLightCreate",                   "()I",                                  (void*)nLightCreate },
-{"nLightDestroy",                  "(I)V",                                 (void*)nLightDestroy },
 {"nLightSetColor",                 "(IFFF)V",                              (void*)nLightSetColor },
 {"nLightSetPosition",              "(IFFF)V",                              (void*)nLightSetPosition },
 
@@ -1428,12 +1321,10 @@
 {"nContextBindProgramFragment",    "(I)V",                                 (void*)nContextBindProgramFragment },
 {"nContextBindProgramVertex",      "(I)V",                                 (void*)nContextBindProgramVertex },
 
-{"nSamplerDestroy",                "(I)V",                                 (void*)nSamplerDestroy },
 {"nSamplerBegin",                  "()V",                                  (void*)nSamplerBegin },
 {"nSamplerSet",                    "(II)V",                                (void*)nSamplerSet },
 {"nSamplerCreate",                 "()I",                                  (void*)nSamplerCreate },
 
-{"nSimpleMeshDestroy",             "(I)V",                                 (void*)nSimpleMeshDestroy },
 {"nSimpleMeshCreate",              "(II[II)I",                             (void*)nSimpleMeshCreate },
 {"nSimpleMeshBindVertex",          "(III)V",                               (void*)nSimpleMeshBindVertex },
 {"nSimpleMeshBindIndex",           "(II)V",                                (void*)nSimpleMeshBindIndex },
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 0df237f..1a81021 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -32,6 +32,10 @@
 	param size_t len
 	}
 
+ObjDestroy {
+	param void *obj
+	}
+
 ElementBegin {
 }
 
@@ -56,10 +60,6 @@
 	ret RsElement
 	}
 
-ElementDestroy {
-	param RsElement ve
-	}
-
 TypeBegin {
 	param RsElement type
 	}
@@ -73,10 +73,6 @@
 	ret RsType
 	}
 
-TypeDestroy {
-	param RsType p
-	}
-
 AllocationCreateTyped {
 	param RsType type
 	ret RsAllocation
@@ -130,10 +126,6 @@
 	param RsAllocation alloc
 	}
 
-AllocationDestroy {
-	param RsAllocation alloc
-	}
-
 
 AllocationData {
 	param RsAllocation va
@@ -170,10 +162,6 @@
 	param RsAllocation alloc
 	}
 
-Adapter1DDestroy {
-	param RsAdapter1D adapter
-	}
-
 Adapter1DSetConstraint {
 	param RsAdapter1D adapter
 	param RsDimension dim
@@ -201,10 +189,6 @@
 	param RsAllocation alloc
 	}
 
-Adapter2DDestroy {
-	param RsAdapter2D adapter
-	}
-
 Adapter2DSetConstraint {
 	param RsAdapter2D adapter
 	param RsDimension dim
@@ -237,9 +221,6 @@
 	ret RsSampler
 	}
 
-SamplerDestroy {
-	param RsSampler s
-	}
 
 TriangleMeshBegin {
 	param RsElement vertex
@@ -260,9 +241,6 @@
 	ret RsTriangleMesh
 	}
 
-TriangleMeshDestroy {
-	param RsTriangleMesh mesh
-	}
 
 TriangleMeshRender {
 	param RsTriangleMesh vtm
@@ -274,9 +252,6 @@
 	param uint32_t count
 	}
 
-ScriptDestroy {
-	param RsScript script
-	}
 
 ScriptBindAllocation {
 	param RsScript vtm
@@ -381,9 +356,6 @@
 	ret RsProgramFragmentStore
 	}
 
-ProgramFragmentStoreDestroy {
-	param RsProgramFragmentStore pfs
-	}
 
 
 ProgramFragmentBegin {
@@ -422,10 +394,6 @@
 	ret RsProgramFragment
 	}
 
-ProgramFragmentDestroy {
-	param RsProgramFragment pf
-	}
-
 
 ProgramVertexBegin {
 	param RsElement in
@@ -464,9 +432,6 @@
 	ret RsLight light
 	}
 
-LightDestroy {
-	param RsLight light
-	}
 
 LightSetPosition {
 	param RsLight light
@@ -498,9 +463,6 @@
 	param uint32_t primType
 	}
 
-SimpleMeshDestroy {
-	param RsSimpleMesh mesh
-	}
 
 SimpleMeshBindIndex {
 	param RsSimpleMesh mesh
diff --git a/libs/rs/rsAdapter.cpp b/libs/rs/rsAdapter.cpp
index 25f3340..3242e11 100644
--- a/libs/rs/rsAdapter.cpp
+++ b/libs/rs/rsAdapter.cpp
@@ -76,12 +76,6 @@
     return a;
 }
 
-void rsi_Adapter1DDestroy(Context *rsc, RsAdapter1D va)
-{
-    Adapter1D * a = static_cast<Adapter1D *>(va);
-    a->decRef();
-}
-
 void rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc)
 {
     Adapter1D * a = static_cast<Adapter1D *>(va);
@@ -195,12 +189,6 @@
     return a;
 }
 
-void rsi_Adapter2DDestroy(Context *rsc, RsAdapter2D va)
-{
-    Adapter2D * a = static_cast<Adapter2D *>(va);
-    a->decRef();
-}
-
 void rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc)
 {
     Adapter2D * a = static_cast<Adapter2D *>(va);
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index ad9c739..3cb76bc 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -201,10 +201,6 @@
     alloc->uploadToBufferObject();
 }
 
-void rsi_AllocationDestroy(Context *rsc, RsAllocation)
-{
-}
-
 static void mip565(const Adapter2D &out, const Adapter2D &in)
 {
     uint32_t w = out.getDimX();
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 52389ea..bc0cf12 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -395,6 +395,13 @@
     rsc->assignName(ob, name, len);
 }
 
+void rsi_ObjDestroy(Context *rsc, void *obj)
+{
+    ObjectBase *ob = static_cast<ObjectBase *>(obj);
+    rsc->removeName(ob);
+    ob->decRef();
+}
+
 void rsi_ContextSetDefineF(Context *rsc, const char* name, float value)
 {
     rsc->addInt32Define(name, value);
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 97b18c0..389b2c0 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -416,12 +416,6 @@
     return se;
 }
 
-void rsi_ElementDestroy(Context *rsc, RsElement vse)
-{
-    Element * se = static_cast<Element *>(vse);
-    se->decRef();
-}
-
 
 }
 }
diff --git a/libs/rs/rsLight.cpp b/libs/rs/rsLight.cpp
index 24b58b6..f780e52 100644
--- a/libs/rs/rsLight.cpp
+++ b/libs/rs/rsLight.cpp
@@ -82,7 +82,7 @@
 
 
 ////////////////////////////////////////////////////
-// 
+//
 
 namespace android {
 namespace renderscript {
@@ -110,12 +110,6 @@
     return l;
 }
 
-void rsi_LightDestroy(Context *rsc, RsLight vl)
-{
-    Light *l = static_cast<Light *>(vl);
-    l->decRef();
-}
-
 void rsi_LightSetColor(Context *rsc, RsLight vl, float r, float g, float b)
 {
     Light *l = static_cast<Light *>(vl);
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index a315658..9df07bf 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -236,15 +236,6 @@
     return pf;
 }
 
-void rsi_ProgramFragmentDestroy(Context *rsc, RsProgramFragment vpf)
-{
-    ProgramFragment *pf = (ProgramFragment *)vpf;
-    if (pf->getName()) {
-        rsc->removeName(pf);
-    }
-    pf->decRef();
-}
-
 
 }
 }
diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramFragmentStore.cpp
index 27f4015..99eed16 100644
--- a/libs/rs/rsProgramFragmentStore.cpp
+++ b/libs/rs/rsProgramFragmentStore.cpp
@@ -261,17 +261,6 @@
     rsc->mStateFragmentStore.mPFS->setDitherEnable(enable);
 }
 
-void rsi_ProgramFragmentStoreDestroy(Context *rsc, RsProgramFragmentStore vpfs)
-{
-    ProgramFragmentStore *pfs = (ProgramFragmentStore *)vpfs;
-    if (pfs->getName()) {
-        rsc->removeName(pfs);
-    }
-    pfs->decRef();
-}
-
-
-
 
 }
 }
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index 418f127..c14c371 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -138,20 +138,13 @@
     SamplerState * ss = &rsc->mStateSampler;
 
 
-    Sampler * s = new Sampler(ss->mMagFilter, 
-                              ss->mMinFilter, 
-                              ss->mWrapS, 
+    Sampler * s = new Sampler(ss->mMagFilter,
+                              ss->mMinFilter,
+                              ss->mWrapS,
                               ss->mWrapT,
                               ss->mWrapR);
     return s;
 }
 
-void rsi_SamplerDestroy(Context *rsc, RsSampler vs)
-{
-    Sampler * s = static_cast<Sampler *>(vs);
-    s->decRef();
-
-}
-
 
 }}
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 6bcb8f2..fde31a1 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -37,12 +37,6 @@
 namespace renderscript {
 
 
-void rsi_ScriptDestroy(Context * rsc, RsScript vs)
-{
-    Script *s = static_cast<Script *>(vs);
-    s->decRef();
-}
-
 void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot)
 {
     Script *s = static_cast<Script *>(vs);
diff --git a/libs/rs/rsSimpleMesh.cpp b/libs/rs/rsSimpleMesh.cpp
index 08e36ac..0b745eb 100644
--- a/libs/rs/rsSimpleMesh.cpp
+++ b/libs/rs/rsSimpleMesh.cpp
@@ -135,12 +135,6 @@
     sm->mPrimitiveBuffer.set((Allocation *)va);
 }
 
-void rsi_SimpleMeshDestroy(Context *rsc, RsSimpleMesh vtm)
-{
-    SimpleMesh * tm = static_cast<SimpleMesh *>(vtm);
-    tm->decRef();
-}
-
 
 
 
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index 43c3bda..a40a152 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -177,9 +177,16 @@
             mGL.mColor.size = 3;
             break;
         case Component::ALPHA:
-            rsAssert(mGL.mColor.size == 3);
-            rsAssert(mGL.mColor.type == c->getGLType());
-            mGL.mColor.size = 4;
+            // Can be RGBA or A at this point
+            if (mGL.mColor.size > 0) {
+                rsAssert(mGL.mColor.size == 3);
+                rsAssert(mGL.mColor.type == c->getGLType());
+                mGL.mColor.size = 4;
+            } else {
+                mGL.mColor.size = 1;
+                mGL.mColor.offset = mElement->getComponentOffsetBytes(ct);
+                mGL.mColor.type = c->getGLType();
+            }
         break;
 
         case Component::NX:
@@ -352,11 +359,6 @@
     return st;
 }
 
-void rsi_TypeDestroy(Context *rsc, RsType vst)
-{
-    Type * st = static_cast<Type *>(vst);
-    st->decRef();
-}
 
 }
 }
