diff --git a/CHANGELOG.md b/CHANGELOG.md
index b2cf89f5d0736b300dca807df9697d1d5e41d169..bd3318fbea34d7987bf7c2671fe318492d3efa47 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,8 @@
 # Aparapi Changelog
 
-## 1.4.2
+## 1.5.0
 
+* Support inline array creation in the kernel, which is implemented in the GPU in private memory.
 * Updated parent pon to v6.
 * createProgram had the wrong signature producing a unsatisfied link exception that is now fixed.
 * Build now requires version 3.5.0 of maven due to changes in surefire plugin.
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 4fee1845570ca68720b771ec88805802d6d81deb..42337edff8cb49c6777857cb72210d38785f4bf2 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -19,6 +19,7 @@
 * Lorenzo Gallucci
 * Fernando Marino`
 * AMD Corporation
+* Dmitriy Shabanov <shabanovd@gmail.com>
 
 # Details
 
@@ -37,3 +38,4 @@ Below are some of the specific details of various contributions.
 * Paul Miner issue #61 and #115 (JTP Speed up and fixes to explicit puts) June 13th 2013
 * lgalluci for his fix for issue #121 (incorrect toString for 3D ranges) July 6th 2013
 * George Vinokhodov submited a fix for a bug regarding forward references.
+* Dmitriy Shabanov submited PR for inline array feature.
diff --git a/pom.xml b/pom.xml
index 8b00264019527e315eb872a8574c55afe59938ff..df61c9265dc3d203482bfee79ec199c3bfe2b36e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
 
     <groupId>com.aparapi</groupId>
     <artifactId>aparapi</artifactId>
-    <version>1.4.2-SNAPSHOT</version>
+    <version>1.5.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <prerequisites>
diff --git a/src/main/java/com/aparapi/Config.java b/src/main/java/com/aparapi/Config.java
index 06f369a82ad7cb040b7e442031b9d43e5358eeef..0986dcfd61b8195d0583b889fd8f6dbce81ec173 100644
--- a/src/main/java/com/aparapi/Config.java
+++ b/src/main/java/com/aparapi/Config.java
@@ -157,6 +157,8 @@ public class Config extends ConfigJNI{
 
    public static final boolean enableMONITOR = Boolean.getBoolean(propPkgName + ".enable.MONITOR");
 
+   public static final boolean enableARRAY = !Boolean.getBoolean(propPkgName + ".disable.ARRAY");
+
    public static final boolean enableNEW = Boolean.getBoolean(propPkgName + ".enable.NEW");
 
    public static final boolean enableATHROW = Boolean.getBoolean(propPkgName + ".enable.ATHROW");
diff --git a/src/main/java/com/aparapi/internal/exception/ClassParseException.java b/src/main/java/com/aparapi/internal/exception/ClassParseException.java
index fcdac3f91a0026be3432880db31cb21592c635ef..39aac1fa0f8308f517e572618137d2f7ddd37bae 100644
--- a/src/main/java/com/aparapi/internal/exception/ClassParseException.java
+++ b/src/main/java/com/aparapi/internal/exception/ClassParseException.java
@@ -74,6 +74,8 @@ import com.aparapi.internal.instruction.Instruction;
       ATHROW("We don't support athrow instructions"), //
       SYNCHRONIZE("We don't support monitorenter or monitorexit instructions"), //
       NEW("We don't support new instructions"), //
+      NEWARRAY("We don't support new array instructions"), //
+      NEWMULTIARRAY("We don't support new multi array instructions"), //
       ARRAYALIAS("We don't support copying refs in kernels"), //
       SWITCH("We don't support lookupswitch or tableswitch instructions"), //
       METHODARRAYARG("We don't support passing arrays as method args"), //
diff --git a/src/main/java/com/aparapi/internal/model/MethodModel.java b/src/main/java/com/aparapi/internal/model/MethodModel.java
index 4a16a8685c01856a09e181de27afca2e49297f7e..1766a13c6dd2e6dbf11241a6fe0f191d00167af4 100644
--- a/src/main/java/com/aparapi/internal/model/MethodModel.java
+++ b/src/main/java/com/aparapi/internal/model/MethodModel.java
@@ -54,6 +54,7 @@ package com.aparapi.internal.model;
 
 import com.aparapi.*;
 import com.aparapi.internal.exception.*;
+import com.aparapi.internal.exception.ClassParseException.TYPE;
 import com.aparapi.internal.instruction.*;
 import com.aparapi.internal.instruction.InstructionPattern.*;
 import com.aparapi.internal.instruction.InstructionSet.*;
@@ -243,12 +244,16 @@ public class MethodModel{
             throw new ClassParseException(instruction, ClassParseException.TYPE.SYNCHRONIZE);
          }
 
-         if ((!Config.enableNEW) && (instruction instanceof New)) {
-            throw new ClassParseException(instruction, ClassParseException.TYPE.NEW);
-         }
-
-         if (instruction instanceof I_AASTORE) {
-            throw new ClassParseException(instruction, ClassParseException.TYPE.ARRAYALIAS);
+         if (instruction instanceof New) {
+             if ((instruction instanceof I_NEWARRAY)) {
+                 if (!Config.enableARRAY) {
+                     throw new ClassParseException(instruction, TYPE.NEWARRAY);
+                 }
+             } else if ((instruction instanceof I_MULTIANEWARRAY)) {
+                 throw new ClassParseException(instruction, ClassParseException.TYPE.NEWMULTIARRAY);
+             } else if (!Config.enableNEW) {
+                 throw new ClassParseException(instruction, ClassParseException.TYPE.NEW);
+             }
          }
 
          if ((!Config.enableSWITCH) && ((instruction instanceof I_LOOKUPSWITCH) || (instruction instanceof I_TABLESWITCH))) {
@@ -444,7 +449,7 @@ public class MethodModel{
          }
 
          _expressionList.add(new CloneInstruction(this, e));
-         System.out.println("clone of " + e);
+         //System.out.println("clone of " + e);
       } else if (_instruction instanceof I_DUP2) {
          Instruction e = _expressionList.getTail();
          while (!e.producesStack()) {
diff --git a/src/main/java/com/aparapi/internal/writer/BlockWriter.java b/src/main/java/com/aparapi/internal/writer/BlockWriter.java
index b43fa98a7320903f6d13741ad9ba1fbc16eb7ba3..0712ffc42d67320e732e9cf89a3668b33d37d3c8 100644
--- a/src/main/java/com/aparapi/internal/writer/BlockWriter.java
+++ b/src/main/java/com/aparapi/internal/writer/BlockWriter.java
@@ -366,14 +366,14 @@ public abstract class BlockWriter{
       }
    }
 
-   public String convertType(String _typeDesc, boolean useClassModel) {
+   public String convertType(String _typeDesc, boolean useClassModel, boolean isLocal) {
       return (_typeDesc);
    }
 
    public String convertCast(String _cast) {
       // Strip parens off cast
       //System.out.println("cast = " + _cast);
-      final String raw = convertType(_cast.substring(1, _cast.length() - 1), false);
+      final String raw = convertType(_cast.substring(1, _cast.length() - 1), false, false);
       return ("(" + raw + ")");
    }
 
@@ -393,24 +393,46 @@ public abstract class BlockWriter{
              write(")");
          }
       } else if (_instruction instanceof CompositeInstruction) {
-         writeComposite((CompositeInstruction) _instruction);
+          writeComposite((CompositeInstruction) _instruction);
+
+      } else if (_instruction instanceof I_NEWARRAY) {
+          if (_instruction.getParentExpr() instanceof Return) {
+              throw new CodeGenException("'newarray' is not allowed after 'return'");
+          }
+
+          for (Instruction operand = _instruction.getFirstChild(); operand != null; operand = operand.getNextExpr()) {
+              write("[");
+              writeInstruction(operand);
+              write("]");
+          }
 
       } else if (_instruction instanceof AssignToLocalVariable) {
          final AssignToLocalVariable assignToLocalVariable = (AssignToLocalVariable) _instruction;
 
          final LocalVariableInfo localVariableInfo = assignToLocalVariable.getLocalVariableInfo();
-         if (assignToLocalVariable.isDeclaration()) {
-            final String descriptor = localVariableInfo.getVariableDescriptor();
-            // Arrays always map to __global arrays
-            if (descriptor.startsWith("[")) {
-               write(" __global ");
-            }
-            write(convertType(descriptor, true));
-         }
-         if (localVariableInfo == null) {
-            throw new CodeGenException("outOfScope" + _instruction.getThisPC() + " = ");
+
+         if ((_instruction.getFirstChild() instanceof I_NEWARRAY)) {
+             if (localVariableInfo == null) {
+                 throw new CodeGenException("outOfScope" + _instruction.getThisPC() + " = ");
+             } else {
+                 final String descriptor = localVariableInfo.getVariableDescriptor();
+                 write(convertType(descriptor, true, true));
+                 write(localVariableInfo.getVariableName());
+             }
          } else {
-            write(localVariableInfo.getVariableName() + " = ");
+             if (assignToLocalVariable.isDeclaration()) {
+                 final String descriptor = localVariableInfo.getVariableDescriptor();
+                 // Arrays always map to __global arrays
+                 if (descriptor.startsWith("[")) {
+                     write(" __global ");
+                 }
+                 write(convertType(descriptor, true, false));
+             }
+             if (localVariableInfo == null) {
+                 throw new CodeGenException("outOfScope" + _instruction.getThisPC() + " = ");
+             } else {
+                 write(localVariableInfo.getVariableName() + " = ");
+             }
          }
 
          for (Instruction operand = _instruction.getFirstChild(); operand != null; operand = operand.getNextExpr()) {
@@ -457,7 +479,7 @@ public abstract class BlockWriter{
                dim++;
             }
 
-            NameAndTypeEntry nameAndTypeEntry = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry();
+            NameAndTypeEntry nameAndTypeEntry = ((AccessField) load).getConstantPoolFieldEntry().getNameAndTypeEntry();
             if (isMultiDimensionalArray(nameAndTypeEntry)) {
                String arrayName = nameAndTypeEntry.getNameUTF8Entry().getUTF8();
                write(" * this->" + arrayName + arrayDimMangleSuffix + dim);
@@ -661,7 +683,7 @@ public abstract class BlockWriter{
 
             final LocalVariableInfo localVariableInfo = alv.getLocalVariableInfo();
             if (alv.isDeclaration()) {
-               write(convertType(localVariableInfo.getVariableDescriptor(), true));
+               write(convertType(localVariableInfo.getVariableDescriptor(), true, false));
             }
             if (localVariableInfo == null) {
                throw new CodeGenException("outOfScope" + _instruction.getThisPC() + " = ");
@@ -678,7 +700,7 @@ public abstract class BlockWriter{
          final LocalVariableInfo localVariableInfo = assignToLocalVariable.getLocalVariableInfo();
          if (assignToLocalVariable.isDeclaration()) {
             // this is bad! we need a general way to hoist up a required declaration
-            throw new CodeGenException("/* we can't declare this " + convertType(localVariableInfo.getVariableDescriptor(), true)
+            throw new CodeGenException("/* we can't declare this " + convertType(localVariableInfo.getVariableDescriptor(), true, false)
                   + " here */");
          }
          write(localVariableInfo.getVariableName());
@@ -766,22 +788,22 @@ public abstract class BlockWriter{
    }
 
    private boolean isMultiDimensionalArray(final AccessArrayElement arrayLoadInstruction) {
-      AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
+       AccessField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
       return isMultiDimensionalArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry());
    }
 
    private boolean isObjectArray(final AccessArrayElement arrayLoadInstruction) {
-      AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
+       AccessField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
       return isObjectArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry());
    }
 
-   private AccessInstanceField getUltimateInstanceFieldAccess(final AccessArrayElement arrayLoadInstruction) {
+   private AccessField getUltimateInstanceFieldAccess(final AccessArrayElement arrayLoadInstruction) {
       Instruction load = arrayLoadInstruction.getArrayRef();
       while (load instanceof I_AALOAD) {
          load = load.getFirstChild();
       }
 
-      return (AccessInstanceField) load;
+      return (AccessField) load;
    }
 
    public void writeMethod(MethodCall _methodCall, MethodEntry _methodEntry) throws CodeGenException {
diff --git a/src/main/java/com/aparapi/internal/writer/KernelWriter.java b/src/main/java/com/aparapi/internal/writer/KernelWriter.java
index 4e5de60917dde89220203a47786a178419b03d4f..8099c5914c30561005116f94b83ab0cebfc41d90 100644
--- a/src/main/java/com/aparapi/internal/writer/KernelWriter.java
+++ b/src/main/java/com/aparapi/internal/writer/KernelWriter.java
@@ -52,6 +52,8 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit
  */
 package com.aparapi.internal.writer;
 
+import static com.aparapi.Kernel.PRIVATE_SUFFIX;
+
 import com.aparapi.*;
 import com.aparapi.internal.exception.*;
 import com.aparapi.internal.instruction.*;
@@ -70,24 +72,40 @@ public abstract class KernelWriter extends BlockWriter{
 
    private final String cvtBooleanArrayToCharStar = "char* ";
 
+   private final String cvtBooleanArrayToChar = "char ";
+
    private final String cvtByteToChar = "char ";
 
    private final String cvtByteArrayToCharStar = "char* ";
 
+   private final String cvtByteArrayToChar = "char ";
+
    private final String cvtCharToShort = "unsigned short ";
 
    private final String cvtCharArrayToShortStar = "unsigned short* ";
 
+   private final String cvtCharArrayToShort = "unsigned short ";
+
    private final String cvtIntArrayToIntStar = "int* ";
 
+   private final String cvtIntArrayToInt = "int ";
+
    private final String cvtFloatArrayToFloatStar = "float* ";
 
+   private final String cvtFloatArrayToFloat = "float ";
+
    private final String cvtDoubleArrayToDoubleStar = "double* ";
 
+   private final String cvtDoubleArrayToDouble = "double ";
+
    private final String cvtLongArrayToLongStar = "long* ";
 
+   private final String cvtLongArrayToLong = "long ";
+
    private final String cvtShortArrayToShortStar = "short* ";
 
+   private final String cvtShortArrayToShort = "short ";
+
    /** When declaring a __private struct pointer field, we always omit the "__private" qualifier. This is because the NVidia OpenCL compiler, at time of writing
     * erroneously complains about explicitly qualifying pointers with __private ("error: field may not be qualified with an address space").
     */
@@ -151,29 +169,29 @@ public abstract class KernelWriter extends BlockWriter{
     *          String in the Java JNI notation, [I, etc
     * @return Suitably converted string, "char*", etc
     */
-   @Override public String convertType(String _typeDesc, boolean useClassModel) {
+   @Override public String convertType(String _typeDesc, boolean useClassModel, boolean isLocal) {
       if (_typeDesc.equals("Z") || _typeDesc.equals("boolean")) {
          return (cvtBooleanToChar);
       } else if (_typeDesc.equals("[Z") || _typeDesc.equals("boolean[]")) {
-         return (cvtBooleanArrayToCharStar);
+         return isLocal ? (cvtBooleanArrayToChar) : (cvtBooleanArrayToCharStar);
       } else if (_typeDesc.equals("B") || _typeDesc.equals("byte")) {
          return (cvtByteToChar);
       } else if (_typeDesc.equals("[B") || _typeDesc.equals("byte[]")) {
-         return (cvtByteArrayToCharStar);
+         return isLocal ? (cvtByteArrayToChar) : (cvtByteArrayToCharStar);
       } else if (_typeDesc.equals("C") || _typeDesc.equals("char")) {
          return (cvtCharToShort);
       } else if (_typeDesc.equals("[C") || _typeDesc.equals("char[]")) {
-         return (cvtCharArrayToShortStar);
+         return isLocal ? (cvtCharArrayToShort) : (cvtCharArrayToShortStar);
       } else if (_typeDesc.equals("[I") || _typeDesc.equals("int[]")) {
-         return (cvtIntArrayToIntStar);
+         return isLocal ? (cvtIntArrayToInt) : (cvtIntArrayToIntStar);
       } else if (_typeDesc.equals("[F") || _typeDesc.equals("float[]")) {
-         return (cvtFloatArrayToFloatStar);
+         return isLocal ? (cvtFloatArrayToFloat) : (cvtFloatArrayToFloatStar);
       } else if (_typeDesc.equals("[D") || _typeDesc.equals("double[]")) {
-         return (cvtDoubleArrayToDoubleStar);
+         return isLocal ? (cvtDoubleArrayToDouble) : (cvtDoubleArrayToDoubleStar);
       } else if (_typeDesc.equals("[J") || _typeDesc.equals("long[]")) {
-         return (cvtLongArrayToLongStar);
+         return isLocal ? (cvtLongArrayToLong) : (cvtLongArrayToLongStar);
       } else if (_typeDesc.equals("[S") || _typeDesc.equals("short[]")) {
-         return (cvtShortArrayToShortStar);
+         return isLocal ? (cvtShortArrayToShort) : (cvtShortArrayToShortStar);
       }
       // if we get this far, we haven't matched anything yet
       if (useClassModel) {
@@ -373,8 +391,8 @@ public abstract class KernelWriter extends BlockWriter{
             argLine.append(className);
             thisStructLine.append(className);
          } else {
-            argLine.append(convertType(ClassModel.typeName(signature.charAt(0)), false));
-            thisStructLine.append(convertType(ClassModel.typeName(signature.charAt(0)), false));
+            argLine.append(convertType(ClassModel.typeName(signature.charAt(0)), false, false));
+            thisStructLine.append(convertType(ClassModel.typeName(signature.charAt(0)), false, false));
          }
 
          argLine.append(" ");
@@ -520,7 +538,7 @@ public abstract class KernelWriter extends BlockWriter{
                }
                totalSize += fSize;
 
-               final String cType = convertType(field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8(), true);
+               final String cType = convertType(field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8(), true, false);
                assert cType != null : "could not find type for " + field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8();
                writeln(cType + " " + field.getNameAndTypeEntry().getNameUTF8Entry().getUTF8() + ";");
             }
@@ -585,7 +603,7 @@ public abstract class KernelWriter extends BlockWriter{
          if (returnType.startsWith("[")) {
             write(" __global ");
          }
-         write(convertType(returnType, true));
+         write(convertType(returnType, true, false));
 
          write(mm.getName() + "(");
 
@@ -618,12 +636,11 @@ public abstract class KernelWriter extends BlockWriter{
                   write(", ");
                }
 
-               // Arrays always map to __global arrays
-               if (descriptor.startsWith("[")) {
+               if (descriptor.startsWith("[") && !lvi.getVariableName().endsWith(PRIVATE_SUFFIX)) {
                   write(" __global ");
                }
 
-               write(convertType(descriptor, true));
+               write(convertType(descriptor, true, false));
                write(lvi.getVariableName());
                alreadyHasFirstArg = true;
             }
diff --git a/src/test/java/com/aparapi/codegen/test/ArrayCreation.java b/src/test/java/com/aparapi/codegen/test/ArrayCreation.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d47d48c3629127500998c6a8e683db5d34d57ee
--- /dev/null
+++ b/src/test/java/com/aparapi/codegen/test/ArrayCreation.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2016 - 2017 Syncleus, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.aparapi.codegen.test;
+
+public class ArrayCreation {
+
+    public float[][] results = new float[128][2];
+    int y = 2;
+
+    float[] method(float[] a) {
+        a[0] = a[0] + 1;
+        return a;
+    }
+
+    public void run() {
+        float[] a = new float[2];
+
+        float[] b = new float[16];
+
+        //float[][] c = new float[16][16];
+
+        float[] d = method(a);
+
+        results[y] = b;
+    }
+}
+/**{OpenCL{
+ typedef struct This_s{
+ __global float *results;
+ int results__javaArrayLength0;
+ int results__javaArrayDimension0;
+ int results__javaArrayLength1;
+ int results__javaArrayDimension1;
+ int y;
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global float* com_aparapi_codegen_test_VectorCreation__method(This *this,  __global float* a){
+ a[0]  = a[0] + 1.0f;
+ return(a);
+ }
+ __kernel void run(
+ __global float *results,
+ int results__javaArrayLength0,
+ int results__javaArrayDimension0,
+ int results__javaArrayLength1,
+ int results__javaArrayDimension1,
+ int y,
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->results = results;
+ this->results__javaArrayLength0 = results__javaArrayLength0;
+ this->results__javaArrayDimension0 = results__javaArrayDimension0;
+ this->results__javaArrayLength1 = results__javaArrayLength1;
+ this->results__javaArrayDimension1 = results__javaArrayDimension1;
+ this->y = y;
+ this->passid = passid;
+ {
+ float a[2];
+ float b[16];
+ __global float* d = com_aparapi_codegen_test_VectorCreation__method(this, a);
+ this->results[this->y]  = b;
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ArrayCreationTest.java b/src/test/java/com/aparapi/codegen/test/ArrayCreationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..56de08ffedc1cb7b116eb527de4e059dd5c2a4cb
--- /dev/null
+++ b/src/test/java/com/aparapi/codegen/test/ArrayCreationTest.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2016 - 2017 Syncleus, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.aparapi.codegen.test;
+
+import org.junit.Test;
+
+public class ArrayCreationTest extends com.aparapi.codegen.CodeGenJUnitBase {
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   __global float *results;\n"
+            + "   int results__javaArrayLength0;\n"
+            + "   int results__javaArrayDimension0;\n"
+            + "   int results__javaArrayLength1;\n"
+            + "   int results__javaArrayDimension1;\n"
+            + "   int y;\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global float* com_aparapi_codegen_test_ArrayCreation__method(This *this,  __global float* a){\n"
+            + "   a[0]  = a[0] + 1.0f;\n"
+            + "   return(a);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   __global float *results, \n"
+            + "   int results__javaArrayLength0, \n"
+            + "   int results__javaArrayDimension0, \n"
+            + "   int results__javaArrayLength1, \n"
+            + "   int results__javaArrayDimension1, \n"
+            + "   int y, \n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->results = results;\n"
+            + "   this->results__javaArrayLength0 = results__javaArrayLength0;\n"
+            + "   this->results__javaArrayDimension0 = results__javaArrayDimension0;\n"
+            + "   this->results__javaArrayLength1 = results__javaArrayLength1;\n"
+            + "   this->results__javaArrayDimension1 = results__javaArrayDimension1;\n"
+            + "   this->y = y;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      float a[2];\n"
+            + "      float b[16];\n"
+            + "       __global float* d = com_aparapi_codegen_test_ArrayCreation__method(this, a);\n"
+            + "      this->results[this->y]  = b;\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}\n"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
+
+    @Test
+    public void ArrayCreationTest() {
+        test(ArrayCreation.class, expectedException, expectedOpenCL);
+    }
+
+    @Test
+    public void ArrayCreationTestWorksWithCaching() {
+        test(ArrayCreation.class, expectedException, expectedOpenCL);
+    }
+}
diff --git a/src/test/java/com/aparapi/codegen/test/ObjectRefCopyTest.java b/src/test/java/com/aparapi/codegen/test/ObjectRefCopyTest.java
index e3978c7d9f88fca3f89e3e688b879f0da554fb38..a5cff184fd734e83a73cdfa77a56e7580599ea51 100644
--- a/src/test/java/com/aparapi/codegen/test/ObjectRefCopyTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ObjectRefCopyTest.java
@@ -16,11 +16,34 @@
 package com.aparapi.codegen.test;
 
 import com.aparapi.internal.exception.ClassParseException;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class ObjectRefCopyTest extends com.aparapi.codegen.CodeGenJUnitBase {
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   __global com_aparapi_codegen_test_ObjectRefCopy$DummyOOA *dummy;\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   __global com_aparapi_codegen_test_ObjectRefCopy$DummyOOA *dummy, \n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->dummy = dummy;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      int myId = get_global_id(0);\n"
+            + "      this->dummy[myId]  = this->dummy[(myId + 1)];\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ObjectRefCopyTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArray.java b/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArray.java
index 6271a5960cd0b8308c7fe4b0e28c0fc819e8544c..1d7facb4f1c139f48c65c55175fa3147331ac454 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArray.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArray.java
@@ -26,4 +26,4 @@ public class ReturnBooleanNewArray {
         returnBooleanNewArray();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArrayTest.java b/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArrayTest.java
index e37330fe91857e54cddbc281e81bae8d41e690ed..c750ae9f53d6fa9bfd96889de5da955f68a02e0c 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArrayTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnBooleanNewArrayTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnBooleanNewArrayTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnBooleanNewArrayTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArray.java b/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArray.java
index 757a8aa7a6517c348961e15c2b81f17d9037ea35..85f00fcd5ffd1d767c046decb124321ffa2adff4 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArray.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArray.java
@@ -28,4 +28,27 @@ public class ReturnBooleanVarArray {
         returnBooleanVarArray();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global char* com_aparapi_codegen_test_ReturnBooleanVarArray__returnBooleanVarArray(This *this){
+ char ba[1024];
+ return(ba);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnBooleanVarArray__returnBooleanVarArray(this);
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArrayTest.java b/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArrayTest.java
index f1439e392168898c489e89e3e38f128b44c8c523..46f45c4b9251a35b1d57b5e78920e7c5a9a37121 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArrayTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnBooleanVarArrayTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnBooleanVarArrayTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global char* com_aparapi_codegen_test_ReturnBooleanVarArray__returnBooleanVarArray(This *this){\n"
+            + "   char ba[1024];\n"
+            + "   return(ba);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnBooleanVarArray__returnBooleanVarArray(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnBooleanVarArrayTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNew.java
index fe08bdc9a242f46743fd480b72e122f0f955c302..e47b8d12a8147b489140e3f0f1c890fb219bb5b5 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnByteArrayNew {
         returnByteArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNewTest.java
index a0134a0f65a459d96cebd2842d98b33d513740cd..d322a6b460ab9b91771488623e050d00692b77c5 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayNewTest.java
@@ -15,12 +15,12 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnByteArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     
     @Test
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVar.java
index 8751bfb61535679ee21adf254c51f4a75d2cb8d2..45b9cc9ac23edc1e611305ee8d516568bae83dac 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVar.java
@@ -27,4 +27,27 @@ public class ReturnByteArrayVar {
         returnByteArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global char* com_aparapi_codegen_test_ReturnByteArrayVar__returnByteArrayVar(This *this){
+ char bytes[1024];
+ return(bytes);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnByteArrayVar__returnByteArrayVar(this);
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVarTest.java
index 2b83d4d7c4814bab98dd11d9f77a8897609ce16f..49cf10aa208ab10c78ad08f4f0843b1796b89106 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnByteArrayVarTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnByteArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global char* com_aparapi_codegen_test_ReturnByteArrayVar__returnByteArrayVar(This *this){\n"
+            + "   char bytes[1024];\n"
+            + "   return(bytes);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnByteArrayVar__returnByteArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnByteArrayVarTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNew.java
index 64e3d29ad1d4fb1e70c2144a542f8b780b8c1d20..c7770ac5aa25fc11803b36cc0928ca4d473cbb63 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnDoubleArrayNew {
         returnDoubleArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNewTest.java
index 9c2433f5fa69231adf58540a8529bb0ec44ea741..d60e3c92efd2a8308480029ed9e441dc362f2a16 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayNewTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnDoubleArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnDoubleArrayNewTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVar.java
index 4be6a58e097b9fd77120e3092fa3edf4f6aba020..609aa988fe625d2f6a9aaa4f694f6b44258e3ba1 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVar.java
@@ -27,4 +27,27 @@ public class ReturnDoubleArrayVar {
         returnDoubleArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global double* com_aparapi_codegen_test_ReturnDoubleArrayVar__returnDoubleArrayVar(This *this){
+ double doubles[1024];
+ return(doubles);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnDoubleArrayVar__returnDoubleArrayVar(this);
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVarTest.java
index 1517e6081825f777cb3ed13566878111fbee7ea1..330b735dd2a532d504c1a186ccfb10bf489e32a3 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnDoubleArrayVarTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnDoubleArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global double* com_aparapi_codegen_test_ReturnDoubleArrayVar__returnDoubleArrayVar(This *this){\n"
+            + "   double doubles[1024];\n"
+            + "   return(doubles);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnDoubleArrayVar__returnDoubleArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnDoubleArrayVarTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNew.java
index 9dd36a7c17de560cf1e769b7440fbdb14cdcbc77..211d3e45b6e620ce38711a1ba94dad29187b838b 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnFloatArrayNew {
         returnFloatArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNewTest.java
index 431d54a654261dd115d00ffb975e60eeee93244e..2437e4678cd6df230eb7f6f1a7bbcb166b121693 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayNewTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnFloatArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnFloatArrayNewTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVar.java
index f843d65bc828b54fd64d8f290385cf1884862fd7..289b0050018e885667be981c0b682553a09b2951 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVar.java
@@ -27,4 +27,27 @@ public class ReturnFloatArrayVar {
         returnFloatArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global float* com_aparapi_codegen_test_ReturnFloatArrayVar__returnFloatArrayVar(This *this){
+ float floats[1024];
+ return(floats);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnFloatArrayVar__returnFloatArrayVar(this);
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVarTest.java
index 48fd6b0dbfe3ba31ef59054be675df4ef4874bc4..6fe511fff92531c8a5b748f7c35c51e37b719a12 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnFloatArrayVarTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnFloatArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global float* com_aparapi_codegen_test_ReturnFloatArrayVar__returnFloatArrayVar(This *this){\n"
+            + "   float floats[1024];\n"
+            + "   return(floats);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnFloatArrayVar__returnFloatArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnFloatArrayVarTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNew.java
index c8b8b1f0bac071996722160ba56649e720729038..abd3ac2bad1eb0e2925e78bb923af4d1ced08dad 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnIntArrayNew {
         returnIntArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNewTest.java
index fe067d9de52cd54e482b748e59135e23609e7d06..cd7858f10f001c14d26c357752d639d9d6993d07 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayNewTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnIntArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnIntArrayNewTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVar.java
index 172757e2de6ddbef740d19de2054ef79bebb8e88..9f1d0306a57ff31f8aefbb8f1b72444c02fbbb9d 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVar.java
@@ -27,4 +27,27 @@ public class ReturnIntArrayVar {
         returnIntArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global int* com_aparapi_codegen_test_ReturnIntArrayVar__returnIntArrayVar(This *this){
+ int ints[1024];
+ return(ints);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnIntArrayVar__returnIntArrayVar(this);
+ return;
+ }
+ }
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVarTest.java
index a032b2c1ae0c4184e360c216c77081161e468a7c..f891df6a9afebfaed135ab5c25795f50da34f405 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnIntArrayVarTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnIntArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global int* com_aparapi_codegen_test_ReturnIntArrayVar__returnIntArrayVar(This *this){\n"
+            + "   int ints[1024];\n"
+            + "   return(ints);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnIntArrayVar__returnIntArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnIntArrayVarTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNew.java
index e9143097afadcf6323b248c0259e5173453673ac..9a11f9a539ed65fd536d5b0cadd93c09d4994db4 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnLongArrayNew {
         returnLongArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNewTest.java
index b9c5c2a5a718a4018672e45125c5b872347c4045..d437ba4b99d8e9d90adb3ac4c5064c6005901d3c 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayNewTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnLongArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnLongArrayNewTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVar.java
index 31edd9467ee83bf4f0db96df068d387355c5df3a..0cb75614a786226f1ba0bc2c9b59c31a926dab8d 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVar.java
@@ -27,4 +27,6 @@ public class ReturnLongArrayVar {
         returnLongArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+
+ }OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVarTest.java
index f71c402df91fbcf8eef169d038ab27ec7d4cf10d..66e774258cc46ad4bc0fc829f0504e45e4103b4e 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnLongArrayVarTest.java
@@ -15,13 +15,34 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
 import org.junit.Test;
 
 public class ReturnLongArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global long* com_aparapi_codegen_test_ReturnLongArrayVar__returnLongArrayVar(This *this){\n"
+            + "   long longs[1024];\n"
+            + "   return(longs);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnLongArrayVar__returnLongArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnLongArrayVarTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNew.java b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNew.java
index c3abc0394121647a55a7772d766d1d23c046aa27..443033f93f48b5edc159e4e25d2486802c7c8836 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNew.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNew.java
@@ -25,4 +25,4 @@ public class ReturnShortArrayNew {
         returnShortArrayNew();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{Throws{CodeGenException}Throws}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNewTest.java b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNewTest.java
index 4b4e5f8f2240d5f7c21f88520d75e511c8e9d674..f720a7859cc125f96df9f99a1195dbfd365b1037 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNewTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayNewTest.java
@@ -15,13 +15,13 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+import com.aparapi.internal.exception.CodeGenException;
 import org.junit.Test;
 
 public class ReturnShortArrayNewTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
     private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = CodeGenException.class;
 
     @Test
     public void ReturnShortArrayNewTest() {
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVar.java b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVar.java
index 07d590bdc880a2b94438718a17051bfd9123f53e..8efb31c0c4d3f88cdfb22041a90016f1e2312ffd 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVar.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVar.java
@@ -27,4 +27,26 @@ public class ReturnShortArrayVar {
         returnShortArrayVar();
     }
 }
-/**{Throws{ClassParseException}Throws}**/
+/**{OpenCL{
+ typedef struct This_s{
+ int passid;
+ }This;
+ int get_pass_id(This *this){
+ return this->passid;
+ }
+ __global short* com_aparapi_codegen_test_ReturnShortArrayVar__returnShortArrayVar(This *this){
+ short shorts[1024];
+ return(shorts);
+ }
+ __kernel void run(
+ int passid
+ ){
+ This thisStruct;
+ This* this=&thisStruct;
+ this->passid = passid;
+ {
+ com_aparapi_codegen_test_ReturnShortArrayVar__returnShortArrayVar(this);
+ return;
+ }
+ }
+}OpenCL}**/
diff --git a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVarTest.java b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVarTest.java
index 42bdefbb1909f3824b606627a58331c047665693..b703e37b88b4a1b95090fb471c5242f8d3d49c3e 100644
--- a/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVarTest.java
+++ b/src/test/java/com/aparapi/codegen/test/ReturnShortArrayVarTest.java
@@ -15,13 +15,35 @@
  */
 package com.aparapi.codegen.test;
 
-import com.aparapi.internal.exception.ClassParseException;
+
 import org.junit.Test;
 
 public class ReturnShortArrayVarTest extends com.aparapi.codegen.CodeGenJUnitBase {
 
-    private static final String[] expectedOpenCL = null;
-    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = ClassParseException.class;
+    private static final String[] expectedOpenCL = {
+        "typedef struct This_s{\n"
+            + "   int passid;\n"
+            + "}This;\n"
+            + "int get_pass_id(This *this){\n"
+            + "   return this->passid;\n"
+            + "}\n"
+            + " __global short* com_aparapi_codegen_test_ReturnShortArrayVar__returnShortArrayVar(This *this){\n"
+            + "   short shorts[1024];\n"
+            + "   return(shorts);\n"
+            + "}\n"
+            + "__kernel void run(\n"
+            + "   int passid\n"
+            + "){\n"
+            + "   This thisStruct;\n"
+            + "   This* this=&thisStruct;\n"
+            + "   this->passid = passid;\n"
+            + "   {\n"
+            + "      com_aparapi_codegen_test_ReturnShortArrayVar__returnShortArrayVar(this);\n"
+            + "      return;\n"
+            + "   }\n"
+            + "}"
+    };
+    private static final Class<? extends com.aparapi.internal.exception.AparapiException> expectedException = null;
 
     @Test
     public void ReturnShortArrayVarTest() {
diff --git a/src/test/java/com/aparapi/runtime/ArrayTest.java b/src/test/java/com/aparapi/runtime/ArrayTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a21af6e22bff3615b2f36e4562edce5c34ed4cad
--- /dev/null
+++ b/src/test/java/com/aparapi/runtime/ArrayTest.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016 - 2017 Syncleus, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.aparapi.runtime;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import com.aparapi.Kernel;
+import java.util.Arrays;
+import org.junit.Test;
+
+
+public class ArrayTest {
+    @Test
+    public void test() {
+        VectorKernel b = new VectorKernel();
+        b.test();
+    }
+
+    public static class VectorKernel extends Kernel {
+        private static final int SIZE = 32;
+
+        static int[][] target = new int[SIZE][SIZE];
+
+        public VectorKernel() {
+            for (int i = 0; i < SIZE; ++i) {
+                int[] ints = new int[SIZE];
+                Arrays.fill(ints, 99);
+
+                target[i] = ints;
+            }
+        }
+
+        private static void fillArray(int[] ints_$private$, int id) {
+            for (int i = 0; i < SIZE; i++) {
+                ints_$private$[i] = i + id;
+            }
+        }
+
+        @Override
+        public void run() {
+            int id = getGlobalId();
+
+            int[] ints = new int[SIZE];
+
+            fillArray(ints, id);
+
+            for (int i = 0; i < SIZE; i++) {
+                target[id][i] = ints[i];
+            }
+        }
+
+        void validate() {
+            for (int j = 0; j < SIZE; j++) {
+
+                int[] expected = new int[SIZE];
+                for (int i = 0; i < SIZE; i++) {
+                    expected[i] = i + j;
+                }
+
+                assertArrayEquals("target["+j+"]", expected, target[j]);
+            }
+        }
+
+        public void test() {
+            execute(SIZE);
+            validate();
+        }
+    }
+}