diff --git a/java/RenderScript/android/renderscript/RSSurfaceView.java b/java/RenderScript/android/renderscript/RSSurfaceView.java
index 3d37c13..3835793 100644
--- a/java/RenderScript/android/renderscript/RSSurfaceView.java
+++ b/java/RenderScript/android/renderscript/RSSurfaceView.java
@@ -40,7 +40,7 @@
     public RSSurfaceView(Context context) {
         super(context);
         init();
-        Log.v("***", "RSSurfaceView");
+        Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
     }
 
     /**
@@ -50,7 +50,7 @@
     public RSSurfaceView(Context context, AttributeSet attrs) {
         super(context, attrs);
         init();
-        Log.v("***", "RSSurfaceView");
+        Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
     }
 
     private void init() {
@@ -66,7 +66,7 @@
      * not normally called or subclassed by clients of RSSurfaceView.
      */
     public void surfaceCreated(SurfaceHolder holder) {
-        Log.v("***", "surfaceCreated");
+        Log.v(RenderScript.LOG_TAG, "surfaceCreated");
         mSurfaceHolder = holder;
         //mGLThread.surfaceCreated();
     }
@@ -77,7 +77,7 @@
      */
     public void surfaceDestroyed(SurfaceHolder holder) {
         // Surface will be destroyed when we return
-        Log.v("***", "surfaceDestroyed");
+        Log.v(RenderScript.LOG_TAG, "surfaceDestroyed");
         //mGLThread.surfaceDestroyed();
     }
 
@@ -86,7 +86,7 @@
      * not normally called or subclassed by clients of RSSurfaceView.
      */
     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
-        Log.v("***", "surfaceChanged");
+        Log.v(RenderScript.LOG_TAG, "surfaceChanged");
 
         //mGLThread.onWindowResize(w, h);
     }
@@ -98,7 +98,7 @@
      * Must not be called before a renderer has been set.
      */
     public void onPause() {
-        Log.v("***", "onPause");
+        Log.v(RenderScript.LOG_TAG, "onPause");
         //mGLThread.onPause();
     }
 
@@ -110,7 +110,7 @@
      * Must not be called before a renderer has been set.
      */
     public void onResume() {
-        Log.v("***", "onResume");
+        Log.v(RenderScript.LOG_TAG, "onResume");
         //mGLThread.onResume();
     }
 
@@ -121,7 +121,7 @@
      * @param r the runnable to be run on the GL rendering thread.
      */
     public void queueEvent(Runnable r) {
-        Log.v("***", "queueEvent");
+        Log.v(RenderScript.LOG_TAG, "queueEvent");
         //mGLThread.queueEvent(r);
     }
 
@@ -139,14 +139,14 @@
     // ----------------------------------------------------------------------
 
     public RenderScript createRenderScript() {
-        Log.v("***", "createRenderScript 1");
+        Log.v(RenderScript.LOG_TAG, "createRenderScript 1");
         Surface sur = null;
         while ((sur == null) || (mSurfaceHolder == null)) {
             sur = getHolder().getSurface();
         }
-        Log.v("***", "createRenderScript 2");
+        Log.v(RenderScript.LOG_TAG, "createRenderScript 2");
         RenderScript rs = new RenderScript(sur);
-        Log.v("***", "createRenderScript 3 rs");
+        Log.v(RenderScript.LOG_TAG, "createRenderScript 3 rs");
         return rs;
     }
 
diff --git a/java/RenderScript/android/renderscript/RenderScript.java b/java/RenderScript/android/renderscript/RenderScript.java
index bf381af..a9db15f 100644
--- a/java/RenderScript/android/renderscript/RenderScript.java
+++ b/java/RenderScript/android/renderscript/RenderScript.java
@@ -32,7 +32,7 @@
 import android.graphics.Color;
 
 public class RenderScript {
-    private static final String LOG_TAG = "libRS_jni";
+    static final String LOG_TAG = "libRS_jni";
     private static final boolean DEBUG  = false;
     private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
 
diff --git a/jni/RenderScript_jni.cpp b/jni/RenderScript_jni.cpp
index 5ac1f3a..5b33dd3 100644
--- a/jni/RenderScript_jni.cpp
+++ b/jni/RenderScript_jni.cpp
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
+#define LOG_TAG "libRS_jni"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <math.h>
-
 #include <utils/misc.h>
 
 #include <ui/EGLNativeWindowSurface.h>
@@ -27,6 +28,7 @@
 
 #include <core/SkBitmap.h>
 
+
 #include "jni.h"
 #include "JNIHelp.h"
 #include "android_runtime/AndroidRuntime.h"
@@ -107,7 +109,6 @@
     if (window == NULL)
         goto not_valid_surface;
 
-    LOGE("nContextCreate 5");
     return (jint)rsContextCreate((RsDevice)dev, window, ver);
 }
 
