diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index c8f70e6..6aac39c 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -74,6 +74,7 @@
     write_blacklist = defaultdict(
         lambda: set(),
         OFOxm=set(('typeLen',)),
+        OFOxs=set(('typeLen',)),
         OFAction=set(('type',)),
         OFInstruction=set(('type',)),
         OFFlowMod=set(('command', )),
@@ -81,7 +82,7 @@
         OFActionExperimenter=set(('data',)),
         OFBsnTlv=set(('type',)))
     # interfaces that are virtual
-    virtual_interfaces = set(['OFOxm', 'OFInstruction', 'OFFlowMod', 'OFBsnVport' ])
+    virtual_interfaces = set(['OFOxm', 'OFInstruction', 'OFFlowMod', 'OFBsnVport', 'OFOxs' ])
 
     # Registry of nullable properties:
     # ${java_class_name} -> set(${java_property_name})
@@ -223,13 +224,13 @@
 
         factories = OrderedDict()
 
-        sub_factory_classes = ("OFAction", "OFInstruction", "OFMeterBand", "OFOxm", "OFQueueProp", "OFErrorMsg", "OFActionId", "OFInstructionId", "OFBsnTlv")
+        sub_factory_classes = ("OFAction", "OFInstruction", "OFMeterBand", "OFOxm", "OFQueueProp", "OFErrorMsg", "OFActionId", "OFInstructionId", "OFBsnTlv", "OFOxs")
         for base_class in sub_factory_classes:
             package = base_class[2:].lower()
             remove_prefix = base_class[2].lower() + base_class[3:]
 
             # HACK need to have a better way to deal with parameterized base classes
-            annotated_base_class = base_class + "<?>" if base_class == "OFOxm" else base_class
+            annotated_base_class = base_class + "<?>" if base_class == "OFOxm" or base_class == "OFOxs" else base_class
 
             factories[base_class] = OFFactory(package="%s.%s" % (prefix, package),
                     name=base_class + "s", members=[], remove_prefix=remove_prefix, base_class=annotated_base_class, sub_factories={}, xid_generator= (base_class == "OFErrorMsg"))
@@ -268,6 +269,8 @@
         """
         if clazz.interface.name.startswith("OFMatchV"):
             return True
+        if clazz.interface.name.startswith("OFStatV"):
+            return True
         elif clazz.name == "OFTableModVer10":
             # tablemod ver 10 is a hack and has no oftype defined
             return False
@@ -279,6 +282,8 @@
             return True
         if loxi_utils.class_is_instruction(clazz.interface.c_name):
             return True
+        if loxi_utils.class_is_oxs(clazz.interface.c_name):
+            return True
         else:
             return True
 
@@ -291,6 +296,15 @@
                                        masked=oxm.ir_class.name.endswith("_masked")))
                   for oxm in self.interfaces if oxm.ir_class.is_subclassof("of_oxm") )
 
+    @property
+    @memoize
+    def oxs_map(self):
+        OxsMapEntry = namedtuple("OxsMapEntry", ["type_name", "value", "masked" ])
+        return OrderedDict( (oxs.name, OxsMapEntry(type_name=oxs.member_by_name("value").java_type.public_type,
+                                       value=re.sub(r'^of_oxs_', r'', re.sub(r'_masked$', r'', oxs.ir_class.name)).upper(),
+                                       masked=oxs.ir_class.name.endswith("_masked")))
+                  for oxs in self.interfaces if oxs.ir_class.is_subclassof("of_oxs") )
+
 class OFFactory(namedtuple("OFFactory", ("package", "name", "members", "remove_prefix", "base_class", "sub_factories", "xid_generator"))):
     @property
     def factory_classes(self):
@@ -467,6 +481,8 @@
                 return "instructionid"
             elif i.is_instanceof("of_oxm"):
                 return "oxm"
+            elif i.is_instanceof("of_oxs"):
+                return "oxs"
             elif i.is_instanceof("of_meter_band"):
                 return "meterband"
             elif i.is_instanceof("of_queue_prop"):
@@ -479,6 +495,8 @@
         def calc_super_name(i):
             if re.match('of_match_.*', i.name):
                 return "Match"
+            elif re.match('of_stat_.*', i.name):
+                return "Stat"
             else:
                 ir_super_class = self.ir_class.superclass
                 return java_class_name(ir_super_class.name) if ir_super_class else ""
@@ -501,12 +519,20 @@
                     type_annotation)
         elif self.name == "OFOxm":
             return (package, None, "T extends OFValueType<T>")
+        elif self.name == "OFOxs":
+            return (package, None, "T extends OFValueType<T>")
         elif loxi_utils.class_is_oxm(self.c_name):
             # look up type from member value for OFValueType type annotation
             if self.member_by_name("value") is not None:
                 return (package, "OFOxm<%s>" % self.member_by_name("value").java_type.public_type, None)
             else:
                 return (package, "OFOxm", None)
+        elif loxi_utils.class_is_oxs(self.c_name):
+            # look up type from member value for OFValueType type annotation
+            if self.member_by_name("value") is not None:
+                return (package, "OFOxs<%s>" % self.member_by_name("value").java_type.public_type, None)
+            else:
+                return (package, "OFOxs", None)
         else:
             return (package, super_name, None)
 
@@ -571,6 +597,11 @@
                     JavaVirtualMember(self, "masked", java_type.boolean),
                     JavaVirtualMember(self, "canonical", java_type.make_oxm_jtype("T"))
                    ]
+        elif self.name == "OFOxs":
+            virtual_members += [
+                    JavaVirtualMember(self, "value", java_type.generic_t),
+                    JavaVirtualMember(self, "statField", java_type.make_stat_field_jtype("T")),
+                   ]
         elif self.ir_class.is_subclassof("of_oxm"):
             value = find(lambda m: m.name=="value", self.ir_model_members)
             if value:
@@ -587,6 +618,22 @@
             if not find(lambda x: x.name == "mask", self.ir_model_members):
                 virtual_members.append(
                         JavaVirtualMember(self, "mask", find(lambda x: x.name == "value", self.ir_model_members).java_type))
+        elif self.ir_class.is_subclassof("of_oxs"):
+            value = find(lambda m: m.name=="value", self.ir_model_members)
+            if value:
+                field_type = java_type.make_stat_field_jtype(value.java_type.public_type)
+            else:
+                field_type = java_type.make_stat_field_jtype()
+
+            virtual_members += [
+                    JavaVirtualMember(self, "statField", field_type),
+                    JavaVirtualMember(self, "masked", java_type.boolean),
+                    JavaVirtualMember(self, "canonical", java_type.make_oxs_jtype(value.java_type.public_type),
+                            custom_template=lambda builder: "OFOxs{}_getCanonical.java".format(".Builder" if builder else "")),
+                   ]
+            if not find(lambda x: x.name == "mask", self.ir_model_members):
+                virtual_members.append(
+                        JavaVirtualMember(self, "mask", find(lambda x: x.name == "value", self.ir_model_members).java_type))
         elif self.name =="OFErrorMsg":
             virtual_members += [ JavaVirtualMember(self, "data", java_type.error_cause_data) ]
 
@@ -720,6 +767,19 @@
                     JavaVirtualMember(self, "matchField", java_type.make_match_field_jtype(), "null"),
                     JavaVirtualMember(self, "masked", java_type.boolean, "false"),
                  ]
+        elif self.ir_class.is_subclassof("of_oxs"):
+            value_member = find(lambda m: m.name, self.ir_model_members)
+            if value_member:
+                oxs_entry = model.oxs_map[self.interface.name]
+                virtual_members += [
+                    JavaVirtualMember(self, "statField", java_type.make_stat_field_jtype(value_member.java_type.public_type), "StatField.%s" % oxs_entry.value),
+                    JavaVirtualMember(self, "masked", java_type.boolean, "true" if oxs_entry.masked else "false"),
+                    ]
+            else:
+                virtual_members += [
+                    JavaVirtualMember(self, "statField", java_type.make_stat_field_jtype(), "null"),
+                    JavaVirtualMember(self, "masked", java_type.boolean, "false"),
+                 ]
         if not find(lambda m: m.name == "version", self.ir_model_members):
             virtual_members.append(JavaVirtualMember(self, "version", java_type.of_version, "OFVersion.%s" % self.version.constant_version))
 
@@ -890,6 +950,16 @@
         else:
             return self.java_type.format_value(self.member.value, pub_type=False)
 
+    @property
+    def needs_setter(self):
+        if self.is_writeable:
+            return True
+        super_class = self.msg.super_class
+        if super_class:
+            super_member = super_class.member_by_name(self.name)
+            if super_member:
+                return super_member.needs_setter
+        return False
 
     @property
     def is_writeable(self):
@@ -1037,11 +1107,11 @@
     @property
     def name(self):
         return self.test_class_name
-    
+
     @property
     def interface(self):
         return self.java_class.interface
-    
+
     @property
     def has_test_data(self):
         return test_data.exists(self.data_file_name)
diff --git a/java_gen/java_type.py b/java_gen/java_type.py
index a50bfa9..d50094f 100644
--- a/java_gen/java_type.py
+++ b/java_gen/java_type.py
@@ -88,7 +88,7 @@
 class JType(object):
     """ Wrapper class to hold C to Java type conversion information. JTypes can have a 'public'
         and or 'private' java type associated with them and can define how those types can be
-        read from and written to ChannelBuffers.
+        read from and written to ByteBufs.
 
     """
     def __init__(self, pub_type, priv_type=None):
@@ -163,7 +163,7 @@
             return reduce(lambda a,repl: a.replace("$%s" % repl[0], str(repl[1])),  arguments.items(), _op)
 
     def read_op(self, version=None, length=None, pub_type=True):
-        """ return a Java stanza that reads a value of this JType from ChannelBuffer bb.
+        """ return a Java stanza that reads a value of this JType from ByteBuf bb.
         @param version int - OF wire version to generate expression for
         @param pub_type boolean use this JTypes 'public' (True), or private (False) representation
         @param length string, for operations that need it (e.g., read a list of unknown length)
@@ -184,7 +184,7 @@
 
     def write_op(self, version=None, name=None, pub_type=True):
         """ return a Java stanza that writes a value of this JType contained in Java expression
-        'name' to ChannelBuffer bb.
+        'name' to ByteBuf bb.
         @param name string containing Java expression that evaluations to the value to be written
         @param version int - OF wire version to generate expression for
         @param pub_type boolean use this JTypes 'public' (True), or private (False) representation
@@ -208,7 +208,7 @@
         )
 
     def skip_op(self, version=None, length=None):
