diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index c074189..f2a1c01 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -138,12 +138,23 @@
     return "OFErrorType." + error_type_map[enum_entry.name]
 
 class JavaModel(object):
-    enum_blacklist = set(("OFDefinitions", "OFPortNo"))
+    # registry for enums that should not be generated
+    # set(${java_enum_name})
+    enum_blacklist = set(("OFDefinitions", "OFPortNo",))
+    # registry for enum *entry* that should not be generated
+    # map: ${java_enum_name} -> set(${java_entry_entry_name})
     enum_entry_blacklist = defaultdict(lambda: set(), OFFlowWildcards=set([ "NW_DST_BITS", "NW_SRC_BITS", "NW_SRC_SHIFT", "NW_DST_SHIFT" ]))
+
+    # registry of interfaces that should not be generated
+    # set(java_names)
     # OFUint structs are there for god-knows what in loci. We certainly don't need them.
     interface_blacklist = set( ("OFUint8", "OFUint32",))
+    # registry of interface properties that should not be generated
+    # map: $java_type -> set(java_name_property)
     read_blacklist = defaultdict(lambda: set(), OFExperimenter=set(('data','subtype')), OFActionExperimenter=set(('data',)))
+    # map: $java_type -> set(java_name_property)
     write_blacklist = defaultdict(lambda: set(), OFOxm=set(('typeLen',)), OFAction=set(('type',)), OFInstruction=set(('type',)), OFFlowMod=set(('command', )), OFExperimenter=set(('data','subtype')), OFActionExperimenter=set(('data',)))
+    # interfaces that are virtual
     virtual_interfaces = set(['OFOxm', 'OFInstruction', 'OFFlowMod', 'OFBsnVport' ])
 
     OxmMapEntry = namedtuple("OxmMapEntry", ["type_name", "value", "masked" ])
@@ -221,13 +232,33 @@
                 "OFOxmMplsTcMasked":        OxmMapEntry("U8", "MPLS_TC", True)
                 }
 
+    # Registry of nullable properties:
+    # ${java_class_name} -> set(${java_property_name})
+    nullable_map = defaultdict(lambda: set(),
+    )
+
+    # represents a subgroup of a bitmask enum that is actualy a normal enumerable within a masked part of the enum
+    # e.g., the flags STP.* in OF1.0 port state are bit mask entries, but instead enumerables according to the mask "STP_MASK"
+    # name: a name for the group
+    # mask: java name of the enum entry that defines the mask
+    # members: set of names of the members of the group
     MaskedEnumGroup = namedtuple("MaskedEnumGroup", ("name", "mask", "members"))
 
+    # registry of MaskedEnumGroups (see above).
+    # map: ${java_enum_name}: tuple(MaskedEnumGroup)
     masked_enum_groups = defaultdict(lambda: (),
             OFPortState= (MaskedEnumGroup("stp_flags", mask="STP_MASK", members=set(("STP_LISTEN", "STP_LEARN", "STP_FORWARD", "STP_BLOCK"))), )
     )
 
+    # represents a metadata property associated with an EnumClass
+    # name:
     class OFEnumPropertyMetadata(namedtuple("OFEnumPropertyMetadata", ("name", "type", "value"))):
+        """
+        represents a metadata property associated with an Enum Class
+        @param name name of metadata property
+        @param type java_type instance describing the type
+        @value: Generator function f(entry) that generates the value
+        """
         @property
         def variable_name(self):
             return self.name[0].lower() + self.name[1:]
@@ -237,9 +268,11 @@
             prefix = "is" if self.type == java_type.boolean else "get"
             return prefix+self.name
 
+    """ Metadata container. """
     OFEnumMetadata = namedtuple("OFEnumMetadata", ("properties", "to_string"))
 
     def gen_port_speed(enum_entry):
+        """ Generator function for OFortFeatures.PortSpeed"""
         splits = enum_entry.name.split("_")
         if len(splits)>=2:
             m = re.match(r'\d+[MGTP]B', splits[1])
@@ -248,12 +281,15 @@
         return "PortSpeed.SPEED_NONE";
 
     def gen_stp_state(enum_entry):
+        """ Generator function for OFPortState.StpState"""
         splits = enum_entry.name.split("_")
         if len(splits)>=1:
             if splits[0] == "STP":
                 return "true"
         return "false"
 
+    # registry for metadata properties for enums
+    # map: ${java_enum_name}: OFEnumMetadata
     enum_metadata_map = defaultdict(lambda: JavaModel.OFEnumMetadata((), None),
             OFPortFeatures = OFEnumMetadata((OFEnumPropertyMetadata("PortSpeed", java_type.port_speed, gen_port_speed),), None),
             OFPortState = OFEnumMetadata((OFEnumPropertyMetadata("StpState", java_type.boolean, gen_stp_state),), None),
@@ -839,24 +875,14 @@
 
     @property
     def default_value(self):
-        java_type = self.java_type.public_type;
-
         if self.is_fixed_value:
             return self.enum_value
-        elif java_type == "OFOxmList":
-            return "OFOxmList.EMPTY"
-        elif re.match(r'Set.*', java_type):
-            return "Collections.emptySet()"
-        elif re.match(r'List.*', java_type):
-            return "Collections.emptyList()"
-        elif java_type == "boolean":
-            return "false";
-        elif self.java_type.is_array:
-            return "new %s[0]" % java_type[:-2]
-        elif java_type in ("byte", "char", "short", "int", "long"):
-            return "({0}) 0".format(java_type);
         else:
-            return "null";
+            default = self.java_type.default_op(self.msg.version)
+            if default == "null" and not self.is_nullable:
+                return None
+            else:
+                return default
 
     @property
     def enum_value(self):
@@ -986,6 +1012,11 @@
             return False
         return (self.name,) == (other.name,)
 
+    @property
+    def is_nullable(self):
+        return self.name in model.nullable_map[self.msg.name]
+
+
 class JavaVirtualMember(JavaMember):
     """ Models a virtual property (member) of an openflow class that is not backed by a loxi ir member """
     def __init__(self, msg, name, java_type, value=None):
@@ -1032,7 +1063,7 @@
         while test_data.exists(data_file_template.format(i=i)):
             self.test_units.append(JavaUnitTest(java_class, data_file_template.format(i=i), test_class_name + str(i)))
             i = i + 1
-        
+
     @property
     def package(self):
         return self.java_class.package
@@ -1044,7 +1075,7 @@
     @property
     def length(self):
         return len(self.test_units)
-    
+
     def get_test_unit(self, i):
         return self.test_units[i]
 
@@ -1061,7 +1092,7 @@
             self.test_class_name = self.java_class.name + "Test"
         else:
             self.test_class_name = test_class_name
-        
+
     @property
     def package(self):
         return self.java_class.package
diff --git a/java_gen/java_type.py b/java_gen/java_type.py
index 913992b..87ce9d6 100644
--- a/java_gen/java_type.py
+++ b/java_gen/java_type.py
@@ -70,13 +70,14 @@
 ANY = 0xFFFFFFFFFFFFFFFF
 
 class VersionOp:
-    def __init__(self, version=ANY, read=None, write=None):
+    def __init__(self, version=ANY, read=None, write=None, default=None):
         self.version = version
         self.read = read
         self.write = write
+        self.default = default
 
     def __str__(self):
-        return "[Version: %d, Read: '%s', Write: '%s']" % (self.version, self.read, self.write)
+        return "[Version: %d, Read: '%s', Write: '%s', Default: '%s' ]" % (self.version, self.read, self.write, self.default )
 
 ### FIXME: This class should really be cleaned up
 class JType(object):
@@ -85,14 +86,14 @@
         read from and written to ChannelBuffers.
 
     """
-    def __init__(self, pub_type, priv_type=None, read_op=None, write_op=None):
+    def __init__(self, pub_type, priv_type=None):
         self.pub_type = pub_type    # the type we expose externally, e.g. 'U8'
         if priv_type is None:
             priv_type = pub_type
         self.priv_type = priv_type  # the internal storage type
         self.ops = {}
 
-    def op(self, version=ANY, read=None, write=None, pub_type=ANY):
+    def op(self, version=ANY, read=None, write=None, default=None, pub_type=ANY):
         """
         define operations to be performed for reading and writing this type
         (when read_op, write_op is called). The operations 'read' and 'write'
@@ -108,7 +109,7 @@
 
         pub_types = [ pub_type ] if pub_type is not ANY else [ False, True ]
         for pub_type in pub_types:
-            self.ops[(version, pub_type)] = VersionOp(version, read, write)
+            self.ops[(version, pub_type)] = VersionOp(version, read, write, default)
         return self
 
     def format_value(self, value, pub_type=True):
@@ -184,6 +185,24 @@
         else:
             return _write_op.replace("$name", str(name)).replace("$version", version.of_version)
 
+    def default_op(self, version=None, pub_type=True):
+        """ return a Java stanza that returns a default value of this JType.
+        @param version JavaOFVersion
+        @return string containing generated Java expression.
+        """
+        ver = ANY if version is None else version.int_version
+        _default_op = None
+        if (ver, pub_type) in self.ops:
+            _default_op = self.ops[(ver, pub_type)].default or self.ops[(ANY, pub_type)].default
+        elif (ANY, pub_type) in self.ops:
+            _default_op = self.ops[(ANY, pub_type)].default
+        if _default_op is None:
+            _default_op = self.format_value(0) if self.is_primitive else "null"
+        if callable(_default_op):
+            return _default_op(version, name)
+        else:
+            return _default_op.replace("$version", version.of_version)
+
     def skip_op(self, version=None, length=None):
         """ return a java stanza that skips an instance of JType in the input ChannelBuffer 'bb'.
             This is used in the Reader implementations for virtual classes (because after the
@@ -200,7 +219,7 @@
     @property
     def is_array(self):
         """ return true iff the pub_type is a Java array (and thus requires special
-        treament for equals / toString etc.) """
+        treatment for equals / toString etc.) """
         return self.pub_type.endswith("[]")
 
 
@@ -218,33 +237,46 @@
         .op(read='U32.f(bb.readInt())', write='bb.writeInt(U32.t($name))', pub_type=True) \
         .op(read='bb.readInt()', write='bb.writeInt($name)', pub_type=False)
 u32_list = JType('List<U32>', 'int[]') \
-        .op(read='ChannelUtils.readList(bb, $length, U32.READER)', write='ChannelUtils.writeList(bb, $name)')
+        .op(
+                read='ChannelUtils.readList(bb, $length, U32.READER)',
+                write='ChannelUtils.writeList(bb, $name)',
+                default="ImmutableList.<U32>of()");
 u8obj = JType('U8', 'U8') \
-        .op(read='U8.of(bb.readByte())', write='bb.writeByte($name.getRaw())')
+        .op(read='U8.of(bb.readByte())', write='bb.writeByte($name.getRaw())', default="U8.ZERO")
 u32obj = JType('U32', 'U32') \
-        .op(read='U32.of(bb.readInt())', write='bb.writeInt($name.getRaw())')
+        .op(read='U32.of(bb.readInt())', write='bb.writeInt($name.getRaw())', default="U32.ZERO")
 u64 = JType('U64', 'U64') \
-        .op(read='U64.ofRaw(bb.readLong())', write='bb.writeLong($name.getValue())')
+        .op(read='U64.ofRaw(bb.readLong())', write='bb.writeLong($name.getValue())', default="U64.ZERO")
 of_port = JType("OFPort") \
-         .op(version=1, read="OFPort.read2Bytes(bb)", write="$name.write2Bytes(bb)") \
-         .op(version=ANY, read="OFPort.read4Bytes(bb)", write="$name.write4Bytes(bb)")
+         .op(version=1, read="OFPort.read2Bytes(bb)", write="$name.write2Bytes(bb)", default="OFPort.NONE") \
+         .op(version=ANY, read="OFPort.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="OFPort.NONE")
 actions_list = JType('List<OFAction>') \
-        .op(read='ChannelUtils.readList(bb, $length, OFActionVer$version.READER)', write='ChannelUtils.writeList(bb, $name);')
+        .op(read='ChannelUtils.readList(bb, $length, OFActionVer$version.READER)',
+            write='ChannelUtils.writeList(bb, $name);',
+            default='ImmutableList.<OFAction>of()')
 instructions_list = JType('List<OFInstruction>') \
         .op(read='ChannelUtils.readList(bb, $length, OFInstructionVer$version.READER)', \
-            write='ChannelUtils.writeList(bb, $name)')
+            write='ChannelUtils.writeList(bb, $name)',
+            default='ImmutableList.<OFInstruction>of()')
 buckets_list = JType('List<OFBucket>') \
-        .op(read='ChannelUtils.readList(bb, $length, OFBucketVer$version.READER)', write='ChannelUtils.writeList(bb, $name)')
+        .op(read='ChannelUtils.readList(bb, $length, OFBucketVer$version.READER)',
+            write='ChannelUtils.writeList(bb, $name)',
+            default='ImmutableList.<OFBucket>of()')
 port_desc_list = JType('List<OFPortDesc>') \
-        .op(read='ChannelUtils.readList(bb, $length, OFPortDescVer$version.READER)', write='ChannelUtils.writeList(bb, $name)')
+        .op(read='ChannelUtils.readList(bb, $length, OFPortDescVer$version.READER)',
+            write='ChannelUtils.writeList(bb, $name)',
+            default='ImmutableList.<OFPortDesc>of()')
 port_desc = JType('OFPortDesc') \
         .op(read='OFPortDescVer$version.READER.readFrom(bb)', \
             write='$name.writeTo(bb)')
 packet_queue_list = JType('List<OFPacketQueue>') \
-        .op(read='ChannelUtils.readList(bb, $length, OFPacketQueueVer$version.READER)', write='ChannelUtils.writeList(bb, $name);')
+        .op(read='ChannelUtils.readList(bb, $length, OFPacketQueueVer$version.READER)',
+            write='ChannelUtils.writeList(bb, $name);',
+            default='ImmutableList.<OFPacketQueue>of()')
 octets = JType('byte[]') \
         .op(read='ChannelUtils.readBytes(bb, $length)', \
-            write='bb.writeBytes($name)')
+            write='bb.writeBytes($name)', \
+            default="new byte[0]");
 of_match = JType('Match') \
         .op(read='ChannelUtilsVer$version.readOFMatch(bb)', \
             write='$name.writeTo(bb)');
@@ -253,68 +285,106 @@
         .op(version=ANY, read="bb.readByte()", write="bb.writeByte($name)")
 mac_addr = JType('MacAddress') \
         .op(read="MacAddress.read6Bytes(bb)", \
-            write="$name.write6Bytes(bb)")
+            write="$name.write6Bytes(bb)",
+            default="MacAddress.NONE")
 port_name = JType('String') \
         .op(read='ChannelUtils.readFixedLengthString(bb, 16)', \
-            write='ChannelUtils.writeFixedLengthString(bb, $name, 16)')
+            write='ChannelUtils.writeFixedLengthString(bb, $name, 16)',
+            default='""')
 desc_str = JType('String') \
         .op(read='ChannelUtils.readFixedLengthString(bb, 256)', \
-            write='ChannelUtils.writeFixedLengthString(bb, $name, 256)')
+            write='ChannelUtils.writeFixedLengthString(bb, $name, 256)',
+            default='""')
 serial_num = JType('String') \
         .op(read='ChannelUtils.readFixedLengthString(bb, 32)', \
-            write='ChannelUtils.writeFixedLengthString(bb, $name, 32)')
+            write='ChannelUtils.writeFixedLengthString(bb, $name, 32)',
+            default='""')
 table_name = JType('String') \
         .op(read='ChannelUtils.readFixedLengthString(bb, 32)', \
-            write='ChannelUtils.writeFixedLengthString(bb, $name, 32)')
+            write='ChannelUtils.writeFixedLengthString(bb, $name, 32)',
+            default='""')
 ipv4 = JType("IPv4Address") \
         .op(read="IPv4Address.read4Bytes(bb)", \
-            write="$name.write4Bytes(bb)")
+            write="$name.write4Bytes(bb)",
+            default='IPv4Address.NONE')
 ipv6 = JType("IPv6Address") \
         .op(read="IPv6Address.read16Bytes(bb)", \
-            write="$name.write16Bytes(bb)")
+            write="$name.write16Bytes(bb)",
+            default='IPv6Address.NONE')
 packetin_reason = JType("OFPacketInReason")\
-        .op(read="OFPacketInReasonSerializerVer$version.readFrom(bb)", write="OFPacketInReasonSerializerVer$version.writeTo(bb, $name)")
-wildcards = JType("Wildcards")\
-        .op(read="Wildcards.of(bb.readInt())", write="bb.writeInt($name.getInt())");
+        .op(read="OFPacketInReasonSerializerVer$version.readFrom(bb)",
+            write="OFPacketInReasonSerializerVer$version.writeTo(bb, $name)")
 transport_port = JType("TransportPort")\
-        .op(read="TransportPort.read2Bytes(bb)", write="$name.write2Bytes(bb)")
+        .op(read="TransportPort.read2Bytes(bb)",
+            write="$name.write2Bytes(bb)",
+            default="TransportPort.NONE")
 eth_type = JType("EthType")\
