diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java
index 0454d75b12314b8a5aafd48c7b3ba5c87f471ef7..7674ffe3d593102ef53bd31583cba46cdf366bec 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java
@@ -97,7 +97,7 @@ import com.amd.aparapi.internal.instruction.InstructionSet.ConditionalBranch;
  * @author gfrost 
  */
 
-public class BranchSet{
+public class BranchSet {
    /**
     * Base abstract class used to hold information used to construct node tree for logical expressions. 
     * 
@@ -107,7 +107,7 @@ public class BranchSet{
     * @author gfrost
     *
     */
-   public static abstract class LogicalExpressionNode{
+   public static abstract class LogicalExpressionNode {
       private LogicalExpressionNode next = null;
 
       private LogicalExpressionNode parent = null;
@@ -122,6 +122,8 @@ public class BranchSet{
 
       public abstract void invert();
 
+      public abstract LogicalExpressionNode cloneInverted();
+
       public LogicalExpressionNode getRoot() {
          if (parent != null) {
             return (parent);
@@ -154,24 +156,37 @@ public class BranchSet{
     * @author gfrost
     *
     */
-   public static class SimpleLogicalExpressionNode extends LogicalExpressionNode{
+   public static class SimpleLogicalExpressionNode extends LogicalExpressionNode {
       private final ConditionalBranch branch;
 
-      protected boolean invert = false;
+      private boolean invert;
 
       public SimpleLogicalExpressionNode(ConditionalBranch _branch) {
+         this(_branch, false);
+      }
+
+      private SimpleLogicalExpressionNode(ConditionalBranch _branch, boolean _invert) {
          branch = _branch;
+         invert = _invert;
       }
 
-      @Override public int getTarget() {
+      @Override
+      public int getTarget() {
          return (getBranch().getTarget().getThisPC());
       }
 
-      @Override public void invert() {
+      @Override
+      public void invert() {
          invert = !invert;
       }
 
-      @Override public int getFallThrough() {
+      @Override
+      public LogicalExpressionNode cloneInverted() {
+         return new SimpleLogicalExpressionNode(branch, !invert);
+      }
+
+      @Override
+      public int getFallThrough() {
          return (getBranch().getNextPC().getThisPC());
       }
 
@@ -182,6 +197,11 @@ public class BranchSet{
       public ConditionalBranch getBranch() {
          return branch;
       }
+
+      @Override
+      public String toString() {
+         return invert ? ("!(" + getBranch() + ")") : getBranch().toString();
+      }
    }
 
    /**
@@ -195,41 +215,56 @@ public class BranchSet{
     * @author gfrost
     *
     */
-   public static class CompoundLogicalExpressionNode extends LogicalExpressionNode{
+   public static class CompoundLogicalExpressionNode extends LogicalExpressionNode {
       private final LogicalExpressionNode lhs;
 
       private final LogicalExpressionNode rhs;
 
       private boolean and;
 
-      public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) {
+      private CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs,
+            boolean applyInverts) {
          lhs = _lhs;
          and = _and;
          rhs = _rhs;
          setNext(_rhs.getNext());
-         if (and) {
-            lhs.invert();
-            // rhs.invert();
+         if (applyInverts) {
+            if (and) {
+               lhs.invert();
+               // rhs.invert();
+            }
          }
          rhs.setParent(this);
          lhs.setParent(this);
       }
 
-      @Override public int getTarget() {
+      public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) {
+         this(_and, _lhs, _rhs, true);
+      }
+
+      @Override
+      public int getTarget() {
          return (rhs.getTarget());
       }
 
-      @Override public void invert() {
+      @Override
+      public void invert() {
          and = !and;
          lhs.invert();
          rhs.invert();
       }
 
+      @Override
+      public LogicalExpressionNode cloneInverted() {
+         return new CompoundLogicalExpressionNode(!and, lhs.cloneInverted(), rhs.cloneInverted(), false);
+      }
+
       public boolean isAnd() {
          return (and);
       }
 
-      @Override public int getFallThrough() {
+      @Override
+      public int getFallThrough() {
          return (rhs.getFallThrough());
       }
 
@@ -242,6 +277,12 @@ public class BranchSet{
 
          return rhs;
       }
+
+      @Override
+      public String toString() {
+         return getLhs().toString() + " " + (isAnd() ? "&&" : "||") + " " + getRhs().toString();
+      }
+
    }
 
    private final List<ConditionalBranch> set = new ArrayList<ConditionalBranch>();
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
index ad66f9b39f69d8cc77473941971d7efefcb321b5..761117fbe3123d4e879a2961a4f84ec890aab13c 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java
@@ -959,12 +959,12 @@ public class KernelRunner extends KernelRunnerJNI{
       assert args != null : "args should not be null";
       final boolean needSync = updateKernelArrayRefs();
       if (needSync && logger.isLoggable(Level.FINE)) {
-         logger.fine("Need to resync arrays on " + kernel.getClass().getName());
+         logger.fine("Need to resync arrays on " + describeKernelClass());
       }
 
       // native side will reallocate array buffers if necessary
       if (runKernelJNI(jniContextHandle, _range, needSync, _passes) != 0) {
-         logger.warning("### CL exec seems to have failed. Trying to revert to Java ###");
+         logger.warning("### " + describeKernelClass() + " - CL exec seems to have failed. Trying to revert to Java ###");
          kernel.setFallbackExecutionMode();
          return execute(_entrypointName, _range, _passes);
       }
@@ -999,14 +999,18 @@ public class KernelRunner extends KernelRunnerJNI{
    synchronized private Kernel warnFallBackAndExecute(String _entrypointName, final Range _range, final int _passes,
          Exception _exception) {
       if (logger.isLoggable(Level.WARNING)) {
-         logger.warning("Reverting to the next execution mode for " + kernel.getClass() + ": " + _exception.getMessage());
+         logger.warning("Reverting to the next execution mode for " + describeKernelClass() + ": " + _exception.getMessage());
          _exception.printStackTrace();
       }
       return fallBackAndExecute(_entrypointName, _range, _passes);
    }
 
+   private String describeKernelClass() {
+      return kernel.getClass().getName();
+   }
+
    synchronized private Kernel warnFallBackAndExecute(String _entrypointName, final Range _range, final int _passes, String _excuse) {
-      logger.warning("Reverting to the next execution mode for " + kernel.getClass() + ": " + _excuse);
+      logger.warning("Reverting to the next execution mode for " + describeKernelClass() + ": " + _excuse);
       return fallBackAndExecute(_entrypointName, _range, _passes);
    }
 
@@ -1295,7 +1299,7 @@ public class KernelRunner extends KernelRunnerJNI{
       }
 
       if (Config.enableExecutionModeReporting) {
-         System.out.println(kernel.getClass().getCanonicalName() + ":" + kernel.getExecutionMode());
+         System.out.println(describeKernelClass() + ":" + kernel.getExecutionMode());
       }
 
       executionTime = System.currentTimeMillis() - executeStartTime;
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java
index 95c362a357f0b09911f7f433d426809073bd67ec..e4728c5e892f769305fcec0f8b29878a1aecbd41 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java
@@ -2715,9 +2715,7 @@ public class ClassModel{
     * @return The Method or null if we fail to locate a given method.
     */
    public ClassModelMethod getMethod(MethodEntry _methodEntry, boolean _isSpecial) {
-      NameAndTypeEntry nameAndTypeEntry = _methodEntry.getNameAndTypeEntry();
-      String utf8Name = nameAndTypeEntry.getNameUTF8Entry().getUTF8();
-      final String entryClassNameInDotForm = utf8Name.replace('/', '.');
+      final String entryClassNameInDotForm = _methodEntry.getClassEntry().getNameUTF8Entry().getUTF8().replace('/', '.');
 
       // Shortcut direct calls to supers to allow "foo() { super.foo() }" type stuff to work
       if (_isSpecial && (superClazz != null) && superClazz.isSuperClass(entryClassNameInDotForm)) {
@@ -2728,7 +2726,9 @@ public class ClassModel{
          return superClazz.getMethod(_methodEntry, false);
       }
 
-      ClassModelMethod methodOrNull = getMethodOrNull(utf8Name, nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8());
+      NameAndTypeEntry nameAndTypeEntry = _methodEntry.getNameAndTypeEntry();
+      ClassModelMethod methodOrNull = getMethodOrNull(nameAndTypeEntry.getNameUTF8Entry().getUTF8(), nameAndTypeEntry
+            .getDescriptorUTF8Entry().getUTF8());
       if (methodOrNull == null)
          return superClazz != null ? superClazz.getMethod(_methodEntry, false) : (null);
       return methodOrNull;
@@ -2737,8 +2737,7 @@ public class ClassModel{
    //   private ValueCache<MethodKey, MethodModel, AparapiException> methodModelCache = ValueCache.on(this::computeMethodModel);
    private ValueCache<MethodKey, MethodModel, AparapiException> methodModelCache = ValueCache
          .on(new ThrowingValueComputer<MethodKey, MethodModel, AparapiException>(){
-            @Override
-            public MethodModel compute(MethodKey key) throws AparapiException {
+            @Override public MethodModel compute(MethodKey key) throws AparapiException {
                return computeMethodModel(key);
             }
          });
@@ -2797,8 +2796,7 @@ public class ClassModel{
    //   private final ValueCache<EntrypointKey, Entrypoint, AparapiException> entrypointCache = ValueCache.on(this::computeBasicEntrypoint);
    private final ValueCache<EntrypointKey, Entrypoint, AparapiException> entrypointCache = ValueCache
          .on(new ThrowingValueComputer<EntrypointKey, Entrypoint, AparapiException>(){
-            @Override
-            public Entrypoint compute(EntrypointKey key) throws AparapiException {
+            @Override public Entrypoint compute(EntrypointKey key) throws AparapiException {
                return computeBasicEntrypoint(key);
             }
          });
@@ -2834,4 +2832,8 @@ public class ClassModel{
    public static void invalidateCaches() {
       classModelCache.invalidate();
    }
+
+   @Override public String toString() {
+      return "ClassModel of " + getClassWeAreModelling();
+   }
 }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java
index c6d7fc9b753c9d6f04550393d6766f680ffc7f0f..a629c97e5f9106705de09572a5569304fbeb3a3b 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java
@@ -98,7 +98,6 @@ public class MethodModel{
       return noCL;
    }
 
-
    public boolean isPrivateMemoryGetter() {
       return methodIsPrivateMemoryGetter;
    }
@@ -1727,4 +1726,8 @@ public class MethodModel{
    public Instruction getExprHead() {
       return (expressionList.getHead());
    }
+
+   @Override public String toString() {
+      return "MethodModel of " + method;
+   }
 }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java
index 9e9efc6381e8e658b6091b512bde5b4ff6583ef1..090c14542a9faad28a257043c40edee46834ef37 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java
@@ -40,11 +40,14 @@ package com.amd.aparapi.internal.writer;
 import com.amd.aparapi.*;
 import com.amd.aparapi.internal.exception.*;
 import com.amd.aparapi.internal.instruction.*;
+import com.amd.aparapi.internal.instruction.BranchSet.LogicalExpressionNode;
+import com.amd.aparapi.internal.instruction.InstructionSet.AccessInstanceField;
 import com.amd.aparapi.internal.instruction.BranchSet.*;
 import com.amd.aparapi.internal.instruction.InstructionSet.*;
 import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*;
 import com.amd.aparapi.internal.model.ClassModel.*;
 import com.amd.aparapi.internal.model.*;
+import com.amd.aparapi.internal.model.ClassModel.ConstantPool.NameAndTypeEntry;
 
 import java.util.*;
 
@@ -59,6 +62,7 @@ import java.util.*;
 public abstract class BlockWriter{
 
    public final static String arrayLengthMangleSuffix = "__javaArrayLength";
+
    public final static String arrayDimMangleSuffix = "__javaArrayDimension";
 
    public abstract void write(String _string);
@@ -315,10 +319,7 @@ public abstract class BlockWriter{
    public Instruction writeConditional(BranchSet _branchSet, boolean _invert) throws CodeGenException {
 
       final LogicalExpressionNode logicalExpression = _branchSet.getLogicalExpression();
-      if (!_invert) {
-         logicalExpression.invert();
-      }
-      write(logicalExpression);
+      write(_invert ? logicalExpression : logicalExpression.cloneInverted());
       return (_branchSet.getLast().getNextExpr());
    }
 
@@ -416,7 +417,8 @@ public abstract class BlockWriter{
          final AccessArrayElement arrayLoadInstruction = (AccessArrayElement) _instruction;
 
          //object array, get address
-         if(arrayLoadInstruction instanceof I_AALOAD) {
+         boolean isMultiDimensional = arrayLoadInstruction instanceof I_AALOAD && isMultiDimensionalArray(arrayLoadInstruction);
+         if (isMultiDimensional) {
             write("(&");
          }
          writeInstruction(arrayLoadInstruction.getArrayRef());
@@ -425,22 +427,25 @@ public abstract class BlockWriter{
 
          //object array, find the size of each object in the array
          //for 2D arrays, this size is the size of a row.
-         if(arrayLoadInstruction instanceof I_AALOAD) {
+         if (isMultiDimensional) {
             int dim = 0;
             Instruction load = arrayLoadInstruction.getArrayRef();
-            while(load instanceof I_AALOAD) {
+            while (load instanceof I_AALOAD) {
                load = load.getFirstChild();
                dim++;
             }
 
-            String arrayName = ((AccessInstanceField)load).getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8();
-            write(" * this->" + arrayName + arrayDimMangleSuffix+dim);
+            NameAndTypeEntry nameAndTypeEntry = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry();
+            if (isMultiDimensionalArray(nameAndTypeEntry)) {
+               String arrayName = nameAndTypeEntry.getNameUTF8Entry().getUTF8();
+               write(" * this->" + arrayName + arrayDimMangleSuffix + dim);
+            }
          }
 
          write("]");
 
          //object array, close parentheses
-         if(arrayLoadInstruction instanceof I_AALOAD) {
+         if (isMultiDimensional) {
             write(")");
          }
       } else if (_instruction instanceof AccessField) {
@@ -467,13 +472,14 @@ public abstract class BlockWriter{
          //we're looking at
          int dim = 0;
          Instruction load = _instruction.getFirstChild();
-         while(load instanceof I_AALOAD) {
-             load = load.getFirstChild();
-             dim++;
-         }
-         final AccessInstanceField child = (AccessInstanceField) load;
-         final String arrayName = child.getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8();
-         write("this->" + arrayName + arrayLengthMangleSuffix + dim);
+         while (load instanceof I_AALOAD) {
+            load = load.getFirstChild();
+            dim++;
+         }
+         NameAndTypeEntry nameAndTypeEntry = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry();
+         final String arrayName = nameAndTypeEntry.getNameUTF8Entry().getUTF8();
+         String dimSuffix = isMultiDimensionalArray(nameAndTypeEntry) ? Integer.toString(dim) : "";
+         write("this->" + arrayName + arrayLengthMangleSuffix + dimSuffix);
       } else if (_instruction instanceof AssignToField) {
          final AssignToField assignedField = (AssignToField) _instruction;
 
@@ -723,10 +729,38 @@ public abstract class BlockWriter{
 
    }
 
+   private boolean isMultiDimensionalArray(NameAndTypeEntry nameAndTypeEntry) {
+      return nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8().startsWith("[[");
+   }
+
+   private boolean isObjectArray(NameAndTypeEntry nameAndTypeEntry) {
+      return nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8().startsWith("[L");
+   }
+
+   private boolean isMultiDimensionalArray(final AccessArrayElement arrayLoadInstruction) {
+      AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
+      return isMultiDimensionalArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry());
+   }
+
+   private boolean isObjectArray(final AccessArrayElement arrayLoadInstruction) {
+      AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction);
+      return isObjectArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry());
+   }
+
+   private AccessInstanceField getUltimateInstanceFieldAccess(final AccessArrayElement arrayLoadInstruction) {
+      Instruction load = arrayLoadInstruction.getArrayRef();
+      while (load instanceof I_AALOAD) {
+         load = load.getFirstChild();
+      }
+
+      return (AccessInstanceField) load;
+   }
+
    public void writeMethod(MethodCall _methodCall, MethodEntry _methodEntry) throws CodeGenException {
-      boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods().contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8());
+      boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods()
+            .contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8());
       if (noCL) {
-          return;
+         return;
       }
 
       if (_methodCall instanceof VirtualMethodCall) {
@@ -760,8 +794,7 @@ public abstract class BlockWriter{
       if (_methodModel.isGetter() && !_methodModel.isNoCL()) {
          FieldEntry accessorVariableFieldEntry = _methodModel.getAccessorVariableFieldEntry();
          writeGetterBlock(accessorVariableFieldEntry);
-      }
-      else {
+      } else {
          writeBlock(_methodModel.getExprHead(), null);
       }
    }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java
index 613b091fdbf4b09fda0bcb2dcc6a0e69db902582..92ce2fe930cda4a348b1c8b26b42eb0fb5cb19a7 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java
@@ -38,7 +38,6 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit
 package com.amd.aparapi.internal.writer;
 
 import com.amd.aparapi.*;
-import com.amd.aparapi.Kernel;
 import com.amd.aparapi.internal.exception.*;
 import com.amd.aparapi.internal.instruction.*;
 import com.amd.aparapi.internal.instruction.InstructionSet.*;
@@ -47,8 +46,6 @@ import com.amd.aparapi.internal.model.ClassModel.AttributePool.*;
 import com.amd.aparapi.internal.model.ClassModel.AttributePool.RuntimeAnnotationsEntry.*;
 import com.amd.aparapi.internal.model.ClassModel.*;
 import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*;
-import com.amd.aparapi.opencl.OpenCL.Constant;
-import com.amd.aparapi.opencl.OpenCL.*;
 
 import java.util.*;
 
@@ -198,15 +195,16 @@ public abstract class KernelWriter extends BlockWriter{
          if (m != null && m.isGetter()) {
             getterField = m.getAccessorVariableFieldEntry();
          }
-         if (getterField != null) {
-             String fieldName = getterField.getNameAndTypeEntry().getNameUTF8Entry().getUTF8();
-             write("this->");
-             write(fieldName);
-             return;
+         if (getterField != null && isThis(_methodCall.getArg(0))) {
+            String fieldName = getterField.getNameAndTypeEntry().getNameUTF8Entry().getUTF8();
+            write("this->");
+            write(fieldName);
+            return;
          }
-         boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods().contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8());
+         boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods()
+               .contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8());
          if (noCL) {
-             return;
+            return;
          }
          final String intrinsicMapping = Kernel.getMappedMethodName(_methodEntry);
          // System.out.println("getMappedMethodName for " + methodName + " returned " + mapping);
@@ -260,6 +258,10 @@ public abstract class KernelWriter extends BlockWriter{
       }
    }
 
+   private boolean isThis(Instruction instruction) {
+      return instruction instanceof I_ALOAD_0;
+   }
+
    public void writePragma(String _name, boolean _enable) {
       write("#pragma OPENCL EXTENSION " + _name + " : " + (_enable ? "en" : "dis") + "able");
       newLine();
@@ -273,9 +275,10 @@ public abstract class KernelWriter extends BlockWriter{
 
    public final static String __private = "__private";
 
-   public final static String LOCAL_ANNOTATION_NAME = "L" + Local.class.getName().replace('.', '/') + ";";
+   public final static String LOCAL_ANNOTATION_NAME = "L" + com.amd.aparapi.Kernel.Local.class.getName().replace('.', '/') + ";";
 
-   public final static String CONSTANT_ANNOTATION_NAME = "L" + Constant.class.getName().replace('.', '/') + ";";
+   public final static String CONSTANT_ANNOTATION_NAME = "L" + com.amd.aparapi.Kernel.Constant.class.getName().replace('.', '/')
+         + ";";
 
    @Override public void write(Entrypoint _entryPoint) throws CodeGenException {
       final List<String> thisStruct = new ArrayList<String>();
@@ -308,7 +311,7 @@ public abstract class KernelWriter extends BlockWriter{
          }
 
          if (privateMemorySize != null) {
-             type = __private;
+            type = __private;
          }
          final RuntimeAnnotationsEntry visibleAnnotations = field.getAttributePool().getRuntimeVisibleAnnotationsEntry();
 
@@ -328,7 +331,7 @@ public abstract class KernelWriter extends BlockWriter{
          //if we have a an array we want to mark the object as a pointer
          //if we have a multiple dimensional array we want to remember the number of dimensions
          while (signature.startsWith("[")) {
-            if(isPointer == false) {
+            if (isPointer == false) {
                argLine.append(argType + " ");
                thisStructLine.append(type + " ");
             }
@@ -382,19 +385,15 @@ public abstract class KernelWriter extends BlockWriter{
 
          // Add int field into "this" struct for supporting java arraylength op
          // named like foo__javaArrayLength
-         if (isPointer && _entryPoint.getArrayFieldArrayLengthUsed().contains(field.getName()) ||
-             isPointer && numDimensions > 1) {
-            
-            for(int i = 0; i < numDimensions; i++) {
+         if (isPointer && _entryPoint.getArrayFieldArrayLengthUsed().contains(field.getName()) || isPointer && numDimensions > 1) {
+
+            for (int i = 0; i < numDimensions; i++) {
                final StringBuilder lenStructLine = new StringBuilder();
                final StringBuilder lenArgLine = new StringBuilder();
                final StringBuilder lenAssignLine = new StringBuilder();
-               final StringBuilder dimStructLine = new StringBuilder();
-               final StringBuilder dimArgLine = new StringBuilder();
-               final StringBuilder dimAssignLine = new StringBuilder();
 
-               String lenName = field.getName() + BlockWriter.arrayLengthMangleSuffix +
-                    Integer.toString(i);
+               String suffix = numDimensions == 1 ? "" : Integer.toString(i);
+               String lenName = field.getName() + BlockWriter.arrayLengthMangleSuffix + suffix;
 
                lenStructLine.append("int " + lenName);
 
@@ -409,21 +408,25 @@ public abstract class KernelWriter extends BlockWriter{
                argLines.add(lenArgLine.toString());
                thisStruct.add(lenStructLine.toString());
 
-               String dimName = field.getName() + BlockWriter.arrayDimMangleSuffix +
-                    Integer.toString(i);
+               if (numDimensions > 1) {
+                  final StringBuilder dimStructLine = new StringBuilder();
+                  final StringBuilder dimArgLine = new StringBuilder();
+                  final StringBuilder dimAssignLine = new StringBuilder();
+                  String dimName = field.getName() + BlockWriter.arrayDimMangleSuffix + suffix;
 
-               dimStructLine.append("int " + dimName);
+                  dimStructLine.append("int " + dimName);
 
-               dimAssignLine.append("this->");
-               dimAssignLine.append(dimName);
-               dimAssignLine.append(" = ");
-               dimAssignLine.append(dimName);
+                  dimAssignLine.append("this->");
+                  dimAssignLine.append(dimName);
+                  dimAssignLine.append(" = ");
+                  dimAssignLine.append(dimName);
 
-               dimArgLine.append("int " + dimName);
+                  dimArgLine.append("int " + dimName);
 
-               assigns.add(dimAssignLine.toString());
-               argLines.add(dimArgLine.toString());
-               thisStruct.add(dimStructLine.toString());
+                  assigns.add(dimAssignLine.toString());
+                  argLines.add(dimArgLine.toString());
+                  thisStruct.add(dimStructLine.toString());
+               }
             }
          }
       }
@@ -704,7 +707,7 @@ public abstract class KernelWriter extends BlockWriter{
          throw codeGenException;
       }/* catch (final Throwable t) {
          throw new CodeGenException(t);
-      }*/
+       }*/
 
       return (openCLStringBuilder.toString());
    }
diff --git a/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java b/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java
index 37c77c41460875b2852946ffea6103c3552690aa..ca35b3a91ba0aeb843e56f660e71143333ed8cd7 100644
--- a/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java
+++ b/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java
@@ -37,14 +37,17 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit
 */
 package com.amd.aparapi;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+
 import com.amd.aparapi.internal.exception.AparapiException;
 import com.amd.aparapi.internal.model.ClassModel;
 import com.amd.aparapi.internal.model.Entrypoint;
 import com.amd.aparapi.internal.writer.KernelWriter;
 
-public class CodeGenJUnitBase{
+public class CodeGenJUnitBase {
 
    protected void test(Class<?> _class, Class<? extends AparapiException> _expectedExceptionType, String[] expectedOpenCL) {
       try {
@@ -53,7 +56,7 @@ public class CodeGenJUnitBase{
 
          //  String expected = source.getOpenCLString();
 
-         ClassModel classModel = new ClassModel(_class);
+         ClassModel classModel = ClassModel.createClassModel(_class);
 
          // construct an artficial instance of our class here
          // we assume the specified class will have a null constructor
@@ -94,15 +97,19 @@ public class CodeGenJUnitBase{
                      .println("}\n------------------------------------------------------------------------------------------------------");
 
             }
-            assertTrue(_class.getSimpleName(), same);
+            if (!same) {
+               assertEquals(_class.getSimpleName(), Arrays.toString(expectedOpenCL), actual);
+            }
          } else {
             assertTrue("Expected exception " + _expectedExceptionType + " Instead we got {\n" + actual + "\n}", false);
          }
 
+      } catch (AssertionError e) {
+         throw e;
       } catch (Throwable t) {
          if (_expectedExceptionType == null || !t.getClass().isAssignableFrom(_expectedExceptionType)) {
             t.printStackTrace();
-            assertTrue("Unexpected exception " + t, false);
+            throw new AssertionError("Unexpected exception " + t, t);
          }
       }
    }
diff --git a/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java b/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java
index 40c008513b3017c1e7096fb7bdf94b460e8d553b..028da4a87e979b4ba612434e79de7d7ee3717e16 100644
--- a/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java
+++ b/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java
@@ -45,7 +45,7 @@ import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.List;
 
-public class CreateJUnitTests{
+public class CreateJUnitTests {
    public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, IOException {
       File rootDir = new File(System.getProperty("root", "."));
 
@@ -57,9 +57,10 @@ public class CreateJUnitTests{
       System.out.println(testDir.getCanonicalPath());
 
       List<String> classNames = new ArrayList<String>();
-      for (File sourceFile : testDir.listFiles(new FilenameFilter(){
+      for (File sourceFile : testDir.listFiles(new FilenameFilter() {
 
-         @Override public boolean accept(File dir, String name) {
+         @Override
+         public boolean accept(File dir, String name) {
             return (name.endsWith(".java"));
          }
       })) {
@@ -86,33 +87,10 @@ public class CreateJUnitTests{
             sb.append("\n */\n");
          }
          sb.append("public class " + className + " extends com.amd.aparapi.CodeGenJUnitBase{\n");
-         sb.append("   @Test public void " + className + "(){\n");
-         if (source.getOpenCLSectionCount() > 0) {
-
-            sb.append("   String[] expectedOpenCL = new String[]{\n");
-            for (List<String> opencl : source.getOpenCL()) {
-               sb.append("   \"\"\n");
-               for (String line : opencl) {
-                  sb.append("   +\"" + line + "\\n\"\n");
-               }
-               sb.append("   ,\n");
-            }
-            sb.append("   };\n");
-         } else {
-            sb.append("   String[] expectedOpenCL = null;\n");
-         }
-
-         String exceptions = source.getExceptionsString();
-         if (exceptions.length() > 0) {
-            sb.append("   Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = ");
-
-            sb.append("com.amd.aparapi.internal.exception." + exceptions + ".class");
-            sb.append(";\n");
-         } else {
-            sb.append("   Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = null;\n");
-         }
-         sb.append("       test(" + testPackageName + "." + className + ".class, expectedException, expectedOpenCL);\n");
-         sb.append("   }\n");
+         appendExpectedOpenCL(source, sb);
+         appendExpectedExceptions(source, sb);
+         appendTest(testPackageName, className, "", sb);
+         appendTest(testPackageName, className, "WorksWithCaching", sb);
          sb.append("}\n");
          //  System.out.println(sb.toString());
 
@@ -124,4 +102,39 @@ public class CreateJUnitTests{
       }
 
    }
+
+   private static void appendTest(String testPackageName, String className, String suffix, StringBuilder sb) {
+      sb.append("   @Test public void " + className + suffix + "(){\n");
+      sb.append("       test(" + testPackageName + "." + className + ".class, expectedException, expectedOpenCL);\n");
+      sb.append("   }\n");
+   }
+
+   private static void appendExpectedExceptions(Source source, StringBuilder sb) {
+      String exceptions = source.getExceptionsString();
+      if (exceptions.length() > 0) {
+         sb.append("   private static final Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = ");
+
+         sb.append("com.amd.aparapi.internal.exception." + exceptions + ".class");
+         sb.append(";\n");
+      } else {
+         sb.append("   private static final Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = null;\n");
+      }
+   }
+
+   private static void appendExpectedOpenCL(Source source, StringBuilder sb) {
+      if (source.getOpenCLSectionCount() > 0) {
+
+         sb.append("  private static final  String[] expectedOpenCL = new String[]{\n");
+         for (List<String> opencl : source.getOpenCL()) {
+            sb.append("   \"\"\n");
+            for (String line : opencl) {
+               sb.append("   +\"" + line + "\\n\"\n");
+            }
+            sb.append("   ,\n");
+         }
+         sb.append("   };\n");
+      } else {
+         sb.append("   private static final String[] expectedOpenCL = null;\n");
+      }
+   }
 }
diff --git a/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java b/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java
index 3419977fc05ca9f588be573685e3bde9311a1f15..ee9f1515359dfa54dc5d64ee487b55714b38e08c 100644
--- a/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java
+++ b/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java
@@ -1,7 +1,7 @@
 package com.amd.aparapi.test.runtime;
 
 import com.amd.aparapi.*;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 import org.junit.Test;
 
 
@@ -19,10 +19,11 @@ public class Issue103 extends Kernel {
    }
 
    void validate() {
-      for (int i = 0; i < size; i++) {
-         System.out.println(target[i] + " ... " + source[i]);
-         assertTrue("target == source", target[i] == source[i]);
-      }
+      assertArrayEquals("target == source", target, source);
+//      for (int i = 0; i < size; i++) {
+//         System.out.println(target[i] + " ... " + source[i]);
+//         assertTrue("target == source", target[i] == source[i]);
+//      }
    }
    
    @Test public void test() {
diff --git a/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java b/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java
index 3a24b2d275d61e13d4e0dc779e7ee7f8d1b984a2..41f4b0d21e02207f9ad02621c06f2776a67bf5fd 100644
--- a/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java
+++ b/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java
@@ -1,6 +1,6 @@
 package com.amd.aparapi.test.runtime;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 import org.junit.Test;
 import com.amd.aparapi.Kernel;
 
@@ -28,9 +28,10 @@ public class UseStaticArray extends Kernel{
 
       assertTrue("ran on GPU", getExecutionMode() == Kernel.EXECUTION_MODE.GPU);
 
-      for (int i = 0; i < size; i++) {
-         assertTrue("results == fooBar", results[i] == values[i]);
-      }
+      assertArrayEquals("results == fooBar", results, values);
+//      for (int i = 0; i < size; i++) {
+//         assertTrue("results == fooBar", results[i] == values[i]);
+//      }
    }
 
    public static void main(String args[]) {