@@ -1068,8 +1069,6 @@
     JNIEnv* env = NULL;
     jint result = -1;
 
-    LOGE("****************************************************\n");
-
     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
         LOGE("ERROR: GetEnv failed\n");
         goto bail;
diff --git a/rsAllocation.cpp b/rsAllocation.cpp
index dab3299..bc14eac 100644
--- a/rsAllocation.cpp
+++ b/rsAllocation.cpp
@@ -50,7 +50,6 @@
 
 Allocation::~Allocation()
 {
-    LOGE("Allocation %p destryed", this);
 }
 
 void Allocation::setCpuWritable(bool)
@@ -79,8 +78,6 @@
     //rsAssert(!mTextureId);
     rsAssert(lodOffset < mType->getLODCount());
 
-    //LOGE("uploadToTexture  %i,  lod %i", mTextureID, lodOffset);
-
     GLenum type = mType->getElement()->getGLType();
     GLenum format = mType->getElement()->getGLFormat();
 
@@ -109,8 +106,6 @@
     rsAssert(!mType->getDimY());
     rsAssert(!mType->getDimZ());
 
-    //LOGE("uploadToTexture  %i,  lod %i", mTextureID, lodOffset);
-
     if (!mBufferID) {
         glGenBuffers(1, &mBufferID);
     }
diff --git a/rsContext.cpp b/rsContext.cpp
index 0f78df4..c731db0 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -119,9 +119,6 @@
      Context *rsc = static_cast<Context *>(vrsc);
 
      gIO = new ThreadIO();
-     rsc->mServerCommands.init(128);
-     rsc->mServerReturns.init(128);
-
      rsc->initEGL();
 
      ScriptTLSStruct *tlsStruct = new ScriptTLSStruct;
@@ -169,9 +166,6 @@
     mRunning = false;
     mExit = false;
 
-    mServerCommands.init(256);
-    mServerReturns.init(256);
-
     // see comment in header
     gCon = this;
 
@@ -194,13 +188,14 @@
     sparam.sched_priority = ANDROID_PRIORITY_DISPLAY;
     pthread_attr_setschedparam(&threadAttr, &sparam);
 
-    LOGE("RS Launching thread");
+    mWndSurface = sur;
+
+    LOGV("RS Launching thread");
     status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
     if (status) {
         LOGE("Failed to start rs context thread.");
     }
 
-    mWndSurface = sur;
     while(!mRunning) {
         sleep(1);
     }
diff --git a/rsContext.h b/rsContext.h
index 26d665b..d98bfd9 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -116,9 +116,6 @@
     bool mRunning;
     bool mExit;
 
-    LocklessCommandFifo mServerCommands;
-    LocklessCommandFifo mServerReturns;
-
     pthread_t mThreadId;
 
     ObjectBaseRef<Script> mRootScript;
diff --git a/rsElement.cpp b/rsElement.cpp
index 5a44f47..069a128 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -410,8 +410,6 @@
 
     rsc->mStateElement.mComponentBuildList.clear();
     se->incRef();
-
-    LOGE("Create %p", se);
     return se;
 }
 
diff --git a/rsLocklessFifo.cpp b/rsLocklessFifo.cpp
index fae92e5..c3fee54 100644
--- a/rsLocklessFifo.cpp
+++ b/rsLocklessFifo.cpp
@@ -64,8 +64,6 @@
     if (freeSpace < 0) {
         freeSpace = 0;
     }
-    
-    //LOGE("free %i", freeSpace);
     return freeSpace;
 }
 
@@ -90,13 +88,11 @@
 
 void LocklessCommandFifo::commit(uint32_t command, uint32_t sizeInBytes)
 {
-    //LOGE("commit cmd %i  size %i", command, sizeInBytes);
     //dumpState("commit 1");
     reinterpret_cast<uint16_t *>(mPut)[0] = command;
     reinterpret_cast<uint16_t *>(mPut)[1] = sizeInBytes;
     mPut += ((sizeInBytes + 3) & ~3) + 4;
     //dumpState("commit 2");
-
     mSignalToWorker.set();
 }
 
@@ -123,12 +119,9 @@
             mSignalToControl.set();
             mSignalToWorker.wait();
         }