-        .op(read="EthType.read2Bytes(bb)", write="$name.write2Bytes(bb)")
+        .op(read="EthType.read2Bytes(bb)",
+            write="$name.write2Bytes(bb)",
+            default="EthType.NONE")
 vlan_vid = JType("VlanVid")\
-        .op(read="VlanVid.read2Bytes(bb)", write="$name.write2Bytes(bb)")
+        .op(read="VlanVid.read2Bytes(bb)",
+            write="$name.write2Bytes(bb)",
+            default="VlanVid.NONE")
 vlan_pcp = JType("VlanPcp")\
-        .op(read="VlanPcp.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="VlanPcp.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="VlanPcp.NONE")
 ip_dscp = JType("IpDscp")\
-        .op(read="IpDscp.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="IpDscp.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="IpDscp.NONE")
 ip_ecn = JType("IpEcn")\
-        .op(read="IpEcn.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="IpEcn.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="IpEcn.NONE")
 ip_proto = JType("IpProtocol")\
-        .op(read="IpProtocol.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="IpProtocol.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="IpProtocol.NONE")
 icmpv4_type = JType("ICMPv4Type")\
-        .op(read="ICMPv4Type.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="ICMPv4Type.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="ICMPv4Type.NONE")
 icmpv4_code = JType("ICMPv4Code")\
-        .op(read="ICMPv4Code.readByte(bb)", write="$name.writeByte(bb)")
+        .op(read="ICMPv4Code.readByte(bb)",
+            write="$name.writeByte(bb)",
+            default="ICMPv4Code.NONE")
 arp_op = JType("ArpOpcode")\
-        .op(read="ArpOpcode.read2Bytes(bb)", write="$name.write2Bytes(bb)")
+        .op(read="ArpOpcode.read2Bytes(bb)",
+            write="$name.write2Bytes(bb)",
+            default="ArpOpcode.NONE")
 ipv6_flabel = JType("IPv6FlowLabel")\
-        .op(read="IPv6FlowLabel.read4Bytes(bb)", write="$name.write4Bytes(bb)")
+        .op(read="IPv6FlowLabel.read4Bytes(bb)",
+            write="$name.write4Bytes(bb)",
+            default="IPv6FlowLabel.NONE")
 metadata = JType("OFMetadata")\
-        .op(read="OFMetadata.read8Bytes(bb)", write="$name.write8Bytes(bb)")
+        .op(read="OFMetadata.read8Bytes(bb)",
+            write="$name.write8Bytes(bb)",
+            default="OFMetadata.NONE")
 oxm = JType("OFOxm<?>")\
         .op(  read="OFOxmVer$version.READER.readFrom(bb)",
               write="$name.writeTo(bb)")
 oxm_list = JType("OFOxmList") \
         .op(
             read= 'OFOxmList.readFrom(bb, $length, OFOxmVer$version.READER)', \
-            write='$name.writeTo(bb)')
+            write='$name.writeTo(bb)',
+            default="OFOxmList.EMPTY")
 meter_features = JType("OFMeterFeatures")\
-        .op(read="OFMeterFeaturesVer$version.READER.readFrom(bb)", write="$name.writeTo(bb)")
+        .op(read="OFMeterFeaturesVer$version.READER.readFrom(bb)",
+            write="$name.writeTo(bb)")
+flow_wildcards = JType("int") \
+        .op(read='bb.readInt()',
+            write='bb.writeInt($name)',
+            default="OFFlowWildcardsSerializerVer$version.ALL_VAL")
+table_stats_wildcards = JType("int") \
+        .op(read='bb.readInt()',
+            write='bb.writeInt($name)')
 
 
 port_speed = JType("PortSpeed")
 error_type = JType("OFErrorType")
-
-boolean = JType("boolean")
+boolean = JType("boolean").op(default="false")
 
 generic_t = JType("T")
 
@@ -344,7 +414,7 @@
         'of_table_name_t': table_name,
         'of_ipv4_t': ipv4,
         'of_ipv6_t': ipv6,
-        'of_wc_bmap_t': wildcards,
+        'of_wc_bmap_t': flow_wildcards,
         'of_oxm_t': oxm,
         'of_meter_features_t': meter_features,
         }
@@ -400,6 +470,12 @@
         'of_oxm_mpls_label_masked' : { 'value' : u32obj, 'value_mask' : u32obj },
         'of_oxm_mpls_tc' : { 'value' : u8obj },
         'of_oxm_mpls_tc_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
+
+        'of_table_stats_entry': { 'wildcards': table_stats_wildcards },
+        'of_match_v1': { 'vlan_vid' : vlan_vid, 'vlan_pcp': vlan_pcp,
+                'eth_type': eth_type, 'ip_dscp': ip_dscp, 'ip_proto': ip_proto,
+                'tcp_src': transport_port, 'tcp_dst': transport_port
+                }
 }
 
 
@@ -410,11 +486,17 @@
     for protocol in of_g.ir.values():
         for enum in protocol.enums:
             java_name = name_c_to_caps_camel(re.sub(r'_t$', "", enum.name))
-            java_type = java_name if not enum.is_bitmask else "Set<{}>".format(java_name)
+            if enum.is_bitmask:
+                java_type = "Set<{}>".format(java_name)
+                default_value = "ImmutableSet.<{}>of()".format(java_name)
+            else:
+                java_type = java_name
+                default_value = "null"
             enum_types[enum.name] = \
                     JType(java_type)\
-                      .op(read = "{}SerializerVer$version.readFrom(bb)".format(java_name),
-                          write ="{}SerializerVer$version.writeTo(bb, $name)".format(java_name))
+                      .op(read="{}SerializerVer$version.readFrom(bb)".format(java_name),
+                          write="{}SerializerVer$version.writeTo(bb, $name)".format(java_name),
+                          default=default_value)
     return enum_types
 
 def make_match_field_jtype(sub_type_name="?"):
@@ -432,10 +514,12 @@
     # 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
     # write op assumes class implements Writeable
-    return JType("List<OF%s>" % java_base_name) \
+    return JType("List<OF{}>".format(java_base_name)) \
         .op(
-            read= 'ChannelUtils.readList(bb, $length, OF%sVer$version.READER)' % java_base_name, \
-            write='ChannelUtils.writeList(bb, $name)')
+            read= 'ChannelUtils.readList(bb, $length, OF{}Ver$version.READER)'.format(java_base_name), \
+            write='ChannelUtils.writeList(bb, $name)',
+            default="ImmutableList.<OF{}>of()".format(java_base_name)
+            )
 
 
 
@@ -459,7 +543,7 @@
             .op(read='bb.readByte()', write='bb.writeByte($name)')
     elif field_name == "buffer_id" and c_type == "uint32_t":
         return JType("OFBufferId") \
