address comments
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/DatapathId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/DatapathId.java
index 2e7a59b..708eaa9 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/DatapathId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/DatapathId.java
@@ -6,7 +6,6 @@
 import org.projectfloodlight.openflow.util.HexString;
 
 import com.google.common.hash.PrimitiveSink;
-import com.google.common.primitives.Bytes;
 import com.google.common.primitives.Longs;
 import com.google.common.primitives.UnsignedLongs;
 
@@ -40,16 +39,12 @@
     }
 
     /**
-     * Creates a {@link DatapathId} from a {@link MacAddress}. This factory
-     * method assumes that the {@link DatapathId} is composed of two zero bytes
-     * appended by the {@link MacAddress}'s 6 bytes.
+     * Creates a {@link DatapathId} from a {@link MacAddress}.
      * @param mac the {@link MacAddress} to create the {@link DatapathId} from
      * @return a {@link DatapathId} derived from the supplied {@link MacAddress}
      */
     public static DatapathId of(@Nonnull MacAddress mac) {
-        byte[] zeroBytes = new byte[]{0,0};
-        byte[] fullBytes = Bytes.concat(zeroBytes, mac.getBytes());
-        return DatapathId.of(fullBytes);
+        return DatapathId.of(mac.getLong());
     }
 
     public long getLong() {
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/MacAddress.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/MacAddress.java
index b026b6c..3db7e3a 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/MacAddress.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/MacAddress.java
@@ -9,7 +9,6 @@
 import org.projectfloodlight.openflow.util.HexString;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.Longs;
 
@@ -37,7 +36,7 @@
 
     private static final String FORMAT_ERROR = "Mac address is not well-formed. " +
             "It must consist of 6 hex digit pairs separated by colons: ";
-    private static final int STRING_LENGTH = 6 * 2 + 5;
+    private static final int MAC_STRING_LENGTH = 6 * 2 + 5;
 
     private MacAddress(final long rawValue) {
         this.rawValue = rawValue;
@@ -72,15 +71,18 @@
      */
     @Nonnull
     public static MacAddress of(@Nonnull final String macString) throws IllegalArgumentException {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(macString),
-                                    "macString must not be null or empty");
-        Preconditions.checkArgument(macString.length() == (STRING_LENGTH),
-                FORMAT_ERROR + macString);
+        if (macString == null) {
+            throw new NullPointerException("macString must not be null");
+        }
 
         int index = 0;
         int shift = 40;
         long raw = 0;
 
+        if (macString.length() != MAC_STRING_LENGTH) {
+            throw new IllegalArgumentException(FORMAT_ERROR + macString);
+        }
+
         while (shift >= 0) {
             int digit1 = Character.digit(macString.charAt(index++), 16);
             int digit2 = Character.digit(macString.charAt(index++), 16);
@@ -99,8 +101,7 @@
 
     /**
      * Creates a {@link MacAddress} from a {@link DatapathId}. This factory
-     * method assumes that the {@link MacAddress} is composed of the last six
-     * bytes of the supplied {@link DatapathId}.
+     * method assumes that the first two bytes of the {@link DatapathId} are 0 bytes.
      * @param dpid the {@link DatapathId} to create the {@link MacAddress} from
      * @return a {@link MacAddress} derived from the supplied {@link DatapathId}
      */
@@ -108,8 +109,14 @@
         Preconditions.checkNotNull(dpid, "dpid must not be null");
 
         byte[] dpidBytes = dpid.getBytes();
-        byte[] macBytes = Arrays.copyOfRange(dpidBytes, 2, 8);
-        return MacAddress.of(macBytes);
+
+        if (dpidBytes[0] == 0
+                && dpidBytes[1] == 0) {
+            return MacAddress.of(dpid.getLong());
+        } else {
+            throw new IllegalArgumentException("First two bytes of supplied "
+                    + "Datapathid must be 0");
+        }
     }
 
     private volatile byte[] bytesCache = null;
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBooleanValue.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBooleanValue.java
index a667db6..99416a3 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBooleanValue.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBooleanValue.java
@@ -18,6 +18,8 @@
 package org.projectfloodlight.openflow.types;
 
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
 
 import com.google.common.hash.PrimitiveSink;
@@ -29,6 +31,8 @@
     public final static OFBooleanValue NO_MASK = TRUE;
     public final static OFBooleanValue FULL_MASK = FALSE;
 
+    public final static Reader READER_INSTANCE = new Reader();
+
     private final boolean value;
 
     private OFBooleanValue(boolean value) {
@@ -79,6 +83,13 @@
         bb.writeByte(getInt());
     }
 
+    private static class Reader implements OFMessageReader<OFBooleanValue> {
+        @Override
+        public OFBooleanValue readFrom(ChannelBuffer bb) throws OFParseError {
+            return of(bb.readByte() != 0);
+        }
+    }
+
     @Override
     public int getLength() {
         return 1;