diff --git a/src/cpp/runKernel/Aparapi.cpp b/src/cpp/runKernel/Aparapi.cpp
index 02d967620ae5982dc488becd453553f145b97908..807bf81e437612ae98e6158282c4b1e34c488c34 100644
--- a/src/cpp/runKernel/Aparapi.cpp
+++ b/src/cpp/runKernel/Aparapi.cpp
@@ -284,39 +284,8 @@ jint updateNonPrimitiveReferences(JNIEnv *jenv, jobject jobj, JNIContext* jniCon
                if (config->isVerbose()){
                   fprintf(stderr, "Resync javaArray for %s: %p  %p\n", arg->name, newRef, arg->arrayBuffer->javaArray);
                }
-               // Free previous ref if any
-               if (arg->arrayBuffer->javaArray != NULL) {
-                  jenv->DeleteWeakGlobalRef((jweak) arg->arrayBuffer->javaArray);
-                  if (config->isVerbose()){
-                     fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, arg->arrayBuffer->javaArray);
-                  }
-               }
-
-               // need to free opencl buffers, run will reallocate later
-               if (arg->arrayBuffer->mem != 0) {
-                  //fprintf(stderr, "-->releaseMemObject[%d]\n", i);
-                  if (config->isTrackingOpenCLResources()){
-                     memList.remove(arg->arrayBuffer->mem,__LINE__, __FILE__);
-                  }
-                  status = clReleaseMemObject((cl_mem)arg->arrayBuffer->mem);
-                  //fprintf(stderr, "<--releaseMemObject[%d]\n", i);
-                  if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()");
-                  arg->arrayBuffer->mem = (cl_mem)0;
-               }
-
-               arg->arrayBuffer->addr = NULL;
-
-               // Capture new array ref from the kernel arg object
-
-               if (newRef != NULL) {
-                  arg->arrayBuffer->javaArray = (jarray)jenv->NewWeakGlobalRef((jarray)newRef);
-                  if (config->isVerbose()){
-                     fprintf(stderr, "NewWeakGlobalRef for %s, set to %p\n", arg->name,
-                           arg->arrayBuffer->javaArray);
-                  }
-               } else {
-                  arg->arrayBuffer->javaArray = NULL;
-               }
+               // Free previous ref if any and allocate new
+               arg->arrayBuffer->replaceJavaArray(jenv, arg, newRef);
 
                // Save the lengthInBytes which was set on the java side
                int lengthInBytes = arg->getSizeInBytes(jenv);
@@ -413,7 +382,6 @@ void updateArray(JNIEnv* jenv, JNIContext* jniContext, KernelArg* arg, int& argP
 }
 
 void updateBuffer(JNIEnv* jenv, JNIContext* jniContext, KernelArg* arg, int& argPos, int argIdx) {
-
    AparapiBuffer* buffer = arg->aparapiBuffer;
    cl_int status = CL_SUCCESS;
    cl_uint mask = 0;
diff --git a/src/cpp/runKernel/ArrayBuffer.cpp b/src/cpp/runKernel/ArrayBuffer.cpp
index 42300d57d78ee2e7bee54a05913b7f5ca9ec4420..55be9ebc517d3a43f2d06b02e43c15ef2afef9f1 100644
--- a/src/cpp/runKernel/ArrayBuffer.cpp
+++ b/src/cpp/runKernel/ArrayBuffer.cpp
@@ -53,6 +53,8 @@
 #define ARRAYBUFFER_SOURCE
 #include "ArrayBuffer.h"
 #include "KernelArg.h"
+#include "List.h"
+
 
 ArrayBuffer::ArrayBuffer():
    javaArray((jobject) 0),
@@ -86,5 +88,67 @@ void ArrayBuffer::getMinimalParams(JNIEnv *jenv, KernelArg *arg, cl_uint& arrayE
 
 void ArrayBuffer::syncMinimalParams(JNIEnv *jenv, KernelArg *arg) {
     length = JNIHelper::getInstanceField<jint>(jenv, arg->javaArg, "numElements", IntArg);
-	lengthInBytes = jenv->GetIntField(arg->javaArg, KernelArg::getSizeInBytesFieldID());
+    lengthInBytes = jenv->GetIntField(arg->javaArg, KernelArg::getSizeInBytesFieldID());
+}
+
+void ArrayBuffer::replaceJavaArray(JNIEnv *jenv, KernelArg *arg, jarray newRef) {
+   cl_int status = CL_SUCCESS;
+    if (javaArray != NULL) {
+        jenv->DeleteWeakGlobalRef((jweak) javaArray);
+        if (config->isVerbose()){
+             fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, javaArray);
+        }
+        javaArray = 0;
+    }
+
+    // need to free opencl buffers, run will reallocate later
+    if (mem != 0) {
+        //fprintf(stderr, "-->releaseMemObject[%d]\n", i);
+        if (config->isTrackingOpenCLResources()){
+            memList.remove(mem,__LINE__, __FILE__);
+        }
+        status = clReleaseMemObject((cl_mem)mem);
+        //fprintf(stderr, "<--releaseMemObject[%d]\n", i);
+        if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()");
+        mem = (cl_mem)0;
+     }
+
+     addr = 0;
+
+     // Capture new array ref from the kernel arg object
+     if (newRef != 0) {
+         javaArray = (jarray)jenv->NewWeakGlobalRef((jarray)newRef);
+         if (config->isVerbose()){
+             fprintf(stderr, "NewWeakGlobalRef for %s, set to %p\n", arg->name,
+                 javaArray);
+         }
+    } else {
+        javaArray = 0;
+    }
+}
+
+
+void ArrayBuffer::deleteJavaArray(JNIEnv *jenv, KernelArg *arg) {
+   cl_int status = CL_SUCCESS;
+    if (javaArray != NULL) {
+        jenv->DeleteWeakGlobalRef((jweak) ArrayBuffer::javaArray);
+        if (config->isVerbose()){
+             fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, ArrayBuffer::javaArray);
+        }
+        javaArray = 0;
+    }
+
+    // need to free opencl buffers, run will reallocate later
+    if (mem != 0) {
+        //fprintf(stderr, "-->releaseMemObject[%d]\n", i);
+        if (config->isTrackingOpenCLResources()){
+            memList.remove(mem,__LINE__, __FILE__);
+        }
+        status = clReleaseMemObject((cl_mem)mem);
+        //fprintf(stderr, "<--releaseMemObject[%d]\n", i);
+        if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()");
+        mem = (cl_mem)0;
+     }
+
+     addr = 0;
 }
diff --git a/src/cpp/runKernel/ArrayBuffer.h b/src/cpp/runKernel/ArrayBuffer.h
index 26cdbe567c1ace9ba48c7ada1017237e871ef21f..1be98a07d4f59ea0d90df9303735d6effba5d200 100644
--- a/src/cpp/runKernel/ArrayBuffer.h
+++ b/src/cpp/runKernel/ArrayBuffer.h
@@ -78,6 +78,8 @@ class ArrayBuffer{
       void pin(JNIEnv *jenv);
       void getMinimalParams(JNIEnv *jenv, KernelArg *arg, cl_uint& arrayElements, int &sizeInBytes);
       void syncMinimalParams(JNIEnv *jenv, KernelArg *arg);
+      void replaceJavaArray(JNIEnv *jenv, KernelArg *arg, jarray newRef);
+      void deleteJavaArray(JNIEnv *jenv, KernelArg *arg);
 };
 
 #endif // ARRAYBUFFER_H