-            .op(read="OFBufferId.of(bb.readInt())", write="bb.writeInt($name.getInt())")
+            .op(read="OFBufferId.of(bb.readInt())", write="bb.writeInt($name.getInt())", default="OFBufferId.NO_BUFFER")
     elif c_type in default_mtype_to_jtype_convert_map:
         return default_mtype_to_jtype_convert_map[c_type]
     elif re.match(r'list\(of_([a-zA-Z_]+)_t\)', c_type):
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Wildcards.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Wildcards.java
deleted file mode 100644
index 2268ce6..0000000
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/Wildcards.java
+++ /dev/null
@@ -1,656 +0,0 @@
-/**
- *    Copyright 2013, Big Switch Networks, Inc.
- *
- *    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.protocol;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import com.google.common.base.Joiner;
-
-/**
- * a more user friendly representation of the wildcards bits in an OpenFlow
- * match. The Wildcards object is
- * <ul>
- * <li>immutable (i.e., threadsafe)</li>
- * <li>instance managed (don't instantiate it yourself), instead call "of"</li>
- * <ul>
- * <p>
- * You can construct a Wildcard object from either its integer representation
- * </p>
- * <code>
- *    Wildcard.of(0x3820e0);
- *  </code>
- * <p>
- * Or start with either an empty or full wildcard, and select/unselect foo.
- * </p>
- * <code>
- *  Wildcard w = Wildcards.NONE
- *                .set(Flag.DL_SRC, Flag. DL_DST, Flag.DL_VLAN_PCP)
- *                .setNwDstMask(8)
- *                .setNwSrcMask(8);
- *  </code>
- * <p>
- * <b>Remember:</b> Wildcards objects are immutable. set... operations have
- * <b>NO EFFECT</b> on the current wildcard object. You HAVE to use the returned
- * changed object.
- * </p>
- *
- * @author Andreas Wundsam <andreas.wundsam@bigswitch.com>
- */
-public class Wildcards {
-    public class OFWildcardFlags {
-        final public static int OFPFW_ALL = ((1 << 22) - 1);
-
-        final public static int OFPFW_IN_PORT = 1 << 0; /* Switch input port. */
-        final public static int OFPFW_DL_VLAN = 1 << 1; /* VLAN id. */
-        final public static int OFPFW_DL_SRC = 1 << 2; /* Ethernet source address. */
-        final public static int OFPFW_DL_DST = 1 << 3; /*
-                                                        * Ethernet destination
-                                                        * address.
-                                                        */
-        final public static int OFPFW_DL_TYPE = 1 << 4; /* Ethernet frame type. */
-        final public static int OFPFW_NW_PROTO = 1 << 5; /* IP protocol. */
-        final public static int OFPFW_TP_SRC = 1 << 6; /* TCP/UDP source port. */
-        final public static int OFPFW_TP_DST = 1 << 7; /* TCP/UDP destination port. */
-
-        /*
-         * IP source address wildcard bit count. 0 is exact match, 1 ignores the
-         * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard
-         * the entire field. This is the *opposite* of the usual convention where
-         * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded.
-         */
-        final public static int OFPFW_NW_SRC_SHIFT = 8;
-        final public static int OFPFW_NW_SRC_BITS = 6;
-        final public static int OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT;
-        final public static int OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT;
-
-        /* IP destination address wildcard bit count. Same format as source. */
-        final public static int OFPFW_NW_DST_SHIFT = 14;
-        final public static int OFPFW_NW_DST_BITS = 6;
-        final public static int OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT;
-        final public static int OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT;
-
-        final public static int OFPFW_DL_VLAN_PCP = 1 << 20; /* VLAN priority. */
-        final public static int OFPFW_NW_TOS = 1 << 21; /*
-                                                         * IP ToS (DSCP field, 6
-                                                         * bits).
-                                                         */
-
-        final public static int OFPFW_ALL_SANITIZED = (((1 << 22) - 1)
-                                                       & ~OFPFW_NW_SRC_MASK & ~OFPFW_NW_DST_MASK)
-                                                      | OFPFW_NW_SRC_ALL
-                                                      | OFPFW_NW_DST_ALL;
-
-
-    }
-
-    public final static Wildcards FULL = new Wildcards(OFWildcardFlags.OFPFW_ALL_SANITIZED);
-    private static final int FULL_INT = FULL.getInt();
-
-    public final static Wildcards EXACT = new Wildcards(0);
-
-    // floodlight common case: matches on inport + l2
-    public final static int INT_INPORT_L2_MATCH = 0x3820e0;
-    public final static Wildcards INPORT_L2_MATCH = new Wildcards(
-            INT_INPORT_L2_MATCH);
-
-    /**
-     * enum type for the binary flags that can be set in the wildcards field of
-     * an OFWildcardFlags. Replaces the unwieldy c-ish int constants in OFWildcardFlags.
-     */
-    public static enum Flag {
-        IN_PORT(OFWildcardFlags.OFPFW_IN_PORT),  /* Switch input port. */
-        DL_VLAN(OFWildcardFlags.OFPFW_DL_VLAN), /* VLAN id. */
-        DL_SRC(OFWildcardFlags.OFPFW_DL_SRC), /* Ethernet source address. */
-        DL_DST(OFWildcardFlags.OFPFW_DL_DST), /* Ethernet destination addr */
-        DL_TYPE(OFWildcardFlags.OFPFW_DL_TYPE), /* Ethernet frame type. */
-        NW_PROTO(OFWildcardFlags.OFPFW_NW_PROTO), /* IP protocol. */
-        TP_SRC(OFWildcardFlags.OFPFW_TP_SRC), /* TCP/UDP source port. */
-        TP_DST(OFWildcardFlags.OFPFW_TP_DST), /* TCP/UDP destination port. */
-        DL_VLAN_PCP(OFWildcardFlags.OFPFW_DL_VLAN_PCP), /* VLAN priority. */
-        NW_SRC(-1) { /*
-                      * virtual NW_SRC flag => translates to the strange 6 bits
-                      * in the header
-                      */
-            @Override
-            boolean isBolean() {
-                return false;
-            }
-
-            @Override
-            int getInt(int flags) {
-                return ((flags & OFWildcardFlags.OFPFW_NW_SRC_MASK) >> OFWildcardFlags.OFPFW_NW_SRC_SHIFT);
-            }
-
-            @Override
-            int setInt(int flags, int srcMask) {
-                return (flags & ~OFWildcardFlags.OFPFW_NW_SRC_MASK) | (srcMask << OFWildcardFlags.OFPFW_NW_SRC_SHIFT);
-            }
-
-            @Override
-            int wildcard(int flags) {
-                return flags & ~OFWildcardFlags.OFPFW_NW_SRC_MASK;
-            }
-
-            @Override
-            int matchOn(int flags) {
-                return flags | OFWildcardFlags.OFPFW_NW_SRC_ALL;
-            }
-
-            @Override
-            boolean isPartiallyOn(int flags) {
-                int intValue = getInt(flags);
-                return intValue > 0 && intValue < 32;
-            }
-
-            @Override
-            boolean isFullyOn(int flags) {
-                return getInt(flags) >= 32;
-            }
-
-        },
-        NW_DST(-1) { /*
-                      * virtual NW_SRC flag => translates to the strange 6 bits
-                      * in the header
-                      */
-            @Override
-            boolean isBolean() {
-                return false;
-            }
-
-            @Override
-            int getInt(int flags) {
-                return ((flags & OFWildcardFlags.OFPFW_NW_DST_MASK) >> OFWildcardFlags.OFPFW_NW_DST_SHIFT);
-            }
-
-            @Override
-            int setInt(int flags, int srcMask) {
-                return (flags & ~OFWildcardFlags.OFPFW_NW_DST_MASK) | (srcMask << OFWildcardFlags.OFPFW_NW_DST_SHIFT);
-            }
-
-            @Override
-            int wildcard(int flags) {
-                return flags & ~OFWildcardFlags.OFPFW_NW_DST_MASK;
-            }
-
-            @Override
-            int matchOn(int flags) {
-                return flags | OFWildcardFlags.OFPFW_NW_DST_ALL;
-            }
-
-            @Override
-            boolean isFullyOn(int flags) {
-                return getInt(flags) >= 32;
-            }
-        },
-        NW_TOS(OFWildcardFlags.OFPFW_NW_TOS); /* IP ToS (DSCP field, 6 bits). */
-
-        final int bitPosition;
-
-        Flag(int bitPosition) {
-            this.bitPosition = bitPosition;
-        }
-
-        /**
-         * @return a modified OF-1.0 flags field with this flag cleared (match
-         *         on this field)
-         */
-        int matchOn(int flags) {
-            return flags & ~this.bitPosition;
-        }
-
-        /**
-         * @return a modified OF-1.0 flags field with this flag set (wildcard
-         *         this field)
-         */
-        int wildcard(int flags) {
-            return flags | this.bitPosition;
-        }
-
-        /**
-         * @return true iff this is a true boolean flag that can either be off
-         *         or on.True in OF-1.0 for all fields except NW_SRC and NW_DST
-         */
-        boolean isBolean() {
-            return false;
-        }
-
-        /**
-         * @return true iff this wildcard field is currently 'partially on'.
-         *         Always false for true Boolean Flags. Can be true in OF-1.0
-         *         for NW_SRC, NW_DST.
-         */
-        boolean isPartiallyOn(int flags) {
-            return false;
-        }
-
-        /**
-         * @return true iff this wildcard field currently fully on (fully
-         *         wildcarded). Equivalent to the boolean flag being set in the
-         *         bitmask for bit flags, and to the wildcarded bit length set
-         *         to >=32 for NW_SRC and NW_DST
-         * @param flags
-         * @return
-         */
-        boolean isFullyOn(int flags) {
-            return (flags & this.bitPosition) != 0;
-        }
-
-        /**
-         * set the integer representation of this flag. only for NW_SRC and
-         * NW_DST
-         */
-        int setInt(int flags, int srcMask) {
-            throw new UnsupportedOperationException();
-        }
-
-        /**
-         * set the integer representation of this flag. only for NW_SRC and
-         * NW_DST
-         */
-        int getInt(int flags) {
-            throw new UnsupportedOperationException();
-        }
-
-
-    }
-
-    private final int flags;
-
-    /** private constructor. use Wildcard.of() instead */
-    private Wildcards(int flags) {
-        this.flags = flags;
-    }
-
-    /**
-     * return a wildcard object matching the given int flags. May reuse / cache
-     * frequently used wildcard instances. Don't rely on it though (use equals
-     * not ==).
-     *
-     * @param flags
-     * @return
-     */
-    public static Wildcards of(int paramFlags) {
-        int flags = paramFlags; //sanitizeInt(paramFlags);
-        switch(flags) {
-            case 0x0000:
-                return EXACT;
-            case OFWildcardFlags.OFPFW_ALL_SANITIZED:
-                return FULL;
-            case INT_INPORT_L2_MATCH:
-                return INPORT_L2_MATCH;
-            default:
-                return new Wildcards(flags);
-        }
-    }
-
-    /** convience method return a wildcard for exactly one set flag */
-    public static Wildcards of(Wildcards.Flag setFlag) {
-        return Wildcards.of(setFlag.wildcard(0));
-    }
-
-    /** convience method return a wildcard for exactly two set flags */
-    public static Wildcards of(Wildcards.Flag setFlag, Wildcards.Flag setFlag2) {
-        return Wildcards.of(setFlag.wildcard(setFlag2.wildcard(0)));
-    }
-
-    /** convience method return a wildcard for an arbitrary number of set flags */
-    public static Wildcards of(Wildcards.Flag... setFlags) {
-        int flags = 0;
-        for (Wildcards.Flag flag : setFlags)
-            flags = flag.wildcard(0);
-        return Wildcards.of(flags);
-    }
-
-    /** convience method return a wildcards for ofmatches that match on one flag */
-    public static Wildcards ofMatches(Wildcards.Flag setFlag) {
-        return Wildcards.of(setFlag.matchOn(FULL_INT));
-    }
-
-    /**
-     * convience method return a wildcard for for an ofmatch that match on two
-     * flags
-     */
-    public static Wildcards ofMatches(Wildcards.Flag setFlag, Wildcards.Flag setFlag2) {
-        return Wildcards.of(setFlag.matchOn(setFlag2.matchOn(FULL_INT)));
-    }
-
-    /**
-     * convience method return a wildcard for an ofmatch that amtch on an
-     * arbitrary number of set flags
-     */
-    public static Wildcards ofMatches(Wildcards.Flag... setFlags) {
-        int flags = FULL_INT;
-        for (Wildcards.Flag flag : setFlags)
-           flags = flag.matchOn(flags);
-        return Wildcards.of(flags);
-    }
-
-    public static Wildcards ofMatches(Set<Wildcards.Flag> wSet) {
-        int flags = FULL_INT;
-        for (Wildcards.Flag flag : wSet)
-           flags = flag.matchOn(flags);
-        return Wildcards.of(flags);
-    }
-
-    /**
-     * return a Wildcards object that has the given flags set
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards wildcard(Wildcards.Flag flag) {
-        int flags = flag.wildcard(this.flags);
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcards object that has the given flags set
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards wildcard(Wildcards.Flag flag, Wildcards.Flag flag2) {
-        int flags = flag.wildcard(flag2.wildcard(this.flags));
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcards object that has the given flags wildcarded
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards wildcard(Wildcards.Flag... setFlags) {
-        int flags = this.flags;
-        for (Wildcards.Flag flag : setFlags)
-            flags = flag.wildcard(flags);
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcards object that matches on exactly the given flag
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards matchOn(Wildcards.Flag flag) {
-        int flags = flag.matchOn(this.flags);
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcards object that matches on exactly the given flags
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards matchOn(Wildcards.Flag flag, Wildcards.Flag flag2) {
-        int flags = flag.matchOn(flag2.matchOn(this.flags));
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcards object that matches on exactly the given flags
-     * <p>
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     */
-    public Wildcards matchOn(Wildcards.Flag... setFlags) {
-        int flags = this.flags;
-        for (Wildcards.Flag flag : setFlags)
-            flags = flag.matchOn(flags);
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return the nw src mask in normal CIDR style, e.g., 8 means x.x.x.x/8
-     * means 8 bits wildcarded
-     */
-    public int getNwSrcMask() {
-        return Math.max(0, 32 - Flag.NW_SRC.getInt(flags));
-    }
-
-    /**
-     * return the nw dst mask in normal CIDR style, e.g., 8 means x.x.x.x/8
-     * means 8 bits wildcarded
-     */
-    public int getNwDstMask() {
-        return Math.max(0, 32 - Flag.NW_DST.getInt(flags));
-    }
-
-    /**
-     * return a Wildcard object that has the given nwSrcCidrMask set.
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     *
-     * @param srcCidrMask
-     *            source mask to set in <b>normal CIDR notation</b>, i.e., 8
-     *            means x.x.x.x/8
-     * @return a modified object
-     */
-    public Wildcards withNwSrcMask(int srcCidrMask) {
-        int flags = Flag.NW_SRC.setInt(this.flags, Math.max(0, 32 - srcCidrMask));
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcard object that has the given nwDstCidrMask set.
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     *
-     * @param dstCidrMask
-     *            dest mask to set in <b>normal CIDR notation</b>, i.e., 8 means
-     *            x.x.x.x/8
-     * @return a modified object
-     */
-    public Wildcards withNwDstMask(int dstCidrMask) {
-        int flags = Flag.NW_DST.setInt(this.flags, Math.max(0, 32 - dstCidrMask));
-        if (flags == this.flags)
-            return this;
-        else
-            return new Wildcards(flags);
-    }
-
-    /**
-     * return a Wildcard object that is inverted to this wildcard object.
-     * <b>NOTE:</b> NOT a mutator function. 'this' wildcard object stays
-     * unmodified. </b>
-     * @return a modified object
-     */
-    public Wildcards inverted() {
-        return Wildcards.of(flags ^ OFWildcardFlags.OFPFW_ALL_SANITIZED);
-    }
-
-    public boolean isWildcarded(Flag flag) {
-        return flag.isFullyOn(flags);
-    }
-
-    /**
-     * return all wildcard flags that are fully wildcarded as an EnumSet. Do not
-     * modify. Note: some flags (like NW_SRC and NW_DST) that are partially
-     * wildcarded are not returned in this set.
-     *
-     * @return the EnumSet of wildcards
-     */
-    public EnumSet<Wildcards.Flag> getWildcardedFlags() {
-        EnumSet<Wildcards.Flag> res = EnumSet.noneOf(Wildcards.Flag.class);
-        for (Wildcards.Flag flag : Flag.values()) {
-            if (flag.isFullyOn(flags)) {
-                res.add(flag);
-            }
-        }
-        return res;
-    }
-
-    /** return the OpenFlow 'wire' integer representation of these wildcards */
-    public int getInt() {
-        return flags;
-    }
-
-    /**
-     * return the OpenFlow 'wire' integer representation of these wildcards.
-     * Sanitize nw_src and nw_dst to be max. 32 (values > 32 are technically
-     * possible, but don't make semantic sense)
-     */
-    public static int sanitizeInt(int flags) {
-        if (((flags & OFWildcardFlags.OFPFW_NW_SRC_MASK) >> OFWildcardFlags.OFPFW_NW_SRC_SHIFT) > 32) {
-            flags = (flags & ~OFWildcardFlags.OFPFW_NW_SRC_MASK) | OFWildcardFlags.OFPFW_NW_SRC_ALL;
-        }
-        if (((flags & OFWildcardFlags.OFPFW_NW_DST_MASK) >> OFWildcardFlags.OFPFW_NW_DST_SHIFT) > 32) {
-            flags = (flags & ~OFWildcardFlags.OFPFW_NW_DST_MASK) | OFWildcardFlags.OFPFW_NW_DST_ALL;
-        }
-        return flags;
-    }
-
-    /**
-     * is this a wildcard set that has all flags set + and full (/0) nw_src and
-     * nw_dst wildcarding ?
-     */
-    public boolean isFull() {
-        return flags == OFWildcardFlags.OFPFW_ALL || flags == OFWildcardFlags.OFPFW_ALL_SANITIZED;
-    }
-
-    /** is this a wildcard of an exact match */
-    public boolean isExact() {
-        return flags == 0;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + flags;
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Wildcards other = (Wildcards) obj;
-        if (flags != other.flags)
-            return false;
-        return true;
-    }
-
-    private final static Joiner pipeJoiner = Joiner.on("|");
-
-    @Override
-    public String toString() {
-        List<String> res = new ArrayList<String>();
-        for (Wildcards.Flag flag : Flag.values()) {
-            if (flag.isFullyOn(flags)) {
-                res.add(flag.name().toLowerCase());
-            }
-        }
-
-        if (Flag.NW_SRC.isPartiallyOn(flags)) {
-            res.add("nw_src(/" + getNwSrcMask() + ")");
-        }
-
-        if (Flag.NW_DST.isPartiallyOn(flags)) {
-            res.add("nw_dst(/" + getNwDstMask() + ")");
-        }
-
-        return pipeJoiner.join(res);
-    }
-
-    private final static Joiner commaJoiner = Joiner.on(", ");
-
-    /** a Java expression that constructs 'this' wildcards set */
-    public String toJava() {
-        if(isFull()) {
-            return "Wildcards.FULL";
-        } else  if (isExact()){
-            return "Wildcards.EXACT";
-        }
-
-        StringBuilder b = new StringBuilder();
-
-        EnumSet<Flag> myFlags = getWildcardedFlags();
-        if (myFlags.size() < 3) {
-            // default to start with empty
-            b.append("Wildcards.of("
-                     + commaJoiner.join(prefix("Flag.", myFlags.iterator())) + ")");
-        } else {
-            // too many - start with full
-
-            EnumSet<Flag> invFlags = inverted().getWildcardedFlags();
-            b.append("Wildcards.ofMatches("
-                     + commaJoiner.join(prefix("Flag.", invFlags.iterator())) + ")");
-        }
-        if (Flag.NW_SRC.isPartiallyOn(flags)) {
-            b.append(".setNwSrcMask(" + getNwSrcMask() + ")");
-        }
-        if (Flag.NW_DST.isPartiallyOn(flags)) {
-            b.append(".setNwDstMask(" + getNwDstMask() + ")");
-        }
-        return b.toString();
-    }
-
-    private Iterator<String> prefix(final String prefix, final Iterator<?> i) {
-        return new Iterator<String>() {
-
-            @Override
-            public boolean hasNext() {
-                return i.hasNext();
-            }
-
-            @Override
-            public String next() {
-                Object next = i.next();
-                return next == null ? null : prefix + next.toString();
-            }
-
-            @Override
-            public void remove() {
-                i.remove();
-            }
-        };
-    }
-
-
-}
\ 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 611898f..47ca9da 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
@@ -60,23 +60,23 @@
 
     public final static MatchField<IpDscp> IP_DSCP =
             new MatchField<IpDscp>("ip_dscp", MatchFields.IP_DSCP,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv4, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4, EthType.IPv6));
 
     public final static MatchField<IpEcn> IP_ECN =
             new MatchField<IpEcn>("ip_dscp", MatchFields.IP_ECN,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv4, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4, EthType.IPv6));
 
     public final static MatchField<IpProtocol> IP_PROTO =
             new MatchField<IpProtocol>("ip_proto", MatchFields.IP_PROTO,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv4, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4, EthType.IPv6));
 
     public final static MatchField<IPv4Address> IPV4_SRC =
             new MatchField<IPv4Address>("ipv4_src", MatchFields.IPV4_SRC,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv4));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4));
 
     public final static MatchField<IPv4Address> IPV4_DST =
             new MatchField<IPv4Address>("ipv4_dst", MatchFields.IPV4_DST,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv4));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv4));
 
     public final static MatchField<TransportPort> TCP_SRC = new MatchField<TransportPort>(
             "tcp_src", MatchFields.TCP_SRC,
@@ -112,35 +112,35 @@
 
     public final static MatchField<ArpOpcode> ARP_OP = new MatchField<ArpOpcode>(
             "arp_op", MatchFields.ARP_OP,
-            new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_ARP));
+            new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ARP));
 
     public final static MatchField<IPv4Address> ARP_SPA =
             new MatchField<IPv4Address>("arp_spa", MatchFields.ARP_SPA,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_ARP));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ARP));
 
     public final static MatchField<IPv4Address> ARP_TPA =
             new MatchField<IPv4Address>("arp_tpa", MatchFields.ARP_TPA,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_ARP));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ARP));
 
     public final static MatchField<MacAddress> ARP_SHA =
             new MatchField<MacAddress>("arp_sha", MatchFields.ARP_SHA,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_ARP));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ARP));
 
     public final static MatchField<MacAddress> ARP_THA =
             new MatchField<MacAddress>("arp_tha", MatchFields.ARP_THA,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_ARP));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ARP));
 
     public final static MatchField<IPv6Address> IPV6_SRC =
             new MatchField<IPv6Address>("ipv6_src", MatchFields.IPV6_SRC,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv6));
 
     public final static MatchField<IPv6Address> IPV6_DST =
             new MatchField<IPv6Address>("ipv6_dst", MatchFields.IPV6_DST,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv6));
 
     public final static MatchField<IPv6FlowLabel> IPV6_FLABEL =
             new MatchField<IPv6FlowLabel>("ipv6_flabel", MatchFields.IPV6_FLABEL,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_IPv6));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.IPv6));
 
     public final static MatchField<U8> ICMPV6_TYPE =
             new MatchField<U8>("icmpv6_type", MatchFields.ICMPV6_TYPE,
@@ -164,11 +164,11 @@
 
     public final static MatchField<U32> MPLS_LABEL =
             new MatchField<U32>("mpls_label", MatchFields.MPLS_LABEL,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_MPLS_UNICAST, EthType.ETH_TYPE_MPLS_MULTICAST));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.MPLS_UNICAST, EthType.MPLS_MULTICAST));
 
     public final static MatchField<U8> MPLS_TC =
             new MatchField<U8>("mpls_tc", MatchFields.MPLS_TC,
-                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.ETH_TYPE_MPLS_UNICAST, EthType.ETH_TYPE_MPLS_MULTICAST));
+                    new Prerequisite<EthType>(MatchField.ETH_TYPE, EthType.MPLS_UNICAST, EthType.MPLS_MULTICAST));
 
     public String getName() {
         return name;
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 5e710ca..5ab940d 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
@@ -60,7 +60,10 @@
 
     private static final int MIN_OPCODE = 0;
     private static final int MAX_OPCODE = 0xFFFF;
-    
+
+    private static final int NONE_VAL = 0;
+    public static final ArpOpcode NONE = new ArpOpcode(NONE_VAL);
+
     public static final ArpOpcode NO_MASK = new ArpOpcode(0xFFFFFFFF);
     public static final ArpOpcode FULL_MASK = new ArpOpcode(0x00000000);
 
@@ -83,6 +86,8 @@
         if (opcode < MIN_OPCODE || opcode > MAX_OPCODE)
             throw new IllegalArgumentException("Invalid ARP opcode: " + opcode);
         switch (opcode) {
+            case NONE_VAL:
+                return NONE;
             case ARP_OPCODE_VAL_REQUEST:
                 return ARP_OPCODE_REQUEST;
             case ARP_OPCODE_VAL_REPLY:
@@ -137,11 +142,11 @@
                 return new ArpOpcode(opcode);
         }
     }
-    
+
     public void write2Bytes(ChannelBuffer c) {
         c.writeShort(this.opcode);
     }
-    
+
     public static ArpOpcode read2Bytes(ChannelBuffer c) {
         return ArpOpcode.of(c.readUnsignedShort());
     }
@@ -150,9 +155,9 @@
     public ArpOpcode applyMask(ArpOpcode mask) {
         return ArpOpcode.of(this.opcode & mask.opcode);
     }
-    
+
     public int getOpCode() {
         return opcode;
     }
-    
+
 }
