diff --git a/src/aparapi/com.amd.aparapi/dist/aparapi.jar b/src/aparapi/com.amd.aparapi/dist/aparapi.jar
index 0be74ef231d313a2b694f0ca651bdb8c5caf6e2b..44f2c68a53dacfb08499ef538b1d34bd10381558 100644
Binary files a/src/aparapi/com.amd.aparapi/dist/aparapi.jar and b/src/aparapi/com.amd.aparapi/dist/aparapi.jar differ
diff --git a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/Kernel.java b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/Kernel.java
index 2d11bcce22f037ca2f3653ff72d0588de4303590..81da69de464585bb5387170d8e32b21d33412d17 100644
--- a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/Kernel.java
+++ b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/Kernel.java
@@ -994,7 +994,23 @@ public abstract class Kernel implements Cloneable {
       }
    }
 
+   
    /**
+    * Init a kernel from an existing one. used in caching mechanisems to improve startup time (ex. SparkCL). 
+    *  
+    */
+   public void init(Kernel kernel) {
+
+	 // create and init a copy of the kernel runner
+	 kernelRunner = new KernelRunner(this);
+         if(kernel.kernelRunner!=null)
+	   kernelRunner.init(kernel.kernelRunner);
+         // We need to be careful to also clone the KernelState
+         kernelState = new KernelState(kernel.kernelState); // Qualified copy constructor
+   }
+
+
+/**
     * Delegates to either {@link java.lang.Math#acos(double)} (Java) or <code><a href="http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/acos.html">acos(float)</a></code> (OpenCL).
      * 
      * User should note the differences in precision between Java and OpenCL's implementation of arithmetic functions to determine whether the difference in precision is acceptable.
diff --git a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/KernelRunnerJNI.java b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/KernelRunnerJNI.java
index da60ff634120a890eeeebf3a6315e69de3c7e395..b8039bd8632316e3f0f2bee26f89e30fb9efca82 100644
--- a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/KernelRunnerJNI.java
+++ b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/KernelRunnerJNI.java
@@ -310,6 +310,8 @@ public abstract class KernelRunnerJNI{
 
    //protected native long buildProgramJNI(long _jniContextHandle, String _source);
    // !!! oren change -> add binary option to build
+   // !!! oren change -> add synchronized
+   // protected native synchronized long buildProgramJNI(long _jniContextHandle, String _source, int _buildFlags);
    protected native long buildProgramJNI(long _jniContextHandle, String _source, int _buildFlags);
 
    protected native int setArgsJNI(long _jniContextHandle, KernelArgJNI[] _args, int argc);
diff --git a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
index c8578a9bc6ccaac8631a2e36cb2fbec19826b29c..4ecec0d710b1c56ed6591ea5b210903c4bb27495 100644
--- a/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
+++ b/src/aparapi/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
@@ -110,7 +110,21 @@ public class KernelRunner extends KernelRunnerJNI{
       kernel = _kernel;
    }
 
-   /**
+   public void init(KernelRunner kernelRunner) 
+   {
+	//this = super.clone();
+	jniContextHandle = kernelRunner.jniContextHandle;
+	entryPoint = kernelRunner.entryPoint;
+	argc = kernelRunner.argc;
+        args = kernelRunner.args;
+        //puts = kernelRunner.puts;
+	capabilitiesSet = kernelRunner.capabilitiesSet;
+        accumulatedExecutionTime = kernelRunner.accumulatedExecutionTime;
+	conversionTime = kernelRunner.conversionTime;
+	executionTime = kernelRunner.executionTime;
+   }
+
+/**
     * <code>Kernel.dispose()</code> delegates to <code>KernelRunner.dispose()</code> which delegates to <code>disposeJNI()</code> to actually close JNI data structures.<br/>
     * 
     * @see KernelRunner#disposeJNI()
@@ -1021,8 +1035,12 @@ public class KernelRunner extends KernelRunnerJNI{
                   }
 
                   String openCL = null;
-                  try {
-                     openCL = KernelWriter.writeToString(entryPoint);
+                  try {
+                     // !!! oren change -> kernel writer is not thread safe!
+                     // TODO: check if it makes sense to change this
+                     synchronized (Kernel.class) {
+                     openCL = KernelWriter.writeToString(entryPoint);
+                     }
                   } catch (final CodeGenException codeGenException) {
                      return warnFallBackAndExecute(_entrypointName, _range, _passes, codeGenException);
                   }
@@ -1050,10 +1068,15 @@ public class KernelRunner extends KernelRunnerJNI{
                   // !!! oren change -> support flow types
                   // set flow type
                   int buildFlags = kernel.getFlowType().getValue();
-                  // Send the string to OpenCL to compile it
-                  if (buildProgramJNI(jniContextHandle, openCL,buildFlags) == 0) {
+                  // Send the string to OpenCL to compile it
+                  // !!! oren change -> in a parallel device for singel kernel environment buildProgramJNI can fail
+                  // TODO: improve sync to be more fine grained later - reuse kernel elements better etc.
+                  //synchronized (Kernel.class)
+                  //{
+                    if (buildProgramJNI(jniContextHandle, openCL,buildFlags) == 0) {
                      return warnFallBackAndExecute(_entrypointName, _range, _passes, "OpenCL compile failed");
-                  }
+                    }
+                  //}
 
                   args = new KernelArg[entryPoint.getReferencedFields().size()];
                   int i = 0;
diff --git a/src/aparapi/samples/add/src/com/amd/aparapi/sample/add/MainSelectPlatform.java b/src/aparapi/samples/add/src/com/amd/aparapi/sample/add/MainSelectPlatform.java
index 053483ef860404f82a66a9874f93dd513f6123d7..243a26713fa3f19bfab252922fc970d524995ae0 100644
--- a/src/aparapi/samples/add/src/com/amd/aparapi/sample/add/MainSelectPlatform.java
+++ b/src/aparapi/samples/add/src/com/amd/aparapi/sample/add/MainSelectPlatform.java
@@ -227,6 +227,9 @@ public class MainSelectPlatform {
       Device device = Device.getDevice(platformHint,deviceType,deviceId);
       kernel.execute(Range.create(device,512,16)); 
       System.out.printf("****************\n");
+      
+      // test new range functionality
+      Range.create(device,Range.create(512,16));