diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitmap.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
similarity index 64%
rename from java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitmap.java
rename to java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
index ecf9bc5..2827a72 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitmap.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
@@ -2,27 +2,27 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 
-public class OFPortBitmap implements OFValueType<OFPortBitmap> {
+public class OFBitMask128 implements OFValueType<OFBitMask128> {
 
     static final int LENGTH = 16;
 
     private final long raw1; // MSBs (ports 64-127)
     private final long raw2; // LSBs (ports 0-63)
 
-    public static final OFPortBitmap ALL = new OFPortBitmap(-1, -1);
-    public static final OFPortBitmap NONE = new OFPortBitmap(0, 0);
+    public static final OFBitMask128 ALL = new OFBitMask128(-1, -1);
+    public static final OFBitMask128 NONE = new OFBitMask128(0, 0);
 
-    private OFPortBitmap(long raw1, long raw2) {
+    private OFBitMask128(long raw1, long raw2) {
         this.raw1 = raw1;
         this.raw2 = raw2;
     }
 
-    static OFPortBitmap of(long raw1, long raw2) {
+    static OFBitMask128 of(long raw1, long raw2) {
         if (raw1 == -1 && raw2 == -1)
             return ALL;
         if (raw1 == 0 && raw2 == 0)
             return NONE;
-        return new OFPortBitmap(raw1, raw2);
+        return new OFBitMask128(raw1, raw2);
     }
 
     @Override
@@ -31,15 +31,15 @@
     }
 
     @Override
-    public OFPortBitmap applyMask(OFPortBitmap mask) {
+    public OFBitMask128 applyMask(OFBitMask128 mask) {
         return of(this.raw1 & mask.raw1, this.raw2 & mask.raw2);
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (!(obj instanceof OFPortBitmap))
+        if (!(obj instanceof OFBitMask128))
             return false;
-        OFPortBitmap other = (OFPortBitmap)obj;
+        OFBitMask128 other = (OFBitMask128)obj;
         return (other.raw1 == this.raw1 && other.raw2 == this.raw2);
     }
 
@@ -50,7 +50,7 @@
 
     protected static boolean isBitOn(long raw1, long raw2, int bit) {
         if (bit < 0 || bit >= 128)
-            throw new IndexOutOfBoundsException("Port number is out of bounds");
+            throw new IndexOutOfBoundsException();
         long word;
         if (bit < 64) {
             word = raw2; // ports 0-63
@@ -61,20 +61,19 @@
         return (word & ((long)1 << bit)) != 0;
     }
 
-
     public void write16Bytes(ChannelBuffer cb) {
         cb.writeLong(raw1);
         cb.writeLong(raw2);
     }
 
-    public static OFPortBitmap read16Bytes(ChannelBuffer cb) {
+    public static OFBitMask128 read16Bytes(ChannelBuffer cb) {
         long raw1 = cb.readLong();
         long raw2 = cb.readLong();
         return of(raw1, raw2);
     }
 
-    public boolean isOn(OFPort port) {
-        return isBitOn(raw1, raw2, port.getPortNumber());
+    public boolean isOn(int bit) {
+        return isBitOn(raw1, raw2, bit);
     }
 
     @Override
@@ -82,4 +81,12 @@
         return (String.format("%64s", Long.toBinaryString(raw2)) + String.format("%64s", Long.toBinaryString(raw1))).replaceAll(" ", "0");
     }
 
+    @Override
+    public int compareTo(OFBitMask128 o) {
+        long c = this.raw1 - o.raw1;
+        if (c != 0)
+            return Long.signum(c);
+        return Long.signum(this.raw2 - o.raw2);
+    }
+
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortMap.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortMap.java
index 0454d39..8ec056e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortMap.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortMap.java
@@ -1,14 +1,14 @@
 package org.projectfloodlight.openflow.types;
 
 
-public class OFPortMap extends Masked<OFPortBitmap> {
+public class OFPortMap extends Masked<OFBitMask128> {
 
-    private OFPortMap(OFPortBitmap mask) {
-        super(OFPortBitmap.NONE, mask);
+    private OFPortMap(OFBitMask128 mask) {
+        super(OFBitMask128.NONE, mask);
     }
 
     public boolean isOn(OFPort port) {
-        return this.mask.isOn(port);
+        return !(this.mask.isOn(port.getPortNumber()));
     }
 
     public static OFPortMap ofPorts(OFPort... ports) {
@@ -33,19 +33,19 @@
     }
 
     public static class Builder {
-        private long raw1, raw2;
+        private long raw1 = -1, raw2 = -1;
 
         public Builder() {
 
         }
 
         public boolean isOn(OFPort port) {
-            return OFPortBitmap.isBitOn(raw1, raw2, port.getPortNumber());
+            return !(OFBitMask128.isBitOn(raw1, raw2, port.getPortNumber()));
         }
 
-        public Builder set(OFPort port) {
+        public Builder unset(OFPort port) {
             int bit = port.getPortNumber();
-            if (bit < 0 || bit >= 128)
+            if (bit < 0 || bit >= 127) // MAX PORT IS 127
                 throw new IndexOutOfBoundsException("Port number is out of bounds");
             if (bit < 64) {
                 raw2 |= ((long)1 << bit);
@@ -55,9 +55,9 @@
             return this;
         }
 
-        public Builder unset(OFPort port) {
+        public Builder set(OFPort port) {
             int bit = port.getPortNumber();
-            if (bit < 0 || bit >= 128)
+            if (bit < 0 || bit >= 127)
                 throw new IndexOutOfBoundsException("Port number is out of bounds");
             if (bit < 64) {
                 raw2 &= ~((long)1 << bit);
@@ -68,7 +68,7 @@
         }
 
         public OFPortMap build() {
-            return new OFPortMap(OFPortBitmap.of(raw1, raw2));
+            return new OFPortMap(OFBitMask128.of(raw1, raw2));
         }
     }
 
