diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
index dbd05ca1741525447deb3fc1c18ff1443f879975..4c5be21da959823c1b2bfbf961c60dff965c7158 100644
--- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
+++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
@@ -1169,6 +1169,30 @@ inline char* getClassName(JNIEnv* jenv, JNIContext* jniContext, const char *optE
    return classNameStr;
 }
 
+const char *OSPathSeparator =
+#ifdef _WIN32
+                            "\\";
+#else
+                            "/";
+#endif
+
+char *buildFilePath(const char *basePart,const char *filePart)
+{
+    int fullPathLength = strlen(filePart);
+    if(basePart!=NULL)
+    	fullPathLength += strlen(basePart);
+    char *fullPath = new char[fullPathLength + 1];
+    if(basePart!=NULL)
+    {
+      strcpy(fullPath,basePart);
+      // !!! Handle os dependent separator !!!
+      if(fullPath[strlen(fullPath)-1]!=OSPathSeparator[0])
+        strcat(fullPath,OSPathSeparator);
+    }
+    strcat(fullPath,filePart);
+    return fullPath;
+}
+
 void writeProfile(JNIEnv* jenv, JNIContext* jniContext) {
    // compute profile filename
    // indicate cpu or gpu
@@ -1276,6 +1300,10 @@ JNI_JAVA(jlong, KernelRunnerJNI, buildProgramJNI)
 #define BINARY_FILE_EXT ".aocx"
 #endif
 
+// allows defining an alternative folder where bin files should be loaded from
+// Usefull when running in aparapi embeded mode
+#define BINARY_FOLDER_ENV_VAR "APARAPI_CL_BIN_FOLDER"
+
         const char *sourceChars = jenv->GetStringUTFChars(source, NULL);
 
 //#ifdef OUTPUT_OCL_FILE
@@ -1283,9 +1311,14 @@ JNI_JAVA(jlong, KernelRunnerJNI, buildProgramJNI)
 //#endif
 
 #ifdef USE_BINARY_FILE
+        char *binFileFolder = getenv(BINARY_FOLDER_ENV_VAR);
+        fprintf(stderr, "Bin Folder is %s\n",binFileFolder);
         char *binFileName = getClassName(jenv,jniContext,BINARY_FILE_EXT);
-     	jniContext->program = CLHelper::createProgramWithBinary(jenv, jniContext->context,  1, &jniContext->deviceId, binFileName, NULL, &status);
+        char *fullBinFilePath = buildFilePath(binFileFolder,binFileName);
+        fprintf(stderr, "FullBinFilePath is %s\n",fullBinFilePath);
+     	jniContext->program = CLHelper::createProgramWithBinary(jenv, jniContext->context,  1, &jniContext->deviceId, fullBinFilePath, NULL, &status);
      	delete []binFileName;
+     	delete []fullBinFilePath;
 #else
         jniContext->program = CLHelper::createProgramWithSource(jenv, jniContext->context,  1, &jniContext->deviceId, sourceChars, NULL, &status);
 #endif
diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp
index 654bf65893c441b7e0d7704508104c705a443b42..ce1ad9c8bd91b3b6dd94566cc396a99b498b9685 100644
--- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp
+++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp
@@ -49,6 +49,17 @@ ArrayBuffer::ArrayBuffer():
    isPinned(false){
    }
 
+ArrayBuffer::~ArrayBuffer()
+{
+   // !!! oren fix mem leak
+   if(addr!=NULL)
+   {
+     acl_aligned_free(addr);//aclPtr
+ 	 fprintf(stderr, "Deallocated %d bytes at address %x\n",lengthInBytes,(long)addr);
+     //addr = NULL;
+   }
+}
+
 void ArrayBuffer::unpinAbort(JNIEnv *jenv){
    // !!! oren mem test
    //jenv->ReleasePrimitiveArrayCritical((jarray)javaArray, addr,JNI_ABORT);
diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h
index 1bc5aa769f77cce66397438dedb8a535c5850d37..87c9da6a9d3abd7bce26d43ae18a299a158d4291 100644
--- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h
+++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h
@@ -102,6 +102,7 @@ class ArrayBuffer{
       ProfileInfo write;
 
       ArrayBuffer();
+      ~ArrayBuffer();
       void unpinAbort(JNIEnv *jenv);
       void unpinCommit(JNIEnv *jenv);
       void pin(JNIEnv *jenv);