-        """ return a java stanza that skips an instance of JType in the input ChannelBuffer 'bb'.
+        """ return a java stanza that skips an instance of JType in the input ByteBuf 'bb'.
             This is used in the Reader implementations for virtual classes (because after the
             discriminator field, the concrete Reader instance will re-read all the fields)
             Currently just delegates to read_op + throws away the result."""
@@ -259,7 +259,7 @@
 
 def gen_list_jtype(java_base_name):
     # read op assumes the class has a public final static field READER that implements
-    # OFMessageReader<$class> i.e., can deserialize an instance of class from a ChannelBuffer
+    # OFMessageReader<$class> i.e., can deserialize an instance of class from a ByteBuf
     # write op assumes class implements Writeable
     return JType("List<{}>".format(java_base_name)) \
         .op(
@@ -349,6 +349,11 @@
         .op(read='ChannelUtilsVer$version.readOFMatch(bb)', \
             write='$name.writeTo(bb)',
             default="OFFactoryVer$version.MATCH_WILDCARD_ALL");
+of_stat = JType('Stat') \
+         .op(read='ChannelUtilsVer$version.readOFStat(bb)', write='$name.writeTo(bb)')
+of_time = JType('OFTime') \
+         .op(read='OFTimeVer$version.READER.readFrom(bb)', \
+             write='$name.writeTo(bb)')
 group_mod_cmd = JType('OFGroupModCommand', 'short') \
         .op(version=ANY, read="bb.readShort()", write="bb.writeShort($name)")
 flow_mod_cmd = JType('OFFlowModCommand', 'short') \
@@ -358,6 +363,15 @@
         .op(read="MacAddress.read6Bytes(bb)", \
             write="$name.write6Bytes(bb)",
             default="MacAddress.NONE")
+vxlan_ni = JType('VxlanNI') \
+        .op(read="VxlanNI.read4Bytes(bb)", \
+            write="$name.write4Bytes(bb)",
+            default="VxlanNI.ZERO")
+
+vfi = JType('VFI') \
+        .op(read="VFI.read2Bytes(bb)", \
+            write="$name.write2Bytes(bb)",
+            default="VFI.ZERO")
 
 port_name = gen_fixed_length_string_jtype(16)
 app_code = gen_fixed_length_string_jtype(15)
@@ -432,6 +446,9 @@
         .op(read="IPv6FlowLabel.read4Bytes(bb)",
             write="$name.write4Bytes(bb)",
             default="IPv6FlowLabel.NONE")
+packet_type = JType("PacketType") \
+        .op(read="PacketType.read4Bytes(bb)",
+            write="$name.write4Bytes(bb)")
 metadata = JType("OFMetadata")\
         .op(read="OFMetadata.read8Bytes(bb)",
             write="$name.write8Bytes(bb)",
@@ -444,6 +461,17 @@
             read= 'OFOxmList.readFrom(bb, $length, OFOxmVer$version.READER)', \
             write='$name.writeTo(bb)',
             default="OFOxmList.EMPTY")
+connection_uri = JType("OFConnectionIndex") \
+        .op(read="OFConnectionIndex.read4Bytes(bb)",
+            write="$name.write4Bytes(bb)")
+#Fixed Ver15 (FIXME for 1.5 + versions)
+oxs = JType("OFOxs<?>")\
+        .op(read="OFOxsVer15.READER.readFrom(bb)",
+            write="$name.writeTo(bb)")
+oxs_list = JType("OFOxsList") \
+        .op(read= 'OFOxsList.readFrom(bb, $length, OFOxsVer15.READER)', \
+            write='$name.writeTo(bb)',
+            default="OFOxsList.EMPTY")
 meter_features = JType("OFMeterFeatures")\
         .op(read="OFMeterFeaturesVer$version.READER.readFrom(bb)",
             write="$name.writeTo(bb)")
@@ -485,6 +513,7 @@
             .op(read='bb.readByte()', write='bb.writeByte($name)')
 
 port_speed = JType("PortSpeed")
+
 error_type = JType("OFErrorType")
 of_message = JType("OFMessage")\
             .op(read="OFMessageVer$version.READER.readFrom(bb)",
@@ -564,6 +593,9 @@
         .op(read='OFTableDescVer$version.READER.readFrom(bb)', \
             write='$name.writeTo(bb)')
 
+controller_status_entry = JType('OFControllerStatusEntry') \
+        .op(read='OFControllerStatusEntryVer$version.READER.readFrom(bb)', \
+            write='$name.writeTo(bb)')
 
 default_mtype_to_jtype_convert_map = {
         'uint8_t' : u8,
@@ -581,10 +613,13 @@
         'list(of_uint16_t)' : u16_list,
         'list(of_uint8_t)' : u8_list,
         'list(of_oxm_t)' : oxm_list,
+        'list(of_oxs_t)' : oxs_list,
         'list(of_ipv4_t)' : ipv4_list,
         'list(of_ipv6_t)' : ipv6_list,
         'of_octets_t' : octets,
         'of_match_t': of_match,
+        'of_stat_t' : of_stat,
+        'of_controller_uri_t' : connection_uri,
         'of_fm_cmd_t': flow_mod_cmd,
         'of_mac_addr_t': mac_addr,
         'of_port_desc_t': port_desc,
@@ -600,6 +635,7 @@
         'of_ipv6_t': ipv6,
         'of_wc_bmap_t': flow_wildcards,
         'of_oxm_t': oxm,
+        'of_oxs_t': oxs,
         'of_meter_features_t': meter_features,
         'of_bitmap_128_t': port_bitmap_128,
         'of_bitmap_256_t': port_bitmap_256,
@@ -611,6 +647,9 @@
         'of_table_desc_t': table_desc,
         'of_odu_sig_id_t': odu_sig_id,
         'of_och_sig_id_t' : sig_id,
+        'of_controller_status_entry_t' : controller_status_entry,
+        'of_time_t' : of_time,
+        'of_header_t' : of_message,
         }
 
 ## Map that defines exceptions from the standard loxi->java mapping scheme
@@ -679,6 +718,21 @@
         'of_oxm_conntrack_label' : { 'value' : port_bitmap_128 },
         'of_oxm_conntrack_label_masked' : { 'value' : port_bitmap_128, 'value_mask' : port_bitmap_128 },
 
+        'of_oxm_tcp_flags' : { 'value' : u16obj },
+        'of_oxm_tcp_flags_masked' : { 'value' : u16obj, 'value_mask' : u16obj },
+        'of_oxm_ovs_tcp_flags' : { 'value' : u16obj },
+        'of_oxm_ovs_tcp_flags_masked' : { 'value' : u16obj, 'value_mask' : u16obj },
+        'of_oxm_actset_output' : { 'value' : of_port },
+        'of_oxm_actset_output_masked' : { 'value' : of_port, 'value_mask' : of_port },
+        'of_oxm_packet_type' : { 'value' : packet_type },
+        'of_oxm_packet_type_masked' : { 'value' : packet_type, 'value_mask' : packet_type },
+
+        'of_oxs_byte_count' : { 'value' : u64 },
+        'of_oxs_duration' : { 'value' : u64 },
+        'of_oxs_flow_count' : { 'value' : u32obj },
+        'of_oxs_idle_time' : { 'value' : u64 },
+        'of_oxs_packet_count' : { 'value' : u64 },
+
         'of_oxm_bsn_in_ports_128' : { 'value': port_bitmap_128 },
         'of_oxm_bsn_in_ports_128_masked' : { 'value': port_bitmap_128, 'value_mask': port_bitmap_128 },
 
@@ -745,8 +799,8 @@
         'of_oxm_bsn_l2_cache_hit' : { 'value' : boolean_value },
         'of_oxm_bsn_l2_cache_hit_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },
 
-        'of_oxm_bsn_vxlan_network_id' : { 'value' : u32obj },
-        'of_oxm_bsn_vxlan_network_id_masked' : { 'value' : u32obj, 'value_mask' : u32obj },
+        'of_oxm_bsn_vxlan_network_id' : { 'value' : vxlan_ni },
+        'of_oxm_bsn_vxlan_network_id_masked' : { 'value' : vxlan_ni, 'value_mask' : vxlan_ni},
 
         'of_oxm_bsn_inner_eth_dst' : { 'value' : mac_addr },
         'of_oxm_bsn_inner_eth_dst_masked' : { 'value' : mac_addr, 'value_mask' : mac_addr },
@@ -757,6 +811,12 @@
         'of_oxm_bsn_inner_vlan_vid' : { 'value' : vlan_vid_match },
         'of_oxm_bsn_inner_vlan_vid_masked' : { 'value' : vlan_vid_match, 'value_mask' : vlan_vid_match },
 
+        'of_oxm_bsn_vfi' : { 'value' : vfi },
+        'of_oxm_bsn_vfi_masked' : { 'value' : vfi, 'value_mask' : vfi },
+
+        'of_oxm_bsn_ip_fragmentation' : { 'value' : boolean_value },
+        'of_oxm_bsn_ip_fragmentation_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },
+
         'of_table_stats_entry': { 'wildcards': table_stats_wildcards },
         'of_match_v1': { 'vlan_vid' : vlan_vid_match, 'vlan_pcp': vlan_pcp,
                 'eth_type': eth_type, 'ip_dscp': ip_dscp, 'ip_proto': ip_proto,
@@ -787,6 +847,8 @@
         'of_group_add' : { 'command' : group_mod_cmd },
         'of_group_modify' : { 'command' : group_mod_cmd },
         'of_group_delete' : { 'command' : group_mod_cmd },
+        'of_group_insert_bucket': {'command' : group_mod_cmd },
+        'of_group_remove_bucket' : {'command' : group_mod_cmd },
 
         'of_bucket' : { 'watch_group': of_group },
 
@@ -881,7 +943,7 @@
         'of_oxm_tun_gpe_flags' : { 'value' : u8obj },
         'of_oxm_tun_gpe_flags_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
 
-        'of_oxm_ofdpa_mpls_type': { 'value': u16obj },
+        'of_oxm_ofdpa_mpls_type' : { 'value': u16obj },
 
         'of_oxm_ofdpa_qos_index': { 'value': u8obj },
 
@@ -889,6 +951,8 @@
         'of_oxm_ofdpa_mpls_l2_port_masked': { 'value': u32obj, 'value_mask': u32obj },
 
         'of_oxm_ofdpa_ovid': { 'value': u16obj },
+
+        'of_flow_lightweight_stats_request' : { 'out_group' : of_group }
 }
 
 
@@ -903,9 +967,15 @@
 def make_match_field_jtype(sub_type_name="?"):
     return JType("MatchField<{}>".format(sub_type_name))
 
+def make_stat_field_jtype(sub_type_name="?"):
+    return JType("StatField<{}>".format(sub_type_name))
+
 def make_oxm_jtype(sub_type_name="?"):
     return JType("OFOxm<{}>".format(sub_type_name))
 
+def make_oxs_jtype(sub_type_name="?"):
+    return JType("OFOxs<{}>".format(sub_type_name))
+
 def list_cname_to_java_name(c_type):
     m = re.match(r'list\(of_([a-zA-Z_]+)_t\)', c_type)
     if not m:
diff --git a/java_gen/pre-written/pom.xml b/java_gen/pre-written/pom.xml
index cc6da6b..a047f1d 100644
--- a/java_gen/pre-written/pom.xml
+++ b/java_gen/pre-written/pom.xml
@@ -10,11 +10,11 @@
 
     <groupId>org.onosproject</groupId>
     <artifactId>openflowj</artifactId>
-    <version>0.9.9.onos-SNAPSHOT</version>
+    <version>3.2.0.onos-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>OpenFlowJ-Loxi</name>
-    <description>OpenFlowJ API supporting OpenFlow versions 1.0 through 1.3.1, generated by LoxiGen</description>
+    <description>OpenFlowJ API supporting OpenFlow versions 1.0 through 1.5.1, generated by LoxiGen</description>
     <url>http://www.projectfloodlight.org/projects/</url>
     <licenses>
         <license>
@@ -45,8 +45,7 @@
         <dependency>
             <groupId>com.google.code.findbugs</groupId>
             <artifactId>annotations</artifactId>
-            <version>3.0.0</version>
-            <scope>provided</scope>
+            <version>3.0.1u2</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
@@ -62,18 +61,28 @@
         </dependency>
         <dependency>
             <groupId>io.netty</groupId>
-            <artifactId>netty</artifactId>
-            <version>3.10.5.Final</version>
+            <artifactId>netty-all</artifactId>
+            <version>4.0.31.Final</version>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>19.0</version>
+            <version>20.0</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>1.7.13</version>
+            <version>1.7.22</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.1.10</version>
         </dependency>
     </dependencies>
     <build>
@@ -135,6 +144,9 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-javadoc-plugin</artifactId>
                 <version>2.9.1</version>
+                <configuration>
+                        <maxmemory>1024m</maxmemory>
+                </configuration>
                 <executions>
                     <execution>
                         <id>attach-javadocs</id>
@@ -243,6 +255,18 @@
                 <artifactId>maven-bundle-plugin</artifactId>
                 <version>3.0.1</version>
                 <extensions>true</extensions>
+                <configuration>
+                    <niceManifest>true</niceManifest>
+                    <instructions>
+                      <!-- Compile-time dependency can be optional-->
+                      <!-- Any Guava version 20.0 or later-->
+                      <Import-Package>
+                          javax.annotation;resolution:=optional,
+                          com.google.*;version=20.0,
+                          *
+                      </Import-Package>
+                    </instructions>
+                </configuration>
             </plugin>
         </plugins>
         <resources>
@@ -277,6 +301,9 @@
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-javadoc-plugin</artifactId>
                   <version>2.9.1</version>
+                <configuration>
+                        <maxmemory>1024m</maxmemory>
+                </configuration>
                   <executions>
                       <execution>
                           <id>attach-javadocs</id>
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageReader.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageReader.java
index 8837867..ca28daf 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageReader.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageReader.java
@@ -1,8 +1,8 @@
 package org.projectfloodlight.openflow.protocol;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 public interface OFMessageReader<T> {
-    T readFrom(ChannelBuffer bb) throws OFParseError;
+    T readFrom(ByteBuf bb) throws OFParseError;
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageWriter.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageWriter.java
index bec5634..5890ce3 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageWriter.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFMessageWriter.java
@@ -1,8 +1,8 @@
 package org.projectfloodlight.openflow.protocol;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 public interface OFMessageWriter<T> {
-    public void write(ChannelBuffer bb, T message) throws OFParseError;
+    public void write(ByteBuf bb, T message) throws OFParseError;
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFObjectFactory.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFObjectFactory.java
index c5869ef..a829b22 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFObjectFactory.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFObjectFactory.java
@@ -1,7 +1,7 @@
 package org.projectfloodlight.openflow.protocol;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 public interface OFObjectFactory<T extends OFObject> {
-    T read(ChannelBuffer buffer);
+    T read(ByteBuf buffer);
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxmList.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxmList.java
index 7f66110..5b13da8 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxmList.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxmList.java
@@ -4,7 +4,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.match.MatchField;
 import org.projectfloodlight.openflow.protocol.match.MatchFields;
@@ -97,13 +97,13 @@
         return new OFOxmList(map);
     }
 
-    public static OFOxmList readFrom(ChannelBuffer bb, int length,
+    public static OFOxmList readFrom(ByteBuf bb, int length,
             OFMessageReader<OFOxm<?>> reader) throws OFParseError {
         return ofList(ChannelUtils.readList(bb, length, reader));
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         for (OFOxm<?> o : this) {
             o.writeTo(bb);
         }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxsList.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxsList.java
new file mode 100644
index 0000000..1111088
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFOxsList.java
@@ -0,0 +1,140 @@
+package org.projectfloodlight.openflow.protocol;
+
+import java.util.EnumMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+import org.projectfloodlight.openflow.protocol.oxs.OFOxs;
+import org.projectfloodlight.openflow.protocol.stat.StatField;
+import org.projectfloodlight.openflow.protocol.stat.StatFields;
+import org.projectfloodlight.openflow.types.OFValueType;
+import org.projectfloodlight.openflow.types.PrimitiveSinkable;
+import org.projectfloodlight.openflow.util.ChannelUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.hash.PrimitiveSink;
+
+import io.netty.buffer.ByteBuf;
+
+
+public class OFOxsList implements Iterable<OFOxs<?>>, Writeable, PrimitiveSinkable {
+    private static final Logger logger = LoggerFactory.getLogger(OFOxsList.class);
+
+    private final Map<StatFields, OFOxs<?>> oxsMap;
+
+    public final static OFOxsList EMPTY = new OFOxsList(ImmutableMap.<StatFields, OFOxs<?>>of());
+
+    private OFOxsList(Map<StatFields, OFOxs<?>> oxsMap) {
+        this.oxsMap = oxsMap;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends OFValueType<T>> OFOxs<T> get(StatField<T> statField) {
+        return (OFOxs<T>) oxsMap.get(statField.id);
+    }
+
+    public static class Builder {
+        private final Map<StatFields, OFOxs<?>> oxsMap;
+
+        public Builder() {
+            oxsMap = new EnumMap<StatFields, OFOxs<?>>(StatFields.class);
+        }
+
+        public Builder(EnumMap<StatFields, OFOxs<?>> oxsMap) {
+            this.oxsMap = oxsMap;
+        }
+
+        public <T extends OFValueType<T>> void set(OFOxs<T> oxs) {
+            oxsMap.put(oxs.getStatField().id, oxs);
+        }
+
+        public <T extends OFValueType<T>> void unset(StatField<T> statField) {
+            oxsMap.remove(statField.id);
+        }
+
+        public OFOxsList build() {
+            return OFOxsList.ofList(oxsMap.values());
+        }
+    }
+
+    @Override
+    public Iterator<OFOxs<?>> iterator() {
+        return oxsMap.values().iterator();
+    }
+
+    public static OFOxsList ofList(Iterable<OFOxs<?>> oxsList) {
+        Map<StatFields, OFOxs<?>> map = new EnumMap<StatFields, OFOxs<?>>(
+                StatFields.class);
+        for (OFOxs<?> o : oxsList) {
+            map.put(o.getStatField().id, o);
+        }
+        return new OFOxsList(map);
+    }
+
+    public static OFOxsList of(OFOxs<?>... oxss) {
+        Map<StatFields, OFOxs<?>> map = new EnumMap<StatFields, OFOxs<?>>(
+                StatFields.class);
+        for (OFOxs<?> o : oxss) {
+            map.put(o.getStatField().id, o);
+        }
+        return new OFOxsList(map);
+    }
+
+    public static OFOxsList readFrom(ByteBuf bb, int length,
+            OFMessageReader<OFOxs<?>> reader) throws OFParseError {
+        return ofList(ChannelUtils.readList(bb, length, reader));
+    }
+
+    @Override
+    public void writeTo(ByteBuf bb) {
+        for (OFOxs<?> o : this) {
+            o.writeTo(bb);
+        }
+    }
+
+    public OFOxsList.Builder createBuilder() {
+        return new OFOxsList.Builder(new EnumMap<StatFields, OFOxs<?>>(oxsMap));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((oxsMap == null) ? 0 : oxsMap.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        OFOxsList other = (OFOxsList) obj;
+        if (oxsMap == null) {
+            if (other.oxsMap != null)
+                return false;
+        } else if (!oxsMap.equals(other.oxsMap))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "OFOxsList" + oxsMap;
+    }
+
+    @Override
+    public void putTo(PrimitiveSink sink) {
+        for (OFOxs<?> o : this) {
+            o.putTo(sink);
+        }
+    }
+
+
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFVersion.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFVersion.java
index 0c54fdc..ccb7f68 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFVersion.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/OFVersion.java
@@ -1,7 +1,7 @@
 package org.projectfloodlight.openflow.protocol;
 
 public enum OFVersion {
-    OF_10(1), OF_11(2), OF_12(3), OF_13(4), OF_14(5);
+    OF_10(1), OF_11(2), OF_12(3), OF_13(4), OF_14(5), OF_15(6);
 
     public final int wireVersion;
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Writeable.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Writeable.java
index 31ae9ab..32aaf2b 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Writeable.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Writeable.java
@@ -1,7 +1,7 @@
 package org.projectfloodlight.openflow.protocol;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 public interface Writeable {
-    void writeTo(ChannelBuffer bb);
+    void writeTo(ByteBuf bb);
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Match.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Match.java
index 67513b9..fdd1ca7 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Match.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Match.java
@@ -56,6 +56,7 @@
      * </ul>
      * If one of the above conditions does not hold, returns null. Value is returned masked if partially wildcarded.
      *
+     * @param <F> MatchField type
      * @param field Match field to retrieve
      * @return Value of match field (may be masked), or <code>null</code> if field is one of the conditions above does not hold.
      * @throws UnsupportedOperationException If field is not supported.
@@ -67,6 +68,7 @@
      * Prerequisite: field is partially masked.
      * If prerequisite is not met, a <code>null</code> is returned.
      *
+     * @param <F> MatchField type
      * @param field Match field to retrieve.
      * @return Masked value of match field or null if no mask is set.
      * @throws UnsupportedOperationException If field is not supported.
@@ -128,7 +130,7 @@
      * match. This includes the match fields that are exact or masked match
      * (but not fully wildcarded).
      *
-     * @return
+     * @return the Iterable of MatchField
      */
     public Iterable<MatchField<?>> getMatchFields();
 
@@ -169,6 +171,7 @@
         /**
          * Sets a specific exact value for a field.
          *
+         * @param <F> MatchField and value type
          * @param field Match field to set.
          * @param value Value of match field.
          * @return the Builder instance used.
@@ -179,6 +182,7 @@
         /**
          * Sets a masked value for a field.
          *
+         * @param <F> MatchField, value, and mask type
          * @param field Match field to set.
          * @param value Value of field.
          * @param mask Mask value.
@@ -190,6 +194,7 @@
         /**
          * Sets a masked value for a field.
          *
+         * @param <F> MatchField and value with mask type
          * @param field Match field to set.
          * @param valueWithMask Compound Masked object contains the value and the mask.
          * @return the Builder instance used.
@@ -200,6 +205,7 @@
         /**
          * Unsets any value given for the field and wildcards it so that it matches any value.
          *
+         * @param <F> MatchField type
          * @param field Match field to unset.
          * @return the Builder instance used.
          * @throws UnsupportedOperationException If field is not supported.
@@ -213,4 +219,4 @@
          */
         public Match build();
     }
-}
\ No newline at end of file
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
index 48f38d7..33a6736 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
@@ -21,6 +21,7 @@
 import org.projectfloodlight.openflow.types.OFValueType;
 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
 import org.projectfloodlight.openflow.types.TransportPort;
+import org.projectfloodlight.openflow.types.PacketType;
 import org.projectfloodlight.openflow.types.U16;
 import org.projectfloodlight.openflow.types.U32;
 import org.projectfloodlight.openflow.types.U64;
@@ -30,16 +31,22 @@
 import org.projectfloodlight.openflow.types.VlanPcp;
 import org.projectfloodlight.openflow.types.CircuitSignalID;
 import org.projectfloodlight.openflow.types.OduSignalID;
+import org.projectfloodlight.openflow.types.VxlanNI;
+import org.projectfloodlight.openflow.types.VFI;
+
+import java.util.Set;
+import com.google.common.collect.ImmutableSet;
 
 public class MatchField<F extends OFValueType<F>> {
     private final String name;
     public final MatchFields id;
-    private final Prerequisite<?>[] prerequisites;
+    private final Set<Prerequisite<?>> prerequisites;
 
     private MatchField(final String name, final MatchFields id, Prerequisite<?>... prerequisites) {
         this.name = name;
         this.id = id;
-        this.prerequisites = prerequisites;
+        /* guaranteed non-null (private constructor); 'null' isn't passed as prerequisites */
+        this.prerequisites = ImmutableSet.copyOf(prerequisites);
     }
 
     public final static MatchField<OFPort> IN_PORT =
@@ -197,10 +204,26 @@
             new MatchField<U64>("tunnel_id", MatchFields.TUNNEL_ID);
 
     public final static MatchField<U16> IPV6_EXTHDR =
-            new MatchField<U16>("ipv6_exthdr", MatchFields.IPV6_EXTHDR);
+            new MatchField<U16>("ipv6_exthdr", MatchFields.IPV6_EXTHDR,
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv6));
 
     public final static MatchField<OFBooleanValue> PBB_UCA =
-            new MatchField<OFBooleanValue>("pbb_uca", MatchFields.PBB_UCA);
+            new MatchField<OFBooleanValue>("pbb_uca", MatchFields.PBB_UCA,
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.PBB));
+
+    public final static MatchField<U16> TCP_FLAGS =
+            new MatchField<U16>("tcp_flags", MatchFields.TCP_FLAGS,
+                    new Prerequisite<IpProtocol>(MatchField.IP_PROTO, IpProtocol.TCP));
+
+    public final static MatchField<U16> OVS_TCP_FLAGS =
+            new MatchField<U16>("ovs_tcp_flags", MatchFields.OVS_TCP_FLAGS,
+                    new Prerequisite<IpProtocol>(MatchField.IP_PROTO, IpProtocol.TCP));
+
+    public final static MatchField<PacketType> PACKET_TYPE =
+            new MatchField<PacketType>("packet_type", MatchFields.PACKET_TYPE);
+
+    public final static MatchField<OFPort> ACTSET_OUTPUT =
+            new MatchField<OFPort>("actset_output", MatchFields.ACTSET_OUTPUT);
 
     public final static MatchField<IPv4Address> TUNNEL_IPV4_SRC =
             new MatchField<IPv4Address>("tunnel_ipv4_src", MatchFields.TUNNEL_IPV4_SRC,
@@ -297,8 +320,8 @@
     public final static MatchField<OFBooleanValue> BSN_L2_CACHE_HIT =
             new MatchField<OFBooleanValue>("bsn_l2_cache_hit", MatchFields.BSN_L2_CACHE_HIT);
 
-    public final static MatchField<U32> BSN_VXLAN_NETWORK_ID =
-            new MatchField<U32>("bsn_vxlan_network_id", MatchFields.BSN_VXLAN_NETWORK_ID);
+    public final static MatchField<VxlanNI> BSN_VXLAN_NETWORK_ID =
+            new MatchField<VxlanNI>("bsn_vxlan_network_id", MatchFields.BSN_VXLAN_NETWORK_ID);
 
     public final static MatchField<MacAddress> BSN_INNER_ETH_DST =
             new MatchField<MacAddress>("bsn_inner_eth_dst", MatchFields.BSN_INNER_ETH_DST);
@@ -406,6 +429,13 @@
             new MatchField<U16>("ofdpa_ovid", MatchFields.OFDPA_OVID,
                 new Prerequisite<OFVlanVidMatch>(MatchField.VLAN_VID));
 
+    public final static MatchField<VFI> BSN_VFI =
+            new MatchField<VFI>("bsn_vfi", MatchFields.BSN_VFI);
+
+    public final static MatchField<OFBooleanValue> BSN_IP_FRAGMENTATION =
+            new MatchField<OFBooleanValue>("bsn_ip_fragmentation", MatchFields.BSN_IP_FRAGMENTATION,
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4, EthType.IPv6));
+
     public String getName() {
         return name;
     }
@@ -419,4 +449,15 @@
         return true;
     }
 
+    /**
+     * Retrieve what also must be matched in order to
+     * use this particular MatchField.
+     *
+     * @return unmodifiable view of the prerequisites
+     */
+    public Set<Prerequisite<?>> getPrerequisites() {
+        /* assumes non-null; guaranteed by constructor */
+        return this.prerequisites;
+    }
+
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
index 9274153..3f86466 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
@@ -2,6 +2,8 @@
 
 // MUST BE ORDERED BY THE ORDER OF OF SPEC!!!
 public enum MatchFields {
+    // if present, PacketType must appear as the first OXM in the list (OF 1.5., 7.2.3.11)
+    PACKET_TYPE,
     IN_PORT,
     IN_PHY_PORT,
     METADATA,
@@ -46,6 +48,9 @@
     CONNTRACK_LABEL,
     IPV6_EXTHDR,
     PBB_UCA,
+    TCP_FLAGS,
+    OVS_TCP_FLAGS,
+    ACTSET_OUTPUT,
     TUNNEL_IPV4_SRC,
     TUNNEL_IPV4_DST,
     BSN_IN_PORTS_128,
@@ -73,6 +78,7 @@
     BSN_INNER_ETH_DST,
     BSN_INNER_ETH_SRC,
     BSN_INNER_VLAN_VID,
+    BSN_VFI,
     OCH_SIGTYPE,
     OCH_SIGTYPE_BASIC,
     OCH_SIGID,
@@ -111,4 +117,5 @@
     OFDPA_MPLS_TYPE,
     OFDPA_MPLS_L2_PORT,
     OFDPA_OVID,
+    BSN_IP_FRAGMENTATION
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
index 03d5e79..dec9d21 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
@@ -1,7 +1,7 @@
 package org.projectfloodlight.openflow.protocol.match;
 
-import java.util.HashSet;
 import java.util.Set;
+import com.google.common.collect.ImmutableSet;
 
 import org.projectfloodlight.openflow.types.OFValueType;
 
@@ -12,15 +12,14 @@
 
     @SafeVarargs
     public Prerequisite(MatchField<T> field, OFValueType<T>... values) {
-        this.values = new HashSet<OFValueType<T>>();
         this.field = field;
+        /* possible null values, since public constructor */
         if (values == null || values.length == 0) {
             this.any = true;
+            this.values = ImmutableSet.of();
         } else {
             this.any = false;
-            for (OFValueType<T> value : values) {
-                this.values.add(value);
-            }
+            this.values = ImmutableSet.copyOf(values);
         }
     }
 
@@ -42,4 +41,22 @@
         return false;
     }
 
+    /**
+     * Get valid/possible values for this prerequisite match.
+     *
+     * @return unmodifiable set of possible values
+     */
+    public Set<OFValueType<T>> getValues() {
+        return this.values;   
+    }
+
+    /**
+     * Get the MatchField of this prerequisite.
+     *
+     * @return the MatchField that is required
+     */
+    public MatchField<T> getMatchField() {
+        return this.field; /* immutable */
+    }
+
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/Stat.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/Stat.java
new file mode 100644
index 0000000..618592a
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/Stat.java
@@ -0,0 +1,28 @@
+package org.projectfloodlight.openflow.protocol.stat;
+
+import org.projectfloodlight.openflow.protocol.OFObject;
+import org.projectfloodlight.openflow.types.OFValueType;
+
+public interface Stat extends OFObject {
+    public <F extends OFValueType<F>> F get(StatField<F> field) throws UnsupportedOperationException;
+    public boolean supports(StatField<?> field);
+    public Iterable<StatField<?>> getStatFields();
+    public Builder createBuilder();
+
+    interface Builder {
+        public <F extends OFValueType<F>> F get(StatField<F> field) throws UnsupportedOperationException;
+        /**
+         * Sets a specific value for a stat field.
+         *
+         * @param <F> StatField type
+         * @param field Stat field to set.
+         * @param value Value of stat field.
+         * @return the Builder instance used.
+         * @throws UnsupportedOperationException If field is not supported.
+         */
+        public <F extends OFValueType<F>> Builder set(StatField<F> field, F value) throws UnsupportedOperationException;
+
+        public boolean supports(StatField<?> field);
+        public Stat build();
+    }
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatField.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatField.java
new file mode 100644
index 0000000..b2bb911
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatField.java
@@ -0,0 +1,36 @@
+package org.projectfloodlight.openflow.protocol.stat;
+
+import org.projectfloodlight.openflow.types.OFValueType;
+import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U64;
+
+public class StatField<F extends OFValueType<F>> {
+
+    private final String name;
+    public final StatFields id;
+
+    private StatField(final String name, final StatFields id) {
+        this.name = name;
+        this.id = id;
+    }
+
+    public final static StatField<U64> DURATION =
+            new StatField<U64>("of_duration", StatFields.DURATION);
+
+    public final static StatField<U64> IDLE_TIME =
+            new StatField<U64>("of_idle_time", StatFields.IDLE_TIME);
+
+    public final static StatField<U32> FLOW_COUNT =
+            new StatField<U32>("of_flow_count", StatFields.FLOW_COUNT);
+
+    public final static StatField<U64> PACKET_COUNT =
+            new StatField<U64>("of_packet_count", StatFields.PACKET_COUNT);
+
+    public final static StatField<U64> BYTE_COUNT =
+            new StatField<U64>("of_byte_count", StatFields.BYTE_COUNT);
+
+    public String getName() {
+        return name;
+    }
+
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatFields.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatFields.java
new file mode 100644
index 0000000..374a92b
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/stat/StatFields.java
@@ -0,0 +1,10 @@
+package org.projectfloodlight.openflow.protocol.stat;
+
+//MUST BE ORDERED BY THE ORDER OF OF SPEC!!!
+public enum StatFields {
+    DURATION,
+    IDLE_TIME,
+    FLOW_COUNT,
+    PACKET_COUNT,
+    BYTE_COUNT,
+}
\ No newline at end of file
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver10/ChannelUtilsVer10.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver10/ChannelUtilsVer10.java
index b4937ba..74f75ba 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver10/ChannelUtilsVer10.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver10/ChannelUtilsVer10.java
@@ -3,25 +3,26 @@
 import java.util.EnumSet;
 import java.util.Set;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFActionType;
 import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
 
 import com.google.common.hash.PrimitiveSink;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into Unpooled
  *
  * @author capveg
  */
 
 public class ChannelUtilsVer10 {
-    public static Match readOFMatch(final ChannelBuffer bb) throws OFParseError {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
         return OFMatchV1Ver10.READER.readFrom(bb);
     }
 
-    public static Set<OFActionType> readSupportedActions(ChannelBuffer bb) {
+    public static Set<OFActionType> readSupportedActions(ByteBuf bb) {
         int actions = bb.readInt();
         EnumSet<OFActionType> supportedActions = EnumSet.noneOf(OFActionType.class);
         if ((actions & (1 << OFActionTypeSerializerVer10.OUTPUT_VAL)) != 0)
@@ -84,8 +85,12 @@
         sink.putInt(supportedActionsToWire(supportedActions));
     }
 
-    public static void writeSupportedActions(ChannelBuffer bb, Set<OFActionType> supportedActions) {
+    public static void writeSupportedActions(ByteBuf bb, Set<OFActionType> supportedActions) {
         bb.writeInt(supportedActionsToWire(supportedActions));
     }
 
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        throw new UnsupportedOperationException("not supported");
+    }
+
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver11/ChannelUtilsVer11.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver11/ChannelUtilsVer11.java
index b090e47..b09da37 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver11/ChannelUtilsVer11.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver11/ChannelUtilsVer11.java
@@ -1,26 +1,31 @@
 package org.projectfloodlight.openflow.protocol.ver11;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMatchBmap;
 import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into Unpooled
  *
  * @author capveg
  */
 
 public class ChannelUtilsVer11 {
-    public static Match readOFMatch(final ChannelBuffer bb) throws OFParseError {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
         return OFMatchV2Ver11.READER.readFrom(bb);
     }
 
-    public static OFMatchBmap readOFMatchBmap(ChannelBuffer bb) {
+    public static OFMatchBmap readOFMatchBmap(ByteBuf bb) {
         throw new UnsupportedOperationException("not implemented");
     }
 
-    public static void writeOFMatchBmap(ChannelBuffer bb, OFMatchBmap match) {
+    public static void writeOFMatchBmap(ByteBuf bb, OFMatchBmap match) {
         throw new UnsupportedOperationException("not implemented");
     }
+
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        throw new UnsupportedOperationException("not supported");
+    }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver12/ChannelUtilsVer12.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver12/ChannelUtilsVer12.java
index 756363d..5b28170 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver12/ChannelUtilsVer12.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver12/ChannelUtilsVer12.java
@@ -1,40 +1,45 @@
 package org.projectfloodlight.openflow.protocol.ver12;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMatchBmap;
 import org.projectfloodlight.openflow.protocol.match.Match;
 import org.projectfloodlight.openflow.protocol.ver12.OFMatchV3Ver12;
 import org.projectfloodlight.openflow.protocol.OFBsnVportQInQ;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into Unpooled
  *
  * @author capveg
  */
 
 public class ChannelUtilsVer12 {
-    public static Match readOFMatch(final ChannelBuffer bb) throws OFParseError {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
         return OFMatchV3Ver12.READER.readFrom(bb);
     }
 
     // TODO these need to be figured out / removed
 
-    public static OFBsnVportQInQ readOFBsnVportQInQ(ChannelBuffer bb) {
+    public static OFBsnVportQInQ readOFBsnVportQInQ(ByteBuf bb) {
         throw new UnsupportedOperationException("not implemented");
     }
 
-    public static void writeOFBsnVportQInQ(ChannelBuffer bb,
+    public static void writeOFBsnVportQInQ(ByteBuf bb,
             OFBsnVportQInQ vport) {
         throw new UnsupportedOperationException("not implemented");
 
     }
 
-    public static OFMatchBmap readOFMatchBmap(ChannelBuffer bb) {
+    public static OFMatchBmap readOFMatchBmap(ByteBuf bb) {
         throw new UnsupportedOperationException("not implemented");
     }
 
-    public static void writeOFMatchBmap(ChannelBuffer bb, OFMatchBmap match) {
+    public static void writeOFMatchBmap(ByteBuf bb, OFMatchBmap match) {
         throw new UnsupportedOperationException("not implemented");
     }
+
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        throw new UnsupportedOperationException("not supported");
+    }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver13/ChannelUtilsVer13.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver13/ChannelUtilsVer13.java
index 8216bb0..cd65bcd 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver13/ChannelUtilsVer13.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver13/ChannelUtilsVer13.java
@@ -1,26 +1,31 @@
 package org.projectfloodlight.openflow.protocol.ver13;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMatchBmap;
 import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into Unpooled
  *
  * @author capveg
  */
 
 public class ChannelUtilsVer13 {
-    public static Match readOFMatch(final ChannelBuffer bb) throws OFParseError {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
         return OFMatchV3Ver13.READER.readFrom(bb);
     }
 
-    public static OFMatchBmap readOFMatchBmap(ChannelBuffer bb) {
+    public static OFMatchBmap readOFMatchBmap(ByteBuf bb) {
         throw new UnsupportedOperationException("not implemented");
     }
 
-    public static void writeOFMatchBmap(ChannelBuffer bb, OFMatchBmap match) {
+    public static void writeOFMatchBmap(ByteBuf bb, OFMatchBmap match) {
         throw new UnsupportedOperationException("not implemented");
     }
+
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        throw new UnsupportedOperationException("not supported");
+    }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver14/ChannelUtilsVer14.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver14/ChannelUtilsVer14.java
index c893cab..f062711 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver14/ChannelUtilsVer14.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver14/ChannelUtilsVer14.java
@@ -1,26 +1,31 @@
 package org.projectfloodlight.openflow.protocol.ver14;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMatchBmap;
 import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into ByteBufs
  *
  * @author capveg
  */
 
 public class ChannelUtilsVer14 {
-    public static Match readOFMatch(final ChannelBuffer bb) throws OFParseError {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
         return OFMatchV3Ver14.READER.readFrom(bb);
     }
 
-    public static OFMatchBmap readOFMatchBmap(ChannelBuffer bb) {
+    public static OFMatchBmap readOFMatchBmap(ByteBuf bb) {
         throw new UnsupportedOperationException("not implemented");
     }
 
-    public static void writeOFMatchBmap(ChannelBuffer bb, OFMatchBmap match) {
+    public static void writeOFMatchBmap(ByteBuf bb, OFMatchBmap match) {
         throw new UnsupportedOperationException("not implemented");
     }
+
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        throw new UnsupportedOperationException("not supported");
+    }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver15/ChannelUtilsVer15.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver15/ChannelUtilsVer15.java
new file mode 100644
index 0000000..9142a19
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/ver15/ChannelUtilsVer15.java
@@ -0,0 +1,30 @@
+package org.projectfloodlight.openflow.protocol.ver15;
+
+import io.netty.buffer.ByteBuf;
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+import org.projectfloodlight.openflow.protocol.OFMatchBmap;
+import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.stat.Stat;
+/**
+ * Collection of helper functions for reading and writing into ByteBufs
+ *
+ * @author capveg
+ */
+
+public class ChannelUtilsVer15 {
+    public static Match readOFMatch(final ByteBuf bb) throws OFParseError {
+        return OFMatchV3Ver15.READER.readFrom(bb);
+    }
+
+    public static Stat readOFStat(final ByteBuf bb) throws OFParseError {
+        return OFStatV6Ver15.READER.readFrom(bb);
+    }
+
+    public static OFMatchBmap readOFMatchBmap(ByteBuf bb) {
+        throw new UnsupportedOperationException("not implemented");
+    }
+
+    public static void writeOFMatchBmap(ByteBuf bb, OFMatchBmap match) {
+        throw new UnsupportedOperationException("not implemented");
+    }
+}
\ No newline at end of file
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ArpOpcode.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ArpOpcode.java
index dd50d29..2fb2816 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ArpOpcode.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ArpOpcode.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -146,11 +146,11 @@
         }
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.opcode);
     }
 
-    public static ArpOpcode read2Bytes(ChannelBuffer c) {
+    public static ArpOpcode read2Bytes(ByteBuf c) {
         return ArpOpcode.of(c.readUnsignedShort());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/BundleId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/BundleId.java
index cccf67e..7f6b496 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/BundleId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/BundleId.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.concurrent.Immutable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -72,11 +72,11 @@
         return true;
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static BundleId read4Bytes(ChannelBuffer c) {
+    public static BundleId read4Bytes(ByteBuf c) {
         return BundleId.of(c.readInt());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/CircuitSignalID.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/CircuitSignalID.java
index 7a304f6..91eebe0 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/CircuitSignalID.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/CircuitSignalID.java
@@ -1,7 +1,7 @@
 package org.projectfloodlight.openflow.types;
 
 import com.google.common.collect.ComparisonChain;
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -53,14 +53,14 @@
         return spectralWidth;
     }
 
-    public void write6Bytes(ChannelBuffer c) {
+    public void write6Bytes(ByteBuf c) {
         c.writeByte(gridType);
         c.writeByte(channelSpacing);
         c.writeShort(channelNumber);
         c.writeShort(spectralWidth);
     }
 
-    public static CircuitSignalID read6Bytes(ChannelBuffer c) throws OFParseError {
+    public static CircuitSignalID read6Bytes(ByteBuf c) throws OFParseError {
         return new CircuitSignalID((byte)c.readUnsignedByte(),
                                    (byte)c.readUnsignedByte(),
                                    (short)c.readUnsignedShort(),
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ClassId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ClassId.java
index 98c1253..c5f18cd 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ClassId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ClassId.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.concurrent.Immutable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -72,11 +72,11 @@
         return true;
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static ClassId read4Bytes(ChannelBuffer c) {
+    public static ClassId read4Bytes(ByteBuf c) {
         return ClassId.of(c.readInt());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/EthType.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/EthType.java
index 1d9c8d6..a7c1464 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/EthType.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/EthType.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -59,6 +59,7 @@
     static final int VAL_CONF_TEST         = 0x9000; // Ethernet Configuration Testing Protocol[6]
     static final int VAL_Q_IN_Q            = 0x9100; // Q-in-Q
     static final int VAL_LLT               = 0xCAFE; // Veritas Low Latency Transport (LLT)[7] for Veritas Cluster Server
+    static final int VAL_PBB               = 0x88E7; // Provider Backbone Bridges (PBB)
 
     public static final EthType IPv4               = new EthType(VAL_IPv4);
     public static final EthType ARP                = new EthType(VAL_ARP);
@@ -103,6 +104,7 @@
     public static final EthType CONF_TEST          = new EthType(VAL_CONF_TEST );
     public static final EthType Q_IN_Q             = new EthType(VAL_Q_IN_Q );
     public static final EthType LLT                = new EthType(VAL_LLT );
+    public static final EthType PBB                = new EthType(VAL_PBB );
 
 
     private static final int NONE_VAL = 0x0;
@@ -210,6 +212,8 @@
                 return Q_IN_Q;
             case VAL_LLT:
                 return LLT;
+            case VAL_PBB:
+                return PBB;
             default:
                 // TODO: What's here?
                 return new EthType(type);
@@ -221,11 +225,11 @@
         return "0x" + Integer.toHexString(rawValue);
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.rawValue);
     }
 
-    public static EthType read2Bytes(ChannelBuffer c) {
+    public static EthType read2Bytes(ByteBuf c) {
         return EthType.of(c.readUnsignedShort());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/GenTableId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/GenTableId.java
index cfa7cdf..2127bef 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/GenTableId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/GenTableId.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -51,11 +51,11 @@
         return LENGTH;
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.id);
     }
 
-    public static GenTableId read2Bytes(ChannelBuffer c) throws OFParseError {
+    public static GenTableId read2Bytes(ByteBuf c) throws OFParseError {
         return GenTableId.of(c.readUnsignedShort());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/HashValue.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/HashValue.java
index ee736d7..5e8bb72 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/HashValue.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/HashValue.java
@@ -7,7 +7,7 @@
  *
  * @author Andreas Wundsam {@literal <}andreas.wundsam@bigswitch.com{@literal >}
  *
- * @param <H> - this type, for return type safety.
+ * @param H - this type, for return type safety.
  */
 @Immutable
 public interface HashValue<H extends HashValue<H>> {
@@ -20,7 +20,7 @@
     /** perform an arithmetic addition of this value and other. Wraps around on
      * overflow of the defined word size.
      *
-     * @param other
+     * @param other the other value to add to this
      * @return this + other
      */
     H add(H other);
@@ -29,7 +29,7 @@
      * arithmetically substract the given 'other' value from this value.
      * around on overflow.
      *
-     * @param other
+     * @param other the other value to subtract from this
      * @return this - other
      */
     H subtract(H other);
@@ -37,32 +37,53 @@
     /** @return the bitwise inverse of this value */
     H inverse();
 
-    /** or this value with another value value of the same type */
+    /** 
+     * or this value with another value value of the same type 
+     * 
+     * @param other the other value to bitwise or with this
+     * @return this | other
+     */
     H or(H other);
 
-    /** and this value with another value value of the same type */
+    /** 
+     * and this value with another value value of the same type 
+     * 
+     * @param other the other value to bitwise and with this
+     * @return this {@literal &} other
+     */
     H and(H other);
 
-    /** xor this value with another value value of the same type */
+    /** 
+     * xor this value with another value value of the same type 
+     *
+     * @param other the other value to bitwise xor with this
+     * @return this XOR other
+     */
     H xor(H other);
 
-    /** create and return a builder */
+    /** 
+     * create and return a builder 
+     *
+     * @return builder
+     */
     Builder<H> builder();
 
-    /** a mutator for HashValues. Allows perfomring a series of
-     *  operations on a hashv value without the associated cost of object
-     *  reallocation.
+    /** 
+     * a mutator for HashValues. Allows perfomring a series of
+     * operations on a hashv value without the associated cost of object
+     * reallocation.
      *
      * @author Andreas Wundsam {@literal <}andreas.wundsam@bigswitch.com{@literal >}
      *
      * @param <H> - the hashvalue
      */
     public interface Builder<H> {
-        /** perform an arithmetic addition of this value and other. Wraps around on
+        /** 
+         * perform an arithmetic addition of this value and other. Wraps around on
          * overflow of the defined word size.
          *
-         * @param other
-         * @return this mutator
+         * @param other the other value to add to this
+         * @return this mutator containing this + other
          */
         Builder<H> add(H other);
 
@@ -70,33 +91,47 @@
          * arithmetically substract the given 'other' value from the value stored in this mutator.
          * around on overflow.
          *
-         * @param other
-         * @return this mutator
+         * @param other the other value to subtract from this
+         * @return this mutator containing this - other
          */
         Builder<H> subtract(H other);
 
-        /** bitwise invert the value stored in this mutator
+        /** 
+         * bitwise invert the value stored in this mutator
          *
-         * @return this mutator
+         * @return this mutator containing ~this
          */
         Builder<H> invert();
 
-        /** or the value stored in this mutator with another value value of the same type
-        * @return this mutator
-        */
+        /** 
+         * or the value stored in this mutator with another value value of the same type
+         *
+         * @param other the other value to bitwise or with this
+         * @return this mutator containing this | other
+         */
         Builder<H> or(H other);
 
-        /** and the value stored in this mutator with another value value of the same type
-        * @return this mutator
-        */
+        /** 
+         * and the value stored in this mutator with another value value of the same type
+         *
+         * @param other the other value to bitwise and with this
+         * @return this mutator containing this {@literal &} other
+         */
         Builder<H> and(H other);
 
-        /** xor the value stored in this mutator with another value value of the same type
-        * @return this mutator
-        */
+        /** 
+         * xor the value stored in this mutator with another value value of the same type
+         *
+         * @param other the other value to bitwise exclusive or with this
+         * @return this mutator containing this XOR other
+         */
         Builder<H> xor(H other);
 
-        /** @return the hash value */
+        /** 
+         * construct an immutable value from the value defined in the builder
+         *
+         * @return the hash value 
+         */
         public H build();
     }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Code.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Code.java
index ced5737..597095d 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Code.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Code.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.Shorts;
@@ -45,11 +45,11 @@
         return code;
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.code);
     }
 
-    public static ICMPv4Code readByte(ChannelBuffer c) {
+    public static ICMPv4Code readByte(ByteBuf c) {
         return ICMPv4Code.of(c.readUnsignedByte());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Type.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Type.java
index 634bc03..3eb2987 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Type.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/ICMPv4Type.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.Shorts;
@@ -155,11 +155,11 @@
         return type;
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.type);
     }
 
-    public static ICMPv4Type readByte(ChannelBuffer c) {
+    public static ICMPv4Type readByte(ByteBuf c) {
         return ICMPv4Type.of(c.readUnsignedByte());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java
index ad21e06..cc91ebf 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java
@@ -34,13 +34,49 @@
     public abstract int asCidrMaskLength();
 
     /**
+     * Returns {@code true} if the IPAddress is unspecified.
+     *
+     * <p>The <em>unspecified</em> addresses, also known as the
+     * <em>wildcard</em> addresses, refer to:
+     * <ul>
+     * <li>the {@link IPv4Address} of {@code 0.0.0.0}
+     * <li>the {@link IPv6Address} of {@code ::}
+     * </ul>
+     * @return {@code true} if the IPAddress is unspecified, false otherwise
+     */
+    public abstract boolean isUnspecified();
+
+    /**
+     * Returns {@code true} if the IPAddress is a loopback address.
+     *
+     * <p><em>Loopback</em> addresses refer to:
+     * <ul>
+     * <li>any {@link IPv4Address} within {@code 127.0.0.0/8}
+     * <li>the {@link IPv6Address} of {@code ::1}
+     * </ul>
+     * @return {@code true} if the IPAddress is a loopback address, false otherwise
+     */
+    public abstract boolean isLoopback();
+
+    /**
+     * Returns {@code true} if the IPAddress is a link local address.
+     *
+     * <p><em>Link local</em> addresses refer to:
+     * <ul>
+     * <li>any {@link IPv4Address} within {@code 169.254.0.0/16}
+     * <li>any {@link IPv6Address} within {@code fe80::/10}
+     * </ul>
+     * @return {@code true} if the IPAddress is a link local address, false otherwise
+     */
+    public abstract boolean isLinkLocal();
+
+    /**
      * Checks if the IPAddress is the global broadcast address
      * 255.255.255.255 in case of IPv4
      * @return boolean true or false
      */
     public abstract boolean isBroadcast();
 
-
     /**
      * Checks if the IPAddress is the multicast address
      * @return boolean true or false
@@ -111,6 +147,20 @@
      */
     public abstract byte[] getBytes();
 
+    /**
+     * Returns an {@link InetAddress} object representing this IP address.
+     *
+     * <p>The resulting {@link InetAddress} object:
+     * <ul>
+     * <li>will not carry a hostname
+     * <li>will not carry a non-zero scope ID or scoped interface,
+     *     in the case of {@link Inet6Address}
+     * </ul>
+     * @return an {@link InetAddress} object representing this IP address
+     */
+    @Nonnull
+    public abstract InetAddress toInetAddress();
+
     @Override
     public abstract String toString();
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
index 53e8071..37dd919 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
@@ -1,21 +1,24 @@
 package org.projectfloodlight.openflow.types;
 
+import io.netty.buffer.ByteBuf;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.net.Inet4Address;
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Arrays;
 
 import javax.annotation.Nonnull;
 
-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.base.Preconditions;
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
 
-import org.projectfloodlight.openflow.protocol.Writeable;
-import org.projectfloodlight.openflow.protocol.OFMessageReader;
-import org.projectfloodlight.openflow.exceptions.OFParseError;
-
 /**
  * Wrapper around an IPv4Address address
  *
@@ -44,7 +47,7 @@
 
     private static class Reader implements OFMessageReader<IPv4Address> {
         @Override
-        public IPv4Address readFrom(ChannelBuffer bb) throws OFParseError {
+        public IPv4Address readFrom(ByteBuf bb) throws OFParseError {
             return new IPv4Address(bb.readInt());
         }
     }
@@ -86,18 +89,34 @@
     }
 
     @Override
+    public boolean isUnspecified() {
+        return this.equals(NONE);
+    }
+
+    @Override
+    public boolean isLoopback() {
+        return ((rawValue >>> 24) & 0xFF) == 127;
+    }
+
+    @Override
+    public boolean isLinkLocal() {
+        return ((rawValue >>> 24) & 0xFF) == 169
+                && ((rawValue >>> 16) & 0xFF) == 254;
+    }
+
+    @Override
     public boolean isBroadcast() {
         return this.equals(NO_MASK);
     }
 
     /**
-     * IPv4 multicast addresses are defined by the leading address bits of 1110 
+     * IPv4 multicast addresses are defined by the leading address bits of 1110
      */
     @Override
     public boolean isMulticast() {
         return ((rawValue >>> 24) & 0xF0) == 0xE0;
     }
-    
+
     @Override
     public IPv4Address and(IPv4Address other) {
         Preconditions.checkNotNull(other, "other must not be null");
@@ -153,6 +172,48 @@
 
     /**
      * Returns an {@code IPv4Address} object that represents the given
+     * IP address. The arguments are in network byte order: the highest
+     * order byte of the address is in {@code octet1}.
+     *
+     * <p>For example, {@code IPv4Address.of(192, 0, 2, 101)} yields
+     * the IPv4 address of {@code "192.0.2.101"}.
+     *
+     * <p>Use caution when providing byte-typed values as arguments.
+     * "Byte-typed values" here refer to values that are of either the
+     * primitive {@code byte} type or the corresponding object wrapper
+     * class {@link Byte}. Byte-typed values greater than 127 are
+     * essentially negative values and will be casted to negative
+     * {@code int} values, thus failing the numeric range checks
+     * enforced by this method. Consider using {@link #of(byte[])}
+     * instead when handling byte-typed values.
+     *
+     * @throws IllegalArgumentException if any of the octets were
+     *         negative or greater than 255
+     * @param octet1 the highest order byte in network byte order
+     * @param octet2 the 2nd-highest order byte in network byte order
+     * @param octet3 the 2nd-lowest order byte in network byte order
+     * @param octet4 the lowest order byte in network byte order
+     * @return an {@code IPv4Address} object that represents the given
+     * IP address
+     */
+    @Nonnull
+    public static IPv4Address of(
+            int octet1, int octet2, int octet3, int octet4) {
+        checkArgument((octet1 & 0xFF) == octet1
+                && (octet2 & 0xFF) == octet2
+                && (octet3 & 0xFF) == octet3
+                && (octet4 & 0xFF) == octet4,
+                "Invalid IPv4 address %s.%s.%s.%s",
+                octet1, octet2, octet3, octet4);
+        int raw = (octet1 & 0xFF) << 24
+                | (octet2 & 0xFF) << 16
+                | (octet3 & 0xFF) << 8
+                | (octet4 & 0xFF) << 0;
+        return IPv4Address.of(raw);
+    }
+
+    /**
+     * Returns an {@code IPv4Address} object that represents the given
      * IP address.
      *
      * @param raw  the raw IP address represented as a 32-bit integer
@@ -309,6 +370,17 @@
         return LENGTH;
     }
 
+    @Nonnull
+    @Override
+    public Inet4Address toInetAddress() {
+        try {
+            return (Inet4Address) InetAddress.getByAddress(getBytes());
+        } catch (UnknownHostException e) {
+            throw new IllegalArgumentException(
+                    "Error getting InetAddress for the IPAddress " + this, e);
+        }
+    }
+
     @Override
     public String toString() {
         StringBuilder res = new StringBuilder();
@@ -319,11 +391,11 @@
         return res.toString();
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static IPv4Address read4Bytes(ChannelBuffer c) {
+    public static IPv4Address read4Bytes(ByteBuf c) {
         return IPv4Address.of(c.readInt());
     }
 
@@ -365,7 +437,7 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeInt(rawValue);
     }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
index fee04ac..497a40c 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
@@ -1,22 +1,26 @@
 package org.projectfloodlight.openflow.types;
 
+import io.netty.buffer.ByteBuf;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.net.Inet6Address;
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.regex.Pattern;
 
 import javax.annotation.Nonnull;
 
-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.base.Preconditions;
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedLongs;
 
-import org.projectfloodlight.openflow.protocol.Writeable;
-import org.projectfloodlight.openflow.protocol.OFMessageReader;
-import org.projectfloodlight.openflow.exceptions.OFParseError;
-
 /**
  * IPv6 address object. Instance controlled, immutable. Internal representation:
  * two 64 bit longs (not that you'd have to know).
@@ -24,7 +28,7 @@
  * @author Andreas Wundsam {@literal <}andreas.wundsam@teleteach.de{@literal >}
  */
 public class IPv6Address extends IPAddress<IPv6Address> implements Writeable {
-    static final int LENGTH = 16;
+    public static final int LENGTH = 16;
     private final long raw1;
     private final long raw2;
 
@@ -50,7 +54,7 @@
 
     private static class Reader implements OFMessageReader<IPv6Address> {
         @Override
-        public IPv6Address readFrom(ChannelBuffer bb) throws OFParseError {
+        public IPv6Address readFrom(ByteBuf bb) throws OFParseError {
             return new IPv6Address(bb.readLong(), bb.readLong());
         }
     }
@@ -111,18 +115,74 @@
     }
 
     @Override
+    public boolean isUnspecified() {
+        return this.equals(NONE);
+    }
+
+    @Override
+    public boolean isLoopback() {
+        return raw1 == 0 && raw2 == 1;
+    }
+
+    @Override
+    public boolean isLinkLocal() {
+        return (raw1 & 0xFFC0_0000_0000_0000L) == 0xFE80_0000_0000_0000L;
+    }
+
+    @Override
     public boolean isBroadcast() {
         return this.equals(NO_MASK);
     }
 
     /**
-     * IPv6 multicast addresses are defined by the prefix ff00::/8 
+     * IPv6 multicast addresses are defined by the prefix ff00::/8
      */
     @Override
     public boolean isMulticast() {
         return (raw1 >>> 56) == 0xFFL;
     }
-    
+
+    /**
+     * Returns the Modified EUI-64 format interface identifier that
+     * corresponds to the specified MAC address.
+     *
+     * <p>Refer to the followings for the conversion details:
+     * <ul>
+     * <li>RFC 7042 - Section 2.2.1
+     * <li>RFC 5342 - Section 2.2.1 (Obsoleted by RFC 7042)
+     * <li>RFC 4291 - Appendix A
+     * </ul>
+     */
+    private static long toModifiedEui64(@Nonnull MacAddress macAddress) {
+        checkNotNull(macAddress, "macAddress must not be null");
+        return   ((0xFFFF_FF00_0000_0000L & (macAddress.getLong() << 16))
+                ^ (0x0200_0000_0000_0000L))
+                | (0x0000_00FF_FE00_0000L)
+                | (0x0000_0000_00FF_FFFFL & macAddress.getLong());
+    }
+
+    /**
+     * Returns {@code true} if the second (lower-order) 64-bit block of
+     * this address is equal to the Modified EUI-64 format interface
+     * identifier that corresponds to the specified MAC address.
+     *
+     * <p>Refer to the followings for the details of conversions between
+     * MAC addresses and Modified EUI-64 format interface identifiers:
+     * <ul>
+     * <li>RFC 7042 - Section 2.2.1
+     * <li>RFC 5342 - Section 2.2.1 (Obsoleted by RFC 7042)
+     * <li>RFC 4291 - Appendix A
+     * </ul>
+     *
+     * <p>This method assumes the second (lower-order) 64-bit block to be
+     * a 64-bit interface identifier, which may not always be true.
+     * @param macAddress the MAC address to check
+     * @return boolean true or false
+     */
+    public boolean isModifiedEui64Derived(@Nonnull MacAddress macAddress) {
+        return raw2 == toModifiedEui64(macAddress);
+    }
+
     @Override
     public IPv6Address and(IPv6Address other) {
         Preconditions.checkNotNull(other, "other must not be null");
@@ -329,6 +389,54 @@
     }
 
     /**
+     * Returns an {@code IPv6Address} object that represents the given
+     * MAC address in the specified network.
+     *
+     * <p>The first (higher-order) 64-bit block of the returned address
+     * will be the network prefix derived from the specified network.
+     * The specified network must satisfy the followings:
+     * <ul>
+     * <li>{@link #isCidrMask()} {@code == true}
+     * <li>{@literal 0 <= } {@link #asCidrMaskLength()} {@literal <= 64}
+     * </ul>
+     *
+     * <p>The second (lower-order) 64-bit block of the returned address
+     * will be equal to the Modified EUI-64 format interface identifier
+     * that corresponds to the specified MAC address.
+     *
+     * <p>Refer to the followings for the details of conversions between
+     * MAC addresses and Modified EUI-64 format interface identifiers:
+     * <ul>
+     * <li>RFC 7042 - Section 2.2.1
+     * <li>RFC 5342 - Section 2.2.1 (Obsoleted by RFC 7042)
+     * <li>RFC 4291 - Appendix A
+     * </ul>
+     *
+     * @throws IllegalArgumentException if the specified network does not
+     *         meet the aforementioned requirements
+     * @param network the IPv6 network
+     * @param macAddress the MAC address
+     * @return an {@code IPv6Address} object that represents the given
+     * MAC address in the specified network
+     */
+    @Nonnull
+    public static IPv6Address of(
+            @Nonnull IPv6AddressWithMask network,
+            @Nonnull MacAddress macAddress) {
+
+        checkNotNull(network, "network must not be null");
+        checkArgument(network.getMask().isCidrMask()
+                && network.getMask().asCidrMaskLength() <= 64,
+                "network must consist of a mask of 64 or less leading 1 bits"
+                + " and no other 1 bits: %s", network);
+
+        long raw1 = network.getValue().raw1;
+        long raw2 = toModifiedEui64(macAddress);
+
+        return IPv6Address.of(raw1, raw2);
+    }
+
+    /**
      * Returns an {@code IPv6Address} object that represents the
      * CIDR subnet mask of the given prefix length.
      *
@@ -394,6 +502,7 @@
 
     private volatile byte[] bytesCache = null;
 
+    @Override
     public byte[] getBytes() {
         if (bytesCache == null) {
             synchronized (this) {
@@ -427,6 +536,17 @@
         return LENGTH;
     }
 
+    @Nonnull
+    @Override
+    public Inet6Address toInetAddress() {
+        try {
+            return (Inet6Address) InetAddress.getByAddress(getBytes());
+        } catch (UnknownHostException e) {
+            throw new IllegalArgumentException(
+                    "Error getting InetAddress for the IPAddress " + this, e);
+        }
+    }
+
     @Override
     public String toString() {
         return toString(true, false);
@@ -441,7 +561,11 @@
             throw new IllegalArgumentException("16 bit word index must be in [0,7]");
     }
 
-    /** get the index of the first word where to apply IPv6 zero compression */
+    /** 
+     * get the index of the first word where to apply IPv6 zero compression 
+     *
+     * @return the index
+     */
     public int getZeroCompressStart() {
         int start = Integer.MAX_VALUE;
         int maxLength = -1;
@@ -454,7 +578,7 @@
                 if (getUnsignedShortWord(i) != 0) {
                     // end of this candidate word
                     int candidateLength = i - candidateStart;
-                    if (candidateLength >= maxLength) {
+                    if ((candidateLength > 1) && (candidateLength > maxLength)) {
                         start = candidateStart;
                         maxLength = candidateLength;
                     }
@@ -470,7 +594,7 @@
 
         if (candidateStart >= 0) {
             int candidateLength = 8 - candidateStart;
-            if (candidateLength >= maxLength) {
+            if ((candidateLength > 1) && (candidateLength > maxLength)) {
                 start = candidateStart;
                 maxLength = candidateLength;
             }
@@ -539,12 +663,12 @@
         return true;
     }
 
-    public void write16Bytes(ChannelBuffer c) {
+    public void write16Bytes(ByteBuf c) {
         c.writeLong(this.raw1);
         c.writeLong(this.raw2);
     }
 
-    public static IPv6Address read16Bytes(ChannelBuffer c) throws OFParseError {
+    public static IPv6Address read16Bytes(ByteBuf c) throws OFParseError {
         return IPv6Address.of(c.readLong(), c.readLong());
     }
 
@@ -569,7 +693,7 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeLong(raw1);
         bb.writeLong(raw2);
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
index ee34923..a50da1a 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
@@ -5,6 +5,32 @@
 public class IPv6AddressWithMask extends IPAddressWithMask<IPv6Address> {
     public final static IPv6AddressWithMask NONE = of(IPv6Address.NONE, IPv6Address.NONE);
 
+    /**
+     * Represents the link-local network configuration used in practice,
+     * i.e. {@code fe80::/64}.
+     *
+     * <p>See Section 2.5.6 of RFC 4291.
+     *
+     * @see #LINK_LOCAL_RESERVED
+     */
+    public final static IPv6AddressWithMask LINK_LOCAL_NETWORK
+            = IPv6Address
+                    .of(0xFE80_0000_0000_0000L, 0x0000_0000_0000_0000L)
+                    .withMaskOfLength(64);
+
+    /**
+     * Contains all addresses reserved for link-local usages,
+     * i.e. {@code fe80::/10}.
+     *
+     * <p>See Section 2.4 of RFC 4291.
+     *
+     * @see #LINK_LOCAL_NETWORK
+     */
+    public final static IPv6AddressWithMask LINK_LOCAL_RESERVED
+            = IPv6Address
+                    .of(0xFE80_0000_0000_0000L, 0x0000_0000_0000_0000L)
+                    .withMaskOfLength(10);
+
     private IPv6AddressWithMask(IPv6Address value, IPv6Address mask) {
         super(value, mask);
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6FlowLabel.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6FlowLabel.java
index cfefd39..7c84684 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6FlowLabel.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6FlowLabel.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -56,11 +56,11 @@
         return "0x" + Integer.toHexString(label);
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(this.label);
     }
 
-    public static IPv6FlowLabel read4Bytes(ChannelBuffer c) throws OFParseError {
+    public static IPv6FlowLabel read4Bytes(ByteBuf c) throws OFParseError {
         return IPv6FlowLabel.of((int)(c.readUnsignedInt() & 0xFFFFFFFF));
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpDscp.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpDscp.java
index f19e051..a738ae3 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpDscp.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpDscp.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -230,11 +230,11 @@
         return "0x" + Integer.toHexString(dscp);
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.dscp);
     }
 
-    public static IpDscp readByte(ChannelBuffer c) throws OFParseError {
+    public static IpDscp readByte(ByteBuf c) throws OFParseError {
         return IpDscp.of((byte)(c.readUnsignedByte()));
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpEcn.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpEcn.java
index 654df01..eb6ae66 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpEcn.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpEcn.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -49,11 +49,11 @@
         return (ecn < 3 ? "0" : "") + Integer.toBinaryString(ecn);
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.ecn);
     }
 
-    public static IpEcn readByte(ChannelBuffer c) throws OFParseError {
+    public static IpEcn readByte(ByteBuf c) throws OFParseError {
         return IpEcn.of((byte)(c.readUnsignedByte()));
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpProtocol.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpProtocol.java
index 8443a31..14e01a7 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpProtocol.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IpProtocol.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.Shorts;
@@ -615,11 +615,11 @@
         return "0x" + Integer.toHexString(proto);
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.proto);
     }
 
-    public static IpProtocol readByte(ChannelBuffer c) {
+    public static IpProtocol readByte(ByteBuf c) {
         return IpProtocol.of(c.readUnsignedByte());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/LagId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/LagId.java
index 51364e1..04e59d4 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/LagId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/LagId.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.concurrent.Immutable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -67,11 +67,11 @@
         return true;
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static LagId read4Bytes(ChannelBuffer c) {
+    public static LagId read4Bytes(ByteBuf c) {
         return LagId.of(c.readInt());
     }
 
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 b73db43..7a484f4 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
@@ -4,7 +4,6 @@
 
 import javax.annotation.Nonnull;
 
-import org.jboss.netty.buffer.ChannelBuffer;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.util.HexString;
 
@@ -12,6 +11,8 @@
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.Longs;
 
+import io.netty.buffer.ByteBuf;
+
 /**
  * Wrapper around a 6 byte mac address.
  *
@@ -19,6 +20,7 @@
  */
 
 public class MacAddress implements OFValueType<MacAddress> {
+
     static final int MacAddrLen = 6;
     private final long rawValue;
 
@@ -33,11 +35,16 @@
 
     private static final long LLDP_MAC_ADDRESS_MASK = 0xfffffffffff0L;
     private static final long LLDP_MAC_ADDRESS_VALUE = 0x0180c2000000L;
+    private final static MacAddress IPV4_MULTICAST_BASE_ADDRESS =
+           MacAddress.of("01:00:5E:00:00:00");
+    private final static MacAddress IPV6_MULTICAST_BASE_ADDRESS =
+           MacAddress.of("33:33:00:00:00:00");
 
     private static final String FORMAT_ERROR = "Mac address is not well-formed. " +
-            "It must consist of 6 hex digit pairs separated by colons: ";
+            "It must consist of 6 hex digit pairs separated by colons or hyphens: ";
     private static final int MAC_STRING_LENGTH = 6 * 2 + 5;
 
+
     private MacAddress(final long rawValue) {
         this.rawValue = rawValue;
     }
@@ -62,27 +69,27 @@
         return new MacAddress(raw);
     }
 
-    /** Parse a mac adress from the canonical string representation as
-     *  6 hex bytes separated by colons (01:02:03:04:05:06).
+    /** Parse a mac adress from a string representation as
+     *  6 hex bytes separated by colons or hyphens (01:02:03:04:05:06,
+     *  01-02-03-04-05-06).
      *
-     * @param macString - a mac address in canonical string representation
+     * @param macString - a mac address in string representation
      * @return the parsed MacAddress
      * @throws IllegalArgumentException if macString is not a valid mac adddress
      */
     @Nonnull
     public static MacAddress of(@Nonnull final String macString) throws IllegalArgumentException {
-        if (macString == null) {
-            throw new NullPointerException("macString must not be null");
-        }
+        Preconditions.checkNotNull(macString, "macStringmust not be null");
+        Preconditions.checkArgument(macString.length() == MAC_STRING_LENGTH,
+                FORMAT_ERROR + macString);
+        final char separator = macString.charAt(2);
+        Preconditions.checkArgument(separator == ':' || separator == '-',
+                FORMAT_ERROR + macString + " (invalid separator)");
 
         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);
@@ -90,10 +97,16 @@
                 throw new IllegalArgumentException(FORMAT_ERROR + macString);
             raw |= ((long) (digit1 << 4 | digit2)) << shift;
 
-            if (shift == 0)
+            if (shift == 0) {
                 break;
-            if (macString.charAt(index++) != ':')
-                throw new IllegalArgumentException(FORMAT_ERROR + macString);
+            }
+
+            // Iterate over separators
+            if (macString.charAt(index++) != separator) {
+                throw new IllegalArgumentException(FORMAT_ERROR + macString +
+                                                   " (inconsistent separators");
+            }
+
             shift -= 8;
         }
         return MacAddress.of(raw);
@@ -200,12 +213,12 @@
         return rawValue;
     }
 
-    public void write6Bytes(ChannelBuffer c) {
+    public void write6Bytes(ByteBuf c) {
         c.writeInt((int) (this.rawValue >> 16));
         c.writeShort((int) this.rawValue & 0xFFFF);
     }
 
-    public static MacAddress read6Bytes(ChannelBuffer c) throws OFParseError {
+    public static MacAddress read6Bytes(ByteBuf c) throws OFParseError {
         long raw = c.readUnsignedInt() << 16 | c.readUnsignedShort();
         return MacAddress.of(raw);
     }
@@ -222,10 +235,74 @@
 
     @Override
     public void putTo(PrimitiveSink sink) {
-        sink.putInt((int) (this.rawValue >> 16));
-        sink.putShort((short) (this.rawValue & 0xFFFF));
+        sink.putLong(rawValue);
     }
 
+    /*
+     * Parse an IPv4 Multicast address and return the macAddress
+     * corresponding to the multicast IPv4 address.
+     *
+     * For multicast forwarding, the mac addresses in the range
+     * 01-00-5E-00-00-00 to 01-00-5E-7F-FF-FF have been reserved.
+     * The most significant 25 bits of the above 48-bit mac address
+     * are fixed while the lower 23 bits are variable.
+     * These lower 23 bits are derived from the lower 23 bits
+     * of the multicast IP address.
+     *
+     * AND ipv4 address with 0x07FFFFF to extract the last 23 bits
+     * OR with 01:00:5E:00:00:00 MAC (first 25 bits)
+     *
+     * @param ipv4 - ipv4 multicast address
+     * @return the MacAddress corresponding to the multicast address
+     * @throws IllegalArgumentException if ipv4 is not a valid multicast address
+     */
+    @Nonnull
+    public static MacAddress forIPv4MulticastAddress(IPv4Address ipv4)
+            throws IllegalArgumentException {
 
+        if (!ipv4.isMulticast())
+            throw new IllegalArgumentException(
+                    "Not a Multicast IPAddress\"" + ipv4 + "\"");
 
+        long ipLong = ipv4.getInt();
+        int ipMask = 0x007FFFFF;
+        ipLong = ipLong & ipMask;
+
+        long macLong = IPV4_MULTICAST_BASE_ADDRESS.getLong(); // 01:00:5E:00:00:00
+        macLong = macLong | ipLong;
+        MacAddress returnMac = MacAddress.of(macLong);
+
+        return returnMac;
+    }
+
+    /**
+     * Generate a MAC address corresponding to multicast IPv6  address.
+     *
+     * Take the last 4 bytes of IPv6 address and copy them to the base IPv6
+     * multicast mac address - 33:33:00:00:00:00.
+     *
+     * @param ipv6 - IPv6 address corresponding to which multicast MAC addr
+     * need to be generated.
+     * @return - the generated multicast mac address.
+     * @throws IllegalArgumentException if ipv6 address is not a valid IPv6
+     * multicast address.
+     */
+    @Nonnull
+    public static MacAddress forIPv6MulticastAddr(IPv6Address ipv6)
+            throws IllegalArgumentException {
+        if (!ipv6.isMulticast()) {
+            throw new IllegalArgumentException(
+                    "Not a Multicast IPv6Address\"" + ipv6 + "\"");
+        }
+        long ipLong = ((ipv6.getUnsignedShortWord(6) << 16) |
+                                         ipv6.getUnsignedShortWord(7));
+        long ipMask = 0xFFFFFFFFl;
+        ipLong = ipLong & ipMask;
+
+        long macLong = IPV6_MULTICAST_BASE_ADDRESS.getLong();//33:33:00:00:00:00
+        macLong = macLong | ipLong;
+        MacAddress returnMac = MacAddress.of(macLong);
+
+        return returnMac;
+    }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFAuxId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFAuxId.java
index c8e04d2..3c83f91 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFAuxId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFAuxId.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -64,11 +64,11 @@
         return id;
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.id);
     }
 
-    public static OFAuxId readByte(ChannelBuffer c) throws OFParseError {
+    public static OFAuxId readByte(ByteBuf c) throws OFParseError {
         return OFAuxId.of(c.readUnsignedByte());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
index 93f5a2d..93ba41e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask128.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 
@@ -66,12 +66,12 @@
         return (word & ((long)1 << bit)) != 0;
     }
 
-    public void write16Bytes(ChannelBuffer cb) {
+    public void write16Bytes(ByteBuf cb) {
         cb.writeLong(raw1);
         cb.writeLong(raw2);
     }
 
-    public static OFBitMask128 read16Bytes(ChannelBuffer cb) {
+    public static OFBitMask128 read16Bytes(ByteBuf cb) {
         long raw1 = cb.readLong();
         long raw2 = cb.readLong();
         return of(raw1, raw2);
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask256.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask256.java
index 5326e0d..6009a2f 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask256.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask256.java
@@ -17,7 +17,7 @@
 
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 
@@ -110,14 +110,14 @@
         return (word & ((long)1 << bit)) != 0;
     }
 
-    public void write32Bytes(ChannelBuffer cb) {
+    public void write32Bytes(ByteBuf cb) {
         cb.writeLong(raw1);
         cb.writeLong(raw2);
         cb.writeLong(raw3);
         cb.writeLong(raw4);
     }
 
-    public static OFBitMask256 read32Bytes(ChannelBuffer cb) {
+    public static OFBitMask256 read32Bytes(ByteBuf cb) {
         long raw1 = cb.readLong();
         long raw2 = cb.readLong();
         long raw3 = cb.readLong();
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask512.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask512.java
index e3686a4..39b8fe7 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask512.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFBitMask512.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 
@@ -125,7 +125,7 @@
         return (word & ((long)1 << bit)) != 0;
     }
 
-    public void write64Bytes(ChannelBuffer cb) {
+    public void write64Bytes(ByteBuf cb) {
         cb.writeLong(raw1);
         cb.writeLong(raw2);
         cb.writeLong(raw3);
@@ -136,7 +136,7 @@
         cb.writeLong(raw8);
     }
 
-    public static OFBitMask512 read64Bytes(ChannelBuffer cb) {
+    public static OFBitMask512 read64Bytes(ByteBuf cb) {
         long raw1 = cb.readLong();
         long raw2 = cb.readLong();
         long raw3 = cb.readLong();
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 99416a3..7598d36 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
@@ -17,7 +17,7 @@
 
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -79,13 +79,13 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeByte(getInt());
     }
 
     private static class Reader implements OFMessageReader<OFBooleanValue> {
         @Override
-        public OFBooleanValue readFrom(ChannelBuffer bb) throws OFParseError {
+        public OFBooleanValue readFrom(ByteBuf bb) throws OFParseError {
             return of(bb.readByte() != 0);
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFConnectionIndex.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFConnectionIndex.java
new file mode 100644
index 0000000..133f478
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFConnectionIndex.java
@@ -0,0 +1,78 @@
+package org.projectfloodlight.openflow.types;
+
+import org.projectfloodlight.openflow.annotations.Immutable;
+
+import com.google.common.hash.PrimitiveSink;
+import com.google.common.primitives.UnsignedInts;
+
+import io.netty.buffer.ByteBuf;
+
+@Immutable
+public class OFConnectionIndex implements OFValueType<OFConnectionIndex>  {
+
+    static final int LENGTH = 4;
+    private final int connectionIndex;
+
+    private OFConnectionIndex(final int connectionIndex) {
+        this.connectionIndex = connectionIndex;
+    }
+
+    public static OFConnectionIndex of(final int connectionIndex) {
+        return new OFConnectionIndex(connectionIndex);
+    }
+
+    public void write4Bytes(ByteBuf c) {
+        c.writeInt(connectionIndex);
+    }
+
+    public static OFConnectionIndex read4Bytes(ByteBuf c) {
+        return OFConnectionIndex.of(c.readInt());
+    }
+
+    @Override
+    public OFConnectionIndex applyMask(OFConnectionIndex mask) {
+        return OFConnectionIndex.of(this.connectionIndex & mask.connectionIndex);
+    }
+
+    @Override
+    public int compareTo(OFConnectionIndex o) {
+        return UnsignedInts.compare(this.connectionIndex,o.connectionIndex);
+    }
+
+    @Override
+    public void putTo(PrimitiveSink sink) {
+        sink.putInt(connectionIndex);
+    }
+
+    @Override
+    public int getLength() {
+        return LENGTH;
+    }
+
+    @Override
+    public String toString() {
+        return UnsignedInts.toString(connectionIndex);
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + connectionIndex;
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        OFConnectionIndex other = (OFConnectionIndex) obj;
+        if (connectionIndex != other.connectionIndex)
+            return false;
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFErrorCauseData.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFErrorCauseData.java
index 1e71b3c..03e2fcd 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFErrorCauseData.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFErrorCauseData.java
@@ -1,9 +1,10 @@
 package org.projectfloodlight.openflow.types;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+
 import java.util.Arrays;
 
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFErrorMsg;
 import org.projectfloodlight.openflow.protocol.OFFactories;
@@ -55,7 +56,7 @@
     public Optional<OFMessage> getParsedMessage() {
         OFFactory factory = OFFactories.getFactory(version);
         try {
-            OFMessage msg = factory.getReader().readFrom(ChannelBuffers.wrappedBuffer(data));
+            OFMessage msg = factory.getReader().readFrom(Unpooled.wrappedBuffer(data));
             if(msg != null)
                 return Optional.of(msg);
             else
@@ -66,7 +67,7 @@
         }
     }
 
-    public static OFErrorCauseData read(ChannelBuffer bb, int length, OFVersion version) {
+    public static OFErrorCauseData read(ByteBuf bb, int length, OFVersion version) {
         byte[] bytes = ChannelUtils.readBytes(bb, length);
         return of(bytes, version);
    }
@@ -77,7 +78,7 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeBytes(data);
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFGroup.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFGroup.java
index 9c571ea..e47cd90 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFGroup.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFGroup.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.annotations.Immutable;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
@@ -79,7 +79,11 @@
         }
     }
 
-    /** return the group number as a int32 */
+    /** 
+     * get the group number of this group as a int32 
+     *
+     * @return the integer form of the this group
+     */
     public int getGroupNumber() {
         return groupNumber;
     }
@@ -131,11 +135,11 @@
         return result;
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(this.groupNumber);
     }
 
-    public static OFGroup read4Bytes(ChannelBuffer c) throws OFParseError {
+    public static OFGroup read4Bytes(ByteBuf c) throws OFParseError {
         return OFGroup.of(c.readInt());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFMetadata.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFMetadata.java
index fcabdcd..445c333 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFMetadata.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFMetadata.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 
@@ -31,11 +31,11 @@
         return u64;
     }
 
-    public static OFMetadata read8Bytes(ChannelBuffer cb) {
+    public static OFMetadata read8Bytes(ByteBuf cb) {
         return OFMetadata.ofRaw(cb.readLong());
     }
 
-    public void write8Bytes(ChannelBuffer cb) {
+    public void write8Bytes(ByteBuf cb) {
         u64.writeTo(cb);
     }
 
@@ -66,7 +66,7 @@
 
     @Override
     public String toString() {
-        return "Metadata: " + u64.toString();
+        return u64.toString();
     }
 
     @Override
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPort.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPort.java
index f2b1e9a..89ace97 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPort.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPort.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.annotations.Immutable;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
@@ -161,7 +161,7 @@
      * NOTE: The port object may either be newly allocated or cached. Do not
      * rely on either behavior.
      *
-     * @param portNumber
+     * @param portNumber the integer port number
      * @return a corresponding OFPort
      */
     public static OFPort ofInt(final int portNumber) {
@@ -294,7 +294,12 @@
         }
     }
 
-    /** convenience function: delegates to ofInt */
+    /** 
+     * convenience function: delegates to ofInt 
+     *
+     * @param portNumber the integer port number
+     * @return a corresponding OFPort
+     */
     public static OFPort of(final int portNumber) {
         return ofInt(portNumber);
     }
@@ -305,7 +310,7 @@
      * 32-bit integer value allocated as its port number. NOTE: The port object
      * may either be newly allocated or cached. Do not rely on either behavior.
      *
-     * @param portNumber
+     * @param portNumber the short port number
      * @return a corresponding OFPort
      */
     public static OFPort ofShort(final short portNumber) {
@@ -438,7 +443,11 @@
         }
     }
 
-    /** return the port number as a int32 */
+    /** 
+     * return the port number as a int32 
+     *
+     * @return the port number as an integer
+     */
     public int getPortNumber() {
         return portNumber;
     }
@@ -450,7 +459,8 @@
      *
      * @throws IllegalArgumentException
      *             if a regular port number exceeds the maximum value in OF1.0
-     **/
+     * @return the port number as a short
+     */
     public short getShortPortNumber() {
 
         switch (portNumber) {
@@ -530,19 +540,19 @@
         return result;
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.portNumber);
     }
 
-    public static OFPort read2Bytes(ChannelBuffer c) throws OFParseError {
+    public static OFPort read2Bytes(ByteBuf c) throws OFParseError {
         return OFPort.ofShort(c.readShort());
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(this.portNumber);
     }
 
-    public static OFPort read4Bytes(ChannelBuffer c) throws OFParseError {
+    public static OFPort read4Bytes(ByteBuf c) throws OFParseError {
         return OFPort.of((int)(c.readUnsignedInt() & 0xFFFFFFFF));
     }
 
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/OFPortBitMap.java
index 1d658c5..1c3bc68 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/OFPortBitMap.java
@@ -46,9 +46,13 @@
         super(OFBitMask128.NONE, mask);
     }
 
-    /** @return whether or not the given port is logically included in the
-     *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-     *  this OXM.
+    /** 
+     * Check if the given port is logically included in the
+     * match. I.e. will a packet from in-port <em>port</em>
+     * be matched by this OXM?
+     *
+     * @param port the port to check in the match
+     * @return boolean true or false
      */
     public boolean isOn(OFPort port) {
         // see the implementation note above about the logical inversion of the mask
@@ -63,16 +67,19 @@
         return builder.build();
     }
 
-    /** @return an OFPortBitmap based on the 'mask' part of an OFBitMask128, as, e.g., returned
-     *  by the switch.
-     **/
+    /** 
+     * @param mask the mask to create the bitmap from
+     * @return an OFPortBitmap based on the 'mask' part of an OFBitMask128, as, e.g., returned
+     * by the switch.
+     */
     public static OFPortBitMap of(OFBitMask128 mask) {
         return new OFPortBitMap(mask);
     }
 
-    /** @return iterating over all ports that are logically included in the
-     *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-     *  this OXM.
+    /** 
+     * @return iterating over all ports that are logically included in the
+     * match, i.e., whether a packet from in-port <em>port</em> be matched by
+     * this OXM.
      */
     public Iterable<OFPort> getOnPorts() {
         ArrayList<OFPort> ports = new ArrayList<>();
@@ -104,17 +111,22 @@
 
         }
 
-        /** @return whether or not the given port is logically included in the
-         *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-         *  this OXM.
+        /** 
+         * @param port the port to check if it's being matched by the bitmask
+         * @return whether or not the given port is logically included in the
+         * match, i.e., whether a packet from in-port <em>port</em> be matched by
+         * this OXM.
          */
         public boolean isOn(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
             return !(OFBitMask128.isBitOn(raw1, raw2, port.getPortNumber()));
         }
 
-        /** remove this port from the match, i.e., packets from this in-port
-         *  will NOT be matched.
+        /** 
+         * remove this port from the match, i.e., packets from this in-port
+         * will NOT be matched.
+         * @param port the port to remove from the match
+         * @return this mutator
          */
         public Builder unset(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
@@ -135,8 +147,11 @@
             return this;
         }
 
-        /** add this port from the match, i.e., packets from this in-port
-         *  will NOT be matched.
+        /** 
+         * add this port to the match, i.e., packets from this in-port
+         * will be matched.
+         * @param port the port to add to the match
+         * @return this mutator 
          */
         public Builder set(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitMap512.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitMap512.java
index c85c750..e9c8f4c 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitMap512.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPortBitMap512.java
@@ -46,9 +46,11 @@
         super(OFBitMask512.NONE, mask);
     }
 
-    /** @return whether or not the given port is logically included in the
-     *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-     *  this OXM.
+    /** 
+     * @param port the port to check
+     * @return whether or not the given port is logically included in the
+     * match, i.e., whether a packet from in-port <em>port</em> be matched by
+     * this OXM.
      */
     public boolean isOn(OFPort port) {
         // see the implementation note above about the logical inversion of the mask
@@ -63,16 +65,19 @@
         return builder.build();
     }
 
-    /** @return an OFPortBitmap based on the 'mask' part of an OFBitMask512, as, e.g., returned
-     *  by the switch.
-     **/
+    /** 
+     * @param mask the mask used to create the bitmap
+     * @return an OFPortBitmap based on the 'mask' part of an OFBitMask512, as, e.g., returned
+     * by the switch.
+     */
     public static OFPortBitMap512 of(OFBitMask512 mask) {
         return new OFPortBitMap512(mask);
     }
 
-    /** @return iterating over all ports that are logically included in the
-     *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-     *  this OXM.
+    /** 
+     * @return iterating over all ports that are logically included in the
+     * match, i.e., whether a packet from in-port <em>port</em> be matched by
+     * this OXM.
      */
     public Iterable<OFPort> getOnPorts() {
         ArrayList<OFPort> ports = new ArrayList<>();
@@ -105,9 +110,11 @@
 
         }
 
-        /** @return whether or not the given port is logically included in the
-         *  match, i.e., whether a packet from in-port <em>port</em> be matched by
-         *  this OXM.
+        /**
+         * @param port the port to check
+         * @return whether or not the given port is logically included in the
+         * match, i.e., whether a packet from in-port <em>port</em> be matched by
+         * this OXM.
          */
         public boolean isOn(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
@@ -115,8 +122,11 @@
                     raw5, raw6, raw7, raw8, port.getPortNumber()));
         }
 
-        /** remove this port from the match, i.e., packets from this in-port
-         *  will NOT be matched.
+        /** 
+         * remove this port from the match, i.e., packets from this in-port
+         * will NOT be matched.
+         * @param port the port the remove from the match
+         * @return this mutator
          */
         public Builder unset(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
@@ -149,8 +159,11 @@
             return this;
         }
 
-        /** add this port from the match, i.e., packets from this in-port
-         *  will NOT be matched.
+        /**
+         * add this port from the match, i.e., packets from this in-port
+         * will be matched.
+         * @param port the port to add to the match
+         * @return this mutator
          */
         public Builder set(OFPort port) {
             // see the implementation note above about the logical inversion of the mask
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFVlanVidMatch.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFVlanVidMatch.java
index 91c9fc8..de9da67 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFVlanVidMatch.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFVlanVidMatch.java
@@ -4,7 +4,7 @@
 
 import javax.annotation.Nullable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,7 +48,7 @@
     /** an untagged packet is specified as 0000 in OF 1.0, but 0xFFFF in OF1.0. Special case that. */
     public static final OFVlanVidMatch UNTAGGED = new OFVlanVidMatch(NONE_VAL) {
         @Override
-        public void write2BytesOF10(ChannelBuffer c) {
+        public void write2BytesOF10(ByteBuf c) {
             c.writeShort(UNTAGGED_VAL_OF10);
         }
     };
@@ -172,19 +172,19 @@
         return Arrays.copyOf(bytesCache, bytesCache.length);
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.vid);
     }
 
-    public void write2BytesOF10(ChannelBuffer c) {
+    public void write2BytesOF10(ByteBuf c) {
         c.writeShort(this.getVlan());
     }
 
-    public static OFVlanVidMatch read2Bytes(ChannelBuffer c) throws OFParseError {
+    public static OFVlanVidMatch read2Bytes(ByteBuf c) throws OFParseError {
         return OFVlanVidMatch.ofRawVid(c.readShort());
     }
 
-    public static OFVlanVidMatch read2BytesOF10(ChannelBuffer c) throws OFParseError {
+    public static OFVlanVidMatch read2BytesOF10(ByteBuf c) throws OFParseError {
         return OFVlanVidMatch.ofVlanOF10(c.readShort());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
index c97c4d0..97a5d0d 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
@@ -18,7 +18,7 @@
 
 import java.util.List;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.collect.ComparisonChain;
 import com.google.common.primitives.UnsignedBytes;
@@ -75,14 +75,14 @@
       return MINIMUM_LENGTH + 12; //  tslen == 80 
     }
  
-    public void writeTo(ChannelBuffer c) {
+    public void writeTo(ByteBuf c) {
         c.writeShort(tpn);
         c.writeShort(tslen);
         c.writeBytes(tsmap); // 10 bytes
         c.writeZero(2); // write bytes for add padding alignment (the size of bytes in tsmap must be divided in 4)   
     }
 
-     public static OduSignalID readFrom(ChannelBuffer c)   {
+     public static OduSignalID readFrom(ByteBuf c)   {
         int tpn = U16.f(c.readShort());
         int tslen = U16.f(c.readShort());
         byte[] tsmap = null;
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/PacketType.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/PacketType.java
new file mode 100644
index 0000000..3881b63
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/PacketType.java
@@ -0,0 +1,143 @@
+package org.projectfloodlight.openflow.types;
+
+import org.projectfloodlight.openflow.protocol.OFHeaderTypeNamespace;
+
+import com.google.common.hash.PrimitiveSink;
+import com.google.common.primitives.UnsignedInts;
+
+import io.netty.buffer.ByteBuf;
+
+public class PacketType implements OFValueType<PacketType> {
+
+    private final int namespace;
+    private final int nsType;
+
+    static final int NAMESPACE_ONF = 0;
+    static final int NAMESPACE_ETHERTYPE = 1;
+
+    static final int NS_TYPE_ONF_ETHERNET = 0;
+    static final int NS_TYPE_ONF_NO_PACKET = 1;
+    static final int NS_TYPE_ONF_EXPERIMENTER   = 0xFFFF;
+
+    static final int NS_TYPE_ETHER_IPv4   = 0x800;
+    static final int NS_TYPE_ETHER_IPv6   = 0x86dd;
+
+    public static final PacketType ETHERNET = new PacketType(NAMESPACE_ONF, NS_TYPE_ONF_ETHERNET);
+    public static final PacketType NO_PACKET = new PacketType(NAMESPACE_ONF, NS_TYPE_ONF_NO_PACKET);
+    public static final PacketType EXPERIMENTER = new PacketType(NAMESPACE_ONF, NS_TYPE_ONF_EXPERIMENTER);
+
+    public static final PacketType IPV4 = new PacketType(NAMESPACE_ETHERTYPE, NS_TYPE_ETHER_IPv4);
+    public static final PacketType IPV6 = new PacketType(NAMESPACE_ETHERTYPE, NS_TYPE_ETHER_IPv6);
+
+    public static final PacketType NO_MASK = PacketType.of(0xFFFF, 0x0FFFF);
+    public static final PacketType FULL_MASK = PacketType.of(0, 0);
+
+    private PacketType(int namespace, int nsType) {
+        this.namespace = namespace;
+        this.nsType = nsType;
+    }
+
+    public static PacketType of(int namespace, int nsType) {
+        switch(namespace) {
+            case NAMESPACE_ONF:
+                switch (nsType) {
+                    case NS_TYPE_ONF_ETHERNET:
+                        return ETHERNET;
+                    case NS_TYPE_ONF_NO_PACKET:
+                        return NO_PACKET;
+                    case NS_TYPE_ONF_EXPERIMENTER:
+                        return EXPERIMENTER;
+                }
+                break;
+            case NAMESPACE_ETHERTYPE:
+                switch (nsType) {
+                    case NS_TYPE_ETHER_IPv4:
+                        return IPV4;
+                    case NS_TYPE_ETHER_IPv6:
+                        return IPV6;
+                }
+                break;
+        }
+        return new PacketType(namespace, nsType);
+    }
+
+    public static PacketType of(OFHeaderTypeNamespace namespace, int nsType) {
+        return of(namespace.getStableValue(), nsType);
+
+    }
+
+    @Override
+    public PacketType applyMask(PacketType mask) {
+        return PacketType.of(this.namespace & mask.namespace, this.nsType & mask.nsType);
+    }
+
+    @Override
+    public int compareTo(PacketType o) {
+        int res = UnsignedInts.compare(this.namespace, o.namespace);
+        if(res != 0)
+            return res;
+
+        return UnsignedInts.compare(this.nsType, o.nsType);
+    }
+
+    @Override
+    public void putTo(PrimitiveSink sink) {
+        sink.putInt(namespace);
+        sink.putInt(nsType);
+    }
+
+    @Override
+    public int getLength() {
+        //4 byte
+        return 4;
+    }
+
+    public void write4Bytes(ByteBuf c) {
+        c.writeShort(namespace);
+        c.writeInt(nsType);
+    }
+
+    public static PacketType read4Bytes(ByteBuf c) {
+        return PacketType.of(c.readShort(), c.readInt());
+    }
+
+    public int getNamespace() {
+        return namespace;
+    }
+
+    public int getNsType() {
+        return nsType;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + namespace;
+        result = prime * result + nsType;
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PacketType other = (PacketType) obj;
+        if (namespace != other.namespace)
+            return false;
+        if (nsType != other.nsType)
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PacketType [namespace=" + namespace + ", nsType=" + nsType + "]";
+    }
+
+
+}
\ No newline at end of file
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TableId.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TableId.java
index 950087d..5519d4e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TableId.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TableId.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -58,11 +58,11 @@
         return LENGTH;
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.id);
     }
 
-    public static TableId readByte(ChannelBuffer c) throws OFParseError {
+    public static TableId readByte(ByteBuf c) throws OFParseError {
         return TableId.of(c.readUnsignedByte());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TransportPort.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TransportPort.java
index 6ab0254..bfca2d7 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TransportPort.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/TransportPort.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -72,11 +72,11 @@
         return Integer.toString(port);
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.port);
     }
 
-    public static TransportPort read2Bytes(ChannelBuffer c) throws OFParseError {
+    public static TransportPort read2Bytes(ByteBuf c) throws OFParseError {
         return TransportPort.of((c.readUnsignedShort() & 0x0FFFF));
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U128.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U128.java
index ddf4faa..9e7bd34 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U128.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U128.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.Nonnull;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedLongs;
@@ -71,12 +71,12 @@
         return true;
     }
 
-    public void write16Bytes(ChannelBuffer cb) {
+    public void write16Bytes(ByteBuf cb) {
         cb.writeLong(raw1);
         cb.writeLong(raw2);
     }
 
-    public static U128 read16Bytes(ChannelBuffer cb) {
+    public static U128 read16Bytes(ByteBuf cb) {
         long raw1 = cb.readLong();
         long raw2 = cb.readLong();
         return of(raw1, raw2);
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U16.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U16.java
index 2466ffc..9ed0f45 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U16.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U16.java
@@ -17,7 +17,7 @@
 
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -94,7 +94,7 @@
 
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeShort(raw);
     }
 
@@ -103,7 +103,7 @@
 
     private static class Reader implements OFMessageReader<U16> {
         @Override
-        public U16 readFrom(ChannelBuffer bb) throws OFParseError {
+        public U16 readFrom(ByteBuf bb) throws OFParseError {
             return ofRaw(bb.readShort());
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U32.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U32.java
index c69786c..fddb647 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U32.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U32.java
@@ -17,7 +17,7 @@
 
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -96,7 +96,7 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeInt(raw);
     }
 
@@ -104,7 +104,7 @@
 
     private static class Reader implements OFMessageReader<U32> {
         @Override
-        public U32 readFrom(ChannelBuffer bb) throws OFParseError {
+        public U32 readFrom(ByteBuf bb) throws OFParseError {
             return new U32(bb.readInt());
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U64.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U64.java
index f15544f..0d3cc6e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U64.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U64.java
@@ -19,7 +19,7 @@
 
 import java.math.BigInteger;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -118,7 +118,7 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeLong(raw);
     }
 
@@ -174,7 +174,7 @@
 
     private static class Reader implements OFMessageReader<U64> {
         @Override
-        public U64 readFrom(ChannelBuffer bb) throws OFParseError {
+        public U64 readFrom(ByteBuf bb) throws OFParseError {
             return U64.ofRaw(bb.readLong());
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U8.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U8.java
index 17191af..f4fed56 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U8.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/U8.java
@@ -17,7 +17,7 @@
 
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -89,7 +89,7 @@
 
 
     @Override
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         bb.writeByte(raw);
     }
 
@@ -106,7 +106,7 @@
 
     private static class Reader implements OFMessageReader<U8> {
         @Override
-        public U8 readFrom(ChannelBuffer bb) throws OFParseError {
+        public U8 readFrom(ByteBuf bb) throws OFParseError {
             return new U8(bb.readByte());
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/UDF.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/UDF.java
index e537c20..bc43d56 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/UDF.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/UDF.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.concurrent.Immutable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -60,11 +60,11 @@
         return Integer.toString(rawValue);
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static UDF read4Bytes(ChannelBuffer c) {
+    public static UDF read4Bytes(ByteBuf c) {
         return UDF.of(c.readInt());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VFI.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VFI.java
new file mode 100644
index 0000000..07691ee
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VFI.java
@@ -0,0 +1,93 @@
+package org.projectfloodlight.openflow.types;
+
+import io.netty.buffer.ByteBuf;
+
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+
+import com.google.common.hash.PrimitiveSink;
+
+/** Represents a two byte virtual forwarding instance.
+*
+* @author Sudeep Modi {@literal <}sudeep.modi@bigswitch.com{@literal >}
+*
+*/public class VFI implements OFValueType<VFI> {
+    private static final short ZERO_VAL = 0x0000;
+    final static int LENGTH = 2;
+
+    public static final VFI ZERO = new VFI(ZERO_VAL);
+
+    /** for use with masking operations */
+    public static final VFI NO_MASK = new VFI((short)0xFFFF);
+    public static final VFI FULL_MASK = ZERO;
+
+    private final short vfi;
+
+    private VFI(short vfi) {
+        this.vfi = vfi;
+    }
+
+    public static VFI ofVfi(int vfi) {
+        if (vfi == NO_MASK.vfi)
+            return NO_MASK;
+        if (vfi == ZERO_VAL)
+            return ZERO;
+        return new VFI((short) vfi);
+    }
+
+    /** @return the actual VFI value */
+    public short getVfi() {
+        return vfi;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + vfi;
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null) return false;
+        if (getClass() != obj.getClass()) return false;
+        VFI other = (VFI) obj;
+        if (vfi != other.vfi) return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "0x" + Integer.toHexString(vfi);
+    }
+
+    @Override
+    public int getLength() {
+        return LENGTH;
+    }
+
+    public void write2Bytes(ByteBuf c) {
+        c.writeShort(this.vfi);
+    }
+
+    public static VFI read2Bytes(ByteBuf c) throws OFParseError {
+        return VFI.ofVfi(c.readShort());
+    }
+
+    @Override
+    public VFI applyMask(VFI mask) {
+        return VFI.ofVfi(this.vfi & mask.vfi);
+    }
+
+    @Override
+    public int compareTo(VFI o) {
+        return Integer.compare(vfi & 0xffff, o.vfi & 0xffff);
+    }
+
+    @Override
+    public void putTo(PrimitiveSink sink) {
+        sink.putShort(vfi);
+    }
+
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VRF.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VRF.java
index b742da5..ad57e7d 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VRF.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VRF.java
@@ -2,7 +2,7 @@
 
 import javax.annotation.concurrent.Immutable;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 import com.google.common.hash.PrimitiveSink;
 import com.google.common.primitives.UnsignedInts;
@@ -60,11 +60,11 @@
         return Integer.toString(rawValue);
     }
 
-    public void write4Bytes(ChannelBuffer c) {
+    public void write4Bytes(ByteBuf c) {
         c.writeInt(rawValue);
     }
 
-    public static VRF read4Bytes(ChannelBuffer c) {
+    public static VRF read4Bytes(ByteBuf c) {
         return VRF.of(c.readInt());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanPcp.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanPcp.java
index cbb7004..5ec25dc 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanPcp.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanPcp.java
@@ -1,6 +1,6 @@
 package org.projectfloodlight.openflow.types;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -58,11 +58,11 @@
         return LENGTH;
     }
 
-    public void writeByte(ChannelBuffer c) {
+    public void writeByte(ByteBuf c) {
         c.writeByte(this.pcp);
     }
 
-    public static VlanPcp readByte(ChannelBuffer c) throws OFParseError {
+    public static VlanPcp readByte(ByteBuf c) throws OFParseError {
         return VlanPcp.of((byte)(c.readUnsignedByte() & 0xFF));
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanVid.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanVid.java
index 1c3eba4..a842821 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanVid.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VlanVid.java
@@ -1,8 +1,9 @@
 package org.projectfloodlight.openflow.types;
 
+import io.netty.buffer.ByteBuf;
+
 import java.util.Arrays;
 
-import org.jboss.netty.buffer.ChannelBuffer;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
 import com.google.common.hash.PrimitiveSink;
@@ -86,15 +87,15 @@
         return Arrays.copyOf(bytesCache, bytesCache.length);
     }
 
-    public void write2Bytes(ChannelBuffer c) {
+    public void write2Bytes(ByteBuf c) {
         c.writeShort(this.vid);
     }
 
-    public void write2BytesOF10(ChannelBuffer c) {
+    public void write2BytesOF10(ByteBuf c) {
         c.writeShort(this.getVlan());
     }
 
-    public static VlanVid read2Bytes(ChannelBuffer c) throws OFParseError {
+    public static VlanVid read2Bytes(ByteBuf c) throws OFParseError {
         return VlanVid.ofVlan(c.readShort());
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VxlanNI.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VxlanNI.java
new file mode 100644
index 0000000..5e52b5c
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/VxlanNI.java
@@ -0,0 +1,98 @@
+package org.projectfloodlight.openflow.types;
+
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+
+import com.google.common.hash.PrimitiveSink;
+import com.google.common.primitives.UnsignedInts;
+
+import io.netty.buffer.ByteBuf;
+
+/** Represents the VXLAN Network Identifier (24 bits).
+ *
+ * @author Sarath Kumar Sankaran Kutty
+ * {@literal <}sarath.kutty@bigswitch.com{@literal >}
+ */
+public class VxlanNI implements OFValueType<VxlanNI> {
+
+    private static final int VALIDATION_MASK = 0x00FFffFF;
+    final static int LENGTH = 4;
+
+    private static final int ZERO_VAL = 0x0;
+    public static final VxlanNI ZERO = new VxlanNI(ZERO_VAL);
+
+    private static final int NO_MASK_VAL = 0xFFffFFff;
+    public final static VxlanNI NO_MASK = new VxlanNI(NO_MASK_VAL);
+    public static final VxlanNI FULL_MASK = ZERO;
+
+    private final int vni;
+
+    private VxlanNI(int vni) {
+        this.vni = vni;
+    }
+
+    public static VxlanNI ofVni(int vni) {
+        if (vni == ZERO_VAL)
+            return ZERO;
+        if ((vni & VALIDATION_MASK) != vni) {
+            throw new IllegalArgumentException(String.format("Illegal VNI value: %x", vni));
+        }
+        return new VxlanNI(vni);
+    }
+
+    /** @return the VxLAN Network ID */
+    public int getVni() {
+        return vni;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null) return false;
+        if (getClass() != obj.getClass()) return false;
+        VxlanNI other = (VxlanNI) obj;
+        if (vni != other.vni) return false;
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + vni;
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(vni);
+    }
+
+    @Override
+    public int getLength() {
+        return LENGTH;
+    }
+
+
+    public void write4Bytes(ByteBuf c) {
+        c.writeInt(this.vni);
+    }
+
+    public static VxlanNI read4Bytes(ByteBuf c) throws OFParseError {
+        return VxlanNI.ofVni(c.readInt());
+    }
+
+    @Override
+    public VxlanNI applyMask(VxlanNI mask) {
+        return VxlanNI.ofVni(this.vni & mask.vni);
+    }
+
+    @Override
+    public int compareTo(VxlanNI o) {
+        return UnsignedInts.compare(vni, o.vni);
+    }
+
+    @Override
+    public void putTo(PrimitiveSink sink) {
+        sink.putInt(vni);
+    }
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/ChannelUtils.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/ChannelUtils.java
index 1a1ac6a..93d7ba6 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/ChannelUtils.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/ChannelUtils.java
@@ -2,7 +2,7 @@
 
 import java.util.List;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 import org.projectfloodlight.openflow.protocol.OFMessageReader;
 import org.projectfloodlight.openflow.protocol.Writeable;
@@ -14,14 +14,15 @@
 import com.google.common.collect.ImmutableList.Builder;
 
 /**
- * Collection of helper functions for reading and writing into ChannelBuffers
+ * Collection of helper functions for reading and writing into Unpooled
  *
  * @author capveg
  */
 
 public class ChannelUtils {
     private static final Logger logger = LoggerFactory.getLogger(ChannelUtils.class);
-    public static String readFixedLengthString(ChannelBuffer bb, int length) {
+
+    public static String readFixedLengthString(ByteBuf bb, int length) {
         byte[] dst = new byte[length];
         bb.readBytes(dst, 0, length);
         int validLength = 0;
@@ -32,7 +33,7 @@
         return new String(dst, 0, validLength, Charsets.US_ASCII);
     }
 
-    public static void writeFixedLengthString(ChannelBuffer bb, String string,
+    public static void writeFixedLengthString(ByteBuf bb, String string,
             int length) {
         int l = string.length();
         if (l > length) {
@@ -45,18 +46,18 @@
         }
     }
 
-    static public byte[] readBytes(final ChannelBuffer bb, final int length) {
+    static public byte[] readBytes(final ByteBuf bb, final int length) {
         byte byteArray[] = new byte[length];
         bb.readBytes(byteArray);
         return byteArray;
     }
 
-    static public void writeBytes(final ChannelBuffer bb,
+    static public void writeBytes(final ByteBuf bb,
             final byte byteArray[]) {
         bb.writeBytes(byteArray);
     }
 
-    public static <T> List<T> readList(ChannelBuffer bb, int length, OFMessageReader<T> reader) throws OFParseError {
+    public static <T> List<T> readList(ByteBuf bb, int length, OFMessageReader<T> reader) throws OFParseError {
         int end = bb.readerIndex() + length;
         Builder<T> builder = ImmutableList.<T>builder();
         if(logger.isTraceEnabled())
@@ -73,7 +74,7 @@
         return builder.build();
     }
 
-    public static void writeList(ChannelBuffer bb, List<? extends Writeable> writeables) {
+    public static void writeList(ByteBuf bb, List<? extends Writeable> writeables) {
         for(Writeable w: writeables)
             w.writeTo(bb);
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
index bcc46f7..00cc65e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
@@ -1,70 +1,104 @@
-/**
- *    Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior
- *    University
- *
- *    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 org.projectfloodlight.openflow.util;
 
-import org.projectfloodlight.openflow.types.U8;
+import io.netty.util.internal.EmptyArrays;
 
-public class HexString {
+/** Utility method to convert hexadecimal string from/to longs and byte arrays.
+ *
+ * @author Andreas Wundsam {@literal <}andreas.wundsam@bigswitch.com{@literal >}
+ */
+public final class HexString {
+
+    private HexString() {}
+
+    /* ================================================================================
+     * Implementation note:
+     * These implementations are optimized for small-O efficiency and thus rather ugly.
+     *
+     * When making changes, make sure *every line* is covered by a unit test.
+     *
+     * Do not use this as a blue print for normal code.
+     * ================================================================================
+     */
+
+    private final static char[] CHARS =
+        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
     /**
      * Convert a string of bytes to a ':' separated hex string
      *
-     * @param bytes
+     * @param bytes the byte[] to convert
      * @return "0f:ca:fe:de:ad:be:ef"
      */
     public static String toHexString(final byte[] bytes) {
-        int i;
-        String ret = "";
-        String tmp;
-        for (i = 0; i < bytes.length; i++) {
-            if (i > 0)
-                ret += ":";
-            tmp = Integer.toHexString(U8.f(bytes[i]));
-            if (tmp.length() == 1)
-                ret += "0";
-            ret += tmp;
+        int lenBytes = bytes.length;
+        if (lenBytes == 0) {
+            return "";
         }
-        return ret;
+        char arr[] = new char[lenBytes * 2 + (lenBytes -1)];
+
+        int charPos = 0;
+        int i = 0;
+
+        for (;;) {
+            arr[charPos++] = CHARS[ (bytes[i] >>> 4) & 0xF ];
+            arr[charPos++] = CHARS[ bytes[i] & 0xF ];
+            if (++i >= lenBytes) {
+                break;
+            }
+            arr[charPos++] = ':';
+        }
+
+        return new String(arr, 0, arr.length);
     }
 
-    public static String toHexString(final long val, final int padTo) {
-        char arr[] = Long.toHexString(val).toCharArray();
-        String ret = "";
-        // prepend the right number of leading zeros
-        int i = 0;
-        for (; i < (padTo * 2 - arr.length); i++) {
-            ret += "0";
-            if ((i % 2) != 0)
-                ret += ":";
+    public static String toHexString(long val, final int padTo) {
+        int valBytes = (64 - Long.numberOfLeadingZeros(val) + 7)/8;
+        int lenBytes = valBytes > padTo ? valBytes : padTo;
+
+        char arr[] = new char[lenBytes * 2 + (lenBytes -1)];
+
+        // fill char array from the last position, shifting val by 4 bits
+        for (int charPos = arr.length - 1; charPos >= 0; charPos--) {
+            if ((charPos + 1) % 3 == 0) {
+                // every third char is a colon
+                arr[charPos] = ':';
+            } else {
+                arr[charPos] = CHARS[((int) val) & 0xF];
+                val >>>= 4;
+            }
         }
-        for (int j = 0; j < arr.length; j++) {
-            ret += arr[j];
-            if ((((i + j) % 2) != 0) && (j < (arr.length - 1)))
-                ret += ":";
-        }
-        return ret;
+        return new String(arr, 0, arr.length);
     }
 
     public static String toHexString(final long val) {
         return toHexString(val, 8);
     }
 
+
+    /** Deprecated version of {@link #toBytes(String)}.
+     *
+     * @throws NumberFormatException upon values parse error
+     * @param values the hexstring to parse into a byte[]
+     * @return a byte[] representing the hexstring
+     * {@link Deprecated} because of inconsistent naming
+     */
+    @Deprecated
+    public static byte[] fromHexString(final String values) throws NumberFormatException {
+        return toBytes(values);
+    }
+
+    /** state constants for toBytes */
+    /** expecting first digit */
+    private final static int FIRST_DIGIT = 1;
+    /** expecting second digit or colon */
+    private static final int SECOND_DIGIT_OR_COLON = 2;
+    /** expecting colon */
+    private static final int COLON = 3;
+    /** save byte and move back to FIRST_DIGIT */
+    private static final int SAVE_BYTE = 4;
+
     /**
-     * Convert a string of hex values into a string of bytes
+     * Convert a string of hex values into a string of bytes.
      *
      * @param values
      *            "0f:ca:fe:de:ad:be:ef"
@@ -72,29 +106,103 @@
      * @throws NumberFormatException
      *             If the string can not be parsed
      */
-    public static byte[] fromHexString(final String values) throws NumberFormatException {
-        String[] octets = values.split(":");
-        byte[] ret = new byte[octets.length];
+    public static byte[] toBytes(final String values) throws NumberFormatException {
+        int start = 0;
+        int len = values.length();
 
-        for (int i = 0; i < octets.length; i++) {
-            if (octets[i].length() > 2)
-                throw new NumberFormatException("Invalid octet length");
-            ret[i] = Integer.valueOf(octets[i], 16).byteValue();
+        if (len == 0) {
+            return EmptyArrays.EMPTY_BYTES;
         }
-        return ret;
+
+        int numColons = 0;
+        for (int i=0; i < len; i++) {
+            if (values.charAt(i) == ':') {
+                numColons++;
+            }
+        }
+
+        byte[] res = new byte[numColons+1];
+        int pos = 0;
+
+        int state = FIRST_DIGIT;
+
+        byte b = 0;
+        while (start < len) {
+            char c = values.charAt(start++);
+            switch (state) {
+                case FIRST_DIGIT:
+                    int digit = Character.digit(c, 16);
+                    if(digit < 0) {
+                        throw new NumberFormatException("Invalid char at index " + start + ": " + values);
+                    }
+                    b = (byte) digit;
+                    state = start < len ? SECOND_DIGIT_OR_COLON : SAVE_BYTE;
+                    break;
+                case SECOND_DIGIT_OR_COLON:
+                    if(c != ':') {
+                        int digit2 = Character.digit(c, 16);
+                        if(digit2 < 0) {
+                            throw new NumberFormatException("Invalid char at index " + start + ": " + values);
+                        }
+                        b =  (byte) ((b<<4) | digit2);
+                        state = start < len ? COLON : SAVE_BYTE;
+                    } else {
+                        state = SAVE_BYTE;
+                    }
+                    break;
+                case COLON:
+                    if(c != ':') {
+                        throw new NumberFormatException("Separator expected at index " + start + ": " + values);
+                    }
+                    state = SAVE_BYTE;
+                    break;
+                default:
+                    throw new IllegalStateException("Should not be in state " + state);
+            }
+            if (state == SAVE_BYTE) {
+                res[pos++] = b;
+                b = 0;
+                state = FIRST_DIGIT;
+            }
+        }
+        if (pos != res.length) {
+            // detects a mal-formed input string, e.g., "01:02:"
+            throw new NumberFormatException("Invalid hex string: " + values);
+        }
+
+        return res;
     }
 
     public static long toLong(String value) throws NumberFormatException {
-        String[] octets = value.split(":");
-        if (octets.length > 8)
-            throw new NumberFormatException("Input string is too big to fit in long: " + value);
-        long l = 0;
-        for (String octet: octets) {
-            if (octet.length() > 2)
-                throw new NumberFormatException("Each colon-separated byte component must consist of 1 or 2 hex digits: " + value);
-            short s = Short.parseShort(octet, 16);
-            l = (l << 8) + s;
+        int shift = 0;
+        long result = 0L;
+
+        int sinceLastSeparator = 0;
+        for (int charPos=value.length() - 1; charPos >= 0; charPos--) {
+            char c = value.charAt(charPos);
+            if (c == ':') {
+                if (sinceLastSeparator == 0) {
+                    throw new NumberFormatException("Expected hex digit at index " + charPos +": " + value);
+                } else if(sinceLastSeparator == 1) {
+                    shift += 4;
+                }
+                sinceLastSeparator = 0;
+            } else {
+                int digit = Character.digit(c, 16);
+                if (digit < 0) {
+                    throw new NumberFormatException("Invalid hex digit at index " + charPos +": " + value);
+                }
+                result |= ((long) digit) << shift;
+                shift +=4;
+                sinceLastSeparator++;
+                if (sinceLastSeparator > 2) {
+                    throw new NumberFormatException("Expected colon at index " + charPos +": " + value);
+                }
+            }
+            if (shift > 64) {
+                throw new NumberFormatException("Too many bytes in hex string to convert to long: " + value);
+            }
         }
-        return l;
+        return result;
     }
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/MultiplePktInReasonUtil.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/MultiplePktInReasonUtil.java
index 3ee588f..107b7cf 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/MultiplePktInReasonUtil.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/MultiplePktInReasonUtil.java
@@ -20,7 +20,10 @@
     /**
      * This function is used in BVS T5/6 to decode the multiple packet in
      * reasons in Match.MetaData field.
-     * */
+     *
+     * @param pktIn the packet in message
+     * @return the set of packet in reasons
+     */
     public static Set<OFBsnPktinFlag> getOFBsnPktinFlags(OFPacketIn pktIn) {
         if(pktIn.getVersion().compareTo(OFVersion.OF_13) < 0) {
             throw new IllegalArgumentException("multiple pkt in reasons are "
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
index aafe262..7b01e4c 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/PrimitiveSinkUtils.java
@@ -48,8 +48,8 @@
     /** puts the elements of a sorted set into the {@link PrimitiveSink}. Does not support null
      *  elements. The elements are assumed to be self-delimitating.
      *
-     * @param sink
-     * @param set
+     * @param sink the sink to put the sorted set
+     * @param set the sorted set
      */
     public static void putSortedSetTo(PrimitiveSink sink,
             SortedSet<? extends PrimitiveSinkable> set) {
@@ -62,13 +62,13 @@
     /** puts the elements of a list into the {@link PrimitiveSink}. Does not support null
      *  elements. The elements are assumed to be self-delimitating.
      *
-     * @param sink
-     * @param set
+     * @param sink the sink to put the list elements
+     * @param list the list
      */
     public static void putListTo(PrimitiveSink sink,
-            List<? extends PrimitiveSinkable> set) {
-        sink.putInt(set.size());
-        for(PrimitiveSinkable e: set) {
+            List<? extends PrimitiveSinkable> list) {
+        sink.putInt(list.size());
+        for(PrimitiveSinkable e: list) {
             e.putTo(sink);
         }
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/StringByteSerializer.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/StringByteSerializer.java
index 6949fb2..6396f2e 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/StringByteSerializer.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/StringByteSerializer.java
@@ -21,10 +21,10 @@
 import java.nio.charset.Charset;
 import java.util.Arrays;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 
 public class StringByteSerializer {
-    public static String readFrom(final ChannelBuffer data, final int length) {
+    public static String readFrom(final ByteBuf data, final int length) {
         byte[] stringBytes = new byte[length];
         data.readBytes(stringBytes);
         // find the first index of 0
@@ -37,7 +37,7 @@
         return new String(Arrays.copyOf(stringBytes, index), Charset.forName("ascii"));
     }
 
-    public static void writeTo(final ChannelBuffer data, final int length,
+    public static void writeTo(final ByteBuf data, final int length,
             final String value) {
         try {
             byte[] name = value.getBytes("ASCII");
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPAddressTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPAddressTest.java
index 6e9d047..420f176 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPAddressTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPAddressTest.java
@@ -1,5 +1,7 @@
 package org.projectfloodlight.openflow.types;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -8,9 +10,12 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.List;
 
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * Most tests are in IPv4AddressTest and IPv6AddressTest
  * Just exception testing here
@@ -92,6 +97,16 @@
     }
 
     @Test
+    public void testToInetAddress() throws Exception {
+        IPAddress<?> ip0 = IPAddress.of("201.202.3.4");
+        IPAddress<?> ip1 = IPAddress.of("2001:db8:abcd::1:2:3:4");
+        InetAddress ia0 = ip0.toInetAddress();
+        InetAddress ia1 = ip1.toInetAddress();
+        assertEquals(ia0, InetAddress.getByName("201.202.3.4"));
+        assertEquals(ia1, InetAddress.getByName("2001:db8:abcd:0:1:2:3:4"));
+    }
+
+    @Test
     public void testContains() {
 
         // Test IPv4 Mask
@@ -131,6 +146,93 @@
     }
 
     @Test
+    public void testIsUnspecified() {
+        IPAddress<?> unspecifiedV4 = IPAddress.of("0.0.0.0");
+        IPAddress<?> unspecifiedV6 = IPAddress.of("::");
+        assertThat(unspecifiedV4.isUnspecified(), is(true));
+        assertThat(unspecifiedV6.isUnspecified(), is(true));
+        List<String> others = ImmutableList.of(
+                "0.0.0.1",
+                "1.2.3.4",
+                "10.0.0.0",
+                "127.0.0.1",
+                "255.255.255.255",
+                "::1",
+                "2001:db8:1:2::5:6",
+                "fc00::4:5:6:7",
+                "fe80::1234",
+                "ff02::1");
+        for (String other : others) {
+            assertThat(IPAddress.of(other).isUnspecified(), is(false));
+        }
+    }
+
+    @Test
+    public void testIsLoopback() {
+        List<String> loopbacks = ImmutableList.of(
+                "127.0.0.0",
+                "127.0.0.1",
+                "127.0.0.2",
+                "127.0.0.255",
+                "127.1.2.3",
+                "127.101.102.103",
+                "127.201.202.203",
+                "127.255.255.255",
+                "::1");
+        for (String loopback : loopbacks) {
+            assertThat(IPAddress.of(loopback).isLoopback(), is(true));
+        }
+        List<String> others = ImmutableList.of(
+                "0.0.0.0",
+                "0.0.0.1",
+                "10.0.0.1",
+                "126.255.255.255",
+                "128.0.0.0",
+                "255.255.255.255",
+                "::",
+                "::2",
+                "2001:db8::1:2:3:4",
+                "fe80:7:6:5:4:3:2:1",
+                "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+        for (String other : others) {
+            assertThat(IPAddress.of(other).isLoopback(), is(false));
+        }
+    }
+
+    @Test
+    public void testIsLinkLocal() {
+        List<String> linkLocals = ImmutableList.of(
+                "169.254.0.0",
+                "169.254.0.1",
+                "169.254.1.2",
+                "169.254.101.102",
+                "169.254.201.202",
+                "169.254.255.255",
+                "fe80::",
+                "fe80::1",
+                "fe80::1:2:3:4:5:6:7",
+                "fe80:aaaa:bbbb:cccc:dddd:eeee:ffff:1234",
+                "febf::",
+                "febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+        for (String linkLocal : linkLocals) {
+            assertThat(IPAddress.of(linkLocal).isLinkLocal(), is(true));
+        }
+        List<String> others = ImmutableList.of(
+                "0.0.0.0",
+                "1.2.3.4",
+                "169.253.255.255",
+                "169.255.0.0",
+                "255.255.255.255",
+                "::",
+                "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
+                "fec0::",
+                "ff02::1");
+        for (String other : others) {
+            assertThat(IPAddress.of(other).isLinkLocal(), is(false));
+        }
+    }
+
+    @Test
     public void testMulticastIp() {
         IPAddress<?> ip0 = IPAddress.of("240.2.3.4");
         IPAddress<?> ip1 = IPAddress.of("224.0.1.1");
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv4AddressTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv4AddressTest.java
index 5d95a5a..d0beb12 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv4AddressTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv4AddressTest.java
@@ -8,13 +8,16 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import io.netty.buffer.Unpooled;
 
 import java.net.Inet4Address;
 import java.net.InetAddress;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
@@ -228,6 +231,84 @@
     }
 
     @Test
+    public void testOf4Integers() {
+        Map<IPv4Address, IPv4Address> map = new HashMap<>();
+        map.put(IPv4Address.of(0, 0, 0, 0), IPv4Address.of(0));
+        map.put(IPv4Address.of(1, 2, 3, 4), IPv4Address.of("1.2.3.4"));
+        map.put(IPv4Address.of(6, 7, 8, 9), IPv4Address.of("6.7.8.9"));
+        map.put(IPv4Address.of(10, 1, 2, 3), IPv4Address.of("10.1.2.3"));
+        map.put(IPv4Address.of(10, 201, 202, 203), IPv4Address.of("10.201.202.203"));
+        map.put(IPv4Address.of(192, 168, 0, 101), IPv4Address.of("192.168.0.101"));
+        map.put(IPv4Address.of(211, 212, 213, 214), IPv4Address.of("211.212.213.214"));
+        map.put(IPv4Address.of(255, 255, 255, 255), IPv4Address.of(0xFF_FF_FF_FF));
+        for (Entry<IPv4Address, IPv4Address> entry : map.entrySet()) {
+            assertThat(entry.getKey(), equalTo(entry.getValue()));
+        }
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative1() {
+        IPv4Address.of(-3, 4, 5, 6);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative2() {
+        IPv4Address.of(3, -4, 5, 6);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative3() {
+        IPv4Address.of(3, 4, -5, 6);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative4() {
+        IPv4Address.of(3, 4, 5, -6);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative5() {
+        // ((byte) 128) is actually -128
+        IPv4Address.of(101, 102, 103, (byte) 128);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative6() {
+        // ((byte) 255) is actually -1
+        IPv4Address.of(101, 102, 103, (byte) 255);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionNegative7() {
+        IPv4Address.of(-1, -1, -1, -1);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionTooBig1() {
+        IPv4Address.of(1000, 2, 3, 4);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionTooBig2() {
+        IPv4Address.of(1, 20000, 3, 4);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionTooBig3() {
+        IPv4Address.of(1, 2, 300000, 4);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionTooBig4() {
+        IPv4Address.of(1, 2, 3, 4000000);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testOf4IntegersExceptionTooBig5() {
+        IPv4Address.of(256, 256, 256, 256);
+    }
+
+    @Test
     public void testOfCidrMaskLength() {
         for (int i = 0; i <= 32; i++) {
             assertEquals(IPv4Address.ofCidrMaskLength(i).asCidrMaskLength(), i);
@@ -307,7 +388,7 @@
     @Test
     public void testReadFrom() throws OFParseError {
         for(int i=0; i < testAddresses.length; i++ ) {
-            IPv4Address ip = IPv4Address.read4Bytes(ChannelBuffers.copiedBuffer(testAddresses[i]));
+            IPv4Address ip = IPv4Address.read4Bytes(Unpooled.copiedBuffer(testAddresses[i]));
             assertEquals(testInts[i], ip.getInt());
             assertArrayEquals(testAddresses[i], ip.getBytes());
             assertEquals(testStrings[i], ip.toString());
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv6AddressTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv6AddressTest.java
index a94f443..d778c1b 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv6AddressTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/IPv6AddressTest.java
@@ -1,6 +1,14 @@
 package org.projectfloodlight.openflow.types;
 
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import io.netty.buffer.Unpooled;
 
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -8,7 +16,6 @@
 
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
@@ -277,7 +284,7 @@
     public void testReadFrom() throws OFParseError, UnknownHostException {
         for(int i=0; i < testStrings.length; i++ ) {
             byte[] bytes = Inet6Address.getByName(testStrings[i]).getAddress();
-            IPv6Address ip = IPv6Address.read16Bytes(ChannelBuffers.copiedBuffer(bytes));
+            IPv6Address ip = IPv6Address.read16Bytes(Unpooled.copiedBuffer(bytes));
             assertEquals(testStrings[i], ip.toString());
             assertArrayEquals(bytes, ip.getBytes());
         }
@@ -314,6 +321,13 @@
         assertEquals("0000:0000:0000:0000:0000:0000:0000:0000", IPv6Address.of("::").toString(false, true));
         assertEquals("1::4:5:6:0:8", IPv6Address.of("1:0:0:4:5:6:0:8").toString(true, false));
         assertEquals("1:0:0:4::8", IPv6Address.of("1:0:0:4:0:0:0:8").toString(true, false));
+        // Two equal length zero runs; should zero compress the first instance
+        assertEquals("1::4:2:0:0:8", IPv6Address.of("1:0:0:4:2:0:0:8").toString(true, false));
+        // Shouldn't zero compress a single zero
+        assertEquals("1:0:2:4:3:1:0:8", IPv6Address.of("1:0:2:4:3:1:0:8").toString(true, false));
+        // Test zero runs at the end of the address since that's a different code path in toString
+        assertEquals("1::4:2:8:0:0", IPv6Address.of("1:0:0:4:2:8:0:0").toString(true, false));
+        assertEquals("1:3:2:4:3:1:5:0", IPv6Address.of("1:3:2:4:3:1:5:0").toString(true, false));
     }
 
     @Test
@@ -427,4 +441,76 @@
         assertEquals("::", IPv6Address.of("::%eth0").toString(true, false));
         assertEquals("1:0:0:4::8", IPv6Address.of("1:0:0:4:0:0:0:8%2").toString(true, false));
     }
+
+    private void testModifiedEui64(
+            String network, String macAddress, String expectedIpAddress) {
+
+        IPv6AddressWithMask networkObj = IPv6AddressWithMask.of(network);
+        MacAddress macAddressObj = MacAddress.of(macAddress);
+        MacAddress macAddressAdd1 = MacAddress.of(
+                macAddressObj.getLong() + 1 & 0xFFFF_FFFF_FFFFL);
+        MacAddress macAddressSub1 = MacAddress.of(
+                macAddressObj.getLong() - 1 & 0xFFFF_FFFF_FFFFL);
+        IPv6Address ipAddressObj = IPv6Address.of(networkObj, macAddressObj);
+        IPv6Address expectedObj = IPv6Address.of(expectedIpAddress);
+
+        assertThat(ipAddressObj, is(expectedObj));
+        assertThat(ipAddressObj.isModifiedEui64Derived(macAddressObj), is(true));
+        assertThat(ipAddressObj.isModifiedEui64Derived(macAddressAdd1), is(false));
+        assertThat(ipAddressObj.isModifiedEui64Derived(macAddressSub1), is(false));
+    }
+
+    @Test
+    public void testModifiedEui64() throws Exception {
+        testModifiedEui64(
+                "fe80::/64", "00:00:00:00:00:00", "fe80::0200:ff:fe00:0");
+        testModifiedEui64(
+                "fe80::/64", "12:34:56:78:9a:bc", "fe80::1034:56ff:fe78:9abc");
+        testModifiedEui64(
+                "fe80::/64", "ff:ff:ff:ff:ff:ff", "fe80::fdff:ffff:feff:ffff");
+        testModifiedEui64(
+                "fe80::/10", "5c:16:c7:12:34:56", "fe80::5e16:c7ff:fe12:3456");
+        testModifiedEui64(
+                "2001:db8:9876:5400::/56", "00:0c:29:ab:cd:ef",
+                "2001:db8:9876:5400:20c:29ff:feab:cdef");
+        testModifiedEui64(
+                "fd00:9999:8888::/48", "52:54:00:78:56:34",
+                "fd00:9999:8888::5054:00ff:fe78:5634");
+        testModifiedEui64(
+                "2001:db8:7777:aabb::/64", "14:10:9f:00:00:cd",
+                "2001:db8:7777:aabb:1610:9fff:fe00:00cd");
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testModifiedEui64ExceptionNullNetwork() {
+        IPv6Address.of(
+                (IPv6AddressWithMask) null,
+                MacAddress.of("00:50:56:12:34:56"));
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testModifiedEui64ExceptionNullMacAddress() {
+        IPv6Address.of(
+                IPv6AddressWithMask.LINK_LOCAL_NETWORK,
+                (MacAddress) null);
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testModifiedEui64ExceptionNullDerivedMacAddress() {
+        IPv6Address.NONE.isModifiedEui64Derived(null);
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testModifiedEui64ExceptionPrefixLengthNo() {
+        IPv6Address.of(
+                IPv6Address.of("fef::").withMask(IPv6Address.of("f0f0:1234::")),
+                MacAddress.of("5c:16:c7:00:00:00"));
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testModifiedEui64ExceptionPrefixLengthTooLong() {
+        IPv6Address.of(
+                IPv6AddressWithMask.of("fe80::/65"),
+                MacAddress.of("5c:16:c7:00:00:00"));
+    }
 }
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/MacAddressTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/MacAddressTest.java
index e1c7721..f201b47 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/MacAddressTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/MacAddressTest.java
@@ -1,8 +1,9 @@
 package org.projectfloodlight.openflow.types;
 
+import io.netty.buffer.Unpooled;
+
 import java.util.Arrays;
 
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
 import org.projectfloodlight.openflow.exceptions.OFParseError;
 
@@ -22,12 +23,18 @@
             {(byte) 255, (byte) 255, (byte) 255, (byte) 255, (byte) 255, (byte) 255 }
     };
 
-    String[] testStrings = {
+    String[] testColonStrings = {
             "01:02:03:04:05:06",
             "80:00:00:00:00:01",
-            "ff:ff:ff:ff:ff:ff"
+            "ff:ff:ff:ff:ff:ff",
     };
 
+    String[] testHyphenStrings = {
+             "01-02-03-04-05-06",
+             "80-00-00-00-00-01",
+             "ff-ff-ff-ff-ff-ff",
+     };
+
     long[] testInts = {
             0x00010203040506L,
             0x00800000000001L,
@@ -43,7 +50,8 @@
             "00:fff:ef:12:12:ff",
             "01:02:03:04:05;06",
             "0:1:2:3:4:5:6",
-            "01:02:03:04"
+            "01:02:03:04",
+            "01-02-03:04-05-06",
     };
 
     byte[][] invalidMacBytes = {
@@ -53,11 +61,15 @@
 
     @Test
     public void testOfString() {
+        testOfStringForArray(testColonStrings);
+        testOfStringForArray(testHyphenStrings);
+    }
+
+    private void testOfStringForArray(String [] strings) {
         for(int i=0; i < testAddresses.length; i++ ) {
-            MacAddress ip = MacAddress.of(testStrings[i]);
+            MacAddress ip = MacAddress.of(strings[i]);
             assertEquals(testInts[i], ip.getLong());
             assertArrayEquals(testAddresses[i], ip.getBytes());
-            assertEquals(testStrings[i], ip.toString());
         }
     }
 
@@ -67,17 +79,17 @@
             MacAddress ip = MacAddress.of(testAddresses[i]);
             assertEquals("error checking long representation of "+Arrays.toString(testAddresses[i]) + "(should be "+Long.toHexString(testInts[i]) +")", testInts[i],  ip.getLong());
             assertArrayEquals(testAddresses[i], ip.getBytes());
-            assertEquals(testStrings[i], ip.toString());
+            assertEquals(testColonStrings[i], ip.toString());
         }
     }
 
     @Test
     public void testReadFrom() throws OFParseError {
         for(int i=0; i < testAddresses.length; i++ ) {
-            MacAddress ip = MacAddress.read6Bytes(ChannelBuffers.copiedBuffer(testAddresses[i]));
+            MacAddress ip = MacAddress.read6Bytes(Unpooled.copiedBuffer(testAddresses[i]));
             assertEquals(testInts[i], ip.getLong());
             assertArrayEquals(testAddresses[i], ip.getBytes());
-            assertEquals(testStrings[i], ip.toString());
+            assertEquals(testColonStrings[i], ip.toString());
         }
     }
 
@@ -156,14 +168,72 @@
     }
 
     @Test
+
+    public void testForIPv4MulticastAddress() {
+        IPv4Address ip = IPv4Address.of("224.1.1.1");
+        MacAddress mac = MacAddress.forIPv4MulticastAddress(ip);
+        MacAddress expectedMac = MacAddress.of("01:00:5E:01:01:01");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv4Address.of("224.129.1.1");
+        mac = MacAddress.forIPv4MulticastAddress(ip);
+        expectedMac = MacAddress.of("01:00:5E:01:01:01");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv4Address.of("225.1.1.1");
+        mac = MacAddress.forIPv4MulticastAddress(ip);
+        expectedMac = MacAddress.of("01:00:5E:01:01:01");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv4Address.of("239.129.1.1");
+        mac = MacAddress.forIPv4MulticastAddress(ip);
+        expectedMac = MacAddress.of("01:00:5E:01:01:01");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv4Address.of("224.1.2.3");
+        mac = MacAddress.forIPv4MulticastAddress(ip);
+        expectedMac = MacAddress.of("01:00:5E:01:02:03");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv4Address.of("239.129.2.3");
+        mac = MacAddress.forIPv4MulticastAddress(ip);
+        expectedMac = MacAddress.of("01:00:5E:01:02:03");
+        assertTrue(mac.equals(expectedMac));
+    }
+
     public void testOfDatapathid() {
         MacAddress mac = MacAddress.of(DatapathId.NONE);
         assertThat(mac, is(MacAddress.NONE));
 
-        for (String s : testStrings) {
+        for (String s : testColonStrings) {
             DatapathId dpid = DatapathId.of("00:00:" + s);
             mac = MacAddress.of(dpid);
             assertThat(mac, is(MacAddress.of(s)));
         }
     }
+
+    @Test
+    public void forIPv6MulticastAddr() {
+        IPv6Address ip = IPv6Address.of("ff02::1:ff00:0");
+        MacAddress mac = MacAddress.forIPv6MulticastAddr(ip);
+        MacAddress expectedMac = MacAddress.of("33:33:ff:00:00:00");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv6Address.of("ff02::1:ff01:0203");
+        mac = MacAddress.forIPv6MulticastAddr(ip);
+        expectedMac = MacAddress.of("33:33:ff:01:02:03");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv6Address.of("ff02::1:0102:0304");
+        mac = MacAddress.forIPv6MulticastAddr(ip);
+        expectedMac = MacAddress.of("33:33:01:02:03:04");
+        assertTrue(mac.equals(expectedMac));
+
+        ip = IPv6Address.of("2001::1:0102:0304");
+        try {
+            mac = MacAddress.forIPv6MulticastAddr(ip);
+        } catch(IllegalArgumentException e) {
+                // ok
+        }
+    }
 }
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/OFErrorCauseDataTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/OFErrorCauseDataTest.java
index 9a5a4dc..6d6c545 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/OFErrorCauseDataTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/OFErrorCauseDataTest.java
@@ -2,10 +2,10 @@
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertThat;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 
 import org.hamcrest.Matchers;
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
 import org.projectfloodlight.openflow.protocol.OFFactories;
 import org.projectfloodlight.openflow.protocol.OFFlowAdd;
@@ -60,7 +60,7 @@
         .setPriority(6000)
         .build();
 
-        ChannelBuffer bb = ChannelBuffers.dynamicBuffer();
+        ByteBuf bb = Unpooled.buffer();
         flowAdd.writeTo(bb);
         byte[] flowAddBytes = new byte[bb.readableBytes()];
         bb.readBytes(flowAddBytes);
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/U128Test.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/U128Test.java
index 81d9d7f..56dc070 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/U128Test.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/U128Test.java
@@ -8,12 +8,12 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 
 import java.text.MessageFormat;
 
 import org.hamcrest.Matchers;
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -36,12 +36,12 @@
 
     @Test
     public void testReadBytes() {
-        ChannelBuffer empty = ChannelBuffers.wrappedBuffer(new byte[16]);
+        ByteBuf empty = Unpooled.wrappedBuffer(new byte[16]);
         U128 uEmpty = U128.read16Bytes(empty);
         assertThat(uEmpty.getMsb(), equalTo(0L));
         assertThat(uEmpty.getLsb(), equalTo(0L));
 
-        ChannelBuffer value = ChannelBuffers.wrappedBuffer(
+        ByteBuf value = Unpooled.wrappedBuffer(
                 new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0x88,
                         (byte) 0x99, (byte) 0xaa, (byte) 0xbb, (byte) 0xcc, (byte) 0xdd,
                         (byte) 0xee, (byte) 0xff, 0x11 });
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/VxlanNITest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/VxlanNITest.java
new file mode 100644
index 0000000..818dd07
--- /dev/null
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/types/VxlanNITest.java
@@ -0,0 +1,50 @@
+package org.projectfloodlight.openflow.types;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+
+public class VxlanNITest {
+
+    @Test
+    public void testValidMaxVni() {
+        VxlanNI.ofVni(0x00ffffff);
+    }
+
+    @Test
+    public void testValidMinVni() {
+        VxlanNI.ofVni(0x0000001);
+    }
+
+    @Test
+    public void testVniEquals() {
+        assertEquals((int)VxlanNI.ofVni(0x01).getVni(), 0x01);
+        assertEquals((int)VxlanNI.ofVni(0x00ffFFff).getVni(), 0x00ffFFff);
+    }
+
+    @Test
+    public void testVniObjects() {
+        VxlanNI o = VxlanNI.ofVni(0x00ffFFff);
+        VxlanNI m = VxlanNI.ofVni(0x00ffFFff);
+        assertEquals(o.compareTo(m), 0);
+        assertEquals(o.getVni(), m.getVni());
+        assertFalse(!o.equals(m));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testInvalidVni1() {
+        VxlanNI.ofVni(0xFFffFFff);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testInvalidVni2() {
+        VxlanNI.ofVni(0x0FffFFff);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testInvalidVni3() {
+        VxlanNI.ofVni(0x01FffFFff);
+    }
+}
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/util/HexStringTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/util/HexStringTest.java
index 360cb5a..ca5df98 100644
--- a/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/util/HexStringTest.java
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/openflow/util/HexStringTest.java
@@ -17,14 +17,21 @@
 
 package org.projectfloodlight.openflow.util;
 
+import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.util.Random;
 
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * Does hexstring conversion work?
  *
  * @author Rob Sherwood (rob.sherwood@stanford.edu)
+ * @author Andreas Wundsam <andreas.wundsam@bigswitch.com>
  */
 public class HexStringTest {
 
@@ -41,7 +48,7 @@
         String dpidStr = "3e:1f:01:fc:72:8c:63:31";
         long valid = 0x3e1f01fc728c6331L;
         long testLong = HexString.toLong(dpidStr);
-        assertEquals(valid, testLong);
+        assertEquals("was: " + Long.toHexString(testLong), valid, testLong);
     }
 
     @Test
@@ -49,7 +56,7 @@
         String dpidStr = "1f:1:fc:72:3:f:31";
         long valid = 0x1f01fc72030f31L;
         long testLong = HexString.toLong(dpidStr);
-        assertEquals(valid, testLong);
+        assertEquals("was: " + Long.toHexString(testLong), valid, testLong);
     }
 
     @Test
@@ -76,13 +83,17 @@
     }
 
     @Test(expected=NumberFormatException.class)
+    public void testToLongErrorColonAtEnd() {
+        HexString.toLong("03:01:");
+    }
+
+    @Test(expected=NumberFormatException.class)
     public void testToLongErrorInvalidHexDigit() {
         HexString.toLong("ss:01");
     }
 
-    @Test(expected=NumberFormatException.class)
     public void testToLongErrorEmptyString() {
-        HexString.toLong("");
+        assertThat(HexString.toLong(""), equalTo(0L));
     }
 
 
@@ -94,10 +105,138 @@
         assertEquals(valid, testString);
     }
 
-    @Test(expected=NumberFormatException.class)
-    public void testFromHexStringError() {
-        String invalidStr = "00:00:00:00:00:00:ffff";
-        HexString.fromHexString(invalidStr);
+    @Test
+    public void testToStringBytes2() {
+        byte[] dpid = { 1, 2, 3, 4 };
+        String valid = "01:02:03:04";
+        String testString = HexString.toHexString(dpid);
+        assertEquals(valid, testString);
     }
+
+    @Test
+    public void testToStringBytes3() {
+        byte[] dpid = { (byte) 0xff };
+        String valid = "ff";
+        String testString = HexString.toHexString(dpid);
+        assertEquals(valid, testString);
+    }
+
+    @Test
+    public void testToStringEmpty() {
+        byte[] dpid = { };
+        String valid = "";
+        String testString = HexString.toHexString(dpid);
+        assertEquals(valid, testString);
+    }
+
+    @Test
+    public void testToStringLong() {
+        byte[] dpid = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+        String valid = "01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f";
+        String testString = HexString.toHexString(dpid);
+        assertEquals(valid, testString);
+    }
+
+    @Test
+    public void testToZero() {
+        byte[] dpid = { 0, 0, 0, 0};
+        String valid = "00:00:00:00";
+        String testString = HexString.toHexString(dpid);
+        assertEquals(valid, testString);
+    }
+
+    @Test
+    public void testToStringFromLong() {
+        assertThat(HexString.toHexString(0x0L), equalTo("00:00:00:00:00:00:00:00"));
+        assertThat(HexString.toHexString(0x00_00_00_00_00_00_00_01L), equalTo("00:00:00:00:00:00:00:01"));
+        assertThat(HexString.toHexString(0x01_02_03_04_05_06_07_08L), equalTo("01:02:03:04:05:06:07:08"));
+        assertThat(HexString.toHexString(0x00_00_ff_fe_fd_fc_fb_fa_f9_f8L), equalTo("ff:fe:fd:fc:fb:fa:f9:f8"));
+        assertThat(HexString.toHexString(0x80_70_60_50_40_30_20_10L), equalTo("80:70:60:50:40:30:20:10"));
+    }
+
+    @Test
+    public void testToStringFromLongPad6() {
+        assertThat(HexString.toHexString(0x0L, 6), equalTo("00:00:00:00:00:00"));
+        assertThat(HexString.toHexString(0x00_00_00_00_00_00_00_01L, 6), equalTo("00:00:00:00:00:01"));
+        assertThat(HexString.toHexString(0x00_00_01_02_03_04_05_06L, 6), equalTo("01:02:03:04:05:06"));
+        assertThat(HexString.toHexString(0x00_00_ff_fe_fd_fc_fb_faL, 6), equalTo("ff:fe:fd:fc:fb:fa"));
+        // when supplying a value longer than 6, it is displayed completely
+        assertThat(HexString.toHexString(0x80_70_60_50_40_30_20_10L, 6), equalTo("80:70:60:50:40:30:20:10"));
+    }
+
+    @Test
+    public void testToBytes() {
+        assertThat(HexString.toBytes(""), equalTo(new byte[]{}));
+        assertThat(HexString.toBytes("1"), equalTo(new byte[]{0x01}));
+        assertThat(HexString.toBytes("f"), equalTo(new byte[]{0x0f}));
+        assertThat(HexString.toBytes("10"), equalTo(new byte[]{(byte) 0x10}));
+        assertThat(HexString.toBytes("80"), equalTo(new byte[]{(byte) 0x80}));
+        assertThat(HexString.toBytes("ff"), equalTo(new byte[]{(byte) 0xff}));
+        assertThat(HexString.toBytes("0:0"), equalTo(new byte[]{(byte) 0x00, 0x00}));
+        assertThat(HexString.toBytes("00:00"), equalTo(new byte[]{(byte) 0x00, 0x00}));
+        assertThat(HexString.toBytes("0:1"), equalTo(new byte[]{(byte) 0x00, 0x01}));
+        assertThat(HexString.toBytes("00:1"), equalTo(new byte[]{(byte) 0x00, 0x01}));
+        assertThat(HexString.toBytes("0:01"), equalTo(new byte[]{(byte) 0x00, 0x01}));
+        assertThat(HexString.toBytes("1:0"), equalTo(new byte[]{(byte) 0x01, 0x00}));
+        assertThat(HexString.toBytes("01:00"), equalTo(new byte[]{(byte) 0x01, 0x00}));
+        assertThat(HexString.toBytes("01:02:03:04"), equalTo(new byte[]{(byte) 0x01, 0x02, 03, 04}));
+        assertThat(HexString.toBytes("ff:fe:03:04"), equalTo(new byte[]{(byte) 0xff, (byte) 0xfe, 03, 04}));
+        assertThat(HexString.toBytes("ff:fe:3:4"), equalTo(new byte[]{(byte) 0xff, (byte) 0xfe, 03, 04}));
+        assertThat(HexString.toBytes("01:02:03:04:05:06"), equalTo(new byte[]{0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }));
+        assertThat(HexString.toBytes("ff:1:fe:2:fd"),
+                equalTo(new byte[]{(byte) 0xff, 0x01, (byte) 0xfe, 0x02, (byte) 0xfd}));
+
+    }
+    @Test
+    public void testToBytesRandom() {
+        Random r = new Random();
+        for(int length: ImmutableList.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 15, 16, 32, 63, 64, 128, 255, 256, 511, 512, 1023, 1024)) {
+            StringBuilder build = new StringBuilder();
+            byte[] bytes = new byte[length];
+            for(int i=0; i<length; i++) {
+                byte b = (byte) r.nextInt(256);
+                build.append(String.format("%02x", b));
+                if(i < length-1) {
+                    build.append(":");
+                }
+                bytes[i] = b;
+            }
+            assertThat("For length "+ length + ", ",
+                    HexString.toBytes(build.toString()),
+                    equalTo(bytes));
+        }
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void testToBytesError() {
+        String invalidStr = "00:00:00:00:00:00:ffff";
+        HexString.toBytes(invalidStr);
+    }
+
+
+    @Test(expected=NumberFormatException.class)
+    public void testToBytesError2() {
+        String invalidStr = ":01:02:03";
+        HexString.toBytes(invalidStr);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void testToBytesError3() {
+        String invalidStr = "01::02:03";
+        HexString.toBytes(invalidStr);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void testBoBytesError4() {
+        String invalidStr = "01:02:03:";
+        HexString.toBytes(invalidStr);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void testtoBytesError5() {
+        String invalidStr = "01:0X";
+        HexString.toBytes(invalidStr);
+    }
+
 }
 
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/OFBundleAddTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/OFBundleAddTest.java
new file mode 100644
index 0000000..48a80c4
--- /dev/null
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/OFBundleAddTest.java
@@ -0,0 +1,74 @@
+package org.projectfloodlight.protocol;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.projectfloodlight.openflow.protocol.OFBundleAddMsg;
+import org.projectfloodlight.openflow.protocol.OFFactories;
+import org.projectfloodlight.openflow.protocol.OFFactory;
+import org.projectfloodlight.openflow.protocol.OFFlowAdd;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.types.BundleId;
+
+/** Custom tests that validate that BundleAdd messages inherit the XID from their
+ *  contained message, as per OF Spec 1.4.0:
+ *  <p>
+ *  7.3.9.6 Adding messages to a bundle
+ *  <p>
+ *     Message added in a bundle should have a unique xid to help matching errors to messages,
+ *     and the xid of the bundle add message must be the same.
+ *  </p>
+ *
+ * @author Andreas Wundsam <andreas.wundsam@bigswitch.com>
+ */
+public class OFBundleAddTest {
+    private final OFFactory factory = OFFactories.getFactory(OFVersion.OF_14);
+    private OFFlowAdd flowAdd;
+
+    @Before
+    public void setup() {
+        flowAdd = factory.buildFlowAdd().build();
+
+    }
+
+    @Test
+    public void testBundleAddBuilder() {
+        OFBundleAddMsg bundleAdd = createBundleAdd();
+        assertThat(bundleAdd.getXid(), equalTo(flowAdd.getXid()));
+    }
+
+    private OFBundleAddMsg createBundleAdd() {
+        return factory.buildBundleAddMsg()
+                .setBundleId(BundleId.of(1))
+                .setData(flowAdd)
+                .build();
+    }
+
+    @Test
+    public void testBundleAddBuilderWithParent() {
+        OFBundleAddMsg bundleAdd = createBundleAdd();
+
+        // validate BuilderWithParent
+        OFBundleAddMsg builtFromOtherMessage = bundleAdd.createBuilder()
+           .build();
+
+        assertThat(builtFromOtherMessage.getXid(), equalTo(builtFromOtherMessage.getData().getXid()));
+    }
+
+    @Test
+    public void testBundleAddBuilderWithParentOverwrite() {
+        OFFlowAdd flowAdd2 = factory.buildFlowAdd().setXid(1234L).build();
+
+        // BuilderWithParent, overwrite with new message
+        OFBundleAddMsg bundleAdd = createBundleAdd();
+
+        OFBundleAddMsg builtFromOtherMessage = bundleAdd.createBuilder()
+           .setData(flowAdd2)
+           .build();
+
+        assertThat(builtFromOtherMessage.getXid(), equalTo(flowAdd2.getXid()));
+    }
+
+}
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/match/OFMatchPrerequisitesTest.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/match/OFMatchPrerequisitesTest.java
new file mode 100644
index 0000000..89cd536
--- /dev/null
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/protocol/match/OFMatchPrerequisitesTest.java
@@ -0,0 +1,86 @@
+package org.projectfloodlight.protocol.match;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+import static org.projectfloodlight.openflow.protocol.match.MatchField.ETH_TYPE;
+import static org.projectfloodlight.openflow.protocol.match.MatchField.IPV4_SRC;
+
+import java.util.Arrays;
+
+import org.hamcrest.Matchers;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.projectfloodlight.openflow.protocol.OFFactories;
+import org.projectfloodlight.openflow.protocol.OFFactory;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.protocol.match.Match;
+import org.projectfloodlight.openflow.protocol.match.MatchField;
+import org.projectfloodlight.openflow.types.EthType;
+import org.projectfloodlight.openflow.types.IPv4Address;
+
+@RunWith(Parameterized.class)
+public class OFMatchPrerequisitesTest {
+    private final OFFactory factory;
+
+    @Parameters(name="{index}.ChannelHandlerVersion={0}")
+    public static Iterable<Object[]> data() {
+        return Arrays.asList(new Object[][] {
+                {OFVersion.OF_10},
+                {OFVersion.OF_13},
+                {OFVersion.OF_14}
+        });
+    }
+
+    public OFMatchPrerequisitesTest(OFVersion version) {
+        factory = OFFactories.getFactory(version);
+    }
+
+    @Test
+    public void testPreRequisitesNotMet() {
+        Match match = factory.buildMatch()
+           .setExact(ETH_TYPE, EthType.IPv6)
+           .setExact(IPV4_SRC, IPv4Address.of("1.2.3.4"))
+           .build();
+
+        assertThat(match.get(ETH_TYPE), equalTo(EthType.IPv6));
+        assertThat(match.isExact(ETH_TYPE), equalTo(true));
+        assertThat(match.isPartiallyMasked(ETH_TYPE), equalTo(false));
+        assertThat(match.isFullyWildcarded(ETH_TYPE), equalTo(false));
+
+        assertThat(match.get(IPV4_SRC), nullValue());
+        assertThat(match.isExact(IPV4_SRC), equalTo(false));
+        assertThat(match.isPartiallyMasked(IPV4_SRC), equalTo(false));
+        assertThat(match.isFullyWildcarded(IPV4_SRC), equalTo(true));
+
+        Iterable<MatchField<?>> matchFields = match.getMatchFields();
+        assertThat(matchFields, Matchers.<MatchField<?>>iterableWithSize(1));
+        assertThat(matchFields, Matchers.<MatchField<?>>contains(MatchField.ETH_TYPE));
+    }
+
+    @Test
+    public void testPreRequisitesMet() {
+        Match match = factory.buildMatch()
+           .setExact(ETH_TYPE, EthType.IPv4)
+           .setExact(IPV4_SRC, IPv4Address.of("1.2.3.4"))
+           .build();
+
+        assertThat(match.get(ETH_TYPE), equalTo(EthType.IPv4));
+        assertThat(match.isExact(ETH_TYPE), equalTo(true));
+        assertThat(match.isPartiallyMasked(ETH_TYPE), equalTo(false));
+        assertThat(match.isFullyWildcarded(ETH_TYPE), equalTo(false));
+
+        assertThat(match.get(IPV4_SRC), equalTo(IPv4Address.of("1.2.3.4")));
+        assertThat(match.isExact(IPV4_SRC), equalTo(true));
+        assertThat(match.isPartiallyMasked(IPV4_SRC), equalTo(false));
+        assertThat(match.isFullyWildcarded(IPV4_SRC), equalTo(false));
+
+        Iterable<MatchField<?>> matchFields = match.getMatchFields();
+        assertThat(matchFields, Matchers.<MatchField<?>>iterableWithSize(2));
+        assertThat(matchFields, Matchers.<MatchField<?>>contains(MatchField.ETH_TYPE, MatchField.IPV4_SRC));
+    }
+
+
+}
diff --git a/java_gen/templates/_field_accessors.java b/java_gen/templates/_field_accessors.java
index 41ac66f..46a79b6 100644
--- a/java_gen/templates/_field_accessors.java
+++ b/java_gen/templates/_field_accessors.java
@@ -16,7 +16,7 @@
         return ${version_prop.enum_value};
 //::    elif version_prop.is_length_value:
         // FIXME: Hacky and inperformant way to determine a message length. Should be replaced with something better
-        ChannelBuffer c = new LengthCountingPseudoChannelBuffer();
+        ByteBuf c = new LengthCountingPseudoByteBuf();
         WRITER.write(c, ${ "this" if not builder else "({0}) this.getMessage()".format(msg.name) });
         return c.writerIndex();
 //::    else:
@@ -28,7 +28,7 @@
     }
 //:: #endif
 
-//:: if generate_setters and prop.is_writeable:
+//:: if generate_setters and prop.needs_setter:
     //:: setter_template_file_name = "%s/custom/%s_%s.java" % (template_dir, msg.name if not builder else msg.name + '.Builder', prop.setter_name)
     //:: if os.path.exists(setter_template_file_name):
     //:: include(setter_template_file_name, msg=msg, builder=builder, has_parent=has_parent)
@@ -36,12 +36,14 @@
     //:: else:
     @Override
     public ${msg.interface.name}.Builder ${prop.setter_name}(${prop.java_type.public_type} ${prop.name})${ "" if prop in msg.members else " throws UnsupportedOperationException"} {
-        //:: if prop in msg.members:
+        //:: if prop.is_writeable and prop in msg.members:
         this.${prop.name} = ${prop.name};
         this.${prop.name}Set = true;
         return this;
-        //:: else:
+        //:: elif prop.is_writeable:
             throw new UnsupportedOperationException("Property ${prop.name} not supported in version #{version}");
+        //:: else:
+            throw new UnsupportedOperationException("Property ${prop.name} is not writeable");
         //:: #endif
     }
     //:: #endif
diff --git a/java_gen/templates/_imports.java b/java_gen/templates/_imports.java
index f84efbe..b64865f 100644
--- a/java_gen/templates/_imports.java
+++ b/java_gen/templates/_imports.java
@@ -16,15 +16,17 @@
 import org.projectfloodlight.openflow.protocol.instruction.*;
 import org.projectfloodlight.openflow.protocol.instructionid.*;
 import org.projectfloodlight.openflow.protocol.match.*;
+import org.projectfloodlight.openflow.protocol.stat.*;
 import org.projectfloodlight.openflow.protocol.oxm.*;
+import org.projectfloodlight.openflow.protocol.oxs.*;
 import org.projectfloodlight.openflow.protocol.queueprop.*;
 import org.projectfloodlight.openflow.types.*;
 import org.projectfloodlight.openflow.util.*;
 import org.projectfloodlight.openflow.exceptions.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
diff --git a/java_gen/templates/const_serializer.java b/java_gen/templates/const_serializer.java
index 03ca8ac..9af3a40 100644
--- a/java_gen/templates/const_serializer.java
+++ b/java_gen/templates/const_serializer.java
@@ -44,7 +44,7 @@
     public final static ${int_wire_type} ${entry.name}_VAL = ${entry.format_value(version)};
     //:: #endfor
 
-    public static ${enum.name} readFrom(ChannelBuffer bb) throws OFParseError {
+    public static ${enum.name} readFrom(ByteBuf bb) throws OFParseError {
         try {
             return ofWireValue(${wire_type.read_op(version)});
         } catch (IllegalArgumentException e) {
@@ -52,7 +52,7 @@
         }
     }
 
-    public static void writeTo(ChannelBuffer bb, ${enum.name} e) {
+    public static void writeTo(ByteBuf bb, ${enum.name} e) {
         ${wire_type.write_op(version=version, name="toWireValue(e)")};
     }
 
diff --git a/java_gen/templates/const_set_serializer.java b/java_gen/templates/const_set_serializer.java
index 61592a6..35e9c86 100644
--- a/java_gen/templates/const_set_serializer.java
+++ b/java_gen/templates/const_set_serializer.java
@@ -45,7 +45,7 @@
     public final static ${int_wire_type} ${entry.name}_VAL = ${entry.format_value(version)};
     //:: #endfor
 
-    public static Set<${enum.name}> readFrom(ChannelBuffer bb) throws OFParseError {
+    public static Set<${enum.name}> readFrom(ByteBuf bb) throws OFParseError {
         try {
             return ofWireValue(${wire_type.read_op(version)});
         } catch (IllegalArgumentException e) {
@@ -53,7 +53,7 @@
         }
     }
 
-    public static void writeTo(ChannelBuffer bb, Set<${enum.name}> set) {
+    public static void writeTo(ByteBuf bb, Set<${enum.name}> set) {
         ${wire_type.write_op(version=version, name="toWireValue(set)")};
     }
 
diff --git a/java_gen/templates/custom/OFBundleAddMsg.Builder_setData.java b/java_gen/templates/custom/OFBundleAddMsg.Builder_setData.java
new file mode 100644
index 0000000..0a59131
--- /dev/null
+++ b/java_gen/templates/custom/OFBundleAddMsg.Builder_setData.java
@@ -0,0 +1,15 @@
+    /** Custom setter that ensures the BundleAdd message inherits the XID from their
+     *  contained message, as per OF Spec 1.4.0:
+     *  <p>
+     *  7.3.9.6 Adding messages to a bundle
+     *  </p><p>
+     *     Message added in a bundle should have a unique xid to help matching errors to messages,
+     *     and the xid of the bundle add message must be the same.
+     *  </p>
+     */
+    @Override
+    public OFBundleAddMsg.Builder setData(OFMessage data) {
+        this.data = data;
+        this.dataSet = true;
+        return setXid(data.getXid());
+    }
diff --git a/java_gen/templates/custom/OFBundleAddMsgVer14.Builder_setData.java b/java_gen/templates/custom/OFBundleAddMsgVer14.Builder_setData.java
new file mode 100644
index 0000000..638415f
--- /dev/null
+++ b/java_gen/templates/custom/OFBundleAddMsgVer14.Builder_setData.java
@@ -0,0 +1 @@
+//:: include("custom/OFBundleAddMsg.Builder_setData.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_getActions.java b/java_gen/templates/custom/OFFlowAdd.Builder_getActions.java
similarity index 99%
rename from java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_getActions.java
rename to java_gen/templates/custom/OFFlowAdd.Builder_getActions.java
index ce71981..d4ed242 100644
--- a/java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_getActions.java
+++ b/java_gen/templates/custom/OFFlowAdd.Builder_getActions.java
@@ -16,4 +16,4 @@
             }
         }
         return Collections.emptyList();
-    }
\ No newline at end of file
+    }
diff --git a/java_gen/templates/custom/OFFlowAdd.Builder_setActions.java b/java_gen/templates/custom/OFFlowAdd.Builder_setActions.java
new file mode 100644
index 0000000..84a77b1
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAdd.Builder_setActions.java
@@ -0,0 +1,9 @@
+
+    @Override
+    public ${msg.interface.name}.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
+        OFInstructionApplyActionsVer${version.dotless_version}.Builder builder = new OFInstructionApplyActionsVer${version.dotless_version}.Builder();
+        builder.setActions(actions);
+        this.instructions = Collections.singletonList((OFInstruction)builder.build());
+        this.instructionsSet = true;
+        return this;
+    }
diff --git a/java_gen/templates/custom/OFFlowAddVer11.Builder_getActions.java b/java_gen/templates/custom/OFFlowAddVer11.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer11.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer11.Builder_setActions.java b/java_gen/templates/custom/OFFlowAddVer11.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer11.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer11_getActions.java b/java_gen/templates/custom/OFFlowAddVer11_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer11_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer12.Builder_getActions.java b/java_gen/templates/custom/OFFlowAddVer12.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer12.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer12.Builder_setActions.java b/java_gen/templates/custom/OFFlowAddVer12.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer12.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer12_getActions.java b/java_gen/templates/custom/OFFlowAddVer12_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer12_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer13.Builder_getActions.java b/java_gen/templates/custom/OFFlowAddVer13.Builder_getActions.java
index ce71981..8852fad 100644
--- a/java_gen/templates/custom/OFFlowAddVer13.Builder_getActions.java
+++ b/java_gen/templates/custom/OFFlowAddVer13.Builder_getActions.java
@@ -1,19 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-//:: if builder:
-        if (!this.instructionsSet)
-//:: if has_parent:
-            return parentMessage.getActions();
-//:: else:
-            return Collections.emptyList();
-//:: #endif
-//:: #endif
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer13.Builder_setActions.java b/java_gen/templates/custom/OFFlowAddVer13.Builder_setActions.java
index 725de24..89118a0 100644
--- a/java_gen/templates/custom/OFFlowAddVer13.Builder_setActions.java
+++ b/java_gen/templates/custom/OFFlowAddVer13.Builder_setActions.java
@@ -1,9 +1 @@
-
-    @Override
-    public OFFlowAdd.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
-        OFInstructionApplyActionsVer13.Builder builder = new OFInstructionApplyActionsVer13.Builder();
-        builder.setActions(actions);
-        this.instructions = Collections.singletonList((OFInstruction)builder.build());
-        this.instructionsSet = true;
-        return this;
-    }
\ No newline at end of file
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer13_getActions.java b/java_gen/templates/custom/OFFlowAddVer13_getActions.java
index eb7799a..7a6f91f 100644
--- a/java_gen/templates/custom/OFFlowAddVer13_getActions.java
+++ b/java_gen/templates/custom/OFFlowAddVer13_getActions.java
@@ -1,11 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer14.Builder_getActions.java b/java_gen/templates/custom/OFFlowAddVer14.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer14.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer14.Builder_setActions.java b/java_gen/templates/custom/OFFlowAddVer14.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer14.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer14_getActions.java b/java_gen/templates/custom/OFFlowAddVer14_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer14_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer15.Builder_getActions.java b/java_gen/templates/custom/OFFlowAddVer15.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer15.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer15.Builder_setActions.java b/java_gen/templates/custom/OFFlowAddVer15.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer15.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowAddVer15_getActions.java b/java_gen/templates/custom/OFFlowAddVer15_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowAddVer15_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowDeleteStrictVer13_getActions.java b/java_gen/templates/custom/OFFlowAdd_getActions.java
similarity index 99%
rename from java_gen/templates/custom/OFFlowDeleteStrictVer13_getActions.java
rename to java_gen/templates/custom/OFFlowAdd_getActions.java
index eb7799a..c128a68 100644
--- a/java_gen/templates/custom/OFFlowDeleteStrictVer13_getActions.java
+++ b/java_gen/templates/custom/OFFlowAdd_getActions.java
@@ -8,4 +8,4 @@
             }
         }
         return Collections.emptyList();
-    }
\ No newline at end of file
+    }
diff --git a/java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_setActions.java b/java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_setActions.java
deleted file mode 100644
index b2dafe5..0000000
--- a/java_gen/templates/custom/OFFlowDeleteStrictVer13.Builder_setActions.java
+++ /dev/null
@@ -1,9 +0,0 @@
-
-    @Override
-    public OFFlowDeleteStrict.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
-        OFInstructionApplyActionsVer13.Builder builder = new OFInstructionApplyActionsVer13.Builder();
-        builder.setActions(actions);
-        this.instructions = Collections.singletonList((OFInstruction)builder.build());
-        this.instructionsSet = true;
-        return this;
-    }
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFFlowDeleteVer13.Builder_getActions.java b/java_gen/templates/custom/OFFlowDeleteVer13.Builder_getActions.java
deleted file mode 100644
index ce71981..0000000
--- a/java_gen/templates/custom/OFFlowDeleteVer13.Builder_getActions.java
+++ /dev/null
@@ -1,19 +0,0 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-//:: if builder:
-        if (!this.instructionsSet)
-//:: if has_parent:
-            return parentMessage.getActions();
-//:: else:
-            return Collections.emptyList();
-//:: #endif
-//:: #endif
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFFlowDeleteVer13.Builder_setActions.java b/java_gen/templates/custom/OFFlowDeleteVer13.Builder_setActions.java
deleted file mode 100644
index 5576aaa..0000000
--- a/java_gen/templates/custom/OFFlowDeleteVer13.Builder_setActions.java
+++ /dev/null
@@ -1,9 +0,0 @@
-
-    @Override
-    public OFFlowDelete.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
-        OFInstructionApplyActionsVer13.Builder builder = new OFInstructionApplyActionsVer13.Builder();
-        builder.setActions(actions);
-        this.instructions = Collections.singletonList((OFInstruction)builder.build());
-        this.instructionsSet = true;
-        return this;
-    }
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFFlowDeleteVer13_getActions.java b/java_gen/templates/custom/OFFlowDeleteVer13_getActions.java
deleted file mode 100644
index eb7799a..0000000
--- a/java_gen/templates/custom/OFFlowDeleteVer13_getActions.java
+++ /dev/null
@@ -1,11 +0,0 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFFlowModify.Builder_getActions.java b/java_gen/templates/custom/OFFlowModify.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModify.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModify.Builder_setActions.java b/java_gen/templates/custom/OFFlowModify.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModify.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrict.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrict.Builder_getActions.java
new file mode 100644
index 0000000..8852fad
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrict.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrict.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrict.Builder_setActions.java
new file mode 100644
index 0000000..89118a0
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrict.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_getActions.java
new file mode 100644
index 0000000..0c6581a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_setActions.java
new file mode 100644
index 0000000..e1f198a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer11.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer11_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer11_getActions.java
new file mode 100644
index 0000000..a81bd15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer11_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_getActions.java
new file mode 100644
index 0000000..0c6581a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_setActions.java
new file mode 100644
index 0000000..e1f198a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer12.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer12_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer12_getActions.java
new file mode 100644
index 0000000..a81bd15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer12_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_getActions.java
index ce71981..0c6581a 100644
--- a/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_getActions.java
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_getActions.java
@@ -1,19 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-//:: if builder:
-        if (!this.instructionsSet)
-//:: if has_parent:
-            return parentMessage.getActions();
-//:: else:
-            return Collections.emptyList();
-//:: #endif
-//:: #endif
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModifyStrict.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_setActions.java
index fc04079..e1f198a 100644
--- a/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_setActions.java
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer13.Builder_setActions.java
@@ -1,9 +1 @@
-
-    @Override
-    public OFFlowModifyStrict.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
-        OFInstructionApplyActionsVer13.Builder builder = new OFInstructionApplyActionsVer13.Builder();
-        builder.setActions(actions);
-        this.instructions = Collections.singletonList((OFInstruction)builder.build());
-        this.instructionsSet = true;
-        return this;
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModifyStrict.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer13_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer13_getActions.java
index eb7799a..a81bd15 100644
--- a/java_gen/templates/custom/OFFlowModifyStrictVer13_getActions.java
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer13_getActions.java
@@ -1,11 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModifyStrict_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_getActions.java
new file mode 100644
index 0000000..0c6581a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_setActions.java
new file mode 100644
index 0000000..e1f198a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer14.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer14_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer14_getActions.java
new file mode 100644
index 0000000..a81bd15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer14_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_getActions.java
new file mode 100644
index 0000000..0c6581a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_setActions.java
new file mode 100644
index 0000000..e1f198a
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer15.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrictVer15_getActions.java b/java_gen/templates/custom/OFFlowModifyStrictVer15_getActions.java
new file mode 100644
index 0000000..a81bd15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrictVer15_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModifyStrict_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyStrict_getActions.java b/java_gen/templates/custom/OFFlowModifyStrict_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyStrict_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer11.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyVer11.Builder_getActions.java
new file mode 100644
index 0000000..ded35c2
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer11.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer11.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyVer11.Builder_setActions.java
new file mode 100644
index 0000000..4942a15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer11.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer11_getActions.java b/java_gen/templates/custom/OFFlowModifyVer11_getActions.java
new file mode 100644
index 0000000..2432665
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer11_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer12.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyVer12.Builder_getActions.java
new file mode 100644
index 0000000..ded35c2
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer12.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer12.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyVer12.Builder_setActions.java
new file mode 100644
index 0000000..4942a15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer12.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer12_getActions.java b/java_gen/templates/custom/OFFlowModifyVer12_getActions.java
new file mode 100644
index 0000000..2432665
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer12_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer13.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyVer13.Builder_getActions.java
index ce71981..ded35c2 100644
--- a/java_gen/templates/custom/OFFlowModifyVer13.Builder_getActions.java
+++ b/java_gen/templates/custom/OFFlowModifyVer13.Builder_getActions.java
@@ -1,19 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-//:: if builder:
-        if (!this.instructionsSet)
-//:: if has_parent:
-            return parentMessage.getActions();
-//:: else:
-            return Collections.emptyList();
-//:: #endif
-//:: #endif
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModify.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer13.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyVer13.Builder_setActions.java
index 695b771..4942a15 100644
--- a/java_gen/templates/custom/OFFlowModifyVer13.Builder_setActions.java
+++ b/java_gen/templates/custom/OFFlowModifyVer13.Builder_setActions.java
@@ -1,9 +1 @@
-
-    @Override
-    public OFFlowModify.Builder setActions(List<OFAction> actions) throws UnsupportedOperationException {
-        OFInstructionApplyActionsVer13.Builder builder = new OFInstructionApplyActionsVer13.Builder();
-        builder.setActions(actions);
-        this.instructions = Collections.singletonList((OFInstruction)builder.build());
-        this.instructionsSet = true;
-        return this;
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModify.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer13_getActions.java b/java_gen/templates/custom/OFFlowModifyVer13_getActions.java
index eb7799a..2432665 100644
--- a/java_gen/templates/custom/OFFlowModifyVer13_getActions.java
+++ b/java_gen/templates/custom/OFFlowModifyVer13_getActions.java
@@ -1,11 +1 @@
-
-    @Override
-    public List<OFAction> getActions()throws UnsupportedOperationException {
-        for (OFInstruction inst : this.instructions) {
-            if (inst instanceof OFInstructionApplyActions) {
-                OFInstructionApplyActions iap = (OFInstructionApplyActions)inst;
-                return iap.getActions();
-            }
-        }
-        return Collections.emptyList();
-    }
\ No newline at end of file
+//:: include("custom/OFFlowModify_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer14.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyVer14.Builder_getActions.java
new file mode 100644
index 0000000..ded35c2
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer14.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer14.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyVer14.Builder_setActions.java
new file mode 100644
index 0000000..4942a15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer14.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer14_getActions.java b/java_gen/templates/custom/OFFlowModifyVer14_getActions.java
new file mode 100644
index 0000000..2432665
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer14_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer15.Builder_getActions.java b/java_gen/templates/custom/OFFlowModifyVer15.Builder_getActions.java
new file mode 100644
index 0000000..ded35c2
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer15.Builder_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer15.Builder_setActions.java b/java_gen/templates/custom/OFFlowModifyVer15.Builder_setActions.java
new file mode 100644
index 0000000..4942a15
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer15.Builder_setActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify.Builder_setActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModifyVer15_getActions.java b/java_gen/templates/custom/OFFlowModifyVer15_getActions.java
new file mode 100644
index 0000000..2432665
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModifyVer15_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowModify_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFFlowModify_getActions.java b/java_gen/templates/custom/OFFlowModify_getActions.java
new file mode 100644
index 0000000..7a6f91f
--- /dev/null
+++ b/java_gen/templates/custom/OFFlowModify_getActions.java
@@ -0,0 +1 @@
+//:: include("custom/OFFlowAdd_getActions.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFGroupInsertBucketVer15.Builder.java b/java_gen/templates/custom/OFGroupInsertBucketVer15.Builder.java
new file mode 100644
index 0000000..194c458
--- /dev/null
+++ b/java_gen/templates/custom/OFGroupInsertBucketVer15.Builder.java
@@ -0,0 +1,19 @@
+
+    public List<OFBucket> insertBucketBasedOnCommandBucketId(OFBucket bucket) {
+        if(commandBucketId == null)
+            throw new IllegalStateException("CommandBucketId is null");
+        if(commandBucketId.equals(OFGroupBucket.BUCKET_FIRST))
+            buckets.add(0, bucket);
+        else if(commandBucketId.equals(OFGroupBucket.BUCKET_LAST))
+            buckets.add(buckets.size(), bucket);
+        return buckets;
+    }
+
+
+    public List<OFBucket> insertBucketBasedOnSpecificIndex(OFBucket bucket, int index) {
+        if(index <= buckets.size())
+            buckets.add(index,bucket);
+        else
+            throw new IllegalStateException("Index is not valid");
+        return buckets;
+    }
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFGroupRemoveBucketVer15.Builder.java b/java_gen/templates/custom/OFGroupRemoveBucketVer15.Builder.java
new file mode 100644
index 0000000..07ecadc
--- /dev/null
+++ b/java_gen/templates/custom/OFGroupRemoveBucketVer15.Builder.java
@@ -0,0 +1,21 @@
+
+    public List<OFBucket> removeBucketBasedOnCommandBucketId() {
+        if(commandBucketId == null)
+            throw new IllegalStateException("CommandBucketId is null");
+        if(commandBucketId.equals(OFGroupBucket.BUCKET_FIRST))
+            buckets.remove(0);
+        else if(commandBucketId.equals(OFGroupBucket.BUCKET_LAST))
+            buckets.remove(buckets.size()-1);
+        else if(commandBucketId.equals(OFGroupBucket.BUCKET_ALL))
+            buckets.removeAll(buckets);
+        return buckets;
+    }
+
+
+    public List<OFBucket> removeBucketBasedOnSpecificIndex(int index) {
+        if(index <= buckets.size())
+            buckets.remove(index);
+        else
+            throw new IllegalStateException("Index is not valid");
+        return buckets;
+    }
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Builder.java b/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
index c4cb6bc..b8797fe 100644
--- a/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
@@ -64,11 +64,11 @@
                 case SCTP_DST:
                     result = tcpDst;
                     break;
-                case ICMPV4_TYPE:
-                    result = tcpSrc;
+               case ICMPV4_TYPE:
+                    result = ICMPv4Type.of((short) tcpSrc.getPort());
                     break;
-                case ICMPV4_CODE:
-                    result = tcpDst;
+               case ICMPV4_CODE:
+                    result = ICMPv4Code.of((short) tcpDst.getPort());
                     break;
                 // NOT SUPPORTED:
                 default:
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.java b/java_gen/templates/custom/OFMatchV1Ver10.java
index 8a24b2f..bb57596 100644
--- a/java_gen/templates/custom/OFMatchV1Ver10.java
+++ b/java_gen/templates/custom/OFMatchV1Ver10.java
@@ -101,10 +101,10 @@
                 result = tcpDst;
                 break;
             case ICMPV4_TYPE:
-                result = tcpSrc;
+                result = ICMPv4Type.of((short) tcpSrc.getPort());
                 break;
             case ICMPV4_CODE:
-                result = tcpDst;
+                result = ICMPv4Code.of((short) tcpDst.getPort());
                 break;
             // NOT SUPPORTED:
             default:
@@ -365,6 +365,8 @@
                 builder.add(MatchField.TCP_SRC);
             } else if (ipProto == IpProtocol.SCTP) {
                 builder.add(MatchField.SCTP_SRC);
+            } else if (ipProto == IpProtocol.ICMP) {
+                builder.add(MatchField.ICMPV4_TYPE);
             } else {
                 throw new UnsupportedOperationException(
                         "Unsupported IP protocol for matching on source port " + ipProto);
@@ -377,6 +379,8 @@
                 builder.add(MatchField.TCP_DST);
             } else if (ipProto == IpProtocol.SCTP) {
                 builder.add(MatchField.SCTP_DST);
+            } else if (ipProto == IpProtocol.ICMP) {
+                builder.add(MatchField.ICMPV4_CODE);
             } else {
                 throw new UnsupportedOperationException(
                         "Unsupported IP protocol for matching on destination port " + ipProto);
diff --git a/java_gen/templates/custom/OFMatchV3.java b/java_gen/templates/custom/OFMatchV3.java
index 799135c..bc97ca2 100644
--- a/java_gen/templates/custom/OFMatchV3.java
+++ b/java_gen/templates/custom/OFMatchV3.java
@@ -58,6 +58,9 @@
         if (!supports(field))
             throw new UnsupportedOperationException("${msg.name} does not support matching on field " + field.getName());
 
+        if(!field.arePrerequisitesOK(this))
+            return false;
+
         OFOxm<?> oxm = this.oxmList.get(field);
 
         return oxm != null && !oxm.isMasked();
@@ -67,6 +70,8 @@
     public boolean isFullyWildcarded(MatchField<?> field) {
         if (!supports(field))
             throw new UnsupportedOperationException("${msg.name} does not support matching on field " + field.getName());
+        if(!field.arePrerequisitesOK(this))
+            return true;
 
         OFOxm<?> oxm = this.oxmList.get(field);
 
@@ -77,6 +82,8 @@
     public boolean isPartiallyMasked(MatchField<?> field) {
         if (!supports(field))
             throw new UnsupportedOperationException("${msg.name} does not support matching on field " + field.getName());
+        if(!field.arePrerequisitesOK(this))
+            return false;
 
         OFOxm<?> oxm = this.oxmList.get(field);
 
diff --git a/java_gen/templates/custom/OFMatchV3Ver15.Builder.java b/java_gen/templates/custom/OFMatchV3Ver15.Builder.java
new file mode 100644
index 0000000..ae2ecaa
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV3Ver15.Builder.java
@@ -0,0 +1 @@
+//:: include("custom/OFMatchV3.Builder.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFMatchV3Ver15.java b/java_gen/templates/custom/OFMatchV3Ver15.java
new file mode 100644
index 0000000..225b0dc
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV3Ver15.java
@@ -0,0 +1 @@
+//:: include("custom/OFMatchV3.java", msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/OFMatchV3Ver15_toString.java b/java_gen/templates/custom/OFMatchV3Ver15_toString.java
new file mode 100644
index 0000000..3b2783b
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV3Ver15_toString.java
@@ -0,0 +1 @@
+//:: include("custom/OFMatch_toString.java", msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/OFOxs_getCanonical.java b/java_gen/templates/custom/OFOxs_getCanonical.java
new file mode 100644
index 0000000..f656faa
--- /dev/null
+++ b/java_gen/templates/custom/OFOxs_getCanonical.java
@@ -0,0 +1 @@
+//:: include("custom/OFOxm_getCanonical.java", msg=msg, version=version, has_parent=False)
diff --git a/java_gen/templates/custom/OFPortDesc.java b/java_gen/templates/custom/OFPortDesc.java
index ccfbedb..a2f05cf 100644
--- a/java_gen/templates/custom/OFPortDesc.java
+++ b/java_gen/templates/custom/OFPortDesc.java
@@ -13,7 +13,7 @@
      * Returns the current generation ID of this port.
      *
      * The generationId is reported by the switch as a @{link OFPortDescProp} in
-     * @link{OFPortDescStatsReply} and @link{OFPortStatus} messages. If the
+     * {@link OFPortDescStatsReply} and {@link OFPortStatus} messages. If the
      * current OFPortDesc does not contain a generation Id, returns U64.ZERO;
      *
      * For OpenFlow versions earlier than 1.4, always returns U64.ZERO;
diff --git a/java_gen/templates/custom/OFPortDescVer15.java b/java_gen/templates/custom/OFPortDescVer15.java
new file mode 100644
index 0000000..782a726
--- /dev/null
+++ b/java_gen/templates/custom/OFPortDescVer15.java
@@ -0,0 +1 @@
+//:: include("custom/OFPortDesc.java", msg=msg, has_parent=False)
\ No newline at end of file
diff --git a/java_gen/templates/custom/OFStatV6.Builder.java b/java_gen/templates/custom/OFStatV6.Builder.java
new file mode 100644
index 0000000..3b19031
--- /dev/null
+++ b/java_gen/templates/custom/OFStatV6.Builder.java
@@ -0,0 +1,50 @@
+    private OFOxsList.Builder oxsFieldsBuilder;
+
+    private void initBuilder() {
+        if (oxsFieldsBuilder != null)
+            return;
+        oxsFieldsBuilder = new OFOxsList.Builder();
+    }
+
+    private void updateOxsList() {
+        this.oxsFields = this.oxsFieldsBuilder.build();
+        this.oxsFieldsSet = true;
+    }
+
+
+
+    @Override
+    public <F extends OFValueType<F>> F get(StatField<F> field) throws UnsupportedOperationException{
+        if (!supports(field))
+            throw new UnsupportedOperationException("${msg.name} does not support statistics on field " + field.getName());
+
+        OFOxs<F> oxs = getOxs(field);
+
+        if (oxs == null)
+            return null;
+
+        return oxs.getValue();
+    }
+
+    @Override
+    public <F extends OFValueType<F>> Stat.Builder set(StatField<F> field, F value) {
+        initBuilder();
+        OFOxs<F> oxs = OFFactories.getFactory(OFVersion.${version.constant_version}).oxss().fromValue(value, field);
+        this.oxsFieldsBuilder.set(oxs);
+        updateOxsList();
+        return this;
+    }
+
+
+    @Override
+    public boolean supports(StatField<?> field){
+        return supportsField(field);
+    }
+
+    private <F extends OFValueType<F>> OFOxs<F> getOxs(StatField<F> field) {
+//:: if has_parent:
+        return this.oxsFieldsSet ? this.oxsFields.get(field) : parentMessage.oxsFields.get(field);
+//:: else:
+        return this.oxsFieldsSet ? this.oxsFields.get(field) : null;
+//:: #endif
+    }
diff --git a/java_gen/templates/custom/OFStatV6.java b/java_gen/templates/custom/OFStatV6.java
new file mode 100644
index 0000000..d2b395c
--- /dev/null
+++ b/java_gen/templates/custom/OFStatV6.java
@@ -0,0 +1,59 @@
+
+//:: from generic_utils import OrderedSet
+//:: from java_gen.java_model import model
+    @Override
+    public <F extends OFValueType<F>> F get(StatField<F> field)
+            throws UnsupportedOperationException {
+        if (!supports(field))
+            throw new UnsupportedOperationException("${msg.name} does not support statistics on field " + field.getName());
+
+        OFOxs<F> oxs = this.oxsFields.get(field);
+
+        if (oxs == null)
+            return null;
+
+        return oxs.getValue();
+    }
+
+    @Override
+    public Iterable<StatField<?>> getStatFields() {
+        return new Iterable<StatField<?>>() {
+            public Iterator<StatField<?>> iterator() {
+                return new StatFieldIterator();
+            }
+        };
+    }
+
+    @Override
+    public boolean supports(StatField<?> field) {
+        return supportsField(field);
+    }
+
+    private static boolean supportsField(StatField<?> field) {
+        switch (field.id) {
+            //:: for id_constant in sorted(set(id_constant for _, id_constant, _ in model.oxs_map.values())):
+            case ${id_constant}:
+            //:: #endfor
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private class StatFieldIterator extends AbstractIterator<StatField<?>> {
+        private Iterator<OFOxs<?>> oxsIterator;
+
+        StatFieldIterator() {
+            oxsIterator = oxsFields.iterator();
+        }
+
+        @Override
+        protected StatField<?> computeNext() {
+            while(oxsIterator.hasNext()) {
+                OFOxs<?> oxs = oxsIterator.next();
+                return oxs.getStatField();
+            }
+            endOfData();
+            return null;
+        }
+    }
diff --git a/java_gen/templates/custom/OFStatV6Ver15.Builder.java b/java_gen/templates/custom/OFStatV6Ver15.Builder.java
new file mode 100644
index 0000000..3cd8e0d
--- /dev/null
+++ b/java_gen/templates/custom/OFStatV6Ver15.Builder.java
@@ -0,0 +1 @@
+//:: include("custom/OFStatV6.Builder.java", msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/OFStatV6Ver15.java b/java_gen/templates/custom/OFStatV6Ver15.java
new file mode 100644
index 0000000..25cb9a2
--- /dev/null
+++ b/java_gen/templates/custom/OFStatV6Ver15.java
@@ -0,0 +1 @@
+//:: include("custom/OFStatV6.java", msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/interface/OFMessage.java b/java_gen/templates/custom/interface/OFMessage.java
new file mode 100644
index 0000000..1d63ee6
--- /dev/null
+++ b/java_gen/templates/custom/interface/OFMessage.java
@@ -0,0 +1,28 @@
+    
+    /**
+     * Compares the two messages for equality, ignoring the XID field.
+     *
+     * @param obj the other message to compare
+     * @return true if the messages are equal, ignoring the XID; false otherwise
+     */
+    boolean equalsIgnoreXid(Object obj);
+
+    /**
+     * Computes the hashcode of the message, ignoring the XID field.
+     * This can be useful in hashing OFMessages where an OFMessage
+     * is "the same as" another OFMessage if all fields are equal
+     * except for possibly the XIDs, which may or may not be equal.
+     *
+     * The obvious problem is that existing hash data structure 
+     * implementations will use OFMessage's hashCode() function instead.
+     * In order to use the functionality of hashCodeIgnoreXid(), one 
+     * must wrap the OFMessage within a user-defined class, where this 
+     * user-defined class is used as the key within a hash data structure, 
+     * e.g. HashMap. The user-defined class' overrideen hashCode() 
+     * function must explicitly invoke hashCodeIgnoreXid() when computing 
+     * the hash of the OFMessage member instead of computing it using 
+     * OFMessage's hashCode().
+     *
+     * @return the hashcode of the message, ignoring the XID
+     */
+    int hashCodeIgnoreXid();
diff --git a/java_gen/templates/custom/interface/OFPortDesc.java b/java_gen/templates/custom/interface/OFPortDesc.java
index 247464d..45e2dfb 100644
--- a/java_gen/templates/custom/interface/OFPortDesc.java
+++ b/java_gen/templates/custom/interface/OFPortDesc.java
@@ -12,7 +12,7 @@
      * Returns the current generation ID of this port.
      *
      * The generationId is reported by the switch as a @{link OFPortDescProp} in
-     * @link{OFPortDescStatsReply} and @link{OFPortStatus} messages. If the
+     * {@link OFPortDescStatsReply} and {@link OFPortStatus} messages. If the
      * current OFPortDesc does not contain a generation Id, returns U64.ZERO;
      *
      * For OpenFlow versions earlier than 1.4, always returns U64.ZERO;
diff --git a/java_gen/templates/of_class.java b/java_gen/templates/of_class.java
index 0b032ac..dcb15e8 100644
--- a/java_gen/templates/of_class.java
+++ b/java_gen/templates/of_class.java
@@ -197,7 +197,7 @@
     final static Reader READER = new Reader();
     static class Reader implements OFMessageReader<${msg.interface.name}> {
         @Override
-        public ${msg.interface.name} readFrom(ChannelBuffer bb) throws OFParseError {
+        public ${msg.interface.name} readFrom(ByteBuf bb) throws OFParseError {
 //:: for prop in msg.members:
 //:: if not prop.is_virtual and (prop.is_length_value or prop.is_field_length_value):
             int start = bb.readerIndex();
@@ -304,18 +304,19 @@
     }
 
 
-    public void writeTo(ChannelBuffer bb) {
+    public void writeTo(ByteBuf bb) {
         WRITER.write(bb, this);
     }
 
     final static Writer WRITER = new Writer();
     static class Writer implements OFMessageWriter<${impl_class}> {
         @Override
-        public void write(ChannelBuffer bb, ${impl_class} message) {
+        public void write(ByteBuf bb, ${impl_class} message) {
 //:: if not msg.is_fixed_length:
             int startIndex = bb.writerIndex();
 //:: #endif
 //:: fields_with_length_member = {}
+//:: has_length_value = False
 //:: for prop in msg.members:
 //:: if prop.c_name in fields_with_length_member:
             int ${prop.name}StartIndex = bb.writerIndex();
@@ -331,6 +332,7 @@
             // fixed value property ${prop.name} = ${prop.value}
             ${prop.java_type.write_op(version, prop.priv_value, pub_type=False)};
 //:: elif prop.is_length_value:
+//::     has_length_value = True
             // ${prop.name} is length of variable message, will be updated at the end
 //:: if not msg.is_fixed_length:
             int lengthIndex = bb.writerIndex();
@@ -354,7 +356,7 @@
 //:: #endif
 //:: #endfor
 
-//:: if not msg.is_fixed_length:
+//:: if not msg.is_fixed_length and has_length_value:
             // update length field
             int length = bb.writerIndex() - startIndex;
             //:: if msg.align:
@@ -417,6 +419,40 @@
         return true;
     }
 
+    //:: if filter(lambda m: m.name == 'xid', msg.data_members):
+    @Override
+    public boolean equalsIgnoreXid(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        //:: if len(msg.data_members) > 0:
+        ${msg.name} other = (${msg.name}) obj;
+        //:: #endif
+
+        //:: for prop in msg.data_members:
+        //:: if prop.java_type.is_primitive and prop.name == 'xid':
+        // ignore XID
+        //:: elif prop.java_type.is_primitive:
+        if( ${prop.name} != other.${prop.name})
+            return false;
+        //:: elif prop.java_type.is_array:
+        if (!Arrays.equals(${prop.name}, other.${prop.name}))
+                return false;
+        //:: else:
+        if (${prop.name} == null) {
+            if (other.${prop.name} != null)
+                return false;
+        } else if (!${prop.name}.equals(other.${prop.name}))
+            return false;
+        //:: #endif
+        //:: #endfor
+        return true;
+    }
+
+    //:: #endif
     @Override
     public int hashCode() {
         //:: if len(msg.data_members) > 0:
@@ -440,4 +476,31 @@
         return result;
     }
 
+    //:: if filter(lambda m: m.name == 'xid', msg.data_members):
+    @Override
+    public int hashCodeIgnoreXid() {
+        //:: if len(msg.data_members) > 0:
+        final int prime = 31;
+        //:: #endif
+        int result = 1;
+
+        //:: for prop in msg.data_members:
+        //:: if prop.java_type.is_primitive and prop.name == 'xid':
+        // ignore XID
+        //:: elif prop.java_type.pub_type == 'long':
+        result = prime *  (int) (${prop.name} ^ (${prop.name} >>> 32));
+        //:: elif prop.java_type.pub_type == 'boolean':
+        result = prime * result + (${prop.name} ? 1231 : 1237);
+        //:: elif prop.java_type.is_primitive:
+        result = prime * result + ${prop.name};
+        //:: elif prop.java_type.is_array:
+        result = prime * result + Arrays.hashCode(${prop.name});
+        //:: else:
+        result = prime * result + ((${prop.name} == null) ? 0 : ${prop.name}.hashCode());
+        //:: #endif
+        //:: #endfor
+        return result;
+    }
+
+    //:: #endif
 }
diff --git a/java_gen/templates/of_factories.java b/java_gen/templates/of_factories.java
index ba73286..ffca7b4 100644
--- a/java_gen/templates/of_factories.java
+++ b/java_gen/templates/of_factories.java
@@ -50,8 +50,8 @@
     }
 
     private static class GenericReader implements OFMessageReader<OFMessage> {
-        public OFMessage readFrom(ChannelBuffer bb) throws OFParseError {
-            if(!bb.readable())
+        public OFMessage readFrom(ByteBuf bb) throws OFParseError {
+            if(!bb.isReadable())
                 return null;
             short wireVersion = U8.f(bb.getByte(bb.readerIndex()));
             OFFactory factory;
diff --git a/java_gen/templates/of_factory_class.java b/java_gen/templates/of_factory_class.java
index ef26ca0..2d32703 100644
--- a/java_gen/templates/of_factory_class.java
+++ b/java_gen/templates/of_factory_class.java
@@ -55,7 +55,7 @@
     //:: if i.is_virtual:
     //::    continue
     //:: #endif
-    //:: is_match_object = re.match('OFMatch.*', i.name) # i.has_version(factory.version) and model.generate_class(i.versioned_class(factory.version)) and i.versioned_class(factory.version).interface.parent_interface == 'Match'
+    //:: is_match_object = re.match('OFMatch.*', i.name)
     //:: unsupported_match_object = is_match_object and not i.has_version(factory.version)
 
     //:: if len(i.writeable_members) > 0:
@@ -105,7 +105,12 @@
 //:: #endif
     }
 
-//:: if factory.interface.name == 'OFOxms':
+//:: if factory.interface.name == "OFFactory":
+    @Override
+    public Stat.Builder buildStat() {
+            return buildStatV6();
+    }
+//:: elif factory.interface.name == 'OFOxms':
     @SuppressWarnings("unchecked")
     public <F extends OFValueType<F>> OFOxm<F> fromValue(F value, MatchField<F> field) {
         switch (field.id) {
@@ -162,6 +167,23 @@
                 return null;
         }
     }
+//:: elif factory.interface.name == "OFOxss":
+    @SuppressWarnings("unchecked")
+    public <F extends OFValueType<F>> OFOxs<F> fromValue(F value, StatField<F> field) {
+        switch (field.id) {
+            //:: for oxs_name in model.oxs_map:
+            //::    type_name, value, masked = model.oxs_map[oxs_name]
+            //::    method_name = oxs_name.replace('OFOxs', '')
+            //::    method_name = method_name[0].lower() + method_name[1:]
+            case ${value}:
+                //:: # The cast to Object is done to avoid some javac bug that in some versions cannot handle cast from generic type to other types but Object
+                return (OFOxs<F>)((Object)${method_name}((${type_name})((Object)value)));
+            //:: #endfor
+            default:
+                throw new IllegalArgumentException("No OXM known for match field " + field);
+        }
+    }
+
 //:: #endif
 //:: if factory.interface.xid_generator:
     public long nextXid() {
diff --git a/java_gen/templates/of_factory_interface.java b/java_gen/templates/of_factory_interface.java
index 3694530..7ac928d 100644
--- a/java_gen/templates/of_factory_interface.java
+++ b/java_gen/templates/of_factory_interface.java
@@ -55,6 +55,7 @@
 //:: if factory.name == 'OFFactory':
     Match.Builder buildMatch();
     Match matchWildcardAll();
+    Stat.Builder buildStat();
 //:: #endif
 
     OFMessageReader<${factory.base_class}> getReader();
@@ -65,4 +66,8 @@
     public <F extends OFValueType<F>> OFOxm<F> fromValueAndMask(F value, F mask, MatchField<F> field);
     public <F extends OFValueType<F>> OFOxm<F> fromMasked(Masked<F> masked, MatchField<F> field);
 //:: #endif
+//:: if factory.name == 'OFOxss':
+
+    public <F extends OFValueType<F>> OFOxs<F> fromValue(F value, StatField<F> field);
+//:: #endif
 }
diff --git a/java_gen/templates/of_interface.java b/java_gen/templates/of_interface.java
index 18e2cf1..c940534 100644
--- a/java_gen/templates/of_interface.java
+++ b/java_gen/templates/of_interface.java
@@ -43,9 +43,8 @@
 //:: if os.path.exists("%s/custom/interface/%s.java" % (template_dir, msg.name)):
 //:: include("custom/interface/%s.java" % msg.name, msg=msg)
 //:: #endif
-    
 
-    void writeTo(ChannelBuffer channelBuffer);
+    void writeTo(ByteBuf channelBuffer);
 
     Builder${msg.type_variable} createBuilder();
     //:: simple_type, annotation = re.match(r'(\w+)(<.*>)?', msg.parent_interface).groups() if msg.parent_interface else ("", "")
@@ -53,7 +52,7 @@
         ${msg.name}${msg.type_variable} build();
 //:: for prop in msg.members:
         ${prop.java_type.public_type} ${prop.getter_name}()${ "" if prop.is_universal else " throws UnsupportedOperationException"};
-//:: if prop.is_writeable:
+//:: if prop.needs_setter:
         Builder${msg.type_variable} ${prop.setter_name}(${prop.java_type.public_type} ${prop.name})${ "" if prop.is_universal else " throws UnsupportedOperationException"};
 //:: #endif
 //:: #endfor
diff --git a/java_gen/templates/of_virtual_class.java b/java_gen/templates/of_virtual_class.java
index 2c31c75..d785838 100644
--- a/java_gen/templates/of_virtual_class.java
+++ b/java_gen/templates/of_virtual_class.java
@@ -50,7 +50,7 @@
 
     static class Reader implements OFMessageReader<${msg.interface.inherited_declaration()}> {
         @Override
-        public ${msg.interface.inherited_declaration()} readFrom(ChannelBuffer bb) throws OFParseError {
+        public ${msg.interface.inherited_declaration()} readFrom(ByteBuf bb) throws OFParseError {
 //:: if msg.is_fixed_length:
             if(bb.readableBytes() < LENGTH)
 //:: else:
diff --git a/java_gen/templates/unit_test.java b/java_gen/templates/unit_test.java
index cf01429..b9127ff 100644
--- a/java_gen/templates/unit_test.java
+++ b/java_gen/templates/unit_test.java
@@ -69,7 +69,7 @@
         //:: else:
         ${var_type} ${var_name} = factory.${factory_method}();
         //:: #endif
-        ChannelBuffer bb = ChannelBuffers.dynamicBuffer();
+        ByteBuf bb = Unpooled.buffer();
         ${var_name}.writeTo(bb);
         byte[] written = new byte[bb.readableBytes()];
         bb.readBytes(written);
@@ -87,7 +87,7 @@
         ${var_type} ${var_name}Built = factory.${factory_method}();
         //:: #endif
 
-        ChannelBuffer input = ChannelBuffers.copiedBuffer(${msg.constant_name}_SERIALIZED);
+        ByteBuf input = Unpooled.copiedBuffer(${msg.constant_name}_SERIALIZED);
 
         // FIXME should invoke the overall reader once implemented
         ${var_type} ${var_name}Read = ${msg.name}.READER.readFrom(input);
@@ -101,14 +101,14 @@
 
    @Test
    public void testReadWrite() throws Exception {
-       ChannelBuffer input = ChannelBuffers.copiedBuffer(${msg.constant_name}_SERIALIZED);
+       ByteBuf input = Unpooled.copiedBuffer(${msg.constant_name}_SERIALIZED);
 
        // FIXME should invoke the overall reader once implemented
        ${var_type} ${var_name} = ${msg.name}.READER.readFrom(input);
        assertEquals(${msg.constant_name}_SERIALIZED.length, input.readerIndex());
 
        // write message again
-       ChannelBuffer bb = ChannelBuffers.dynamicBuffer();
+       ByteBuf bb = Unpooled.buffer();
        ${var_name}.writeTo(bb);
        byte[] written = new byte[bb.readableBytes()];
        bb.readBytes(written);