\ No newline at end of file
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 52f5455..abd4bff 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
@@ -5,7 +5,7 @@
 
 /**
  * EtherType field representation.
- * 
+ *
  * @author Yotam Harchol (yotam.harchol@bigswitch.com)
  */
 public class EthType implements OFValueType<EthType> {
@@ -13,93 +13,97 @@
 
     private final int rawValue;
 
-    static final int ETH_TYPE_VAL_IPv4              = 0x0800; // Internet Protocol version 4 (IPv4)
-    static final int ETH_TYPE_VAL_ARP               = 0x0806; // Address Resolution Protocol (ARP)
-    static final int ETH_TYPE_VAL_WAKE_ON_LAN       = 0x0842; // Wake-on-LAN[3]
-    static final int ETH_TYPE_VAL_TRILL             = 0x22F3; // IETF TRILL Protocol
-    static final int ETH_TYPE_VAL_DECNET_IV         = 0x6003; // DECnet Phase IV
-    static final int ETH_TYPE_VAL_REV_ARP           = 0x8035; // Reverse Address Resolution Protocol
-    static final int ETH_TYPE_VAL_APPLE_TALK        = 0x809B; // AppleTalk (Ethertalk)
-    static final int ETH_TYPE_VAL_APPLE_TALK_ARP    = 0x80F3; // AppleTalk Address Resolution Protocol (AARP)
-    static final int ETH_TYPE_VAL_VLAN_FRAME        = 0x8100; // VLAN-tagged frame (IEEE 802.1Q) & Shortest Path Bridging IEEE 802.1aq[4]
-    static final int ETH_TYPE_VAL_IPX_8137          = 0x8137; // IPX
-    static final int ETH_TYPE_VAL_IPX_8138          = 0x8138; // IPX
-    static final int ETH_TYPE_VAL_QNX               = 0x8204; // QNX Qnet
-    static final int ETH_TYPE_VAL_IPv6              = 0x86DD; // Internet Protocol Version 6 (IPv6)
-    static final int ETH_TYPE_VAL_ETH_FLOW          = 0x8808; // Ethernet flow control
-    static final int ETH_TYPE_VAL_SLOW_PROTOCOLS    = 0x8809; // Slow Protocols (IEEE 802.3)
-    static final int ETH_TYPE_VAL_COBRANET          = 0x8819; // CobraNet
-    static final int ETH_TYPE_VAL_MPLS_UNICAST      = 0x8847; // MPLS unicast
-    static final int ETH_TYPE_VAL_MPLS_MULTICAST    = 0x8848; // MPLS multicast
-    static final int ETH_TYPE_VAL_PPPoE_DISCOVERY   = 0x8863; // PPPoE Discovery Stage
-    static final int ETH_TYPE_VAL_PPPoE_SESSION     = 0x8864; // PPPoE Session Stage
-    static final int ETH_TYPE_VAL_JUMBO_FRAMES      = 0x8870; // Jumbo Frames
-    static final int ETH_TYPE_VAL_HOMEPLUG_10       = 0x887B; // HomePlug 1.0 MME
-    static final int ETH_TYPE_VAL_EAP_OVER_LAN      = 0x888E; // EAP over LAN (IEEE 802.1X)
-    static final int ETH_TYPE_VAL_PROFINET          = 0x8892; // PROFINET Protocol
-    static final int ETH_TYPE_VAL_HYPERSCSI         = 0x889A; // HyperSCSI (SCSI over Ethernet)
-    static final int ETH_TYPE_VAL_ATA_OVER_ETH      = 0x88A2; // ATA over Ethernet
-    static final int ETH_TYPE_VAL_ETHERCAT          = 0x88A4; // EtherCAT Protocol
-    static final int ETH_TYPE_VAL_BRIDGING          = 0x88A8; // Provider Bridging (IEEE 802.1ad) & Shortest Path Bridging IEEE 802.1aq[5]
-    static final int ETH_TYPE_VAL_POWERLINK         = 0x88AB; // Ethernet Powerlink[citation needed]
-    static final int ETH_TYPE_VAL_LLDP              = 0x88CC; // Link Layer Discovery Protocol (LLDP)
-    static final int ETH_TYPE_VAL_SERCOS            = 0x88CD; // SERCOS III
-    static final int ETH_TYPE_VAL_HOMEPLUG_AV       = 0x88E1; // HomePlug AV MME[citation needed]
-    static final int ETH_TYPE_VAL_MRP               = 0x88E3; // Media Redundancy Protocol (IEC62439-2)
-    static final int ETH_TYPE_VAL_MAC_SEC           = 0x88E5; // MAC security (IEEE 802.1AE)
-    static final int ETH_TYPE_VAL_PTP               = 0x88F7; // Precision Time Protocol (IEEE 1588)
-    static final int ETH_TYPE_VAL_CFM               = 0x8902; // IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)
-    static final int ETH_TYPE_VAL_FCoE              = 0x8906; // Fibre Channel over Ethernet (FCoE)
-    static final int ETH_TYPE_VAL_FCoE_INIT         = 0x8914; // FCoE Initialization Protocol
-    static final int ETH_TYPE_VAL_RoCE              = 0x8915; // RDMA over Converged Ethernet (RoCE)
-    static final int ETH_TYPE_VAL_HSR               = 0x892F; // High-availability Seamless Redundancy (HSR)
-    static final int ETH_TYPE_VAL_CONF_TEST         = 0x9000; // Ethernet Configuration Testing Protocol[6]
-    static final int ETH_TYPE_VAL_Q_IN_Q            = 0x9100; // Q-in-Q
-    static final int ETH_TYPE_VAL_LLT               = 0xCAFE; // Veritas Low Latency Transport (LLT)[7] for Veritas Cluster Server
+    static final int VAL_IPv4              = 0x0800; // Internet Protocol version 4 (IPv4)
+    static final int VAL_ARP               = 0x0806; // Address Resolution Protocol (ARP)
+    static final int VAL_WAKE_ON_LAN       = 0x0842; // Wake-on-LAN[3]
+    static final int VAL_TRILL             = 0x22F3; // IETF TRILL Protocol
+    static final int VAL_DECNET_IV         = 0x6003; // DECnet Phase IV
+    static final int VAL_REV_ARP           = 0x8035; // Reverse Address Resolution Protocol
+    static final int VAL_APPLE_TALK        = 0x809B; // AppleTalk (Ethertalk)
+    static final int VAL_APPLE_TALK_ARP    = 0x80F3; // AppleTalk Address Resolution Protocol (AARP)
+    static final int VAL_VLAN_FRAME        = 0x8100; // VLAN-tagged frame (IEEE 802.1Q) & Shortest Path Bridging IEEE 802.1aq[4]
+    static final int VAL_IPX_8137          = 0x8137; // IPX
+    static final int VAL_IPX_8138          = 0x8138; // IPX
+    static final int VAL_QNX               = 0x8204; // QNX Qnet
+    static final int VAL_IPv6              = 0x86DD; // Internet Protocol Version 6 (IPv6)
+    static final int VAL_ETH_FLOW          = 0x8808; // Ethernet flow control
+    static final int VAL_SLOW_PROTOCOLS    = 0x8809; // Slow Protocols (IEEE 802.3)
+    static final int VAL_COBRANET          = 0x8819; // CobraNet
+    static final int VAL_MPLS_UNICAST      = 0x8847; // MPLS unicast
+    static final int VAL_MPLS_MULTICAST    = 0x8848; // MPLS multicast
+    static final int VAL_PPPoE_DISCOVERY   = 0x8863; // PPPoE Discovery Stage
+    static final int VAL_PPPoE_SESSION     = 0x8864; // PPPoE Session Stage
+    static final int VAL_JUMBO_FRAMES      = 0x8870; // Jumbo Frames
+    static final int VAL_HOMEPLUG_10       = 0x887B; // HomePlug 1.0 MME
+    static final int VAL_EAP_OVER_LAN      = 0x888E; // EAP over LAN (IEEE 802.1X)
+    static final int VAL_PROFINET          = 0x8892; // PROFINET Protocol
+    static final int VAL_HYPERSCSI         = 0x889A; // HyperSCSI (SCSI over Ethernet)
+    static final int VAL_ATA_OVER_ETH      = 0x88A2; // ATA over Ethernet
+    static final int VAL_ETHERCAT          = 0x88A4; // EtherCAT Protocol
+    static final int VAL_BRIDGING          = 0x88A8; // Provider Bridging (IEEE 802.1ad) & Shortest Path Bridging IEEE 802.1aq[5]
+    static final int VAL_POWERLINK         = 0x88AB; // Ethernet Powerlink[citation needed]
+    static final int VAL_LLDP              = 0x88CC; // Link Layer Discovery Protocol (LLDP)
+    static final int VAL_SERCOS            = 0x88CD; // SERCOS III
+    static final int VAL_HOMEPLUG_AV       = 0x88E1; // HomePlug AV MME[citation needed]
+    static final int VAL_MRP               = 0x88E3; // Media Redundancy Protocol (IEC62439-2)
+    static final int VAL_MAC_SEC           = 0x88E5; // MAC security (IEEE 802.1AE)
+    static final int VAL_PTP               = 0x88F7; // Precision Time Protocol (IEEE 1588)
+    static final int VAL_CFM               = 0x8902; // IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)
+    static final int VAL_FCoE              = 0x8906; // Fibre Channel over Ethernet (FCoE)
+    static final int VAL_FCoE_INIT         = 0x8914; // FCoE Initialization Protocol
+    static final int VAL_RoCE              = 0x8915; // RDMA over Converged Ethernet (RoCE)
+    static final int VAL_HSR               = 0x892F; // High-availability Seamless Redundancy (HSR)
+    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
 
-    public static final EthType ETH_TYPE_IPv4               = new EthType(ETH_TYPE_VAL_IPv4);
-    public static final EthType ETH_TYPE_ARP                = new EthType(ETH_TYPE_VAL_ARP);
-    public static final EthType ETH_TYPE_WAKE_ON_LAN        = new EthType(ETH_TYPE_VAL_WAKE_ON_LAN);
-    public static final EthType ETH_TYPE_TRILL              = new EthType(ETH_TYPE_VAL_TRILL);
-    public static final EthType ETH_TYPE_DECNET_IV          = new EthType(ETH_TYPE_VAL_DECNET_IV); 
-    public static final EthType ETH_TYPE_REV_ARP            = new EthType(ETH_TYPE_VAL_REV_ARP );
-    public static final EthType ETH_TYPE_APPLE_TALK         = new EthType(ETH_TYPE_VAL_APPLE_TALK); 
-    public static final EthType ETH_TYPE_APPLE_TALK_ARP     = new EthType(ETH_TYPE_VAL_APPLE_TALK_ARP); 
-    public static final EthType ETH_TYPE_VLAN_FRAME         = new EthType(ETH_TYPE_VAL_VLAN_FRAME );
-    public static final EthType ETH_TYPE_IPX_8137           = new EthType(ETH_TYPE_VAL_IPX_8137 );
-    public static final EthType ETH_TYPE_IPX_8138           = new EthType(ETH_TYPE_VAL_IPX_8138 );
-    public static final EthType ETH_TYPE_QNX                = new EthType(ETH_TYPE_VAL_QNX );
-    public static final EthType ETH_TYPE_IPv6               = new EthType(ETH_TYPE_VAL_IPv6 );
-    public static final EthType ETH_TYPE_ETH_FLOW           = new EthType(ETH_TYPE_VAL_ETH_FLOW); 
-    public static final EthType ETH_TYPE_SLOW_PROTOCOLS     = new EthType(ETH_TYPE_VAL_SLOW_PROTOCOLS );
-    public static final EthType ETH_TYPE_COBRANET           = new EthType(ETH_TYPE_VAL_COBRANET );
-    public static final EthType ETH_TYPE_MPLS_UNICAST       = new EthType(ETH_TYPE_VAL_MPLS_UNICAST );
-    public static final EthType ETH_TYPE_MPLS_MULTICAST     = new EthType(ETH_TYPE_VAL_MPLS_MULTICAST );
-    public static final EthType ETH_TYPE_PPPoE_DISCOVERY    = new EthType(ETH_TYPE_VAL_PPPoE_DISCOVERY);
-    public static final EthType ETH_TYPE_PPPoE_SESSION      = new EthType(ETH_TYPE_VAL_PPPoE_SESSION );
-    public static final EthType ETH_TYPE_JUMBO_FRAMES       = new EthType(ETH_TYPE_VAL_JUMBO_FRAMES );
-    public static final EthType ETH_TYPE_HOMEPLUG_10        = new EthType(ETH_TYPE_VAL_HOMEPLUG_10 );
-    public static final EthType ETH_TYPE_EAP_OVER_LAN       = new EthType(ETH_TYPE_VAL_EAP_OVER_LAN );
-    public static final EthType ETH_TYPE_PROFINET           = new EthType(ETH_TYPE_VAL_PROFINET );
-    public static final EthType ETH_TYPE_HYPERSCSI          = new EthType(ETH_TYPE_VAL_HYPERSCSI );
-    public static final EthType ETH_TYPE_ATA_OVER_ETH       = new EthType(ETH_TYPE_VAL_ATA_OVER_ETH); 
-    public static final EthType ETH_TYPE_ETHERCAT           = new EthType(ETH_TYPE_VAL_ETHERCAT );
-    public static final EthType ETH_TYPE_BRIDGING           = new EthType(ETH_TYPE_VAL_BRIDGING );
-    public static final EthType ETH_TYPE_POWERLINK          = new EthType(ETH_TYPE_VAL_POWERLINK );
-    public static final EthType ETH_TYPE_LLDP               = new EthType(ETH_TYPE_VAL_LLDP );
-    public static final EthType ETH_TYPE_SERCOS             = new EthType(ETH_TYPE_VAL_SERCOS );
-    public static final EthType ETH_TYPE_HOMEPLUG_AV        = new EthType(ETH_TYPE_VAL_HOMEPLUG_AV );
-    public static final EthType ETH_TYPE_MRP                = new EthType(ETH_TYPE_VAL_MRP );
-    public static final EthType ETH_TYPE_MAC_SEC            = new EthType(ETH_TYPE_VAL_MAC_SEC); 
-    public static final EthType ETH_TYPE_PTP                = new EthType(ETH_TYPE_VAL_PTP );
-    public static final EthType ETH_TYPE_CFM                = new EthType(ETH_TYPE_VAL_CFM );
-    public static final EthType ETH_TYPE_FCoE               = new EthType(ETH_TYPE_VAL_FCoE );
-    public static final EthType ETH_TYPE_FCoE_INIT          = new EthType(ETH_TYPE_VAL_FCoE_INIT );
-    public static final EthType ETH_TYPE_RoCE               = new EthType(ETH_TYPE_VAL_RoCE );
-    public static final EthType ETH_TYPE_HSR                = new EthType(ETH_TYPE_VAL_HSR );
-    public static final EthType ETH_TYPE_CONF_TEST          = new EthType(ETH_TYPE_VAL_CONF_TEST );
-    public static final EthType ETH_TYPE_Q_IN_Q             = new EthType(ETH_TYPE_VAL_Q_IN_Q );
-    public static final EthType ETH_TYPE_LLT                = new EthType(ETH_TYPE_VAL_LLT );
+    public static final EthType IPv4               = new EthType(VAL_IPv4);
+    public static final EthType ARP                = new EthType(VAL_ARP);
+    public static final EthType WAKE_ON_LAN        = new EthType(VAL_WAKE_ON_LAN);
+    public static final EthType TRILL              = new EthType(VAL_TRILL);
+    public static final EthType DECNET_IV          = new EthType(VAL_DECNET_IV);
+    public static final EthType REV_ARP            = new EthType(VAL_REV_ARP );
+    public static final EthType APPLE_TALK         = new EthType(VAL_APPLE_TALK);
+    public static final EthType APPLE_TALK_ARP     = new EthType(VAL_APPLE_TALK_ARP);
+    public static final EthType VLAN_FRAME         = new EthType(VAL_VLAN_FRAME );
+    public static final EthType IPX_8137           = new EthType(VAL_IPX_8137 );
+    public static final EthType IPX_8138           = new EthType(VAL_IPX_8138 );
+    public static final EthType QNX                = new EthType(VAL_QNX );
+    public static final EthType IPv6               = new EthType(VAL_IPv6 );
+    public static final EthType ETH_FLOW           = new EthType(VAL_ETH_FLOW);
+    public static final EthType SLOW_PROTOCOLS     = new EthType(VAL_SLOW_PROTOCOLS );
+    public static final EthType COBRANET           = new EthType(VAL_COBRANET );
+    public static final EthType MPLS_UNICAST       = new EthType(VAL_MPLS_UNICAST );
+    public static final EthType MPLS_MULTICAST     = new EthType(VAL_MPLS_MULTICAST );
+    public static final EthType PPPoE_DISCOVERY    = new EthType(VAL_PPPoE_DISCOVERY);
+    public static final EthType PPPoE_SESSION      = new EthType(VAL_PPPoE_SESSION );
+    public static final EthType JUMBO_FRAMES       = new EthType(VAL_JUMBO_FRAMES );
+    public static final EthType HOMEPLUG_10        = new EthType(VAL_HOMEPLUG_10 );
+    public static final EthType EAP_OVER_LAN       = new EthType(VAL_EAP_OVER_LAN );
+    public static final EthType PROFINET           = new EthType(VAL_PROFINET );
+    public static final EthType HYPERSCSI          = new EthType(VAL_HYPERSCSI );
+    public static final EthType ATA_OVER_ETH       = new EthType(VAL_ATA_OVER_ETH);
+    public static final EthType ETHERCAT           = new EthType(VAL_ETHERCAT );
+    public static final EthType BRIDGING           = new EthType(VAL_BRIDGING );
+    public static final EthType POWERLINK          = new EthType(VAL_POWERLINK );
+    public static final EthType LLDP               = new EthType(VAL_LLDP );
+    public static final EthType SERCOS             = new EthType(VAL_SERCOS );
+    public static final EthType HOMEPLUG_AV        = new EthType(VAL_HOMEPLUG_AV );
+    public static final EthType MRP                = new EthType(VAL_MRP );
+    public static final EthType MAC_SEC            = new EthType(VAL_MAC_SEC);
+    public static final EthType PTP                = new EthType(VAL_PTP );
+    public static final EthType CFM                = new EthType(VAL_CFM );
+    public static final EthType FCoE               = new EthType(VAL_FCoE );
+    public static final EthType FCoE_INIT          = new EthType(VAL_FCoE_INIT );
+    public static final EthType RoCE               = new EthType(VAL_RoCE );
+    public static final EthType HSR                = new EthType(VAL_HSR );
+    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 );
+
+
+    private static final int NONE_VAL = 0x0;
+    public static final EthType NONE = new EthType(NONE_VAL);
 
     public static final EthType NO_MASK = new EthType(0xFFFFFFFF);
     public static final EthType FULL_MASK = new EthType(0x00000000);
