diff --git a/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFOxmsVer13.java b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFOxmsVer13.java
new file mode 100644
index 0000000..1f2f7b7
--- /dev/null
+++ b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFOxmsVer13.java
@@ -0,0 +1,1440 @@
+// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
+// Copyright (c) 2011, 2012 Open Networking Foundation
+// Copyright (c) 2012, 2013 Big Switch Networks, Inc.
+// This library was generated by the LoxiGen Compiler.
+// See the file LICENSE.txt which should have been included in the source distribution
+
+// Automatically generated by LOXI from template of_factory_class.java
+// Do not modify
+
+package org.projectfloodlight.openflow.protocol.ver13;
+
+import org.projectfloodlight.openflow.protocol.*;
+import org.projectfloodlight.openflow.protocol.action.*;
+import org.projectfloodlight.openflow.protocol.actionid.*;
+import org.projectfloodlight.openflow.protocol.bsntlv.*;
+import org.projectfloodlight.openflow.protocol.errormsg.*;
+import org.projectfloodlight.openflow.protocol.meterband.*;
+import org.projectfloodlight.openflow.protocol.instruction.*;
+import org.projectfloodlight.openflow.protocol.instructionid.*;
+import org.projectfloodlight.openflow.protocol.match.*;
+import org.projectfloodlight.openflow.protocol.oxm.*;
+import org.projectfloodlight.openflow.protocol.queueprop.*;
+import org.projectfloodlight.openflow.types.*;
+import org.projectfloodlight.openflow.util.*;
+import org.projectfloodlight.openflow.exceptions.*;
+
+
+public class OFOxmsVer13 implements OFOxms {
+    public final static OFOxmsVer13 INSTANCE = new OFOxmsVer13();
+
+
+
+
+    public OFOxmArpOp.Builder buildArpOp() {
+        return new OFOxmArpOpVer13.Builder();
+    }
+    public OFOxmArpOp arpOp(ArpOpcode value) {
+        return new OFOxmArpOpVer13(
+                value
+                    );
+    }
+
+    public OFOxmArpOpMasked.Builder buildArpOpMasked() {
+        return new OFOxmArpOpMaskedVer13.Builder();
+    }
+    public OFOxmArpOpMasked arpOpMasked(ArpOpcode value, ArpOpcode mask) {
+        return new OFOxmArpOpMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmArpSha.Builder buildArpSha() {
+        return new OFOxmArpShaVer13.Builder();
+    }
+    public OFOxmArpSha arpSha(MacAddress value) {
+        return new OFOxmArpShaVer13(
+                value
+                    );
+    }
+
+    public OFOxmArpShaMasked.Builder buildArpShaMasked() {
+        return new OFOxmArpShaMaskedVer13.Builder();
+    }
+    public OFOxmArpShaMasked arpShaMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmArpShaMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmArpSpa.Builder buildArpSpa() {
+        return new OFOxmArpSpaVer13.Builder();
+    }
+    public OFOxmArpSpa arpSpa(IPv4Address value) {
+        return new OFOxmArpSpaVer13(
+                value
+                    );
+    }
+
+    public OFOxmArpSpaMasked.Builder buildArpSpaMasked() {
+        return new OFOxmArpSpaMaskedVer13.Builder();
+    }
+    public OFOxmArpSpaMasked arpSpaMasked(IPv4Address value, IPv4Address mask) {
+        return new OFOxmArpSpaMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmArpTha.Builder buildArpTha() {
+        return new OFOxmArpThaVer13.Builder();
+    }
+    public OFOxmArpTha arpTha(MacAddress value) {
+        return new OFOxmArpThaVer13(
+                value
+                    );
+    }
+
+    public OFOxmArpThaMasked.Builder buildArpThaMasked() {
+        return new OFOxmArpThaMaskedVer13.Builder();
+    }
+    public OFOxmArpThaMasked arpThaMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmArpThaMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmArpTpa.Builder buildArpTpa() {
+        return new OFOxmArpTpaVer13.Builder();
+    }
+    public OFOxmArpTpa arpTpa(IPv4Address value) {
+        return new OFOxmArpTpaVer13(
+                value
+                    );
+    }
+
+    public OFOxmArpTpaMasked.Builder buildArpTpaMasked() {
+        return new OFOxmArpTpaMaskedVer13.Builder();
+    }
+    public OFOxmArpTpaMasked arpTpaMasked(IPv4Address value, IPv4Address mask) {
+        return new OFOxmArpTpaMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnEgrPortGroupId.Builder buildBsnEgrPortGroupId() {
+        return new OFOxmBsnEgrPortGroupIdVer13.Builder();
+    }
+    public OFOxmBsnEgrPortGroupId bsnEgrPortGroupId(ClassId value) {
+        return new OFOxmBsnEgrPortGroupIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnEgrPortGroupIdMasked.Builder buildBsnEgrPortGroupIdMasked() {
+        return new OFOxmBsnEgrPortGroupIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnEgrPortGroupIdMasked bsnEgrPortGroupIdMasked(ClassId value, ClassId mask) {
+        return new OFOxmBsnEgrPortGroupIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnGlobalVrfAllowed.Builder buildBsnGlobalVrfAllowed() {
+        return new OFOxmBsnGlobalVrfAllowedVer13.Builder();
+    }
+    public OFOxmBsnGlobalVrfAllowed bsnGlobalVrfAllowed(OFBooleanValue value) {
+        return new OFOxmBsnGlobalVrfAllowedVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnGlobalVrfAllowedMasked.Builder buildBsnGlobalVrfAllowedMasked() {
+        return new OFOxmBsnGlobalVrfAllowedMaskedVer13.Builder();
+    }
+    public OFOxmBsnGlobalVrfAllowedMasked bsnGlobalVrfAllowedMasked(OFBooleanValue value, OFBooleanValue mask) {
+        return new OFOxmBsnGlobalVrfAllowedMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnInPorts128.Builder buildBsnInPorts128() {
+        return new OFOxmBsnInPorts128Ver13.Builder();
+    }
+    public OFOxmBsnInPorts128 bsnInPorts128(OFBitMask128 value) {
+        return new OFOxmBsnInPorts128Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnInPorts128Masked.Builder buildBsnInPorts128Masked() {
+        return new OFOxmBsnInPorts128MaskedVer13.Builder();
+    }
+    public OFOxmBsnInPorts128Masked bsnInPorts128Masked(OFBitMask128 value, OFBitMask128 mask) {
+        return new OFOxmBsnInPorts128MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnL3DstClassId.Builder buildBsnL3DstClassId() {
+        return new OFOxmBsnL3DstClassIdVer13.Builder();
+    }
+    public OFOxmBsnL3DstClassId bsnL3DstClassId(ClassId value) {
+        return new OFOxmBsnL3DstClassIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnL3DstClassIdMasked.Builder buildBsnL3DstClassIdMasked() {
+        return new OFOxmBsnL3DstClassIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnL3DstClassIdMasked bsnL3DstClassIdMasked(ClassId value, ClassId mask) {
+        return new OFOxmBsnL3DstClassIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnL3InterfaceClassId.Builder buildBsnL3InterfaceClassId() {
+        return new OFOxmBsnL3InterfaceClassIdVer13.Builder();
+    }
+    public OFOxmBsnL3InterfaceClassId bsnL3InterfaceClassId(ClassId value) {
+        return new OFOxmBsnL3InterfaceClassIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnL3InterfaceClassIdMasked.Builder buildBsnL3InterfaceClassIdMasked() {
+        return new OFOxmBsnL3InterfaceClassIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnL3InterfaceClassIdMasked bsnL3InterfaceClassIdMasked(ClassId value, ClassId mask) {
+        return new OFOxmBsnL3InterfaceClassIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnL3SrcClassId.Builder buildBsnL3SrcClassId() {
+        return new OFOxmBsnL3SrcClassIdVer13.Builder();
+    }
+    public OFOxmBsnL3SrcClassId bsnL3SrcClassId(ClassId value) {
+        return new OFOxmBsnL3SrcClassIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnL3SrcClassIdMasked.Builder buildBsnL3SrcClassIdMasked() {
+        return new OFOxmBsnL3SrcClassIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnL3SrcClassIdMasked bsnL3SrcClassIdMasked(ClassId value, ClassId mask) {
+        return new OFOxmBsnL3SrcClassIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnLagId.Builder buildBsnLagId() {
+        return new OFOxmBsnLagIdVer13.Builder();
+    }
+    public OFOxmBsnLagId bsnLagId(LagId value) {
+        return new OFOxmBsnLagIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnLagIdMasked.Builder buildBsnLagIdMasked() {
+        return new OFOxmBsnLagIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnLagIdMasked bsnLagIdMasked(LagId value, LagId mask) {
+        return new OFOxmBsnLagIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnTcpFlags.Builder buildBsnTcpFlags() {
+        return new OFOxmBsnTcpFlagsVer13.Builder();
+    }
+    public OFOxmBsnTcpFlags bsnTcpFlags(U16 value) {
+        return new OFOxmBsnTcpFlagsVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnTcpFlagsMasked.Builder buildBsnTcpFlagsMasked() {
+        return new OFOxmBsnTcpFlagsMaskedVer13.Builder();
+    }
+    public OFOxmBsnTcpFlagsMasked bsnTcpFlagsMasked(U16 value, U16 mask) {
+        return new OFOxmBsnTcpFlagsMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf0.Builder buildBsnUdf0() {
+        return new OFOxmBsnUdf0Ver13.Builder();
+    }
+    public OFOxmBsnUdf0 bsnUdf0(UDF value) {
+        return new OFOxmBsnUdf0Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf0Masked.Builder buildBsnUdf0Masked() {
+        return new OFOxmBsnUdf0MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf0Masked bsnUdf0Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf0MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf1.Builder buildBsnUdf1() {
+        return new OFOxmBsnUdf1Ver13.Builder();
+    }
+    public OFOxmBsnUdf1 bsnUdf1(UDF value) {
+        return new OFOxmBsnUdf1Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf1Masked.Builder buildBsnUdf1Masked() {
+        return new OFOxmBsnUdf1MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf1Masked bsnUdf1Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf1MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf2.Builder buildBsnUdf2() {
+        return new OFOxmBsnUdf2Ver13.Builder();
+    }
+    public OFOxmBsnUdf2 bsnUdf2(UDF value) {
+        return new OFOxmBsnUdf2Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf2Masked.Builder buildBsnUdf2Masked() {
+        return new OFOxmBsnUdf2MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf2Masked bsnUdf2Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf2MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf3.Builder buildBsnUdf3() {
+        return new OFOxmBsnUdf3Ver13.Builder();
+    }
+    public OFOxmBsnUdf3 bsnUdf3(UDF value) {
+        return new OFOxmBsnUdf3Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf3Masked.Builder buildBsnUdf3Masked() {
+        return new OFOxmBsnUdf3MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf3Masked bsnUdf3Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf3MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf4.Builder buildBsnUdf4() {
+        return new OFOxmBsnUdf4Ver13.Builder();
+    }
+    public OFOxmBsnUdf4 bsnUdf4(UDF value) {
+        return new OFOxmBsnUdf4Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf4Masked.Builder buildBsnUdf4Masked() {
+        return new OFOxmBsnUdf4MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf4Masked bsnUdf4Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf4MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf5.Builder buildBsnUdf5() {
+        return new OFOxmBsnUdf5Ver13.Builder();
+    }
+    public OFOxmBsnUdf5 bsnUdf5(UDF value) {
+        return new OFOxmBsnUdf5Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf5Masked.Builder buildBsnUdf5Masked() {
+        return new OFOxmBsnUdf5MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf5Masked bsnUdf5Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf5MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf6.Builder buildBsnUdf6() {
+        return new OFOxmBsnUdf6Ver13.Builder();
+    }
+    public OFOxmBsnUdf6 bsnUdf6(UDF value) {
+        return new OFOxmBsnUdf6Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf6Masked.Builder buildBsnUdf6Masked() {
+        return new OFOxmBsnUdf6MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf6Masked bsnUdf6Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf6MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnUdf7.Builder buildBsnUdf7() {
+        return new OFOxmBsnUdf7Ver13.Builder();
+    }
+    public OFOxmBsnUdf7 bsnUdf7(UDF value) {
+        return new OFOxmBsnUdf7Ver13(
+                value
+                    );
+    }
+
+    public OFOxmBsnUdf7Masked.Builder buildBsnUdf7Masked() {
+        return new OFOxmBsnUdf7MaskedVer13.Builder();
+    }
+    public OFOxmBsnUdf7Masked bsnUdf7Masked(UDF value, UDF mask) {
+        return new OFOxmBsnUdf7MaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnVlanXlatePortGroupId.Builder buildBsnVlanXlatePortGroupId() {
+        return new OFOxmBsnVlanXlatePortGroupIdVer13.Builder();
+    }
+    public OFOxmBsnVlanXlatePortGroupId bsnVlanXlatePortGroupId(ClassId value) {
+        return new OFOxmBsnVlanXlatePortGroupIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnVlanXlatePortGroupIdMasked.Builder buildBsnVlanXlatePortGroupIdMasked() {
+        return new OFOxmBsnVlanXlatePortGroupIdMaskedVer13.Builder();
+    }
+    public OFOxmBsnVlanXlatePortGroupIdMasked bsnVlanXlatePortGroupIdMasked(ClassId value, ClassId mask) {
+        return new OFOxmBsnVlanXlatePortGroupIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmBsnVrf.Builder buildBsnVrf() {
+        return new OFOxmBsnVrfVer13.Builder();
+    }
+    public OFOxmBsnVrf bsnVrf(VRF value) {
+        return new OFOxmBsnVrfVer13(
+                value
+                    );
+    }
+
+    public OFOxmBsnVrfMasked.Builder buildBsnVrfMasked() {
+        return new OFOxmBsnVrfMaskedVer13.Builder();
+    }
+    public OFOxmBsnVrfMasked bsnVrfMasked(VRF value, VRF mask) {
+        return new OFOxmBsnVrfMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmEthDst.Builder buildEthDst() {
+        return new OFOxmEthDstVer13.Builder();
+    }
+    public OFOxmEthDst ethDst(MacAddress value) {
+        return new OFOxmEthDstVer13(
+                value
+                    );
+    }
+
+    public OFOxmEthDstMasked.Builder buildEthDstMasked() {
+        return new OFOxmEthDstMaskedVer13.Builder();
+    }
+    public OFOxmEthDstMasked ethDstMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmEthDstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmEthSrc.Builder buildEthSrc() {
+        return new OFOxmEthSrcVer13.Builder();
+    }
+    public OFOxmEthSrc ethSrc(MacAddress value) {
+        return new OFOxmEthSrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmEthSrcMasked.Builder buildEthSrcMasked() {
+        return new OFOxmEthSrcMaskedVer13.Builder();
+    }
+    public OFOxmEthSrcMasked ethSrcMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmEthSrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmEthType.Builder buildEthType() {
+        return new OFOxmEthTypeVer13.Builder();
+    }
+    public OFOxmEthType ethType(EthType value) {
+        return new OFOxmEthTypeVer13(
+                value
+                    );
+    }
+
+    public OFOxmEthTypeMasked.Builder buildEthTypeMasked() {
+        return new OFOxmEthTypeMaskedVer13.Builder();
+    }
+    public OFOxmEthTypeMasked ethTypeMasked(EthType value, EthType mask) {
+        return new OFOxmEthTypeMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIcmpv4Code.Builder buildIcmpv4Code() {
+        return new OFOxmIcmpv4CodeVer13.Builder();
+    }
+    public OFOxmIcmpv4Code icmpv4Code(ICMPv4Code value) {
+        return new OFOxmIcmpv4CodeVer13(
+                value
+                    );
+    }
+
+    public OFOxmIcmpv4CodeMasked.Builder buildIcmpv4CodeMasked() {
+        return new OFOxmIcmpv4CodeMaskedVer13.Builder();
+    }
+    public OFOxmIcmpv4CodeMasked icmpv4CodeMasked(ICMPv4Code value, ICMPv4Code mask) {
+        return new OFOxmIcmpv4CodeMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIcmpv4Type.Builder buildIcmpv4Type() {
+        return new OFOxmIcmpv4TypeVer13.Builder();
+    }
+    public OFOxmIcmpv4Type icmpv4Type(ICMPv4Type value) {
+        return new OFOxmIcmpv4TypeVer13(
+                value
+                    );
+    }
+
+    public OFOxmIcmpv4TypeMasked.Builder buildIcmpv4TypeMasked() {
+        return new OFOxmIcmpv4TypeMaskedVer13.Builder();
+    }
+    public OFOxmIcmpv4TypeMasked icmpv4TypeMasked(ICMPv4Type value, ICMPv4Type mask) {
+        return new OFOxmIcmpv4TypeMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIcmpv6Code.Builder buildIcmpv6Code() {
+        return new OFOxmIcmpv6CodeVer13.Builder();
+    }
+    public OFOxmIcmpv6Code icmpv6Code(U8 value) {
+        return new OFOxmIcmpv6CodeVer13(
+                value
+                    );
+    }
+
+    public OFOxmIcmpv6CodeMasked.Builder buildIcmpv6CodeMasked() {
+        return new OFOxmIcmpv6CodeMaskedVer13.Builder();
+    }
+    public OFOxmIcmpv6CodeMasked icmpv6CodeMasked(U8 value, U8 mask) {
+        return new OFOxmIcmpv6CodeMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIcmpv6Type.Builder buildIcmpv6Type() {
+        return new OFOxmIcmpv6TypeVer13.Builder();
+    }
+    public OFOxmIcmpv6Type icmpv6Type(U8 value) {
+        return new OFOxmIcmpv6TypeVer13(
+                value
+                    );
+    }
+
+    public OFOxmIcmpv6TypeMasked.Builder buildIcmpv6TypeMasked() {
+        return new OFOxmIcmpv6TypeMaskedVer13.Builder();
+    }
+    public OFOxmIcmpv6TypeMasked icmpv6TypeMasked(U8 value, U8 mask) {
+        return new OFOxmIcmpv6TypeMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmInPhyPort.Builder buildInPhyPort() {
+        return new OFOxmInPhyPortVer13.Builder();
+    }
+    public OFOxmInPhyPort inPhyPort(OFPort value) {
+        return new OFOxmInPhyPortVer13(
+                value
+                    );
+    }
+
+    public OFOxmInPhyPortMasked.Builder buildInPhyPortMasked() {
+        return new OFOxmInPhyPortMaskedVer13.Builder();
+    }
+    public OFOxmInPhyPortMasked inPhyPortMasked(OFPort value, OFPort mask) {
+        return new OFOxmInPhyPortMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmInPort.Builder buildInPort() {
+        return new OFOxmInPortVer13.Builder();
+    }
+    public OFOxmInPort inPort(OFPort value) {
+        return new OFOxmInPortVer13(
+                value
+                    );
+    }
+
+    public OFOxmInPortMasked.Builder buildInPortMasked() {
+        return new OFOxmInPortMaskedVer13.Builder();
+    }
+    public OFOxmInPortMasked inPortMasked(OFPort value, OFPort mask) {
+        return new OFOxmInPortMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpDscp.Builder buildIpDscp() {
+        return new OFOxmIpDscpVer13.Builder();
+    }
+    public OFOxmIpDscp ipDscp(IpDscp value) {
+        return new OFOxmIpDscpVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpDscpMasked.Builder buildIpDscpMasked() {
+        return new OFOxmIpDscpMaskedVer13.Builder();
+    }
+    public OFOxmIpDscpMasked ipDscpMasked(IpDscp value, IpDscp mask) {
+        return new OFOxmIpDscpMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpEcn.Builder buildIpEcn() {
+        return new OFOxmIpEcnVer13.Builder();
+    }
+    public OFOxmIpEcn ipEcn(IpEcn value) {
+        return new OFOxmIpEcnVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpEcnMasked.Builder buildIpEcnMasked() {
+        return new OFOxmIpEcnMaskedVer13.Builder();
+    }
+    public OFOxmIpEcnMasked ipEcnMasked(IpEcn value, IpEcn mask) {
+        return new OFOxmIpEcnMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpProto.Builder buildIpProto() {
+        return new OFOxmIpProtoVer13.Builder();
+    }
+    public OFOxmIpProto ipProto(IpProtocol value) {
+        return new OFOxmIpProtoVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpProtoMasked.Builder buildIpProtoMasked() {
+        return new OFOxmIpProtoMaskedVer13.Builder();
+    }
+    public OFOxmIpProtoMasked ipProtoMasked(IpProtocol value, IpProtocol mask) {
+        return new OFOxmIpProtoMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv4Dst.Builder buildIpv4Dst() {
+        return new OFOxmIpv4DstVer13.Builder();
+    }
+    public OFOxmIpv4Dst ipv4Dst(IPv4Address value) {
+        return new OFOxmIpv4DstVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv4DstMasked.Builder buildIpv4DstMasked() {
+        return new OFOxmIpv4DstMaskedVer13.Builder();
+    }
+    public OFOxmIpv4DstMasked ipv4DstMasked(IPv4Address value, IPv4Address mask) {
+        return new OFOxmIpv4DstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv4Src.Builder buildIpv4Src() {
+        return new OFOxmIpv4SrcVer13.Builder();
+    }
+    public OFOxmIpv4Src ipv4Src(IPv4Address value) {
+        return new OFOxmIpv4SrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv4SrcMasked.Builder buildIpv4SrcMasked() {
+        return new OFOxmIpv4SrcMaskedVer13.Builder();
+    }
+    public OFOxmIpv4SrcMasked ipv4SrcMasked(IPv4Address value, IPv4Address mask) {
+        return new OFOxmIpv4SrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6Dst.Builder buildIpv6Dst() {
+        return new OFOxmIpv6DstVer13.Builder();
+    }
+    public OFOxmIpv6Dst ipv6Dst(IPv6Address value) {
+        return new OFOxmIpv6DstVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6DstMasked.Builder buildIpv6DstMasked() {
+        return new OFOxmIpv6DstMaskedVer13.Builder();
+    }
+    public OFOxmIpv6DstMasked ipv6DstMasked(IPv6Address value, IPv6Address mask) {
+        return new OFOxmIpv6DstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6Flabel.Builder buildIpv6Flabel() {
+        return new OFOxmIpv6FlabelVer13.Builder();
+    }
+    public OFOxmIpv6Flabel ipv6Flabel(IPv6FlowLabel value) {
+        return new OFOxmIpv6FlabelVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6FlabelMasked.Builder buildIpv6FlabelMasked() {
+        return new OFOxmIpv6FlabelMaskedVer13.Builder();
+    }
+    public OFOxmIpv6FlabelMasked ipv6FlabelMasked(IPv6FlowLabel value, IPv6FlowLabel mask) {
+        return new OFOxmIpv6FlabelMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6NdSll.Builder buildIpv6NdSll() {
+        return new OFOxmIpv6NdSllVer13.Builder();
+    }
+    public OFOxmIpv6NdSll ipv6NdSll(MacAddress value) {
+        return new OFOxmIpv6NdSllVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6NdSllMasked.Builder buildIpv6NdSllMasked() {
+        return new OFOxmIpv6NdSllMaskedVer13.Builder();
+    }
+    public OFOxmIpv6NdSllMasked ipv6NdSllMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmIpv6NdSllMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6NdTarget.Builder buildIpv6NdTarget() {
+        return new OFOxmIpv6NdTargetVer13.Builder();
+    }
+    public OFOxmIpv6NdTarget ipv6NdTarget(IPv6Address value) {
+        return new OFOxmIpv6NdTargetVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6NdTargetMasked.Builder buildIpv6NdTargetMasked() {
+        return new OFOxmIpv6NdTargetMaskedVer13.Builder();
+    }
+    public OFOxmIpv6NdTargetMasked ipv6NdTargetMasked(IPv6Address value, IPv6Address mask) {
+        return new OFOxmIpv6NdTargetMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6NdTll.Builder buildIpv6NdTll() {
+        return new OFOxmIpv6NdTllVer13.Builder();
+    }
+    public OFOxmIpv6NdTll ipv6NdTll(MacAddress value) {
+        return new OFOxmIpv6NdTllVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6NdTllMasked.Builder buildIpv6NdTllMasked() {
+        return new OFOxmIpv6NdTllMaskedVer13.Builder();
+    }
+    public OFOxmIpv6NdTllMasked ipv6NdTllMasked(MacAddress value, MacAddress mask) {
+        return new OFOxmIpv6NdTllMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmIpv6Src.Builder buildIpv6Src() {
+        return new OFOxmIpv6SrcVer13.Builder();
+    }
+    public OFOxmIpv6Src ipv6Src(IPv6Address value) {
+        return new OFOxmIpv6SrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmIpv6SrcMasked.Builder buildIpv6SrcMasked() {
+        return new OFOxmIpv6SrcMaskedVer13.Builder();
+    }
+    public OFOxmIpv6SrcMasked ipv6SrcMasked(IPv6Address value, IPv6Address mask) {
+        return new OFOxmIpv6SrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmMetadata.Builder buildMetadata() {
+        return new OFOxmMetadataVer13.Builder();
+    }
+    public OFOxmMetadata metadata(OFMetadata value) {
+        return new OFOxmMetadataVer13(
+                value
+                    );
+    }
+
+    public OFOxmMetadataMasked.Builder buildMetadataMasked() {
+        return new OFOxmMetadataMaskedVer13.Builder();
+    }
+    public OFOxmMetadataMasked metadataMasked(OFMetadata value, OFMetadata mask) {
+        return new OFOxmMetadataMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmMplsLabel.Builder buildMplsLabel() {
+        return new OFOxmMplsLabelVer13.Builder();
+    }
+    public OFOxmMplsLabel mplsLabel(U32 value) {
+        return new OFOxmMplsLabelVer13(
+                value
+                    );
+    }
+
+    public OFOxmMplsLabelMasked.Builder buildMplsLabelMasked() {
+        return new OFOxmMplsLabelMaskedVer13.Builder();
+    }
+    public OFOxmMplsLabelMasked mplsLabelMasked(U32 value, U32 mask) {
+        return new OFOxmMplsLabelMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmMplsTc.Builder buildMplsTc() {
+        return new OFOxmMplsTcVer13.Builder();
+    }
+    public OFOxmMplsTc mplsTc(U8 value) {
+        return new OFOxmMplsTcVer13(
+                value
+                    );
+    }
+
+    public OFOxmMplsTcMasked.Builder buildMplsTcMasked() {
+        return new OFOxmMplsTcMaskedVer13.Builder();
+    }
+    public OFOxmMplsTcMasked mplsTcMasked(U8 value, U8 mask) {
+        return new OFOxmMplsTcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmSctpDst.Builder buildSctpDst() {
+        return new OFOxmSctpDstVer13.Builder();
+    }
+    public OFOxmSctpDst sctpDst(TransportPort value) {
+        return new OFOxmSctpDstVer13(
+                value
+                    );
+    }
+
+    public OFOxmSctpDstMasked.Builder buildSctpDstMasked() {
+        return new OFOxmSctpDstMaskedVer13.Builder();
+    }
+    public OFOxmSctpDstMasked sctpDstMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmSctpDstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmSctpSrc.Builder buildSctpSrc() {
+        return new OFOxmSctpSrcVer13.Builder();
+    }
+    public OFOxmSctpSrc sctpSrc(TransportPort value) {
+        return new OFOxmSctpSrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmSctpSrcMasked.Builder buildSctpSrcMasked() {
+        return new OFOxmSctpSrcMaskedVer13.Builder();
+    }
+    public OFOxmSctpSrcMasked sctpSrcMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmSctpSrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmTcpDst.Builder buildTcpDst() {
+        return new OFOxmTcpDstVer13.Builder();
+    }
+    public OFOxmTcpDst tcpDst(TransportPort value) {
+        return new OFOxmTcpDstVer13(
+                value
+                    );
+    }
+
+    public OFOxmTcpDstMasked.Builder buildTcpDstMasked() {
+        return new OFOxmTcpDstMaskedVer13.Builder();
+    }
+    public OFOxmTcpDstMasked tcpDstMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmTcpDstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmTcpSrc.Builder buildTcpSrc() {
+        return new OFOxmTcpSrcVer13.Builder();
+    }
+    public OFOxmTcpSrc tcpSrc(TransportPort value) {
+        return new OFOxmTcpSrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmTcpSrcMasked.Builder buildTcpSrcMasked() {
+        return new OFOxmTcpSrcMaskedVer13.Builder();
+    }
+    public OFOxmTcpSrcMasked tcpSrcMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmTcpSrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmUdpDst.Builder buildUdpDst() {
+        return new OFOxmUdpDstVer13.Builder();
+    }
+    public OFOxmUdpDst udpDst(TransportPort value) {
+        return new OFOxmUdpDstVer13(
+                value
+                    );
+    }
+
+    public OFOxmUdpDstMasked.Builder buildUdpDstMasked() {
+        return new OFOxmUdpDstMaskedVer13.Builder();
+    }
+    public OFOxmUdpDstMasked udpDstMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmUdpDstMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmUdpSrc.Builder buildUdpSrc() {
+        return new OFOxmUdpSrcVer13.Builder();
+    }
+    public OFOxmUdpSrc udpSrc(TransportPort value) {
+        return new OFOxmUdpSrcVer13(
+                value
+                    );
+    }
+
+    public OFOxmUdpSrcMasked.Builder buildUdpSrcMasked() {
+        return new OFOxmUdpSrcMaskedVer13.Builder();
+    }
+    public OFOxmUdpSrcMasked udpSrcMasked(TransportPort value, TransportPort mask) {
+        return new OFOxmUdpSrcMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmVlanPcp.Builder buildVlanPcp() {
+        return new OFOxmVlanPcpVer13.Builder();
+    }
+    public OFOxmVlanPcp vlanPcp(VlanPcp value) {
+        return new OFOxmVlanPcpVer13(
+                value
+                    );
+    }
+
+    public OFOxmVlanPcpMasked.Builder buildVlanPcpMasked() {
+        return new OFOxmVlanPcpMaskedVer13.Builder();
+    }
+    public OFOxmVlanPcpMasked vlanPcpMasked(VlanPcp value, VlanPcp mask) {
+        return new OFOxmVlanPcpMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmVlanVid.Builder buildVlanVid() {
+        return new OFOxmVlanVidVer13.Builder();
+    }
+    public OFOxmVlanVid vlanVid(OFVlanVidMatch value) {
+        return new OFOxmVlanVidVer13(
+                value
+                    );
+    }
+
+    public OFOxmVlanVidMasked.Builder buildVlanVidMasked() {
+        return new OFOxmVlanVidMaskedVer13.Builder();
+    }
+    public OFOxmVlanVidMasked vlanVidMasked(OFVlanVidMatch value, OFVlanVidMatch mask) {
+        return new OFOxmVlanVidMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFOxmTunnelId.Builder buildTunnelId() {
+        return new OFOxmTunnelIdVer13.Builder();
+    }
+    public OFOxmTunnelId tunnelId(U64 value) {
+        return new OFOxmTunnelIdVer13(
+                value
+                    );
+    }
+
+    public OFOxmTunnelIdMasked.Builder buildTunnelIdMasked() {
+        return new OFOxmTunnelIdMaskedVer13.Builder();
+    }
+    public OFOxmTunnelIdMasked tunnelIdMasked(U64 value, U64 mask) {
+        return new OFOxmTunnelIdMaskedVer13(
+                value,
+                      mask
+                    );
+    }
+
+    public OFMessageReader<OFOxm<?>> getReader() {
+        return OFOxmVer13.READER;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <F extends OFValueType<F>> OFOxm<F> fromValue(F value, MatchField<F> field) {
+        switch (field.id) {
+            case ARP_OP:
+                return (OFOxm<F>)((Object)arpOp((ArpOpcode)((Object)value)));
+            case ARP_SHA:
+                return (OFOxm<F>)((Object)arpSha((MacAddress)((Object)value)));
+            case ARP_SPA:
+                return (OFOxm<F>)((Object)arpSpa((IPv4Address)((Object)value)));
+            case ARP_THA:
+                return (OFOxm<F>)((Object)arpTha((MacAddress)((Object)value)));
+            case ARP_TPA:
+                return (OFOxm<F>)((Object)arpTpa((IPv4Address)((Object)value)));
+            case BSN_EGR_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnEgrPortGroupId((ClassId)((Object)value)));
+            case BSN_GLOBAL_VRF_ALLOWED:
+                return (OFOxm<F>)((Object)bsnGlobalVrfAllowed((OFBooleanValue)((Object)value)));
+            case BSN_IN_PORTS_128:
+                return (OFOxm<F>)((Object)bsnInPorts128((OFBitMask128)((Object)value)));
+            case BSN_L3_DST_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3DstClassId((ClassId)((Object)value)));
+            case BSN_L3_INTERFACE_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3InterfaceClassId((ClassId)((Object)value)));
+            case BSN_L3_SRC_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3SrcClassId((ClassId)((Object)value)));
+            case BSN_LAG_ID:
+                return (OFOxm<F>)((Object)bsnLagId((LagId)((Object)value)));
+            case BSN_TCP_FLAGS:
+                return (OFOxm<F>)((Object)bsnTcpFlags((U16)((Object)value)));
+            case BSN_UDF0:
+                return (OFOxm<F>)((Object)bsnUdf0((UDF)((Object)value)));
+            case BSN_UDF1:
+                return (OFOxm<F>)((Object)bsnUdf1((UDF)((Object)value)));
+            case BSN_UDF2:
+                return (OFOxm<F>)((Object)bsnUdf2((UDF)((Object)value)));
+            case BSN_UDF3:
+                return (OFOxm<F>)((Object)bsnUdf3((UDF)((Object)value)));
+            case BSN_UDF4:
+                return (OFOxm<F>)((Object)bsnUdf4((UDF)((Object)value)));
+            case BSN_UDF5:
+                return (OFOxm<F>)((Object)bsnUdf5((UDF)((Object)value)));
+            case BSN_UDF6:
+                return (OFOxm<F>)((Object)bsnUdf6((UDF)((Object)value)));
+            case BSN_UDF7:
+                return (OFOxm<F>)((Object)bsnUdf7((UDF)((Object)value)));
+            case BSN_VLAN_XLATE_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupId((ClassId)((Object)value)));
+            case BSN_VRF:
+                return (OFOxm<F>)((Object)bsnVrf((VRF)((Object)value)));
+            case ETH_DST:
+                return (OFOxm<F>)((Object)ethDst((MacAddress)((Object)value)));
+            case ETH_SRC:
+                return (OFOxm<F>)((Object)ethSrc((MacAddress)((Object)value)));
+            case ETH_TYPE:
+                return (OFOxm<F>)((Object)ethType((EthType)((Object)value)));
+            case ICMPV4_CODE:
+                return (OFOxm<F>)((Object)icmpv4Code((ICMPv4Code)((Object)value)));
+            case ICMPV4_TYPE:
+                return (OFOxm<F>)((Object)icmpv4Type((ICMPv4Type)((Object)value)));
+            case ICMPV6_CODE:
+                return (OFOxm<F>)((Object)icmpv6Code((U8)((Object)value)));
+            case ICMPV6_TYPE:
+                return (OFOxm<F>)((Object)icmpv6Type((U8)((Object)value)));
+            case IN_PHY_PORT:
+                return (OFOxm<F>)((Object)inPhyPort((OFPort)((Object)value)));
+            case IN_PORT:
+                return (OFOxm<F>)((Object)inPort((OFPort)((Object)value)));
+            case IP_DSCP:
+                return (OFOxm<F>)((Object)ipDscp((IpDscp)((Object)value)));
+            case IP_ECN:
+                return (OFOxm<F>)((Object)ipEcn((IpEcn)((Object)value)));
+            case IP_PROTO:
+                return (OFOxm<F>)((Object)ipProto((IpProtocol)((Object)value)));
+            case IPV4_DST:
+                return (OFOxm<F>)((Object)ipv4Dst((IPv4Address)((Object)value)));
+            case IPV4_SRC:
+                return (OFOxm<F>)((Object)ipv4Src((IPv4Address)((Object)value)));
+            case IPV6_DST:
+                return (OFOxm<F>)((Object)ipv6Dst((IPv6Address)((Object)value)));
+            case IPV6_FLABEL:
+                return (OFOxm<F>)((Object)ipv6Flabel((IPv6FlowLabel)((Object)value)));
+            case IPV6_ND_SLL:
+                return (OFOxm<F>)((Object)ipv6NdSll((MacAddress)((Object)value)));
+            case IPV6_ND_TARGET:
+                return (OFOxm<F>)((Object)ipv6NdTarget((IPv6Address)((Object)value)));
+            case IPV6_ND_TLL:
+                return (OFOxm<F>)((Object)ipv6NdTll((MacAddress)((Object)value)));
+            case IPV6_SRC:
+                return (OFOxm<F>)((Object)ipv6Src((IPv6Address)((Object)value)));
+            case METADATA:
+                return (OFOxm<F>)((Object)metadata((OFMetadata)((Object)value)));
+            case MPLS_LABEL:
+                return (OFOxm<F>)((Object)mplsLabel((U32)((Object)value)));
+            case MPLS_TC:
+                return (OFOxm<F>)((Object)mplsTc((U8)((Object)value)));
+            case SCTP_DST:
+                return (OFOxm<F>)((Object)sctpDst((TransportPort)((Object)value)));
+            case SCTP_SRC:
+                return (OFOxm<F>)((Object)sctpSrc((TransportPort)((Object)value)));
+            case TCP_DST:
+                return (OFOxm<F>)((Object)tcpDst((TransportPort)((Object)value)));
+            case TCP_SRC:
+                return (OFOxm<F>)((Object)tcpSrc((TransportPort)((Object)value)));
+            case UDP_DST:
+                return (OFOxm<F>)((Object)udpDst((TransportPort)((Object)value)));
+            case UDP_SRC:
+                return (OFOxm<F>)((Object)udpSrc((TransportPort)((Object)value)));
+            case VLAN_PCP:
+                return (OFOxm<F>)((Object)vlanPcp((VlanPcp)((Object)value)));
+            case VLAN_VID:
+                return (OFOxm<F>)((Object)vlanVid((OFVlanVidMatch)((Object)value)));
+            case TUNNEL_ID:
+                return (OFOxm<F>)((Object)tunnelId((U64)((Object)value)));
+            default:
+                throw new IllegalArgumentException("No OXM known for match field " + field);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public <F extends OFValueType<F>> OFOxm<F> fromValueAndMask(F value, F mask, MatchField<F> field) {
+        switch (field.id) {
+            case ARP_OP:
+                return (OFOxm<F>)((Object)arpOpMasked((ArpOpcode)((Object)value), (ArpOpcode)((Object)mask)));
+            case ARP_SHA:
+                return (OFOxm<F>)((Object)arpShaMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case ARP_SPA:
+                return (OFOxm<F>)((Object)arpSpaMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
+            case ARP_THA:
+                return (OFOxm<F>)((Object)arpThaMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case ARP_TPA:
+                return (OFOxm<F>)((Object)arpTpaMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
+            case BSN_EGR_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnEgrPortGroupIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
+            case BSN_GLOBAL_VRF_ALLOWED:
+                return (OFOxm<F>)((Object)bsnGlobalVrfAllowedMasked((OFBooleanValue)((Object)value), (OFBooleanValue)((Object)mask)));
+            case BSN_IN_PORTS_128:
+                return (OFOxm<F>)((Object)bsnInPorts128Masked((OFBitMask128)((Object)value), (OFBitMask128)((Object)mask)));
+            case BSN_L3_DST_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3DstClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
+            case BSN_L3_INTERFACE_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3InterfaceClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
+            case BSN_L3_SRC_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3SrcClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
+            case BSN_LAG_ID:
+                return (OFOxm<F>)((Object)bsnLagIdMasked((LagId)((Object)value), (LagId)((Object)mask)));
+            case BSN_TCP_FLAGS:
+                return (OFOxm<F>)((Object)bsnTcpFlagsMasked((U16)((Object)value), (U16)((Object)mask)));
+            case BSN_UDF0:
+                return (OFOxm<F>)((Object)bsnUdf0Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF1:
+                return (OFOxm<F>)((Object)bsnUdf1Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF2:
+                return (OFOxm<F>)((Object)bsnUdf2Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF3:
+                return (OFOxm<F>)((Object)bsnUdf3Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF4:
+                return (OFOxm<F>)((Object)bsnUdf4Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF5:
+                return (OFOxm<F>)((Object)bsnUdf5Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF6:
+                return (OFOxm<F>)((Object)bsnUdf6Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_UDF7:
+                return (OFOxm<F>)((Object)bsnUdf7Masked((UDF)((Object)value), (UDF)((Object)mask)));
+            case BSN_VLAN_XLATE_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
+            case BSN_VRF:
+                return (OFOxm<F>)((Object)bsnVrfMasked((VRF)((Object)value), (VRF)((Object)mask)));
+            case ETH_DST:
+                return (OFOxm<F>)((Object)ethDstMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case ETH_SRC:
+                return (OFOxm<F>)((Object)ethSrcMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case ETH_TYPE:
+                return (OFOxm<F>)((Object)ethTypeMasked((EthType)((Object)value), (EthType)((Object)mask)));
+            case ICMPV4_CODE:
+                return (OFOxm<F>)((Object)icmpv4CodeMasked((ICMPv4Code)((Object)value), (ICMPv4Code)((Object)mask)));
+            case ICMPV4_TYPE:
+                return (OFOxm<F>)((Object)icmpv4TypeMasked((ICMPv4Type)((Object)value), (ICMPv4Type)((Object)mask)));
+            case ICMPV6_CODE:
+                return (OFOxm<F>)((Object)icmpv6CodeMasked((U8)((Object)value), (U8)((Object)mask)));
+            case ICMPV6_TYPE:
+                return (OFOxm<F>)((Object)icmpv6TypeMasked((U8)((Object)value), (U8)((Object)mask)));
+            case IN_PHY_PORT:
+                return (OFOxm<F>)((Object)inPhyPortMasked((OFPort)((Object)value), (OFPort)((Object)mask)));
+            case IN_PORT:
+                return (OFOxm<F>)((Object)inPortMasked((OFPort)((Object)value), (OFPort)((Object)mask)));
+            case IP_DSCP:
+                return (OFOxm<F>)((Object)ipDscpMasked((IpDscp)((Object)value), (IpDscp)((Object)mask)));
+            case IP_ECN:
+                return (OFOxm<F>)((Object)ipEcnMasked((IpEcn)((Object)value), (IpEcn)((Object)mask)));
+            case IP_PROTO:
+                return (OFOxm<F>)((Object)ipProtoMasked((IpProtocol)((Object)value), (IpProtocol)((Object)mask)));
+            case IPV4_DST:
+                return (OFOxm<F>)((Object)ipv4DstMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
+            case IPV4_SRC:
+                return (OFOxm<F>)((Object)ipv4SrcMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
+            case IPV6_DST:
+                return (OFOxm<F>)((Object)ipv6DstMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
+            case IPV6_FLABEL:
+                return (OFOxm<F>)((Object)ipv6FlabelMasked((IPv6FlowLabel)((Object)value), (IPv6FlowLabel)((Object)mask)));
+            case IPV6_ND_SLL:
+                return (OFOxm<F>)((Object)ipv6NdSllMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case IPV6_ND_TARGET:
+                return (OFOxm<F>)((Object)ipv6NdTargetMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
+            case IPV6_ND_TLL:
+                return (OFOxm<F>)((Object)ipv6NdTllMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
+            case IPV6_SRC:
+                return (OFOxm<F>)((Object)ipv6SrcMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
+            case METADATA:
+                return (OFOxm<F>)((Object)metadataMasked((OFMetadata)((Object)value), (OFMetadata)((Object)mask)));
+            case MPLS_LABEL:
+                return (OFOxm<F>)((Object)mplsLabelMasked((U32)((Object)value), (U32)((Object)mask)));
+            case MPLS_TC:
+                return (OFOxm<F>)((Object)mplsTcMasked((U8)((Object)value), (U8)((Object)mask)));
+            case SCTP_DST:
+                return (OFOxm<F>)((Object)sctpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case SCTP_SRC:
+                return (OFOxm<F>)((Object)sctpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case TCP_DST:
+                return (OFOxm<F>)((Object)tcpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case TCP_SRC:
+                return (OFOxm<F>)((Object)tcpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case UDP_DST:
+                return (OFOxm<F>)((Object)udpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case UDP_SRC:
+                return (OFOxm<F>)((Object)udpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
+            case VLAN_PCP:
+                return (OFOxm<F>)((Object)vlanPcpMasked((VlanPcp)((Object)value), (VlanPcp)((Object)mask)));
+            case VLAN_VID:
+                return (OFOxm<F>)((Object)vlanVidMasked((OFVlanVidMatch)((Object)value), (OFVlanVidMatch)((Object)mask)));
+            case TUNNEL_ID:
+                return (OFOxm<F>)((Object)tunnelIdMasked((U64)((Object)value), (U64)((Object)mask)));
+            default:
+                throw new IllegalArgumentException("No OXM known for match field " + field);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public <F extends OFValueType<F>> OFOxm<F> fromMasked(Masked<F> masked, MatchField<F> field) {
+        switch (field.id) {
+            case ARP_OP:
+                return (OFOxm<F>)((Object)arpOpMasked((ArpOpcode)((Object)(masked.getValue())), (ArpOpcode)((Object)(masked.getMask()))));
+            case ARP_SHA:
+                return (OFOxm<F>)((Object)arpShaMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case ARP_SPA:
+                return (OFOxm<F>)((Object)arpSpaMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
+            case ARP_THA:
+                return (OFOxm<F>)((Object)arpThaMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case ARP_TPA:
+                return (OFOxm<F>)((Object)arpTpaMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
+            case BSN_EGR_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnEgrPortGroupIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
+            case BSN_GLOBAL_VRF_ALLOWED:
+                return (OFOxm<F>)((Object)bsnGlobalVrfAllowedMasked((OFBooleanValue)((Object)(masked.getValue())), (OFBooleanValue)((Object)(masked.getMask()))));
+            case BSN_IN_PORTS_128:
+                return (OFOxm<F>)((Object)bsnInPorts128Masked((OFBitMask128)((Object)(masked.getValue())), (OFBitMask128)((Object)(masked.getMask()))));
+            case BSN_L3_DST_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3DstClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
+            case BSN_L3_INTERFACE_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3InterfaceClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
+            case BSN_L3_SRC_CLASS_ID:
+                return (OFOxm<F>)((Object)bsnL3SrcClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
+            case BSN_LAG_ID:
+                return (OFOxm<F>)((Object)bsnLagIdMasked((LagId)((Object)(masked.getValue())), (LagId)((Object)(masked.getMask()))));
+            case BSN_TCP_FLAGS:
+                return (OFOxm<F>)((Object)bsnTcpFlagsMasked((U16)((Object)(masked.getValue())), (U16)((Object)(masked.getMask()))));
+            case BSN_UDF0:
+                return (OFOxm<F>)((Object)bsnUdf0Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF1:
+                return (OFOxm<F>)((Object)bsnUdf1Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF2:
+                return (OFOxm<F>)((Object)bsnUdf2Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF3:
+                return (OFOxm<F>)((Object)bsnUdf3Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF4:
+                return (OFOxm<F>)((Object)bsnUdf4Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF5:
+                return (OFOxm<F>)((Object)bsnUdf5Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF6:
+                return (OFOxm<F>)((Object)bsnUdf6Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_UDF7:
+                return (OFOxm<F>)((Object)bsnUdf7Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
+            case BSN_VLAN_XLATE_PORT_GROUP_ID:
+                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
+            case BSN_VRF:
+                return (OFOxm<F>)((Object)bsnVrfMasked((VRF)((Object)(masked.getValue())), (VRF)((Object)(masked.getMask()))));
+            case ETH_DST:
+                return (OFOxm<F>)((Object)ethDstMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case ETH_SRC:
+                return (OFOxm<F>)((Object)ethSrcMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case ETH_TYPE:
+                return (OFOxm<F>)((Object)ethTypeMasked((EthType)((Object)(masked.getValue())), (EthType)((Object)(masked.getMask()))));
+            case ICMPV4_CODE:
+                return (OFOxm<F>)((Object)icmpv4CodeMasked((ICMPv4Code)((Object)(masked.getValue())), (ICMPv4Code)((Object)(masked.getMask()))));
+            case ICMPV4_TYPE:
+                return (OFOxm<F>)((Object)icmpv4TypeMasked((ICMPv4Type)((Object)(masked.getValue())), (ICMPv4Type)((Object)(masked.getMask()))));
+            case ICMPV6_CODE:
+                return (OFOxm<F>)((Object)icmpv6CodeMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
+            case ICMPV6_TYPE:
+                return (OFOxm<F>)((Object)icmpv6TypeMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
+            case IN_PHY_PORT:
+                return (OFOxm<F>)((Object)inPhyPortMasked((OFPort)((Object)(masked.getValue())), (OFPort)((Object)(masked.getMask()))));
+            case IN_PORT:
+                return (OFOxm<F>)((Object)inPortMasked((OFPort)((Object)(masked.getValue())), (OFPort)((Object)(masked.getMask()))));
+            case IP_DSCP:
+                return (OFOxm<F>)((Object)ipDscpMasked((IpDscp)((Object)(masked.getValue())), (IpDscp)((Object)(masked.getMask()))));
+            case IP_ECN:
+                return (OFOxm<F>)((Object)ipEcnMasked((IpEcn)((Object)(masked.getValue())), (IpEcn)((Object)(masked.getMask()))));
+            case IP_PROTO:
+                return (OFOxm<F>)((Object)ipProtoMasked((IpProtocol)((Object)(masked.getValue())), (IpProtocol)((Object)(masked.getMask()))));
+            case IPV4_DST:
+                return (OFOxm<F>)((Object)ipv4DstMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
+            case IPV4_SRC:
+                return (OFOxm<F>)((Object)ipv4SrcMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
+            case IPV6_DST:
+                return (OFOxm<F>)((Object)ipv6DstMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
+            case IPV6_FLABEL:
+                return (OFOxm<F>)((Object)ipv6FlabelMasked((IPv6FlowLabel)((Object)(masked.getValue())), (IPv6FlowLabel)((Object)(masked.getMask()))));
+            case IPV6_ND_SLL:
+                return (OFOxm<F>)((Object)ipv6NdSllMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case IPV6_ND_TARGET:
+                return (OFOxm<F>)((Object)ipv6NdTargetMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
+            case IPV6_ND_TLL:
+                return (OFOxm<F>)((Object)ipv6NdTllMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
+            case IPV6_SRC:
+                return (OFOxm<F>)((Object)ipv6SrcMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
+            case METADATA:
+                return (OFOxm<F>)((Object)metadataMasked((OFMetadata)((Object)(masked.getValue())), (OFMetadata)((Object)(masked.getMask()))));
+            case MPLS_LABEL:
+                return (OFOxm<F>)((Object)mplsLabelMasked((U32)((Object)(masked.getValue())), (U32)((Object)(masked.getMask()))));
+            case MPLS_TC:
+                return (OFOxm<F>)((Object)mplsTcMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
+            case SCTP_DST:
+                return (OFOxm<F>)((Object)sctpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case SCTP_SRC:
+                return (OFOxm<F>)((Object)sctpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case TCP_DST:
+                return (OFOxm<F>)((Object)tcpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case TCP_SRC:
+                return (OFOxm<F>)((Object)tcpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case UDP_DST:
+                return (OFOxm<F>)((Object)udpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case UDP_SRC:
+                return (OFOxm<F>)((Object)udpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
+            case VLAN_PCP:
+                return (OFOxm<F>)((Object)vlanPcpMasked((VlanPcp)((Object)(masked.getValue())), (VlanPcp)((Object)(masked.getMask()))));
+            case VLAN_VID:
+                return (OFOxm<F>)((Object)vlanVidMasked((OFVlanVidMatch)((Object)(masked.getValue())), (OFVlanVidMatch)((Object)(masked.getMask()))));
+            case TUNNEL_ID:
+                return (OFOxm<F>)((Object)tunnelIdMasked((U64)((Object)(masked.getValue())), (U64)((Object)(masked.getMask()))));
+            default:
+                return null;
+        }
+    }
+
+    public OFVersion getVersion() {
+            return OFVersion.OF_13;
+    }
+}