-        //dumpState("get 3");
 
         *command = reinterpret_cast<const uint16_t *>(mGet)[0];
         *bytesData = reinterpret_cast<const uint16_t *>(mGet)[1];
-        //LOGE("Got %i, %i", *command, *bytesData);
-    
         if (*command) {
             // non-zero command is valid
             return mGet+4;
@@ -173,7 +166,7 @@
 
 void LocklessCommandFifo::dumpState(const char *s) const
 {
-    LOGE("%s  put %p, get %p,  buf %p,  end %p", s, mPut, mGet, mBuffer, mEnd);
+    LOGV("%s  put %p, get %p,  buf %p,  end %p", s, mPut, mGet, mBuffer, mEnd);
 }
 
 LocklessCommandFifo::Signal::Signal()
diff --git a/rsObjectBase.cpp b/rsObjectBase.cpp
index 6842c37..3219c39 100644
--- a/rsObjectBase.cpp
+++ b/rsObjectBase.cpp
@@ -33,14 +33,14 @@
 void ObjectBase::incRef() const
 {
     mRefCount ++;
-    //LOGE("ObjectBase %p inc ref %i", this, mRefCount);
+    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
 }
 
 void ObjectBase::decRef() const
 {
     rsAssert(mRefCount > 0);
     mRefCount --;
-    //LOGE("ObjectBase %p dec ref %i", this, mRefCount);
+    //LOGV("ObjectBase %p dec ref %i", this, mRefCount);
     if (!mRefCount) {
         delete this;
     }
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index f9eb1b2..f2e7095 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -171,8 +171,6 @@
 {
     ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
     pf->bindTexture(slot, static_cast<Allocation *>(a));
-
-    //LOGE("%p %p", pf, rsc->getFragment());
     if (pf == rsc->getFragment()) {
         pf->setupGL();
     }
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index ec66662..4089507 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -36,11 +36,11 @@
 
 static void logMatrix(const char *txt, const float *f)
 {
-    LOGE("Matrix %s, %p", txt, f);
-    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[0], f[4], f[8], f[12]);
-    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[1], f[5], f[9], f[13]);
-    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[2], f[6], f[10], f[14]);
-    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[3], f[7], f[11], f[15]);
+    LOGV("Matrix %s, %p", txt, f);
+    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[0], f[4], f[8], f[12]);
+    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[1], f[5], f[9], f[13]);
+    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[2], f[6], f[10], f[14]);
+    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[3], f[7], f[11], f[15]);
 }
 
 void ProgramVertex::setupGL()
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index 27c13bd..522ed00 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -472,14 +472,10 @@
         accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
 
         for (int ct=0; ct < pragmaCount; ct+=2) {
-            LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
-
             if (!strcmp(str[ct], "version")) {
                 continue;
-
             }
 
-
             if (!strcmp(str[ct], "stateVertex")) {
                 if (!strcmp(str[ct+1], "default")) {
                     continue;
diff --git a/rsThreadIO.cpp b/rsThreadIO.cpp
index 5f62ad1..89df59d 100644
--- a/rsThreadIO.cpp
+++ b/rsThreadIO.cpp
@@ -34,22 +34,17 @@
 
 bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand)
 {
-    //LOGE("playCoreCommands 1");
     uint32_t cmdID = 0;
     uint32_t cmdSize = 0;
     bool ret = false;
     while(!mToCore.isEmpty() || waitForCommand) {
         ret = true;
-        //LOGE("playCoreCommands 2");
         const void * data = mToCore.get(&cmdID, &cmdSize);
         waitForCommand = false;
-        //LOGE("playCoreCommands 3 %i %i", cmdID, cmdSize);
+        //LOGV("playCoreCommands 3 %i %i", cmdID, cmdSize);
 
         gPlaybackFuncs[cmdID](con, data);
-        //LOGE("playCoreCommands 4");
-
         mToCore.next();
-        //LOGE("playCoreCommands 5");
     }
     return ret;
 }
diff --git a/rsTriangleMesh.cpp b/rsTriangleMesh.cpp
index f26b765..8c7bc92 100644
--- a/rsTriangleMesh.cpp
+++ b/rsTriangleMesh.cpp
@@ -120,7 +120,7 @@
             mSizeTex = 2;
         }
     }
