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/writer/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java
index 9e9efc6381e8e658b6091b512bde5b4ff6583ef1..c8074224b186acff30be215b0ccabcd536183822 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,6 +40,7 @@ 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.BranchSet.*;
 import com.amd.aparapi.internal.instruction.InstructionSet.*;
 import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*;
@@ -56,9 +57,10 @@ import java.util.*;
  *
  */
 
-public abstract class BlockWriter{
+public abstract class BlockWriter {
 
    public final static String arrayLengthMangleSuffix = "__javaArrayLength";
+
    public final static String arrayDimMangleSuffix = "__javaArrayDimension";
 
    public abstract void write(String _string);
@@ -315,10 +317,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 +415,7 @@ public abstract class BlockWriter{
          final AccessArrayElement arrayLoadInstruction = (AccessArrayElement) _instruction;
 
          //object array, get address
-         if(arrayLoadInstruction instanceof I_AALOAD) {
+         if (arrayLoadInstruction instanceof I_AALOAD) {
             write("(&");
          }
          writeInstruction(arrayLoadInstruction.getArrayRef());
@@ -425,22 +424,23 @@ 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 (arrayLoadInstruction instanceof I_AALOAD) {
             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);
+            String arrayName = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry()
+                  .getUTF8();
+            write(" * this->" + arrayName + arrayDimMangleSuffix + dim);
          }
 
          write("]");
 
          //object array, close parentheses
-         if(arrayLoadInstruction instanceof I_AALOAD) {
+         if (arrayLoadInstruction instanceof I_AALOAD) {
             write(")");
          }
       } else if (_instruction instanceof AccessField) {
@@ -467,9 +467,9 @@ public abstract class BlockWriter{
          //we're looking at
          int dim = 0;
          Instruction load = _instruction.getFirstChild();
-         while(load instanceof I_AALOAD) {
-             load = load.getFirstChild();
-             dim++;
+         while (load instanceof I_AALOAD) {
+            load = load.getFirstChild();
+            dim++;
          }
          final AccessInstanceField child = (AccessInstanceField) load;
          final String arrayName = child.getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8();
@@ -724,9 +724,10 @@ public abstract class BlockWriter{
    }
 
    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 +761,7 @@ public abstract class BlockWriter{
       if (_methodModel.isGetter() && !_methodModel.isNoCL()) {
          FieldEntry accessorVariableFieldEntry = _methodModel.getAccessorVariableFieldEntry();
          writeGetterBlock(accessorVariableFieldEntry);
-      }
-      else {
+      } else {
          writeBlock(_methodModel.getExprHead(), null);
       }
    }