diff --git a/RenderScript.h b/RenderScript.h
index 6636fef..3406287 100644
--- a/RenderScript.h
+++ b/RenderScript.h
@@ -63,7 +63,6 @@
 RsContext rsContextCreate(RsDevice, uint32_t version);
 RsContext rsContextCreateGL(RsDevice, uint32_t version, bool useDepth);
 void rsContextDestroy(RsContext);
-void rsObjDestroyOOB(RsContext, void *);
 
 uint32_t rsContextGetMessage(RsContext, void *data, size_t *receiveLen, size_t bufferLen, bool wait);
 void rsContextInitToClient(RsContext);
diff --git a/rsContext.cpp b/rsContext.cpp
index 2a94651..1a7c5ad 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -340,9 +340,6 @@
              rsc->timerPrint();
              rsc->timerReset();
          }
-         if (rsc->mObjDestroy.mNeedToEmpty) {
-             rsc->objDestroyOOBRun();
-         }
          if (rsc->mThreadPriority > 0 && targetTime) {
              int32_t t = (targetTime - (int32_t)(rsc->mTimeMSLastScript + rsc->mTimeMSLastSwap)) * 1000;
              if (t > 0) {
@@ -367,9 +364,6 @@
      }
      ObjectBase::zeroAllUserRef(rsc);
 
-     rsc->mObjDestroy.mNeedToEmpty = true;
-     rsc->objDestroyOOBRun();
-
      if (rsc->mIsGraphicsContext) {
          pthread_mutex_lock(&gInitMutex);
          rsc->deinitEGL();
@@ -488,7 +482,6 @@
 
     mWndSurface = NULL;
 
-    objDestroyOOBInit();
     timerInit();
     timerSet(RS_TIMER_INTERNAL);
 
@@ -534,8 +527,6 @@
 
     mIO.shutdown();
     int status = pthread_join(mThreadId, &res);
-    mObjDestroy.mNeedToEmpty = true;
-    objDestroyOOBRun();
 
     // Global structure cleanup.
     pthread_mutex_lock(&gInitMutex);
@@ -548,8 +539,6 @@
         mDev = NULL;
     }
     pthread_mutex_unlock(&gInitMutex);
-
-    objDestroyOOBDestroy();
 }
 
 void Context::setSurface(uint32_t w, uint32_t h, ANativeWindow *sur)
@@ -721,49 +710,6 @@
     }
 }
 
-bool Context::objDestroyOOBInit()
-{
-    if (!mObjDestroy.mMutex.init()) {
-        LOGE("Context::ObjDestroyOOBInit mutex init failure");
-        return false;
-    }
-    return true;
-}
-
-void Context::objDestroyOOBRun()
-{
-    if (mObjDestroy.mNeedToEmpty) {
-        if (!mObjDestroy.mMutex.lock()) {
-            LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun.");
-            return;
-        }
-
-        for (size_t ct = 0; ct < mObjDestroy.mDestroyList.size(); ct++) {
-            mObjDestroy.mDestroyList[ct]->decUserRef();
-        }
-        mObjDestroy.mDestroyList.clear();
-        mObjDestroy.mNeedToEmpty = false;
-        mObjDestroy.mMutex.unlock();
-    }
-}
-
-void Context::objDestroyOOBDestroy()
-{
-    rsAssert(!mObjDestroy.mNeedToEmpty);
-}
-
-void Context::objDestroyAdd(ObjectBase *obj)
-{
-    if (!mObjDestroy.mMutex.lock()) {
-        LOGE("Context::ObjDestroyOOBRun: error locking for OOBRun.");
-        return;
-    }
-
-    mObjDestroy.mNeedToEmpty = true;
-    mObjDestroy.mDestroyList.add(obj);
-    mObjDestroy.mMutex.unlock();
-}
-
 uint32_t Context::getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait)
 {
     //LOGE("getMessageToClient %i %i", bufferLen, wait);
@@ -1003,12 +949,6 @@
     delete rsc;
 }
 
-void rsObjDestroyOOB(RsContext vrsc, void *obj)
-{
-    Context * rsc = static_cast<Context *>(vrsc);
-    rsc->objDestroyAdd(static_cast<ObjectBase *>(obj));
-}
-
 uint32_t rsContextGetMessage(RsContext vrsc, void *data, size_t *receiveLen, size_t bufferLen, bool wait)
 {
     Context * rsc = static_cast<Context *>(vrsc);
diff --git a/rsContext.h b/rsContext.h
index 2da3ab5..6d1a41d 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -137,7 +137,6 @@
 
 
     ThreadIO mIO;
-    void objDestroyAdd(ObjectBase *);
 
     // Timers
     enum Timers {
@@ -248,16 +247,6 @@
     ObjectBaseRef<ProgramRaster> mRaster;
     ObjectBaseRef<Font> mFont;
 
-    struct ObjDestroyOOB {
-        Mutex mMutex;
-        Vector<ObjectBase *> mDestroyList;
-        bool mNeedToEmpty;
-    };
-    ObjDestroyOOB mObjDestroy;
-    bool objDestroyOOBInit();
-    void objDestroyOOBRun();
-    void objDestroyOOBDestroy();
-
     void displayDebugStats();
 
 private:
