diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
index 7e499fa7255273af374c207a1ddfa7ef5a78e5bc..0951f3eef7a6d31fbff1bbf5146511fe776eea24 100644
--- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
+++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
@@ -253,9 +253,12 @@ void getArg(JNIEnv *jenv, cl_context context, cl_command_queue commandQueue, cl_
 JNI_JAVA(jobject, OpenCLJNI, getProfileInfo)
    (JNIEnv *jenv, jobject jobj, jobject programInstance) {
    jobject returnList = JNIHelper::createInstance(jenv, ArrayListClass, VoidReturn );
-   for (int i=0; i< 5; i++){
-      jobject writeProfileInfo = NULL;
-      JNIHelper::callVoid(jenv, returnList, "add", ArgsBooleanReturn(ObjectClassArg), writeProfileInfo);
+   ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance);
+   if (profileInfoArr != NULL){
+      for (int i=0; profileInfoArr[i] != NULL; i++){
+         jobject writeProfileInfo = profileInfoArr[i]->createProfileInfoInstance(jenv);
+        JNIHelper::callVoid(jenv, returnList, "add", ArgsBooleanReturn(ObjectClassArg), writeProfileInfo);  
+      }
    }
    return(returnList);
 }
@@ -269,6 +272,14 @@ JNI_JAVA(void, OpenCLJNI, disposeProgram)
       clReleaseCommandQueue(commandQueue);
       cl_context context = OpenCLProgram::getContext(jenv, programInstance);
       clReleaseContext(context);
+   ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance);
+   if (profileInfoArr != NULL){
+      for (int i=0; profileInfoArr[i] != NULL; i++){
+          //fprintf(stdout, "removed prev profile %d\n", i);
+          delete profileInfoArr[i];
+      }
+      delete[] profileInfoArr;
+   }
 }
 
 JNI_JAVA(void, OpenCLJNI, disposeKernel)
@@ -300,6 +311,8 @@ JNI_JAVA(void, OpenCLJNI, disposeKernel)
       clReleaseKernel(kernel);
    }
 
+extern cl_int profile(ProfileInfo *profileInfo, cl_event *event, jint type, char* name, cl_ulong profileBaseTime );
+
 /**
  */
 JNI_JAVA(void, OpenCLJNI, invoke)
@@ -379,9 +392,31 @@ JNI_JAVA(void, OpenCLJNI, invoke)
          getArg(jenv, context, commandQueue, events, &eventc, argIndex, argDef, arg);
       }
       status = clWaitForEvents(eventc, events);
+      ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance);
+      if (profileInfoArr != NULL){
+         for (int i=0; profileInfoArr[i] != NULL; i++){
+              //fprintf(stdout, "removed prev profile %d\n", i);
+              delete profileInfoArr[i];
+         }
+         //fprintf(stdout, "removed prev profile list\n");
+         delete[] profileInfoArr;
+      }else{
+         //fprintf(stdout, "prev profile list was NULL\n");
+      }
+      profileInfoArr = NULL;
+  
+      profileInfoArr = new ProfileInfo*[eventc+1]; // add NULL to end!
+      //fprintf(stdout, "allocated a new list %d\n", eventc+1);
       for (int i=0;i<eventc; i++){
+        profileInfoArr[i] = new ProfileInfo();
+        //fprintf(stdout, "allocated a new ProfileInfo for %d\n", i);
+        int type = (i>(writes+1))?2:((i>writes)?1:0);
+        profile(profileInfoArr[i], &events[i], type, "unknown", 0L);
+        //fprintf(stdout, "type = %d\n", type);
         clReleaseEvent(events[i]);
       }
+      profileInfoArr[eventc]=NULL;
+      OpenCLProgram::setProfileInfo(jenv, programInstance, profileInfoArr);
       if (status != CL_SUCCESS) {
          fprintf(stderr, "error waiting for events !\n");
       }
diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h
index e0928d6fd7536e5d5777245e0afa947bb25ff347..35a5ccaf2e2472611d4118c81deaa85e0860c2f7 100644
--- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h
+++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h
@@ -3,6 +3,7 @@
 #define OPEN_CL_PROGRAM_H
 
 #include "JNIHelper.h"
+#include "ProfileInfo.h"
 
 class OpenCLProgram{
    public:
@@ -21,6 +22,12 @@ class OpenCLProgram{
       static cl_program getProgram(JNIEnv *jenv, jobject programInstance){
          return((cl_program) JNIHelper::getInstanceField<jlong>(jenv, programInstance, "programId")); 
       }
+      static ProfileInfo** getProfileInfo(JNIEnv *jenv, jobject programInstance){
+         return((ProfileInfo**) JNIHelper::getInstanceField<jlong>(jenv, programInstance, "profileInfo")); 
+      }
+      static void setProfileInfo(JNIEnv *jenv, jobject programInstance, ProfileInfo **profileInfo){
+         JNIHelper::setInstanceField<jlong>(jenv, programInstance, "profileInfo", (jlong)profileInfo); 
+      }
       static cl_command_queue getCommandQueue(JNIEnv *jenv, jobject programInstance){
          return((cl_command_queue)JNIHelper::getInstanceField<jlong>(jenv, programInstance, "queueId"));
       }
diff --git a/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp b/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp
index 2a5172789d8d8352434b3f4bee555109ab572112..11c77eae9fc335731dfd50c05e10af5159a9fda5 100644
--- a/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp
+++ b/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp
@@ -58,3 +58,4 @@ jobject ProfileInfo::createProfileInfoInstance(JNIEnv *jenv){
          ((jlong)submit));
    return(profileInstance);
 }
+
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
index 4ec4cbcfaa81691f510bd996542346c3b3bb83a0..588960586aec5e585d3bcfa9e6f54f8b5e10ce99 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
@@ -182,10 +182,6 @@ public class OpenCLDevice extends Device{
             } else if (method.getName().equals("end")) {
                System.out.println("end not implemented");
             }  else if (method.getName().equals("getProfileInfo")){
-                  //  public List<ProfileInfo> getProfileInfo() {
-                  //  return (kernelRunner.getProfileInfo());
-                  // }
-               System.out.println("get profile info");
                proxy = (Object)program.getProfileInfo();
             }
          }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
index 91ecff5c7976c50eec64bcc5836bf7c5d2c56192..05e9795563738796a6679fe39506c663be9f5e87 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
@@ -16,6 +16,8 @@ public class OpenCLProgram extends OpenCLJNI{
 
    private final long contextId;
 
+   private final long profileInfo = 0L;
+
    private final OpenCLDevice device;
 
    private final String source;
diff --git a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
index 9c6f2a608b9d9d77ee75ecfc6e104c1f03b7b588..e2b2aa4814ec8baf558f6a24fa92e8c54cc3c9cf 100644
--- a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
+++ b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
@@ -73,12 +73,15 @@ public class SquareExample{
          for (int i = 0; i < size; i++) {
             System.out.println(l+" "+ in[i] + " " + squares[i] + " " + quads[i]);
          }
-         List<ProfileInfo> profileInfo  =squarer.getProfileInfo();
-            for (ProfileInfo pi:profileInfo){
-               System.out.println("whooo");
-            }
+         final List<ProfileInfo> profileInfo = squarer.getProfileInfo();
+         if ((profileInfo != null) && (profileInfo.size() > 0)) {
+             for (final ProfileInfo p : profileInfo) {
+                 System.out.print(" " + p.getType() + " " + p.getLabel() + " " + (p.getStart() / 1000) + " .. "
+                 + (p.getEnd() / 1000) + " " + ((p.getEnd() - p.getStart()) / 1000) + "us");
+                 System.out.println();
+             }
+         }
          squarer.dispose();
-
          }
       }
    }