diff --git a/libs/rs/java/RenderScript/android/renderscript/RSSurfaceView.java b/libs/rs/java/RenderScript/android/renderscript/RSSurfaceView.java
index 3d37c13..3835793 100644
--- a/libs/rs/java/RenderScript/android/renderscript/RSSurfaceView.java
+++ b/libs/rs/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/libs/rs/java/RenderScript/android/renderscript/RenderScript.java b/libs/rs/java/RenderScript/android/renderscript/RenderScript.java
index bf381af..a9db15f 100644
--- a/libs/rs/java/RenderScript/android/renderscript/RenderScript.java
+++ b/libs/rs/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/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp
index 5ac1f3a..5b33dd3 100644
--- a/libs/rs/jni/RenderScript_jni.cpp
+++ b/libs/rs/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/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index dab3299..bc14eac 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/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/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 0f78df4..c731db0 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/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/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 26d665b..d98bfd9 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -116,9 +116,6 @@
     bool mRunning;
     bool mExit;
 
-    LocklessCommandFifo mServerCommands;
-    LocklessCommandFifo mServerReturns;
-
     pthread_t mThreadId;
 
     ObjectBaseRef<Script> mRootScript;
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 5a44f47..069a128 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -410,8 +410,6 @@
 
     rsc->mStateElement.mComponentBuildList.clear();
     se->incRef();
-
-    LOGE("Create %p", se);
     return se;
 }
 
diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp
index fae92e5..c3fee54 100644
--- a/libs/rs/rsLocklessFifo.cpp
+++ b/libs/rs/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/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp
index 6842c37..3219c39 100644
--- a/libs/rs/rsObjectBase.cpp
+++ b/libs/rs/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/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index f9eb1b2..f2e7095 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/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/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
index ec66662..4089507 100644
--- a/libs/rs/rsProgramVertex.cpp
+++ b/libs/rs/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/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 27c13bd..522ed00 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/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/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
index 5f62ad1..89df59d 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/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/libs/rs/rsTriangleMesh.cpp b/libs/rs/rsTriangleMesh.cpp
index f26b765..8c7bc92 100644
--- a/libs/rs/rsTriangleMesh.cpp
+++ b/libs/rs/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/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index 5bb4d60..bbe9720 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/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/libs/rs/rsUtils.h b/libs/rs/rsUtils.h
index 0a31097..3d3437b 100644
--- a/libs/rs/rsUtils.h
+++ b/libs/rs/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 {
 