@@ -115,92 +119,94 @@
 
     public static EthType of(int type) {
         switch (type) {
-            case ETH_TYPE_VAL_IPv4:
-                return ETH_TYPE_IPv4;
-            case ETH_TYPE_VAL_ARP:
-                return ETH_TYPE_ARP;
-            case ETH_TYPE_VAL_WAKE_ON_LAN:
-                return ETH_TYPE_WAKE_ON_LAN;
-            case ETH_TYPE_VAL_TRILL:
-                return ETH_TYPE_TRILL;
-            case ETH_TYPE_VAL_DECNET_IV:
-                return ETH_TYPE_DECNET_IV;
-            case ETH_TYPE_VAL_REV_ARP:
-                return ETH_TYPE_REV_ARP;
-            case ETH_TYPE_VAL_APPLE_TALK:
-                return ETH_TYPE_APPLE_TALK;
-            case ETH_TYPE_VAL_APPLE_TALK_ARP:
-                return ETH_TYPE_APPLE_TALK_ARP;
-            case ETH_TYPE_VAL_VLAN_FRAME:
-                return ETH_TYPE_VLAN_FRAME;
-            case ETH_TYPE_VAL_IPX_8137:
-                return ETH_TYPE_IPX_8137;
-            case ETH_TYPE_VAL_IPX_8138:
-                return ETH_TYPE_IPX_8138;
-            case ETH_TYPE_VAL_QNX:
-                return ETH_TYPE_QNX;
-            case ETH_TYPE_VAL_IPv6:
-                return ETH_TYPE_IPv6;
-            case ETH_TYPE_VAL_ETH_FLOW:
-                return ETH_TYPE_ETH_FLOW;
-            case ETH_TYPE_VAL_SLOW_PROTOCOLS:
-                return ETH_TYPE_SLOW_PROTOCOLS;
-            case ETH_TYPE_VAL_COBRANET:
-                return ETH_TYPE_COBRANET;
-            case ETH_TYPE_VAL_MPLS_UNICAST:
-                return ETH_TYPE_MPLS_UNICAST;
-            case ETH_TYPE_VAL_MPLS_MULTICAST:
-                return ETH_TYPE_MPLS_MULTICAST;
-            case ETH_TYPE_VAL_PPPoE_DISCOVERY:
-                return ETH_TYPE_PPPoE_DISCOVERY;
-            case ETH_TYPE_VAL_PPPoE_SESSION:
-                return ETH_TYPE_PPPoE_SESSION;
-            case ETH_TYPE_VAL_JUMBO_FRAMES:
-                return ETH_TYPE_JUMBO_FRAMES;
-            case ETH_TYPE_VAL_HOMEPLUG_10:
-                return ETH_TYPE_HOMEPLUG_10;
-            case ETH_TYPE_VAL_EAP_OVER_LAN:
-                return ETH_TYPE_EAP_OVER_LAN;
-            case ETH_TYPE_VAL_PROFINET:
-                return ETH_TYPE_PROFINET;
-            case ETH_TYPE_VAL_HYPERSCSI:
-                return ETH_TYPE_HYPERSCSI;
-            case ETH_TYPE_VAL_ATA_OVER_ETH:
-                return ETH_TYPE_ATA_OVER_ETH;
-            case ETH_TYPE_VAL_ETHERCAT:
-                return ETH_TYPE_ETHERCAT;
-            case ETH_TYPE_VAL_BRIDGING:
-                return ETH_TYPE_BRIDGING;
-            case ETH_TYPE_VAL_POWERLINK:
-                return ETH_TYPE_POWERLINK;
-            case ETH_TYPE_VAL_LLDP:
-                return ETH_TYPE_LLDP;
-            case ETH_TYPE_VAL_SERCOS:
-                return ETH_TYPE_SERCOS;
-            case ETH_TYPE_VAL_HOMEPLUG_AV:
-                return ETH_TYPE_HOMEPLUG_AV;
-            case ETH_TYPE_VAL_MRP:
-                return ETH_TYPE_MRP;
-            case ETH_TYPE_VAL_MAC_SEC:
-                return ETH_TYPE_MAC_SEC;
-            case ETH_TYPE_VAL_PTP:
-                return ETH_TYPE_PTP;
-            case ETH_TYPE_VAL_CFM:
-                return ETH_TYPE_CFM;
-            case ETH_TYPE_VAL_FCoE:
-                return ETH_TYPE_FCoE;
-            case ETH_TYPE_VAL_FCoE_INIT:
-                return ETH_TYPE_FCoE_INIT;
-            case ETH_TYPE_VAL_RoCE:
-                return ETH_TYPE_RoCE;
-            case ETH_TYPE_VAL_HSR:
-                return ETH_TYPE_HSR;
-            case ETH_TYPE_VAL_CONF_TEST:
-                return ETH_TYPE_CONF_TEST;
-            case ETH_TYPE_VAL_Q_IN_Q:
-                return ETH_TYPE_Q_IN_Q;
-            case ETH_TYPE_VAL_LLT:
-                return ETH_TYPE_LLT;
+            case NONE_VAL:
+                return NONE;
+            case VAL_IPv4:
+                return IPv4;
+            case VAL_ARP:
+                return ARP;
+            case VAL_WAKE_ON_LAN:
+                return WAKE_ON_LAN;
+            case VAL_TRILL:
+                return TRILL;
+            case VAL_DECNET_IV:
+                return DECNET_IV;
+            case VAL_REV_ARP:
+                return REV_ARP;
+            case VAL_APPLE_TALK:
+                return APPLE_TALK;
+            case VAL_APPLE_TALK_ARP:
+                return APPLE_TALK_ARP;
+            case VAL_VLAN_FRAME:
+                return VLAN_FRAME;
+            case VAL_IPX_8137:
+                return IPX_8137;
+            case VAL_IPX_8138:
+                return IPX_8138;
+            case VAL_QNX:
+                return QNX;
+            case VAL_IPv6:
+                return IPv6;
+            case VAL_ETH_FLOW:
+                return ETH_FLOW;
+            case VAL_SLOW_PROTOCOLS:
+                return SLOW_PROTOCOLS;
+            case VAL_COBRANET:
+                return COBRANET;
+            case VAL_MPLS_UNICAST:
+                return MPLS_UNICAST;
+            case VAL_MPLS_MULTICAST:
+                return MPLS_MULTICAST;
+            case VAL_PPPoE_DISCOVERY:
+                return PPPoE_DISCOVERY;
+            case VAL_PPPoE_SESSION:
+                return PPPoE_SESSION;
+            case VAL_JUMBO_FRAMES:
+                return JUMBO_FRAMES;
+            case VAL_HOMEPLUG_10:
+                return HOMEPLUG_10;
+            case VAL_EAP_OVER_LAN:
+                return EAP_OVER_LAN;
+            case VAL_PROFINET:
+                return PROFINET;
+            case VAL_HYPERSCSI:
+                return HYPERSCSI;
+            case VAL_ATA_OVER_ETH:
+                return ATA_OVER_ETH;
+            case VAL_ETHERCAT:
+                return ETHERCAT;
+            case VAL_BRIDGING:
+                return BRIDGING;
+            case VAL_POWERLINK:
+                return POWERLINK;
+            case VAL_LLDP:
+                return LLDP;
+            case VAL_SERCOS:
+                return SERCOS;
+            case VAL_HOMEPLUG_AV:
+                return HOMEPLUG_AV;
+            case VAL_MRP:
+                return MRP;
+            case VAL_MAC_SEC:
+                return MAC_SEC;
+            case VAL_PTP:
+                return PTP;
+            case VAL_CFM:
+                return CFM;
+            case VAL_FCoE:
+                return FCoE;
+            case VAL_FCoE_INIT:
+                return FCoE_INIT;
+            case VAL_RoCE:
+                return RoCE;
+            case VAL_HSR:
+                return HSR;
+            case VAL_CONF_TEST:
+                return CONF_TEST;
+            case VAL_Q_IN_Q:
+                return Q_IN_Q;
+            case VAL_LLT:
+                return LLT;
             default:
                 // TODO: What's here?
                 return new EthType(type);
@@ -229,11 +235,11 @@
     public String toString() {
         return Integer.toHexString(rawValue);
     }
-    
+
     public void write2Bytes(ChannelBuffer c) {
         c.writeShort(this.rawValue);
     }
-    
+
     public static EthType read2Bytes(ChannelBuffer c) {
         return EthType.of(c.readUnsignedShort());
     }
@@ -242,10 +248,10 @@
     public EthType applyMask(EthType mask) {
         return EthType.of(this.rawValue & mask.rawValue);
     }
-    
+
     public int getValue() {
         return rawValue;
     }
 
-    
+
 }
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 46ada58..a6544c9 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
@@ -3,7 +3,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 
 /**
- * 
+ *
  * @author Yotam Harchol (yotam.harchol@bigswitch.com)
  *
  */
@@ -13,7 +13,10 @@
     final static short MAX_CODE = 0xFF;
 
     private final short code;
-    
+
+    private static final short NONE_VAL = 0;
+    public static final ICMPv4Code NONE = new ICMPv4Code(NONE_VAL);
+
     public static final ICMPv4Code NO_MASK = new ICMPv4Code((short)0xFFFF);
     public static final ICMPv4Code FULL_MASK = new ICMPv4Code((short)0x0000);
 
@@ -22,6 +25,9 @@
     }
 
     public static ICMPv4Code of(short code) {
+        if(code == NONE_VAL)
+            return NONE;
+
         if (code > MAX_CODE || code < 0)
             throw new IllegalArgumentException("Illegal ICMPv4 code: " + code);
         return new ICMPv4Code(code);
@@ -31,15 +37,15 @@
     public int getLength() {
         return LENGTH;
     }
-    
+
     public short getCode() {
         return code;
     }
-    
+
     public void writeByte(ChannelBuffer c) {
         c.writeByte(this.code);
     }
-    
+
     public static ICMPv4Code readByte(ChannelBuffer c) {
         return ICMPv4Code.of(c.readUnsignedByte());
     }
@@ -49,5 +55,5 @@
         return ICMPv4Code.of((short)(this.code & mask.code));
     }
 
-    
+
 }
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 00a789b..5190d4e 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
@@ -64,13 +64,16 @@
     public static final ICMPv4Type ICMPV4_TYPE_PHOTURIS = new ICMPv4Type(ICMPV4_TYPE_VAL_PHOTURIS);
     public static final ICMPv4Type ICMPV4_TYPE_EXPERIMENTAL_MOBILITY    = new ICMPv4Type(ICMPV4_TYPE_VAL_EXPERIMENTAL_MOBILITY);
 
+    // HACK alert - we're disapproriating ICMPV4_TYPE_ECHO_REPLY (value 0) as 'none' as well
+    public static final ICMPv4Type NONE   = ICMPV4_TYPE_ECHO_REPLY;
+
     public static final ICMPv4Type NO_MASK = new ICMPv4Type((short)0xFFFF);
     public static final ICMPv4Type FULL_MASK = new ICMPv4Type((short)0x0000);
 
     private final short type;
-    
+
     private static final int MIN_TYPE = 0;
-    private static final int MAX_TYPE = 0xFF;    
+    private static final int MAX_TYPE = 0xFF;
 
     private ICMPv4Type(short type) {
         this.type = type;
@@ -145,15 +148,15 @@
     public int getLength() {
         return LENGTH;
     }
-    
+
     public short getType() {
         return type;
     }
-    
+
     public void writeByte(ChannelBuffer c) {
         c.writeByte(this.type);
     }
-    
+
     public static ICMPv4Type readByte(ChannelBuffer c) {
         return ICMPv4Type.of(c.readUnsignedByte());
     }
@@ -163,5 +166,5 @@
         return ICMPv4Type.of((short)(this.type & mask.type));
     }
 
-    
+
 }
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 ad454eb..5ef301b 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
@@ -13,6 +13,9 @@
     static final int LENGTH = 4;
     private final int rawValue;
 
+    private final static int NONE_VAL = 0x0;
+    public final static IPv4Address NONE = new IPv4Address(NONE_VAL);
+
     public static final IPv4Address NO_MASK = IPv4Address.of(0xFFFFFFFF);
     public static final IPv4Address FULL_MASK = IPv4Address.of(0x00000000);
 