-    LOGE("TriangleMesh %i,%i  %i,%i  %i,%i", mSizeCoord, mOffsetCoord, mSizeNorm, mOffsetNorm, mSizeTex, mOffsetTex);
+    LOGV("TriangleMesh %i,%i  %i,%i  %i,%i", mSizeCoord, mOffsetCoord, mSizeNorm, mOffsetNorm, mSizeTex, mOffsetTex);
 
 }
 
@@ -130,7 +130,6 @@
 
 void rsi_TriangleMeshBegin(Context *rsc, RsElement vertex, RsElement index)
 {
-    //LOGE("tmb  %p %p", vertex, index);
     TriangleMeshContext *tmc = &rsc->mStateTriangleMesh;
 
     tmc->clear();
@@ -139,8 +138,6 @@
     tmc->mIndexElement = static_cast<Element *>(index);
     tmc->mIndexSizeBits = tmc->mIndexElement->getSizeBits();
 
-    //LOGE("Element sizes  %i  %i", tmc->mVertexSizeBits, tmc->mIndexSizeBits);
-
     assert(!(tmc->mVertexSizeBits & 0x7));
     assert(!(tmc->mIndexSizeBits & 0x7));
 }
@@ -198,8 +195,6 @@
         return 0;
     }
 
-    LOGE("Create mesh, triangleCount %i", tm->mTriangleCount);
-
     memcpy(tm->mVertexData, tmc->mVertexData.array(), tm->mVertexDataSize);
     memcpy(tm->mIndexData, tmc->mIndexData.array(), tm->mIndexDataSize);
     tm->analyzeElement();
@@ -225,8 +220,6 @@
 
     rsc->setupCheck();
 
-    //LOGE("1  %p   ", vtm);
-    //LOGE("1.1  %p   %p", tm->mVertexData,  tm->mIndexData);
     if (!tm->mBufferObjects[0]) {
         glGenBuffers(2, &tm->mBufferObjects[0]);
 
@@ -239,7 +232,6 @@
         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
     }
 
-    //LOGE("1.2");
     if (first >= tm->mTriangleCount) {
         return;
     }
@@ -252,7 +244,6 @@
 
     const float *f = (const float *)tm->mVertexData;
 
-    //LOGE("2");
     glBindBuffer(GL_ARRAY_BUFFER, tm->mBufferObjects[0]);
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
 
@@ -283,8 +274,6 @@
 
     glDrawElements(GL_TRIANGLES, count * 3, GL_UNSIGNED_SHORT, (GLvoid *)(first * 3 * 2));
 
-    //LOGE("4");
-
     glBindBuffer(GL_ARRAY_BUFFER, 0);
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 }
diff --git a/rsType.cpp b/rsType.cpp
index 5bb4d60..bbe9720 100644
--- a/rsType.cpp
+++ b/rsType.cpp
@@ -63,7 +63,6 @@
 
 void Type::compute()
 {
-    //LOGE("compute");
     uint32_t oldLODCount = mLODCount;
     if (mDimLOD) {
         uint32_t l2x = rsFindHighBit(mDimX) + 1;
@@ -80,9 +79,6 @@
         mLODs = new LOD[mLODCount];
     }
 
-    //LOGE("xyz %i %i %i", mDimX, mDimY, mDimZ);
-    //LOGE("mips %i", mLODCount);
-    //LOGE("e size %i", mElement->getSizeBytes());
     uint32_t tx = mDimX;
     uint32_t ty = mDimY;
     uint32_t tz = mDimZ;
@@ -92,15 +88,12 @@
         mLODs[lod].mY = ty;
         mLODs[lod].mZ = tz;
         mLODs[lod].mOffset = offset;
-        //LOGE("txyz %i %i %i", tx, ty, tz);
         offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
         tx = (tx + 1) >> 1;
         ty = (ty + 1) >> 1;
         tz = (tz + 1) >> 1;
     }
 
-    //LOGE("size %i", offset);
-
     // At this point the offset is the size of a mipmap chain;
     mMipChainSizeBytes = offset;
 
diff --git a/rsUtils.h b/rsUtils.h
index 0a31097..3d3437b 100644
--- a/rsUtils.h
+++ b/rsUtils.h
@@ -17,14 +17,15 @@
 #ifndef ANDROID_RS_UTILS_H
 #define ANDROID_RS_UTILS_H
 
-#include "RenderScript.h"
-
+#define LOG_NDEBUG 0 
 #define LOG_TAG "rs"
 #include <utils/Log.h>
 #include <utils/Vector.h>
 #include <stdlib.h>
 #include <pthread.h>
 
+#include "RenderScript.h"
+
 namespace android {
 namespace renderscript {
 