@@ -33,6 +36,8 @@
     }
 
     public static IPv4Address of(final int raw) {
+        if(raw == NONE_VAL)
+            return NONE;
         return new IPv4Address(raw);
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
index a6ec439..45f10d1 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
@@ -1,6 +1,7 @@
 package org.projectfloodlight.openflow.types;
 
 public class IPv4AddressWithMask extends Masked<IPv4Address> {
+    public final static IPv4AddressWithMask NONE = of(IPv4Address.NONE, IPv4Address.NONE);
 
     private IPv4AddressWithMask(int rawValue, int rawMask) {
         super(IPv4Address.of(rawValue), IPv4Address.of(rawMask));
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 001f185..ea71c65 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
@@ -16,6 +16,10 @@
     private final long raw1;
     private final long raw2;
 
+    private final static long NONE_VAL1 = 0x0L;
+    private final static long NONE_VAL2 = 0x0L;
+    public static final IPv6Address NONE = new IPv6Address(NONE_VAL1, NONE_VAL2);
+
     public static final IPv6Address NO_MASK = IPv6Address.of(0xFFFFFFFFFFFFFFFFl, 0xFFFFFFFFFFFFFFFFl);
     public static final IPv6Address FULL_MASK = IPv6Address.of(0x0, 0x0);
 
@@ -123,6 +127,8 @@
     }
 
     public static IPv6Address of(final long raw1, final long raw2) {
+        if(raw1==NONE_VAL1 && raw2 == NONE_VAL2)
+            return NONE;
         return new IPv6Address(raw1, 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 16ff5b1..dcaa0b6 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
@@ -4,33 +4,34 @@
 import java.util.Arrays;
 
 public class IPv6AddressWithMask extends Masked<IPv6Address> {
+    public final static IPv6AddressWithMask NONE = of(IPv6Address.NONE, IPv6Address.NONE);
 
     private IPv6AddressWithMask(IPv6Address value, IPv6Address mask) {
         super(value, mask);
     }
-    
+
     public static IPv6AddressWithMask of(IPv6Address value, IPv6Address mask) {
         return new IPv6AddressWithMask(value, mask);
     }
-    
+
     @Override
     public String toString() {
         StringBuilder res = new StringBuilder();
-        res.append(((IPv6Address)value).toString());
+        res.append(value.toString());
         res.append('/');
-        
-        BigInteger maskint = new BigInteger(((IPv6Address)mask).getBytes());
+
+        BigInteger maskint = new BigInteger(mask.getBytes());
         if (maskint.not().add(BigInteger.ONE).bitCount() == 1) {
             // CIDR notation
             res.append(maskint.bitCount());
         } else {
             // Full address mask
-            res.append(((IPv6Address)mask).toString());
+            res.append(mask.toString());
         }
-        
+
         return res.toString();
     }
-    
+
     public static IPv6AddressWithMask of(final String string) {
         int slashPos;
         String ip = string;
@@ -58,10 +59,10 @@
                 throw new IllegalArgumentException("IPv6 Address not well formed: " + string);
             }
         }
-        
+
         // Read IP
         IPv6Address ipv6 = IPv6Address.of(ip);
-        
+
         if (maskAddress != null) {
             // Full address mask
             return IPv6AddressWithMask.of(ipv6, maskAddress);
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 7feb0d9..7dbf9bb 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
@@ -9,6 +9,9 @@
 
     private final int label;
 
+    private final static int NONE_VAL = 0x0;
+    public static final IPv6FlowLabel NONE = new IPv6FlowLabel(NONE_VAL);
+
     public static final IPv6FlowLabel NO_MASK = IPv6FlowLabel.of(0xFFFFFFFF);
     public static final IPv6FlowLabel FULL_MASK = IPv6FlowLabel.of(0x0);
 
@@ -17,6 +20,8 @@
     }
 
     public static IPv6FlowLabel of(int label) {
+        if(label == NONE_VAL)
+            return NONE;
         return new IPv6FlowLabel(label);
     }
 
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 f311d9d..ec78315 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
@@ -72,6 +72,8 @@
 
     static final int LENGTH = 1;
 
+    public static final IpDscp NONE = DSCP_0;
+
     public static final IpDscp NO_MASK = DSCP_NO_MASK;
     public static final IpDscp FULL_MASK = DSCP_0;
 
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 5ecd251..7e1cdf0 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
@@ -10,6 +10,7 @@
     ECN_11((byte)3),
     ECN_NO_MASK((byte)0xFF);
 
+    public static final IpEcn NONE = ECN_00;
     public static final IpEcn NO_MASK = ECN_NO_MASK;
     public static final IpEcn FULL_MASK = ECN_00;
 
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 e78c97b..36a76a2 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
@@ -4,7 +4,7 @@
 
 /**
  * IP-Protocol field representation
- * 
+ *
  * @author Yotam Harchol (yotam.harchol@bigswitch.com)
  */
 public class IpProtocol implements OFValueType<IpProtocol> {
@@ -298,6 +298,8 @@
     public static final IpProtocol IP_PROTO_HIP = new IpProtocol(IP_PROTO_NUM_HIP);
     public static final IpProtocol IP_PROTO_SHIM6 = new IpProtocol(IP_PROTO_NUM_SHIM6);
 
+    public static final IpProtocol NONE = IP_PROTO_HOPOPT;
+
     public static final IpProtocol NO_MASK = IP_PROTO_HOPOPT;
     public static final IpProtocol FULL_MASK = new IpProtocol((short)0x0000);
 
@@ -627,7 +629,7 @@
     public String toString() {
         return Integer.toHexString(proto);
     }
-    
+
     public void writeByte(ChannelBuffer c) {
         c.writeByte(this.proto);
     }
@@ -644,5 +646,5 @@
     public short getIpProtocolNumber() {
         return proto;
     }
-    
+
 }
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 040d875..cc047ca 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
@@ -14,6 +14,9 @@
     static final int MacAddrLen = 6;
     private final long rawValue;
 
+    private final static long NONE_VAL = 0x0L;
+    public static final MacAddress NONE = new MacAddress(NONE_VAL);
+
     public static final MacAddress NO_MASK = MacAddress.of(0xFFFFFFFFFFFFFFFFl);
     public static final MacAddress FULL_MASK = MacAddress.of(0x0);
 
@@ -30,6 +33,9 @@
     }
 
     public static MacAddress of(final long raw) {
+        if(raw == NONE_VAL)
+            return NONE;
+
         return new MacAddress(raw);
     }
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/Metadata.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/Metadata.java
index 1d0aea7..e4eed77 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/Metadata.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/Metadata.java
@@ -5,6 +5,10 @@
 @Immutable
 public class Metadata {
     static final int LENGTH = 4;
+
+    private final static int NONE_VAL = 0;
+    public final static Metadata NONE = new Metadata(NONE_VAL);
+
     private final int rawValue;
 
     private Metadata(final int rawValue) {
@@ -12,6 +16,9 @@
     }
 
     public static Metadata of(final int raw) {
+        if(raw == NONE_VAL)
+            return NONE;
+
         return new Metadata(raw);
     }
 
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 861d4a8..766ade1 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
@@ -8,6 +8,8 @@
 
     private final U64 u64;
 
+    public static final OFMetadata NONE = OFMetadata.of(U64.ZERO);
+
     public static final OFMetadata NO_MASK = OFMetadata.of(U64.ofRaw(0xFFFFFFFFFFFFFFFFl));
     public static final OFMetadata FULL_MASK = OFMetadata.of(U64.ofRaw(0x0));
 
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPhysicalPort.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPhysicalPort.java
deleted file mode 100644
index ca662f7..0000000
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFPhysicalPort.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.projectfloodlight.openflow.types;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.projectfloodlight.openflow.exceptions.OFParseError;
-import org.projectfloodlight.openflow.protocol.OFMessageReader;
-import org.projectfloodlight.openflow.protocol.Writeable;
-
-/**
- * A wrapper around the OpenFlow physical port description. The interfaces to
- * this object are version agnostic.
- *
- * @author capveg
- */
-
-public class OFPhysicalPort implements OFValueType<OFPhysicalPort>, Writeable {
-
-    static final int LENGTH = 4;
-
-    private final int port;
-
-    public static final OFPhysicalPort NO_MASK = OFPhysicalPort.of(0xFFFFFFFF);
-    public static final OFPhysicalPort FULL_MASK = OFPhysicalPort.of(0x0);
-
-    private OFPhysicalPort(int port) {
-        this.port = port;
-    }
-
-    public static OFPhysicalPort of(int port) {
-        return new OFPhysicalPort(port);
-    }
-
-    @Override
-    public int getLength() {
-        return LENGTH;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof OFPhysicalPort))
-            return false;
-        OFPhysicalPort other = (OFPhysicalPort)obj;
-        if (other.port != this.port)
-            return false;
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 59;
-        int result = 1;
-        result = prime * result + port;
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return Integer.toHexString(port);
-    }
-
-    public void write4Bytes(ChannelBuffer c) {
-        c.writeInt(this.port);
-    }
-
-    @Override
-    public void writeTo(ChannelBuffer bb) {
-        write4Bytes(bb);
-    }
-
-    public static OFPhysicalPort read4Bytes(ChannelBuffer c) throws OFParseError {
-        return OFPhysicalPort.of((int)(c.readUnsignedInt() & 0xFFFFFFFF));
-    }
-
-    @Override
-    public OFPhysicalPort applyMask(OFPhysicalPort mask) {
-        return OFPhysicalPort.of(this.port & mask.port);
-    }
-
-    public int getPortNumber() {
-        return port;
-    }
-
-    public final static Reader READER = new Reader();
-    private static class Reader implements OFMessageReader<OFPhysicalPort> {
-        @Override
-        public OFPhysicalPort readFrom(ChannelBuffer bb) throws OFParseError {
-            return OFPhysicalPort.read4Bytes(bb);
-        }
-
-    }
-}
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 d65d0aa..db7bd5f 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
@@ -17,9 +17,10 @@
 @Immutable
 public class OFPort implements OFValueType<OFPort> {
     static final int LENGTH = 4;
-    
+
     // private int constants (OF1.1+) to avoid duplication in the code
     // should not have to use these outside this class
+    private static final int OFPP_NONE_INT = 0x0;
     private static final int OFPP_ANY_INT = 0xFFffFFff;
     private static final int OFPP_LOCAL_INT = 0xFFffFFfe;
     private static final int OFPP_CONTROLLER_INT = 0xFFffFFfd;
@@ -86,9 +87,12 @@
      */
     public final static OFPort ANY = new NamedPort(OFPP_ANY_INT, "any");
 
+    /** port number 0, read of the wire, e.g, if not set */
+    public final static OFPort NONE = new NamedPort(OFPP_NONE_INT, "none");
+
     public static final OFPort NO_MASK = OFPort.of(0xFFFFFFFF);
     public static final OFPort FULL_MASK = OFPort.of(0x0);
-    
+
     /** cache of frequently used ports */
     private static class PrecachedPort {
         private final static OFPort p1 = new OFPort(1);
@@ -158,6 +162,8 @@
      */
     public static OFPort ofInt(final int portNumber) {
         switch (portNumber) {
+            case 0:
+                return NONE;
             case 1:
                 return PrecachedPort.p1;
             case 2:
@@ -300,6 +306,8 @@
      */
     public static OFPort ofShort(final short portNumber) {
         switch (portNumber) {
+            case 0:
+                return NONE;
             case 1:
                 return PrecachedPort.p1;
             case 2:
@@ -499,7 +507,7 @@
     public int getLength() {
         return LENGTH;
     }
-    
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof OFPort))
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 4cf5b90..6efd813 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
@@ -14,6 +14,9 @@
     static final int MAX_PORT = 0xFFFF;
     static final int MIN_PORT = 0;
 
+    private final static int NONE_VAL = 0;
+    public final static TransportPort NONE = new TransportPort(NONE_VAL);
+
     public static final TransportPort NO_MASK = new TransportPort(0xFFFFFFFF);
     public static final TransportPort FULL_MASK = TransportPort.of(0x0);
 
@@ -24,7 +27,9 @@
     }
 
     public static TransportPort of(int port) {
-        if (port < MIN_PORT || port > MAX_PORT) {
+        if(port == NONE_VAL)
+            return NONE;
+        else if (port < MIN_PORT || port > MAX_PORT) {
             throw new IllegalArgumentException("Illegal transport layer port number: " + port);
         }
         return new TransportPort(port);
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 55a467e..43bec7a 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
@@ -23,6 +23,9 @@
 import org.projectfloodlight.openflow.protocol.Writeable;
 
 public class U16 implements Writeable, OFValueType<U16> {
+    private final static short ZERO_VAL = 0;
+    public final static U16 ZERO = new U16(ZERO_VAL);
+
     public static int f(final short i) {
         return i & 0xffff;
     }
@@ -38,11 +41,13 @@
     }
 
     public static final U16 of(int value) {
-        return new U16(t(value));
+        return ofRaw(t(value));
     }
 
-    public static final U16 ofRaw(short value) {
-        return new U16(value);
+    public static final U16 ofRaw(short raw) {
+        if(raw == ZERO_VAL)
+            return ZERO;
+        return new U16(raw);
     }
 
     public int getValue() {
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 2634ed1..f56a528 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
@@ -23,6 +23,9 @@
 import org.projectfloodlight.openflow.protocol.Writeable;
 
 public class U32 implements Writeable, OFValueType<U32> {
+    private final static int ZERO_VAL = 0;
+    public final static U32 ZERO = new U32(ZERO_VAL);
+
     private final int raw;
 
     private U32(int raw) {
@@ -30,11 +33,13 @@
     }
 
     public static U32 of(long value) {
-        return new U32(U32.t(value));
+        return ofRaw(U32.t(value));
     }
 
-    public static U32 ofRaw(int value) {
-        return new U32(value);
+    public static U32 ofRaw(int raw) {
+        if(raw == ZERO_VAL)
+            return ZERO;
+        return new U32(raw);
     }
 
     public long getValue() {
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 5de62dc..3b89e24 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
@@ -24,6 +24,8 @@
 
 public class U64 implements Writeable, OFValueType<U64> {
     private static final long UNSIGNED_MASK = 0x7fffffffffffffffL;
+    private final static long ZERO_VAL = 0;
+    public final static U64 ZERO = new U64(ZERO_VAL);
 
     private final long raw;
 
@@ -36,6 +38,8 @@
     }
 
     public static U64 ofRaw(final long raw) {
+        if(raw == ZERO_VAL)
+            return ZERO;
         return new U64(raw);
     }
 
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 41e740e..f85bfae 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
@@ -23,6 +23,9 @@
 import org.projectfloodlight.openflow.protocol.Writeable;
 
 public class U8 implements Writeable, OFValueType<U8> {
+    private final static byte ZERO_VAL = 0;
+    public final static U8 ZERO = new U8(ZERO_VAL);
+
     private final byte raw;
 
     private U8(byte raw) {
@@ -30,6 +33,9 @@
     }
 
     public static final U8 of(short value) {
+        if(value == ZERO_VAL)
+            return ZERO;
+
         return new U8(t(value));
     }
 
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 f6993fe..7d15fb7 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
@@ -6,10 +6,12 @@
 public class VlanPcp implements OFValueType<VlanPcp> {
 
     private static final byte VALIDATION_MASK = 0x07;
+    private static final byte NONE_VAL = 0x00;
     static final int LENGTH = 1;
 
     private final byte pcp;
 
+    public static final VlanPcp NONE = new VlanPcp(NONE_VAL);
     public static final VlanPcp NO_MASK = new VlanPcp((byte)0xFF);
     public static final VlanPcp FULL_MASK = VlanPcp.of((byte)0x0);
 
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 63b8831..5c23779 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
@@ -6,8 +6,10 @@
 public class VlanVid implements OFValueType<VlanVid> {
 
     private static final short VALIDATION_MASK = 0x0FFF;
+    private static final short NONE_VAL = 0x0000;
     final static int LENGTH = 2;
 
+    public static final VlanVid NONE = new VlanVid(NONE_VAL);
     public static final VlanVid NO_MASK = new VlanVid((short)0xFFFF);
     public static final VlanVid FULL_MASK = VlanVid.of((short)0x0);
 
@@ -18,7 +20,9 @@
     }
 
     public static VlanVid of(short vid) {
-        if ((vid & VALIDATION_MASK) != vid)
+        if(vid == NONE_VAL)
+            return NONE;
+        else if ((vid & VALIDATION_MASK) != vid)
             throw new IllegalArgumentException("Illegal VLAN VID value: " + vid);
         return new VlanVid(vid);
     }
diff --git a/java_gen/pre-written/src/test/java/org/projectfloodlight/test/TestUtils.java b/java_gen/pre-written/src/test/java/org/projectfloodlight/test/TestUtils.java
new file mode 100644
index 0000000..7a5b8b0
--- /dev/null
+++ b/java_gen/pre-written/src/test/java/org/projectfloodlight/test/TestUtils.java
@@ -0,0 +1,62 @@
+package org.projectfloodlight.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Bytes;
+
+public class TestUtils {
+     private TestUtils() {}
+
+     private static final int PER_LINE = 8;
+
+     public static void betterAssertArrayEquals(byte[] expected, byte[] got) {
+         int maxlen = Math.max(expected.length, got.length);
+
+         List<String> expectedList = formatHex(Bytes.asList(expected));
+         List<String> gotList = formatHex(Bytes.asList(got));
+
+         boolean fail = false;
+         for (int i = 0; i < maxlen;i+= PER_LINE) {
+             int maxThisLine = Math.min(maxlen, PER_LINE);
+             boolean print = false;
+
+             ArrayList<String> changeMarkers = new ArrayList<String>();
+
+             for (int j = i; j < maxThisLine; j++) {
+                 if (j >= expected.length || j >= got.length  || expected[j] != got[j]) {
+                     print = true;
+                     fail = true;
+                     changeMarkers.add("==");
+                     break;
+                 } else {
+                     changeMarkers.add("  ");
+                 }
+             }
+             if(print) {
+                System.out.println(String.format("%4x: %s", i, Joiner.on(" ").join(expectedList.subList(i, Math.min(expectedList.size(), i+PER_LINE)))));
+                System.out.println(String.format("%4x: %s", i, Joiner.on(" ").join(gotList.subList(i, Math.min(gotList.size(), i+PER_LINE)))));
+                System.out.println(String.format("%4s  %s", "", Joiner.on(" ").join(changeMarkers)));
+                System.out.println("\n");
+             }
+         }
+         if(fail) {
+             Assert.fail("Array comparison failed");
+         }
+
+     }
+
+     private static List<String> formatHex(List<Byte> b) {
+         return Lists.transform(b, new Function<Byte, String>() {
+             @Override
+             public String apply(Byte input) {
+                 return String.format("%02x", input);
+             }
+         });
+     }
+}
\ No newline at end of file
diff --git a/java_gen/templates/_imports.java b/java_gen/templates/_imports.java
index 2d93b22..7fd0719 100644
--- a/java_gen/templates/_imports.java
+++ b/java_gen/templates/_imports.java
@@ -17,3 +17,4 @@
 import org.jboss.netty.buffer.ChannelBuffers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Builder.java b/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
index 6570df8..769a687 100644
--- a/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Builder.java
@@ -1,71 +1,459 @@
+        @SuppressWarnings("unchecked")
+        @Override
+        public <F extends OFValueType<F>> F get(MatchField<F> field)
+                throws UnsupportedOperationException {
+            if (isFullyWildcarded(field))
+                return null;
 
-    @Override
-    public <F extends OFValueType<F>> F get(MatchField<F> field)
-            throws UnsupportedOperationException {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
+            Object result;
+            switch (field.id) {
+                case IN_PORT:
+                    result = inPort;
+                    break;
+                case ETH_DST:
+                    result = ethDst;
+                    break;
+                case ETH_SRC:
+                    result = ethSrc;
+                    break;
+                case ETH_TYPE:
+                    result = ethType;
+                    break;
+                case VLAN_VID:
+                    result = vlanVid;
+                    break;
+                case VLAN_PCP:
+                    result = vlanPcp;
+                    break;
+                case IP_DSCP:
+                    result = ipDscp;
+                    break;
+                case IP_PROTO:
+                    result = ipProto;
+                    break;
+                case IPV4_SRC:
+                    result = ipv4Dst;
+                    break;
+                case IPV4_DST:
+                    result = ipv4Dst;
+                    break;
+                case TCP_SRC:
+                    result = ipv4Src;
+                    break;
+                case TCP_DST:
+                    result = tcpDst;
+                    break;
+                case UDP_SRC:
+                    result = tcpSrc;
+                    break;
+                case UDP_DST:
+                    result = tcpDst;
+                    break;
+                case SCTP_SRC:
+                    result = tcpSrc;
+                    break;
+                case SCTP_DST:
+                    result = tcpDst;
+                    break;
+                case ICMPV4_TYPE:
+                    result = tcpSrc;
+                    break;
+                case ICMPV4_CODE:
+                    result = tcpDst;
+                    break;
+                // NOT SUPPORTED:
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+            }
+            return (F)result;
+        }
 
-    @Override
-    public <F extends OFValueType<F>> Masked<F> getMasked(MatchField<F> field)
-            throws UnsupportedOperationException {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
+        @SuppressWarnings("unchecked")
+        @Override
+        public <F extends OFValueType<F>> Masked<F> getMasked(MatchField<F> field)
+                throws UnsupportedOperationException {
+            if (!isPartiallyMasked(field))
+                return null;
+            Object result;
+            switch (field.id) {
+                case IPV4_SRC:
+                    int srcBitMask = (-1) << (32 - getIpv4SrcCidrMaskLen());
+                    result = IPv4AddressWithMask.of(ipv4Src, IPv4Address.of(srcBitMask));
+                    break;
+                case IPV4_DST:
+                    int dstMaskedBits = Math.min(32, (wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT);
+                    int dstBitMask = (-1) << (32 - getIpv4DstCidrMaskLen());
 
-    @Override
-    public boolean supports(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
-    }
+                    result = IPv4AddressWithMask.of(ipv4Dst, IPv4Address.of(dstBitMask));
+                    break;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support masked matching on field " + field.getName());
+            }
+            return (Masked<F>)result;
+        }
 
-    @Override
-    public boolean supportsMasked(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
-    }
+        @Override
+        public boolean supports(MatchField<?> field) {
+            switch (field.id) {
+                case IN_PORT:
+                case ETH_DST:
+                case ETH_SRC:
+                case ETH_TYPE:
+                case VLAN_VID:
+                case VLAN_PCP:
+                case IP_DSCP:
+                case IP_PROTO:
+                case IPV4_SRC:
+                case IPV4_DST:
+                case TCP_SRC:
+                case TCP_DST:
+                case UDP_SRC:
+                case UDP_DST:
+                case SCTP_SRC:
+                case SCTP_DST:
+                case ICMPV4_TYPE:
+                case ICMPV4_CODE:
+                    return true;
+                default:
+                    return false;
+            }
+        }
 
-    @Override
-    public boolean isExact(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
-    }
+        @Override
+        public boolean supportsMasked(MatchField<?> field) {
+            switch (field.id) {
+                case IPV4_SRC:
+                case IPV4_DST:
+                    return true;
+                default:
+                    return false;
+            }
+        }
 
-    @Override
-    public boolean isFullyWildcarded(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
-    }
+        @Override
+        public boolean isExact(MatchField<?> field) {
+            switch (field.id) {
+                case IN_PORT:
+                    return (this.wildcards & OFPFW_IN_PORT) == 0;
+                case ETH_DST:
+                    return (this.wildcards & OFPFW_DL_DST) == 0;
+                case ETH_SRC:
+                    return (this.wildcards & OFPFW_DL_SRC) == 0;
+                case ETH_TYPE:
+                    return (this.wildcards & OFPFW_DL_TYPE) == 0;
+                case VLAN_VID:
+                    return (this.wildcards & OFPFW_DL_VLAN) == 0;
+                case VLAN_PCP:
+                    return (this.wildcards & OFPFW_DL_VLAN_PCP) == 0;
+                case IP_DSCP:
+                    return (this.wildcards & OFPFW_NW_TOS) == 0;
+                case IP_PROTO:
+                    return (this.wildcards & OFPFW_NW_PROTO) == 0;
+                case IPV4_SRC:
+                    return this.getIpv4SrcCidrMaskLen() >= 32;
+                case IPV4_DST:
+                    return this.getIpv4DstCidrMaskLen() >= 32;
+                case TCP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) == 0;
+                case TCP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) == 0;
+                case UDP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) == 0;
+                case UDP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) == 0;
+                case SCTP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) == 0;
+                case SCTP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) == 0;
+                case ICMPV4_TYPE:
+                    return (this.wildcards & OFPFW_TP_SRC) == 0;
+                case ICMPV4_CODE:
+                    return (this.wildcards & OFPFW_TP_DST) == 0;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+            }
+        }
 
-    @Override
-    public boolean isPartiallyMasked(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
-    }
+        /**
+         * Parse this match's wildcard fields and return the number of significant
+         * bits in the IP destination field. NOTE: this returns the number of bits
+         * that are fixed, i.e., like CIDR, not the number of bits that are free
+         * like OpenFlow encodes.
+         *
+         * @return A number between 0 (matches all IPs) and 32 (exact match)
+         */
+        public int getIpv4DstCidrMaskLen() {
+            return Math.max(32 - ((wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT),
+                            0);
+        }
 
-    @Override
-    public <F extends OFValueType<F>> Match.Builder setExact(
-            MatchField<F> field, F value) {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
+        /**
+         * Parse this match's wildcard fields and return the number of significant
+         * bits in the IP destination field. NOTE: this returns the number of bits
+         * that are fixed, i.e., like CIDR, not the number of bits that are free
+         * like OpenFlow encodes.
+         *
+         * @return A number between 0 (matches all IPs) and 32 (exact match)
+         */
+        public int getIpv4SrcCidrMaskLen() {
+            return Math.max(32 - ((wildcards & OFPFW_NW_SRC_MASK) >> OFPFW_NW_SRC_SHIFT),
+                            0);
+        }
 
-    @Override
-    public <F extends OFValueType<F>> Match.Builder setMasked(
-            MatchField<F> field, F value, F mask) {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
 
-    @Override
-    public <F extends OFValueType<F>> Match.Builder setMasked(
-            MatchField<F> field, Masked<F> valueWithMask) {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
+        @Override
+        public boolean isFullyWildcarded(MatchField<?> field) {
+            switch (field.id) {
+                case IN_PORT:
+                    return (this.wildcards & OFPFW_IN_PORT) != 0;
+                case ETH_DST:
+                    return (this.wildcards & OFPFW_DL_DST) != 0;
+                case ETH_SRC:
+                    return (this.wildcards & OFPFW_DL_SRC) != 0;
+                case ETH_TYPE:
+                    return (this.wildcards & OFPFW_DL_TYPE) != 0;
+                case VLAN_VID:
+                    return (this.wildcards & OFPFW_DL_VLAN) != 0;
+                case VLAN_PCP:
+                    return (this.wildcards & OFPFW_DL_VLAN_PCP) != 0;
+                case IP_DSCP:
+                    return (this.wildcards & OFPFW_NW_TOS) != 0;
+                case IP_PROTO:
+                    return (this.wildcards & OFPFW_NW_PROTO) != 0;
+                case TCP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) != 0;
+                case TCP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) != 0;
+                case UDP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) != 0;
+                case UDP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) != 0;
+                case SCTP_SRC:
+                    return (this.wildcards & OFPFW_TP_SRC) != 0;
+                case SCTP_DST:
+                    return (this.wildcards & OFPFW_TP_DST) != 0;
+                case ICMPV4_TYPE:
+                    return (this.wildcards & OFPFW_TP_SRC) != 0;
+                case ICMPV4_CODE:
+                    return (this.wildcards & OFPFW_TP_DST) != 0;
+                case IPV4_SRC:
+                    return this.getIpv4SrcCidrMaskLen() <= 0;
+                case IPV4_DST:
+                    return this.getIpv4DstCidrMaskLen() <= 0;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+            }
+        }
 
-    @Override
-    public <F extends OFValueType<F>> Match.Builder wildcard(MatchField<F> field) {
-        // FIXME yotam - please replace with real implementation
-        return null;
-    }
+        @Override
+        public boolean isPartiallyMasked(MatchField<?> field) {
+            switch (field.id) {
+                case IPV4_SRC:
+                    int srcCidrLen = getIpv4SrcCidrMaskLen();
+                    return srcCidrLen > 0 && srcCidrLen < 32;
+                case IPV4_DST:
+                    int dstCidrLen = getIpv4SrcCidrMaskLen();
+                    return dstCidrLen > 0 && dstCidrLen < 32;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support masked matching on field " + field.getName());
+            }
+        }
+
+        private final void initWildcards() {
+            if(!wildcardsSet) {
+            //:: if has_parent:
+                wildcards = parentMessage.wildcards;
+            //:: else:
+                wildcards = OFPFW_ALL;
+            //:: #endif
+                wildcardsSet = true;
+            }
+        }
+
+        @Override
+        public <F extends OFValueType<F>> Match.Builder setExact(MatchField<F> field,
+                F value) {
+            initWildcards();
+            Object val = value;
+            switch (field.id) {
+                case ETH_DST:
+                    setEthDst((MacAddress) value);
+                    wildcards &= ~OFPFW_DL_DST;
+                    break;
+                case ETH_SRC:
+                    setEthSrc((MacAddress) value);
+                    wildcards &= ~OFPFW_DL_SRC;
+                    break;
+                case ETH_TYPE:
+                    setEthType((EthType) value);
+                    wildcards &= ~OFPFW_DL_TYPE;
+                    break;
+                case ICMPV4_CODE:
+                    setTcpDst((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_DST;
+                    break;
+                case ICMPV4_TYPE:
+                    setTcpSrc((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_SRC;
+                    break;
+                case IN_PORT:
+                    setInPort((OFPort) value);
+                    wildcards &= ~OFPFW_IN_PORT;
+                    break;
+                case IPV4_DST:
+                    setIpv4Dst((IPv4Address) value);
+                    wildcards &= ~OFPFW_NW_DST_MASK;
+                    break;
+                case IPV4_SRC:
+                    setIpv4Src((IPv4Address) value);
+                    wildcards &= ~OFPFW_NW_SRC_MASK;
+                    break;
+                case IP_DSCP:
+                    setIpDscp((IpDscp) value);
+                    wildcards &= ~OFPFW_NW_TOS;
+                    break;
+                case IP_PROTO:
+                    setIpProto((IpProtocol) value);
+                    wildcards &= ~OFPFW_NW_PROTO;
+                    break;
+                case SCTP_DST:
+                    setTcpDst((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_DST;
+                    break;
+                case SCTP_SRC:
+                    setTcpSrc((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_SRC;
+                    break;
+                case TCP_DST:
+                    setTcpDst((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_DST;
+                    break;
+                case TCP_SRC:
+                    setTcpSrc((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_SRC;
+                    break;
+                case UDP_DST:
+                    setTcpDst((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_DST;
+                    break;
+                case UDP_SRC:
+                    setTcpSrc((TransportPort) value);
+                    wildcards &= ~OFPFW_TP_SRC;
+                    break;
+                case VLAN_PCP:
+                    setVlanPcp((VlanPcp) value);
+                    wildcards &= ~OFPFW_DL_VLAN_PCP;
+                    break;
+                case VLAN_VID:
+                    setVlanVid((VlanVid) value);
+                    wildcards &= ~OFPFW_DL_VLAN;
+                default:
+                    throw new UnsupportedOperationException(
+                            "OFMatch does not support matching on field " + field.getName());
+            }
+            return this;
+        }
+
+        @Override
+        public <F extends OFValueType<F>> Match.Builder setMasked(MatchField<F> field,
+                F value, F mask) {
+            initWildcards();
+            switch (field.id) {
+                case IPV4_DST:
+                case IPV4_SRC:
+                    Object valObj = value;
+                    Object masObj = mask;
+                    IPv4Address ip = ((IPv4Address)valObj);
+                    int maskval = ((IPv4Address)masObj).getInt();
+                    if (Integer.bitCount(~maskval + 1) != 1)
+                        throw new UnsupportedOperationException("OFMatch only supports CIDR masks for IPv4");
+                    int maskLen = 32 - Integer.bitCount(maskval);
+                    switch(field.id) {
+                        case IPV4_DST:
+                            setIpv4Dst(ip);
+                            wildcards = (wildcards &~OFPFW_NW_DST_MASK) | (maskLen << OFPFW_NW_DST_SHIFT);
+                            break;
+                        case IPV4_SRC:
+                            setIpv4Src(ip);
+                            wildcards = (wildcards &~OFPFW_NW_SRC_MASK) | (maskLen << OFPFW_NW_SRC_SHIFT);
+                            break;
+                        default:
+                            // Cannot really get here
+                            break;
+                    }
+                    break;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support masked matching on field " + field.getName());
+            }
+            return this;
+        }
+
+        @Override
+        public <F extends OFValueType<F>> Match.Builder setMasked(MatchField<F> field, Masked<F> valueWithMask)
+                                                                       throws UnsupportedOperationException {
+            return this.setMasked(field, valueWithMask.getValue(), valueWithMask.getMask());
+        }
+
+        @Override
+        public <F extends OFValueType<F>> Match.Builder wildcard(MatchField<F> field) {
+            initWildcards();
+            switch (field.id) {
+                case ETH_DST:
+                    setEthDst(MacAddress.NONE);
+                    wildcards |= OFPFW_DL_DST;
+                    break;
+                case ETH_SRC:
+                    setEthSrc(MacAddress.NONE);
+                    wildcards |= OFPFW_DL_SRC;
+                    break;
+                case ETH_TYPE:
+                    setEthType(EthType.NONE);
+                    wildcards |= OFPFW_DL_TYPE;
+                    break;
+                case ICMPV4_CODE:
+                case TCP_DST:
+                case UDP_DST:
+                case SCTP_DST:
+                    setTcpDst(TransportPort.NONE);
+                    wildcards |= OFPFW_TP_DST;
+                    break;
+                case ICMPV4_TYPE:
+                case TCP_SRC:
+                case UDP_SRC:
+                case SCTP_SRC:
+                    setTcpSrc(TransportPort.NONE);
+                    wildcards |= OFPFW_TP_SRC;
+                    break;
+                case IN_PORT:
+                    setInPort(OFPort.NONE);
+                    wildcards |= OFPFW_IN_PORT;
+                    break;
+                case IPV4_DST:
+                    setIpv4Dst(IPv4Address.NONE);
+                    wildcards |= OFPFW_NW_DST_MASK;
+                    break;
+                case IPV4_SRC:
+                    setIpv4Src(IPv4Address.NONE);
+                    wildcards |= OFPFW_NW_SRC_MASK;
+                    break;
+                case IP_DSCP:
+                    setIpDscp(IpDscp.NONE);
+                    wildcards |= OFPFW_NW_TOS;
+                    break;
+                case IP_PROTO:
+                    setIpProto(IpProtocol.NONE);
+                    wildcards |= OFPFW_NW_PROTO;
+                    break;
+                case VLAN_PCP:
+                    setVlanPcp(VlanPcp.NONE);
+                    wildcards |= OFPFW_DL_VLAN_PCP;
+                    break;
+                case VLAN_VID:
+                    setVlanVid(VlanVid.NONE);
+                    wildcards |= OFPFW_DL_VLAN;
+                    break;
+                default:
+                    throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+            }
+            return this;
+        }
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_clear_wildcards_stanza.java b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_clear_wildcards_stanza.java
new file mode 100644
index 0000000..56b5662
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_clear_wildcards_stanza.java
@@ -0,0 +1,53 @@
+            // normalize wildcard fields to mimic old OpenVSwitch behavior. When prerequisites for a field were not met
+            // e.g., eth_type is not set to 0x800, old OVS would set the value of the corresponding ignored fields (e.g.,
+            // ip_src, tcp_dst) to 0, AND ALSO SET THE WILDCARD to 0. It doesn't do that any more as of 1.1.2 and 1.4
+            if(ethType.equals(EthType.IPv4)) {
+                // IP
+                if(ipProto.equals(IpProtocol.IP_PROTO_TCP) || ipProto.equals(IpProtocol.IP_PROTO_UDP) || ipProto.equals(IpProtocol.IP_PROTO_ICMP)) {
+                    // fully speced, wildcards and all values are fine
+                    // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                        wildcards |= OFPFW_NW_SRC_MASK;
+
+                    // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                        wildcards |= OFPFW_NW_DST_MASK;
+
+                } else {
+                    // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                        wildcards |= OFPFW_NW_SRC_MASK;
+
+                    // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                        wildcards |= OFPFW_NW_DST_MASK;
+
+                    // not TCP/UDP/ICMP -> Clear TP wildcards for the wire
+                    wildcards &= ~(OFPFW_TP_SRC | OFPFW_TP_DST);
+                    tcpSrc = TransportPort.NONE;
+                    tcpDst = TransportPort.NONE;
+                }
+            } else if (ethType.equals(EthType.ARP)) {
+                // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                    wildcards |= OFPFW_NW_SRC_MASK;
+
+                // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                    wildcards |= OFPFW_NW_DST_MASK;
+
+                // ARP: clear NW_TOS / TP wildcards for the wire
+                wildcards &= ~( OFPFW_NW_TOS | OFPFW_TP_SRC | OFPFW_TP_DST);
+                ipDscp = IpDscp.NONE;
+                tcpSrc = TransportPort.NONE;
+                tcpDst = TransportPort.NONE;
+            } else {
+                // not even IP. Clear NW/TP wildcards for the wire
+                wildcards &= ~( OFPFW_NW_TOS | OFPFW_NW_PROTO | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK | OFPFW_TP_SRC | OFPFW_TP_DST);
+                ipDscp = IpDscp.NONE;
+                ipProto = IpProtocol.NONE;
+                ipv4Src = IPv4Address.NONE;
+                ipv4Dst = IPv4Address.NONE;
+                tcpSrc = TransportPort.NONE;
+                tcpDst = TransportPort.NONE;
+            }
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_set_wildcards_stanza.java b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_set_wildcards_stanza.java
new file mode 100644
index 0000000..3545f55
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_set_wildcards_stanza.java
@@ -0,0 +1,53 @@
+            // normalize match fields according to current OpenVSwitch behavior. When prerequisites for a field are not met
+            // e.g., eth_type is not set to 0x800, OVS sets the value of corresponding ignored fields (e.g.,
+            // ip_src, tcp_dst) to 0, and sets the wildcard bit to 1.
+            if(ethType.equals(EthType.IPv4)) {
+                // IP
+                if(ipProto.equals(IpProtocol.IP_PROTO_TCP) || ipProto.equals(IpProtocol.IP_PROTO_UDP) || ipProto.equals(IpProtocol.IP_PROTO_ICMP)) {
+                    // fully speced, wildcards and all values are fine
+                    // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                        wildcards |= OFPFW_NW_SRC_MASK;
+
+                    // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                        wildcards |= OFPFW_NW_DST_MASK;
+
+                } else {
+                    // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                        wildcards |= OFPFW_NW_SRC_MASK;
+
+                    // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                    if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                        wildcards |= OFPFW_NW_DST_MASK;
+
+                    // not TCP/UDP/ICMP -> Clear TP wildcards for the wire
+                    wildcards |= (OFPFW_TP_SRC | OFPFW_TP_DST);
+                    tcpSrc = TransportPort.NONE;
+                    tcpDst = TransportPort.NONE;
+                }
+            } else if (ethType.equals(EthType.ARP)) {
+                // normalize 32-63 ipv4 src 'mask' to a full bitmask
+                if((wildcards & OFPFW_NW_SRC_ALL) != 0)
+                    wildcards |= OFPFW_NW_SRC_MASK;
+
+                // normalize 32-63 ipv4 dst 'mask' to a full bitmask
+                if((wildcards & OFPFW_NW_DST_ALL) != 0)
+                    wildcards |= OFPFW_NW_DST_MASK;
+
+                // ARP: clear NW_TOS / TP wildcards for the wire
+                wildcards |= ( OFPFW_NW_TOS | OFPFW_TP_SRC | OFPFW_TP_DST);
+                ipDscp = IpDscp.NONE;
+                tcpSrc = TransportPort.NONE;
+                tcpDst = TransportPort.NONE;
+            } else {
+                // not even IP. Clear NW/TP wildcards for the wire
+                wildcards |= ( OFPFW_NW_TOS | OFPFW_NW_PROTO | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK | OFPFW_TP_SRC | OFPFW_TP_DST);
+                ipDscp = IpDscp.NONE;
+                ipProto = IpProtocol.NONE;
+                ipv4Src = IPv4Address.NONE;
+                ipv4Dst = IPv4Address.NONE;
+                tcpSrc = TransportPort.NONE;
+                tcpDst = TransportPort.NONE;
+            }
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_stanza.java b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_stanza.java
new file mode 100644
index 0000000..3050563
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Builder_normalize_stanza.java
@@ -0,0 +1 @@
+//:: include("custom/%s.Builder_normalize_set_wildcards_stanza.java" % msg.name, msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.Reader_normalize_stanza.java b/java_gen/templates/custom/OFMatchV1Ver10.Reader_normalize_stanza.java
new file mode 100644
index 0000000..1de18df
--- /dev/null
+++ b/java_gen/templates/custom/OFMatchV1Ver10.Reader_normalize_stanza.java
@@ -0,0 +1 @@
+//:: include("custom/%s.Builder_normalize_stanza.java" % msg.name, msg=msg, has_parent=False)
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.java b/java_gen/templates/custom/OFMatchV1Ver10.java
index ec7bfcc..7b1f110 100644
--- a/java_gen/templates/custom/OFMatchV1Ver10.java
+++ b/java_gen/templates/custom/OFMatchV1Ver10.java
@@ -1,44 +1,307 @@
+    final public static int OFPFW_ALL = ((1 << 22) - 1);
 
+    final public static int OFPFW_IN_PORT = 1 << 0; /* Switch input port. */
+    final public static int OFPFW_DL_VLAN = 1 << 1; /* VLAN id. */
+    final public static int OFPFW_DL_SRC = 1 << 2; /* Ethernet source address. */
+    final public static int OFPFW_DL_DST = 1 << 3; /*
+                                                    * Ethernet destination
+                                                    * address.
+                                                    */
+    final public static int OFPFW_DL_TYPE = 1 << 4; /* Ethernet frame type. */
+    final public static int OFPFW_NW_PROTO = 1 << 5; /* IP protocol. */
+    final public static int OFPFW_TP_SRC = 1 << 6; /* TCP/UDP source port. */
+    final public static int OFPFW_TP_DST = 1 << 7; /* TCP/UDP destination port. */
+
+    /*
+     * IP source address wildcard bit count. 0 is exact match, 1 ignores the
+     * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard
+     * the entire field. This is the *opposite* of the usual convention where
+     * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded.
+     */
+    final public static int OFPFW_NW_SRC_SHIFT = 8;
+    final public static int OFPFW_NW_SRC_BITS = 6;
+    final public static int OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT;
+    final public static int OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT;
+
+    /* IP destination address wildcard bit count. Same format as source. */
+    final public static int OFPFW_NW_DST_SHIFT = 14;
+    final public static int OFPFW_NW_DST_BITS = 6;
+    final public static int OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT;
+    final public static int OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT;
+
+    final public static int OFPFW_DL_VLAN_PCP = 1 << 20; /* VLAN priority. */
+    final public static int OFPFW_NW_TOS = 1 << 21; /* IP ToS (DSCP field, 6bits) */
+
+    @SuppressWarnings("unchecked")
     @Override
     public <F extends OFValueType<F>> F get(MatchField<F> field)
             throws UnsupportedOperationException {
-        // FIXME yotam - please replace with real implementation
-        return null;
+        if (isFullyWildcarded(field))
+            return null;
+        if (!field.arePrerequisitesOK(this))
+            return null;
+
+        Object result;
+        switch (field.id) {
+            case IN_PORT:
+                result = inPort;
+                break;
+            case ETH_DST:
+                result = ethDst;
+                break;
+            case ETH_SRC:
+                result = ethSrc;
+                break;
+            case ETH_TYPE:
+                result = ethType;
+                break;
+            case VLAN_VID:
+                result = vlanVid;
+                break;
+            case VLAN_PCP:
+                result = vlanPcp;
+                break;
+            case IP_DSCP:
+                result = ipDscp;
+                break;
+            case IP_PROTO:
+                result = ipProto;
+                break;
+            case IPV4_SRC:
+                result = ipv4Dst;
+                break;
+            case IPV4_DST:
+                result = ipv4Dst;
+                break;
+            case TCP_SRC:
+                result = ipv4Src;
+                break;
+            case TCP_DST:
+                result = tcpDst;
+                break;
+            case UDP_SRC:
+                result = tcpSrc;
+                break;
+            case UDP_DST:
+                result = tcpDst;
+                break;
+            case SCTP_SRC:
+                result = tcpSrc;
+                break;
+            case SCTP_DST:
+                result = tcpDst;
+                break;
+            case ICMPV4_TYPE:
+                result = tcpSrc;
+                break;
+            case ICMPV4_CODE:
+                result = tcpDst;
+                break;
+            // NOT SUPPORTED:
+            default:
+                throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+        }
+        return (F)result;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <F extends OFValueType<F>> Masked<F> getMasked(MatchField<F> field)
             throws UnsupportedOperationException {
-        // FIXME yotam - please replace with real implementation
-        return null;
+        if (!isPartiallyMasked(field))
+            return null;
+        if (!field.arePrerequisitesOK(this))
+            return null;
+        Object result;
+        switch (field.id) {
+            case IPV4_SRC:
+                int srcBitMask = (-1) << (32 - getIpv4SrcCidrMaskLen());
+                result = IPv4AddressWithMask.of(ipv4Src, IPv4Address.of(srcBitMask));
+                break;
+            case IPV4_DST:
+                int dstMaskedBits = Math.min(32, (wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT);
+                int dstBitMask = (-1) << (32 - getIpv4DstCidrMaskLen());
+
+                result = IPv4AddressWithMask.of(ipv4Dst, IPv4Address.of(dstBitMask));
+                break;
+            default:
+                throw new UnsupportedOperationException("OFMatch does not support masked matching on field " + field.getName());
+        }
+        return (Masked<F>)result;
     }
 
     @Override
     public boolean supports(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
+        switch (field.id) {
+            case IN_PORT:
+            case ETH_DST:
+            case ETH_SRC:
+            case ETH_TYPE:
+            case VLAN_VID:
+            case VLAN_PCP:
+            case IP_DSCP:
+            case IP_PROTO:
+            case IPV4_SRC:
+            case IPV4_DST:
+            case TCP_SRC:
+            case TCP_DST:
+            case UDP_SRC:
+            case UDP_DST:
+            case SCTP_SRC:
+            case SCTP_DST:
+            case ICMPV4_TYPE:
+            case ICMPV4_CODE:
+                return true;
+            default:
+                return false;
+        }
     }
 
     @Override
     public boolean supportsMasked(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
+        switch (field.id) {
+            case IPV4_SRC:
+            case IPV4_DST:
+                return true;
+            default:
+                return false;
+        }
     }
 
     @Override
     public boolean isExact(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
+        if (!field.arePrerequisitesOK(this))
+            return false;
+
+        switch (field.id) {
+            case IN_PORT:
+                return (this.wildcards & OFPFW_IN_PORT) == 0;
+            case ETH_DST:
+                return (this.wildcards & OFPFW_DL_DST) == 0;
+            case ETH_SRC:
+                return (this.wildcards & OFPFW_DL_SRC) == 0;
+            case ETH_TYPE:
+                return (this.wildcards & OFPFW_DL_TYPE) == 0;
+            case VLAN_VID:
+                return (this.wildcards & OFPFW_DL_VLAN) == 0;
+            case VLAN_PCP:
+                return (this.wildcards & OFPFW_DL_VLAN_PCP) == 0;
+            case IP_DSCP:
+                return (this.wildcards & OFPFW_NW_TOS) == 0;
+            case IP_PROTO:
+                return (this.wildcards & OFPFW_NW_PROTO) == 0;
+            case IPV4_SRC:
+                return this.getIpv4SrcCidrMaskLen() >= 32;
+            case IPV4_DST:
+                return this.getIpv4DstCidrMaskLen() >= 32;
+            case TCP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) == 0;
+            case TCP_DST:
+                return (this.wildcards & OFPFW_TP_DST) == 0;
+            case UDP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) == 0;
+            case UDP_DST:
+                return (this.wildcards & OFPFW_TP_DST) == 0;
+            case SCTP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) == 0;
+            case SCTP_DST:
+                return (this.wildcards & OFPFW_TP_DST) == 0;
+            case ICMPV4_TYPE:
+                return (this.wildcards & OFPFW_TP_SRC) == 0;
+            case ICMPV4_CODE:
+                return (this.wildcards & OFPFW_TP_DST) == 0;
+            default:
+                throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+        }
     }
 
+    /**
+     * Parse this match's wildcard fields and return the number of significant
+     * bits in the IP destination field. NOTE: this returns the number of bits
+     * that are fixed, i.e., like CIDR, not the number of bits that are free
+     * like OpenFlow encodes.
+     *
+     * @return A number between 0 (matches all IPs) and 32 (exact match)
+     */
+    public int getIpv4DstCidrMaskLen() {
+        return Math.max(32 - ((wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT),
+                        0);
+    }
+
+    /**
+     * Parse this match's wildcard fields and return the number of significant
+     * bits in the IP destination field. NOTE: this returns the number of bits
+     * that are fixed, i.e., like CIDR, not the number of bits that are free
+     * like OpenFlow encodes.
+     *
+     * @return A number between 0 (matches all IPs) and 32 (exact match)
+     */
+    public int getIpv4SrcCidrMaskLen() {
+        return Math.max(32 - ((wildcards & OFPFW_NW_SRC_MASK) >> OFPFW_NW_SRC_SHIFT),
+                        0);
+    }
+
+
     @Override
     public boolean isFullyWildcarded(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
+        if (!field.arePrerequisitesOK(this))
+            return true;
+
+        switch (field.id) {
+            case IN_PORT:
+                return (this.wildcards & OFPFW_IN_PORT) != 0;
+            case ETH_DST:
+                return (this.wildcards & OFPFW_DL_DST) != 0;
+            case ETH_SRC:
+                return (this.wildcards & OFPFW_DL_SRC) != 0;
+            case ETH_TYPE:
+                return (this.wildcards & OFPFW_DL_TYPE) != 0;
+            case VLAN_VID:
+                return (this.wildcards & OFPFW_DL_VLAN) != 0;
+            case VLAN_PCP:
+                return (this.wildcards & OFPFW_DL_VLAN_PCP) != 0;
+            case IP_DSCP:
+                return (this.wildcards & OFPFW_NW_TOS) != 0;
+            case IP_PROTO:
+                return (this.wildcards & OFPFW_NW_PROTO) != 0;
+            case TCP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) != 0;
+            case TCP_DST:
+                return (this.wildcards & OFPFW_TP_DST) != 0;
+            case UDP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) != 0;
+            case UDP_DST:
+                return (this.wildcards & OFPFW_TP_DST) != 0;
+            case SCTP_SRC:
+                return (this.wildcards & OFPFW_TP_SRC) != 0;
+            case SCTP_DST:
+                return (this.wildcards & OFPFW_TP_DST) != 0;
+            case ICMPV4_TYPE:
+                return (this.wildcards & OFPFW_TP_SRC) != 0;
+            case ICMPV4_CODE:
+                return (this.wildcards & OFPFW_TP_DST) != 0;
+            case IPV4_SRC:
+                return this.getIpv4SrcCidrMaskLen() <= 0;
+            case IPV4_DST:
+                return this.getIpv4DstCidrMaskLen() <= 0;
+            default:
+                throw new UnsupportedOperationException("OFMatch does not support matching on field " + field.getName());
+        }
     }
 
     @Override
     public boolean isPartiallyMasked(MatchField<?> field) {
-        // FIXME yotam - please replace with real implementation
-        return false;
+        if (!field.arePrerequisitesOK(this))
+            return false;
+
+        switch (field.id) {
+            case IPV4_SRC:
+                int srcCidrLen = getIpv4SrcCidrMaskLen();
+                return srcCidrLen > 0 && srcCidrLen < 32;
+            case IPV4_DST:
+                int dstCidrLen = getIpv4SrcCidrMaskLen();
+                return dstCidrLen > 0 && dstCidrLen < 32;
+            default:
+                throw new UnsupportedOperationException("OFMatch does not support masked matching on field " + field.getName());
+        }
     }
diff --git a/java_gen/templates/of_class.java b/java_gen/templates/of_class.java
index d03ffbf..aa68d04 100644
--- a/java_gen/templates/of_class.java
+++ b/java_gen/templates/of_class.java
@@ -47,7 +47,9 @@
 //:: #endif
 
 //:: for prop in msg.data_members:
-    private final static ${prop.java_type.public_type} ${prop.default_name} = ${prop.default_value};
+    //:: if prop.default_value:
+        private final static ${prop.java_type.public_type} ${prop.default_name} = ${prop.default_value};
+    //:: #endif
 //:: #end
 
     // OF message fields
@@ -97,13 +99,27 @@
 
 //:: include("_field_accessors.java", msg=msg, generate_setters=True, builder=True, has_parent=True)
 
+
         @Override
         public ${msg.interface.name} build() {
+                //:: for prop in msg.data_members:
+                ${prop.java_type.public_type} ${prop.name} = this.${prop.name}Set ? this.${prop.name} : parentMessage.${prop.name};
+                //::    if not prop.is_nullable and not prop.java_type.is_primitive:
+                if(${prop.name} == null)
+                    throw new NullPointerException("Property ${prop.name} must not be null");
+                //::    #endif
+                //:: #endfor
+
+                //
+                //:: if os.path.exists("%s/custom/%s.Builder_normalize_stanza.java" % (template_dir, msg.name)):
+                //:: include("custom/%s.Builder_normalize_stanza.java" % msg.name, msg=msg, has_parent=False)
+                //:: #endif
                 return new ${impl_class}(
-                    ${",\n                      ".join(
-                         [ "this.{0}Set ? this.{0} : parentMessage.{0}".format(prop.name)
-                             for prop in msg.data_members])}
-                    );
+                //:: for i, prop in enumerate(msg.data_members):
+                //::    comma = "," if i < len(msg.data_members)-1 else ""
+                    ${prop.name}${comma}
+                //:: #endfor
+                );
         }
         //:: if os.path.exists("%s/custom/%s.Builder.java" % (template_dir, msg.name)):
         //:: include("custom/%s.Builder.java" % msg.name, msg=msg, has_parent=True)
@@ -122,10 +138,28 @@
 //
         @Override
         public ${msg.interface.name} build() {
+            //:: for prop in msg.data_members:
+            //::    if prop.default_value:
+            ${prop.java_type.public_type} ${prop.name} = this.${prop.name}Set ? this.${prop.name} : ${prop.default_name};
+            //:: else:
+            if(!this.${prop.name}Set)
+                throw new IllegalStateException("Property ${prop.name} doesn't have default value -- must be set");
+            //::    #endif
+            //::    if not prop.is_nullable and not prop.java_type.is_primitive:
+            if(${prop.name} == null)
+                throw new NullPointerException("Property ${prop.name} must not be null");
+            //::    #endif
+            //:: #endfor
+
+            //:: if os.path.exists("%s/custom/%s.Builder_normalize_stanza.java" % (template_dir, msg.name)):
+            //:: include("custom/%s.Builder_normalize_stanza.java" % msg.name, msg=msg, has_parent=False)
+            //:: #endif
+
             return new ${impl_class}(
-                ${",\n                      ".join(
-                     [ "this.{0}Set ? this.{0} : {1}.{2}".format(prop.name, impl_class, prop.default_name)
-                         for prop in msg.data_members])}
+                //:: for i, prop in enumerate(msg.data_members):
+                //::    comma = "," if i < len(msg.data_members)-1 else ""
+                    ${prop.name}${comma}
+                //:: #endfor
                 );
         }
         //:: if os.path.exists("%s/custom/%s.Builder.java" % (template_dir, msg.name)):
@@ -190,7 +224,10 @@
             //:: #endif
 
             //:: if msg.data_members:
-            return new ${impl_class}(
+            //:: if os.path.exists("%s/custom/%s.Reader_normalize_stanza.java" % (template_dir, msg.name)):
+            //:: include("custom/%s.Reader_normalize_stanza.java" % msg.name, msg=msg, has_parent=False)
+            //:: #endif
+             return new ${impl_class}(
                     ${",\n                      ".join(
                          [ prop.name for prop in msg.data_members])}
                     );
