diff --git a/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFPortStatsEntryVer12.java b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFPortStatsEntryVer12.java
new file mode 100644
index 0000000..555dd39
--- /dev/null
+++ b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFPortStatsEntryVer12.java
@@ -0,0 +1,928 @@
+// 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_class.java
+// Do not modify
+
+package org.projectfloodlight.openflow.protocol.ver12;
+
+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.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.Set;
+import org.jboss.netty.buffer.ChannelBuffer;
+import com.google.common.hash.PrimitiveSink;
+import com.google.common.hash.Funnel;
+
+class OFPortStatsEntryVer12 implements OFPortStatsEntry {
+    private static final Logger logger = LoggerFactory.getLogger(OFPortStatsEntryVer12.class);
+    // version: 1.2
+    final static byte WIRE_VERSION = 3;
+    final static int LENGTH = 104;
+
+        private final static OFPort DEFAULT_PORT_NO = OFPort.ANY;
+        private final static U64 DEFAULT_RX_PACKETS = U64.ZERO;
+        private final static U64 DEFAULT_TX_PACKETS = U64.ZERO;
+        private final static U64 DEFAULT_RX_BYTES = U64.ZERO;
+        private final static U64 DEFAULT_TX_BYTES = U64.ZERO;
+        private final static U64 DEFAULT_RX_DROPPED = U64.ZERO;
+        private final static U64 DEFAULT_TX_DROPPED = U64.ZERO;
+        private final static U64 DEFAULT_RX_ERRORS = U64.ZERO;
+        private final static U64 DEFAULT_TX_ERRORS = U64.ZERO;
+        private final static U64 DEFAULT_RX_FRAME_ERR = U64.ZERO;
+        private final static U64 DEFAULT_RX_OVER_ERR = U64.ZERO;
+        private final static U64 DEFAULT_RX_CRC_ERR = U64.ZERO;
+        private final static U64 DEFAULT_COLLISIONS = U64.ZERO;
+
+    // OF message fields
+    private final OFPort portNo;
+    private final U64 rxPackets;
+    private final U64 txPackets;
+    private final U64 rxBytes;
+    private final U64 txBytes;
+    private final U64 rxDropped;
+    private final U64 txDropped;
+    private final U64 rxErrors;
+    private final U64 txErrors;
+    private final U64 rxFrameErr;
+    private final U64 rxOverErr;
+    private final U64 rxCrcErr;
+    private final U64 collisions;
+//
+    // Immutable default instance
+    final static OFPortStatsEntryVer12 DEFAULT = new OFPortStatsEntryVer12(
+        DEFAULT_PORT_NO, DEFAULT_RX_PACKETS, DEFAULT_TX_PACKETS, DEFAULT_RX_BYTES, DEFAULT_TX_BYTES, DEFAULT_RX_DROPPED, DEFAULT_TX_DROPPED, DEFAULT_RX_ERRORS, DEFAULT_TX_ERRORS, DEFAULT_RX_FRAME_ERR, DEFAULT_RX_OVER_ERR, DEFAULT_RX_CRC_ERR, DEFAULT_COLLISIONS
+    );
+
+    // package private constructor - used by readers, builders, and factory
+    OFPortStatsEntryVer12(OFPort portNo, U64 rxPackets, U64 txPackets, U64 rxBytes, U64 txBytes, U64 rxDropped, U64 txDropped, U64 rxErrors, U64 txErrors, U64 rxFrameErr, U64 rxOverErr, U64 rxCrcErr, U64 collisions) {
+        this.portNo = portNo;
+        this.rxPackets = rxPackets;
+        this.txPackets = txPackets;
+        this.rxBytes = rxBytes;
+        this.txBytes = txBytes;
+        this.rxDropped = rxDropped;
+        this.txDropped = txDropped;
+        this.rxErrors = rxErrors;
+        this.txErrors = txErrors;
+        this.rxFrameErr = rxFrameErr;
+        this.rxOverErr = rxOverErr;
+        this.rxCrcErr = rxCrcErr;
+        this.collisions = collisions;
+    }
+
+    // Accessors for OF message fields
+    @Override
+    public OFPort getPortNo() {
+        return portNo;
+    }
+
+    @Override
+    public U64 getRxPackets() {
+        return rxPackets;
+    }
+
+    @Override
+    public U64 getTxPackets() {
+        return txPackets;
+    }
+
+    @Override
+    public U64 getRxBytes() {
+        return rxBytes;
+    }
+
+    @Override
+    public U64 getTxBytes() {
+        return txBytes;
+    }
+
+    @Override
+    public U64 getRxDropped() {
+        return rxDropped;
+    }
+
+    @Override
+    public U64 getTxDropped() {
+        return txDropped;
+    }
+
+    @Override
+    public U64 getRxErrors() {
+        return rxErrors;
+    }
+
+    @Override
+    public U64 getTxErrors() {
+        return txErrors;
+    }
+
+    @Override
+    public U64 getRxFrameErr() {
+        return rxFrameErr;
+    }
+
+    @Override
+    public U64 getRxOverErr() {
+        return rxOverErr;
+    }
+
+    @Override
+    public U64 getRxCrcErr() {
+        return rxCrcErr;
+    }
+
+    @Override
+    public U64 getCollisions() {
+        return collisions;
+    }
+
+    @Override
+    public long getDurationSec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationSec not supported in version 1.2");
+    }
+
+    @Override
+    public long getDurationNsec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationNsec not supported in version 1.2");
+    }
+
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+
+
+    public OFPortStatsEntry.Builder createBuilder() {
+        return new BuilderWithParent(this);
+    }
+
+    static class BuilderWithParent implements OFPortStatsEntry.Builder {
+        final OFPortStatsEntryVer12 parentMessage;
+
+        // OF message fields
+        private boolean portNoSet;
+        private OFPort portNo;
+        private boolean rxPacketsSet;
+        private U64 rxPackets;
+        private boolean txPacketsSet;
+        private U64 txPackets;
+        private boolean rxBytesSet;
+        private U64 rxBytes;
+        private boolean txBytesSet;
+        private U64 txBytes;
+        private boolean rxDroppedSet;
+        private U64 rxDropped;
+        private boolean txDroppedSet;
+        private U64 txDropped;
+        private boolean rxErrorsSet;
+        private U64 rxErrors;
+        private boolean txErrorsSet;
+        private U64 txErrors;
+        private boolean rxFrameErrSet;
+        private U64 rxFrameErr;
+        private boolean rxOverErrSet;
+        private U64 rxOverErr;
+        private boolean rxCrcErrSet;
+        private U64 rxCrcErr;
+        private boolean collisionsSet;
+        private U64 collisions;
+
+        BuilderWithParent(OFPortStatsEntryVer12 parentMessage) {
+            this.parentMessage = parentMessage;
+        }
+
+    @Override
+    public OFPort getPortNo() {
+        return portNo;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setPortNo(OFPort portNo) {
+        this.portNo = portNo;
+        this.portNoSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxPackets() {
+        return rxPackets;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxPackets(U64 rxPackets) {
+        this.rxPackets = rxPackets;
+        this.rxPacketsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxPackets() {
+        return txPackets;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxPackets(U64 txPackets) {
+        this.txPackets = txPackets;
+        this.txPacketsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxBytes() {
+        return rxBytes;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxBytes(U64 rxBytes) {
+        this.rxBytes = rxBytes;
+        this.rxBytesSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxBytes() {
+        return txBytes;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxBytes(U64 txBytes) {
+        this.txBytes = txBytes;
+        this.txBytesSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxDropped() {
+        return rxDropped;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxDropped(U64 rxDropped) {
+        this.rxDropped = rxDropped;
+        this.rxDroppedSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxDropped() {
+        return txDropped;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxDropped(U64 txDropped) {
+        this.txDropped = txDropped;
+        this.txDroppedSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxErrors() {
+        return rxErrors;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxErrors(U64 rxErrors) {
+        this.rxErrors = rxErrors;
+        this.rxErrorsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxErrors() {
+        return txErrors;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxErrors(U64 txErrors) {
+        this.txErrors = txErrors;
+        this.txErrorsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxFrameErr() {
+        return rxFrameErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxFrameErr(U64 rxFrameErr) {
+        this.rxFrameErr = rxFrameErr;
+        this.rxFrameErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxOverErr() {
+        return rxOverErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxOverErr(U64 rxOverErr) {
+        this.rxOverErr = rxOverErr;
+        this.rxOverErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxCrcErr() {
+        return rxCrcErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxCrcErr(U64 rxCrcErr) {
+        this.rxCrcErr = rxCrcErr;
+        this.rxCrcErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getCollisions() {
+        return collisions;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setCollisions(U64 collisions) {
+        this.collisions = collisions;
+        this.collisionsSet = true;
+        return this;
+    }
+    @Override
+    public long getDurationSec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationSec not supported in version 1.2");
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setDurationSec(long durationSec) throws UnsupportedOperationException {
+            throw new UnsupportedOperationException("Property durationSec not supported in version 1.2");
+    }
+    @Override
+    public long getDurationNsec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationNsec not supported in version 1.2");
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setDurationNsec(long durationNsec) throws UnsupportedOperationException {
+            throw new UnsupportedOperationException("Property durationNsec not supported in version 1.2");
+    }
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+
+
+        @Override
+        public OFPortStatsEntry build() {
+                OFPort portNo = this.portNoSet ? this.portNo : parentMessage.portNo;
+                if(portNo == null)
+                    throw new NullPointerException("Property portNo must not be null");
+                U64 rxPackets = this.rxPacketsSet ? this.rxPackets : parentMessage.rxPackets;
+                if(rxPackets == null)
+                    throw new NullPointerException("Property rxPackets must not be null");
+                U64 txPackets = this.txPacketsSet ? this.txPackets : parentMessage.txPackets;
+                if(txPackets == null)
+                    throw new NullPointerException("Property txPackets must not be null");
+                U64 rxBytes = this.rxBytesSet ? this.rxBytes : parentMessage.rxBytes;
+                if(rxBytes == null)
+                    throw new NullPointerException("Property rxBytes must not be null");
+                U64 txBytes = this.txBytesSet ? this.txBytes : parentMessage.txBytes;
+                if(txBytes == null)
+                    throw new NullPointerException("Property txBytes must not be null");
+                U64 rxDropped = this.rxDroppedSet ? this.rxDropped : parentMessage.rxDropped;
+                if(rxDropped == null)
+                    throw new NullPointerException("Property rxDropped must not be null");
+                U64 txDropped = this.txDroppedSet ? this.txDropped : parentMessage.txDropped;
+                if(txDropped == null)
+                    throw new NullPointerException("Property txDropped must not be null");
+                U64 rxErrors = this.rxErrorsSet ? this.rxErrors : parentMessage.rxErrors;
+                if(rxErrors == null)
+                    throw new NullPointerException("Property rxErrors must not be null");
+                U64 txErrors = this.txErrorsSet ? this.txErrors : parentMessage.txErrors;
+                if(txErrors == null)
+                    throw new NullPointerException("Property txErrors must not be null");
+                U64 rxFrameErr = this.rxFrameErrSet ? this.rxFrameErr : parentMessage.rxFrameErr;
+                if(rxFrameErr == null)
+                    throw new NullPointerException("Property rxFrameErr must not be null");
+                U64 rxOverErr = this.rxOverErrSet ? this.rxOverErr : parentMessage.rxOverErr;
+                if(rxOverErr == null)
+                    throw new NullPointerException("Property rxOverErr must not be null");
+                U64 rxCrcErr = this.rxCrcErrSet ? this.rxCrcErr : parentMessage.rxCrcErr;
+                if(rxCrcErr == null)
+                    throw new NullPointerException("Property rxCrcErr must not be null");
+                U64 collisions = this.collisionsSet ? this.collisions : parentMessage.collisions;
+                if(collisions == null)
+                    throw new NullPointerException("Property collisions must not be null");
+
+                //
+                return new OFPortStatsEntryVer12(
+                    portNo,
+                    rxPackets,
+                    txPackets,
+                    rxBytes,
+                    txBytes,
+                    rxDropped,
+                    txDropped,
+                    rxErrors,
+                    txErrors,
+                    rxFrameErr,
+                    rxOverErr,
+                    rxCrcErr,
+                    collisions
+                );
+        }
+
+    }
+
+    static class Builder implements OFPortStatsEntry.Builder {
+        // OF message fields
+        private boolean portNoSet;
+        private OFPort portNo;
+        private boolean rxPacketsSet;
+        private U64 rxPackets;
+        private boolean txPacketsSet;
+        private U64 txPackets;
+        private boolean rxBytesSet;
+        private U64 rxBytes;
+        private boolean txBytesSet;
+        private U64 txBytes;
+        private boolean rxDroppedSet;
+        private U64 rxDropped;
+        private boolean txDroppedSet;
+        private U64 txDropped;
+        private boolean rxErrorsSet;
+        private U64 rxErrors;
+        private boolean txErrorsSet;
+        private U64 txErrors;
+        private boolean rxFrameErrSet;
+        private U64 rxFrameErr;
+        private boolean rxOverErrSet;
+        private U64 rxOverErr;
+        private boolean rxCrcErrSet;
+        private U64 rxCrcErr;
+        private boolean collisionsSet;
+        private U64 collisions;
+
+    @Override
+    public OFPort getPortNo() {
+        return portNo;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setPortNo(OFPort portNo) {
+        this.portNo = portNo;
+        this.portNoSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxPackets() {
+        return rxPackets;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxPackets(U64 rxPackets) {
+        this.rxPackets = rxPackets;
+        this.rxPacketsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxPackets() {
+        return txPackets;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxPackets(U64 txPackets) {
+        this.txPackets = txPackets;
+        this.txPacketsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxBytes() {
+        return rxBytes;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxBytes(U64 rxBytes) {
+        this.rxBytes = rxBytes;
+        this.rxBytesSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxBytes() {
+        return txBytes;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxBytes(U64 txBytes) {
+        this.txBytes = txBytes;
+        this.txBytesSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxDropped() {
+        return rxDropped;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxDropped(U64 rxDropped) {
+        this.rxDropped = rxDropped;
+        this.rxDroppedSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxDropped() {
+        return txDropped;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxDropped(U64 txDropped) {
+        this.txDropped = txDropped;
+        this.txDroppedSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxErrors() {
+        return rxErrors;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxErrors(U64 rxErrors) {
+        this.rxErrors = rxErrors;
+        this.rxErrorsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getTxErrors() {
+        return txErrors;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setTxErrors(U64 txErrors) {
+        this.txErrors = txErrors;
+        this.txErrorsSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxFrameErr() {
+        return rxFrameErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxFrameErr(U64 rxFrameErr) {
+        this.rxFrameErr = rxFrameErr;
+        this.rxFrameErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxOverErr() {
+        return rxOverErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxOverErr(U64 rxOverErr) {
+        this.rxOverErr = rxOverErr;
+        this.rxOverErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getRxCrcErr() {
+        return rxCrcErr;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setRxCrcErr(U64 rxCrcErr) {
+        this.rxCrcErr = rxCrcErr;
+        this.rxCrcErrSet = true;
+        return this;
+    }
+    @Override
+    public U64 getCollisions() {
+        return collisions;
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setCollisions(U64 collisions) {
+        this.collisions = collisions;
+        this.collisionsSet = true;
+        return this;
+    }
+    @Override
+    public long getDurationSec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationSec not supported in version 1.2");
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setDurationSec(long durationSec) throws UnsupportedOperationException {
+            throw new UnsupportedOperationException("Property durationSec not supported in version 1.2");
+    }
+    @Override
+    public long getDurationNsec()throws UnsupportedOperationException {
+        throw new UnsupportedOperationException("Property durationNsec not supported in version 1.2");
+    }
+
+    @Override
+    public OFPortStatsEntry.Builder setDurationNsec(long durationNsec) throws UnsupportedOperationException {
+            throw new UnsupportedOperationException("Property durationNsec not supported in version 1.2");
+    }
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+//
+        @Override
+        public OFPortStatsEntry build() {
+            OFPort portNo = this.portNoSet ? this.portNo : DEFAULT_PORT_NO;
+            if(portNo == null)
+                throw new NullPointerException("Property portNo must not be null");
+            U64 rxPackets = this.rxPacketsSet ? this.rxPackets : DEFAULT_RX_PACKETS;
+            if(rxPackets == null)
+                throw new NullPointerException("Property rxPackets must not be null");
+            U64 txPackets = this.txPacketsSet ? this.txPackets : DEFAULT_TX_PACKETS;
+            if(txPackets == null)
+                throw new NullPointerException("Property txPackets must not be null");
+            U64 rxBytes = this.rxBytesSet ? this.rxBytes : DEFAULT_RX_BYTES;
+            if(rxBytes == null)
+                throw new NullPointerException("Property rxBytes must not be null");
+            U64 txBytes = this.txBytesSet ? this.txBytes : DEFAULT_TX_BYTES;
+            if(txBytes == null)
+                throw new NullPointerException("Property txBytes must not be null");
+            U64 rxDropped = this.rxDroppedSet ? this.rxDropped : DEFAULT_RX_DROPPED;
+            if(rxDropped == null)
+                throw new NullPointerException("Property rxDropped must not be null");
+            U64 txDropped = this.txDroppedSet ? this.txDropped : DEFAULT_TX_DROPPED;
+            if(txDropped == null)
+                throw new NullPointerException("Property txDropped must not be null");
+            U64 rxErrors = this.rxErrorsSet ? this.rxErrors : DEFAULT_RX_ERRORS;
+            if(rxErrors == null)
+                throw new NullPointerException("Property rxErrors must not be null");
+            U64 txErrors = this.txErrorsSet ? this.txErrors : DEFAULT_TX_ERRORS;
+            if(txErrors == null)
+                throw new NullPointerException("Property txErrors must not be null");
+            U64 rxFrameErr = this.rxFrameErrSet ? this.rxFrameErr : DEFAULT_RX_FRAME_ERR;
+            if(rxFrameErr == null)
+                throw new NullPointerException("Property rxFrameErr must not be null");
+            U64 rxOverErr = this.rxOverErrSet ? this.rxOverErr : DEFAULT_RX_OVER_ERR;
+            if(rxOverErr == null)
+                throw new NullPointerException("Property rxOverErr must not be null");
+            U64 rxCrcErr = this.rxCrcErrSet ? this.rxCrcErr : DEFAULT_RX_CRC_ERR;
+            if(rxCrcErr == null)
+                throw new NullPointerException("Property rxCrcErr must not be null");
+            U64 collisions = this.collisionsSet ? this.collisions : DEFAULT_COLLISIONS;
+            if(collisions == null)
+                throw new NullPointerException("Property collisions must not be null");
+
+
+            return new OFPortStatsEntryVer12(
+                    portNo,
+                    rxPackets,
+                    txPackets,
+                    rxBytes,
+                    txBytes,
+                    rxDropped,
+                    txDropped,
+                    rxErrors,
+                    txErrors,
+                    rxFrameErr,
+                    rxOverErr,
+                    rxCrcErr,
+                    collisions
+                );
+        }
+
+    }
+
+
+    final static Reader READER = new Reader();
+    static class Reader implements OFMessageReader<OFPortStatsEntry> {
+        @Override
+        public OFPortStatsEntry readFrom(ChannelBuffer bb) throws OFParseError {
+            OFPort portNo = OFPort.read4Bytes(bb);
+            // pad: 4 bytes
+            bb.skipBytes(4);
+            U64 rxPackets = U64.ofRaw(bb.readLong());
+            U64 txPackets = U64.ofRaw(bb.readLong());
+            U64 rxBytes = U64.ofRaw(bb.readLong());
+            U64 txBytes = U64.ofRaw(bb.readLong());
+            U64 rxDropped = U64.ofRaw(bb.readLong());
+            U64 txDropped = U64.ofRaw(bb.readLong());
+            U64 rxErrors = U64.ofRaw(bb.readLong());
+            U64 txErrors = U64.ofRaw(bb.readLong());
+            U64 rxFrameErr = U64.ofRaw(bb.readLong());
+            U64 rxOverErr = U64.ofRaw(bb.readLong());
+            U64 rxCrcErr = U64.ofRaw(bb.readLong());
+            U64 collisions = U64.ofRaw(bb.readLong());
+
+            OFPortStatsEntryVer12 portStatsEntryVer12 = new OFPortStatsEntryVer12(
+                    portNo,
+                      rxPackets,
+                      txPackets,
+                      rxBytes,
+                      txBytes,
+                      rxDropped,
+                      txDropped,
+                      rxErrors,
+                      txErrors,
+                      rxFrameErr,
+                      rxOverErr,
+                      rxCrcErr,
+                      collisions
+                    );
+            if(logger.isTraceEnabled())
+                logger.trace("readFrom - read={}", portStatsEntryVer12);
+            return portStatsEntryVer12;
+        }
+    }
+
+    public void putTo(PrimitiveSink sink) {
+        FUNNEL.funnel(this, sink);
+    }
+
+    final static OFPortStatsEntryVer12Funnel FUNNEL = new OFPortStatsEntryVer12Funnel();
+    static class OFPortStatsEntryVer12Funnel implements Funnel<OFPortStatsEntryVer12> {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public void funnel(OFPortStatsEntryVer12 message, PrimitiveSink sink) {
+            message.portNo.putTo(sink);
+            // skip pad (4 bytes)
+            message.rxPackets.putTo(sink);
+            message.txPackets.putTo(sink);
+            message.rxBytes.putTo(sink);
+            message.txBytes.putTo(sink);
+            message.rxDropped.putTo(sink);
+            message.txDropped.putTo(sink);
+            message.rxErrors.putTo(sink);
+            message.txErrors.putTo(sink);
+            message.rxFrameErr.putTo(sink);
+            message.rxOverErr.putTo(sink);
+            message.rxCrcErr.putTo(sink);
+            message.collisions.putTo(sink);
+        }
+    }
+
+
+    public void writeTo(ChannelBuffer bb) {
+        WRITER.write(bb, this);
+    }
+
+    final static Writer WRITER = new Writer();
+    static class Writer implements OFMessageWriter<OFPortStatsEntryVer12> {
+        @Override
+        public void write(ChannelBuffer bb, OFPortStatsEntryVer12 message) {
+            message.portNo.write4Bytes(bb);
+            // pad: 4 bytes
+            bb.writeZero(4);
+            bb.writeLong(message.rxPackets.getValue());
+            bb.writeLong(message.txPackets.getValue());
+            bb.writeLong(message.rxBytes.getValue());
+            bb.writeLong(message.txBytes.getValue());
+            bb.writeLong(message.rxDropped.getValue());
+            bb.writeLong(message.txDropped.getValue());
+            bb.writeLong(message.rxErrors.getValue());
+            bb.writeLong(message.txErrors.getValue());
+            bb.writeLong(message.rxFrameErr.getValue());
+            bb.writeLong(message.rxOverErr.getValue());
+            bb.writeLong(message.rxCrcErr.getValue());
+            bb.writeLong(message.collisions.getValue());
+
+
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder("OFPortStatsEntryVer12(");
+        b.append("portNo=").append(portNo);
+        b.append(", ");
+        b.append("rxPackets=").append(rxPackets);
+        b.append(", ");
+        b.append("txPackets=").append(txPackets);
+        b.append(", ");
+        b.append("rxBytes=").append(rxBytes);
+        b.append(", ");
+        b.append("txBytes=").append(txBytes);
+        b.append(", ");
+        b.append("rxDropped=").append(rxDropped);
+        b.append(", ");
+        b.append("txDropped=").append(txDropped);
+        b.append(", ");
+        b.append("rxErrors=").append(rxErrors);
+        b.append(", ");
+        b.append("txErrors=").append(txErrors);
+        b.append(", ");
+        b.append("rxFrameErr=").append(rxFrameErr);
+        b.append(", ");
+        b.append("rxOverErr=").append(rxOverErr);
+        b.append(", ");
+        b.append("rxCrcErr=").append(rxCrcErr);
+        b.append(", ");
+        b.append("collisions=").append(collisions);
+        b.append(")");
+        return b.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        OFPortStatsEntryVer12 other = (OFPortStatsEntryVer12) obj;
+
+        if (portNo == null) {
+            if (other.portNo != null)
+                return false;
+        } else if (!portNo.equals(other.portNo))
+            return false;
+        if (rxPackets == null) {
+            if (other.rxPackets != null)
+                return false;
+        } else if (!rxPackets.equals(other.rxPackets))
+            return false;
+        if (txPackets == null) {
+            if (other.txPackets != null)
+                return false;
+        } else if (!txPackets.equals(other.txPackets))
+            return false;
+        if (rxBytes == null) {
+            if (other.rxBytes != null)
+                return false;
+        } else if (!rxBytes.equals(other.rxBytes))
+            return false;
+        if (txBytes == null) {
+            if (other.txBytes != null)
+                return false;
+        } else if (!txBytes.equals(other.txBytes))
+            return false;
+        if (rxDropped == null) {
+            if (other.rxDropped != null)
+                return false;
+        } else if (!rxDropped.equals(other.rxDropped))
+            return false;
+        if (txDropped == null) {
+            if (other.txDropped != null)
+                return false;
+        } else if (!txDropped.equals(other.txDropped))
+            return false;
+        if (rxErrors == null) {
+            if (other.rxErrors != null)
+                return false;
+        } else if (!rxErrors.equals(other.rxErrors))
+            return false;
+        if (txErrors == null) {
+            if (other.txErrors != null)
+                return false;
+        } else if (!txErrors.equals(other.txErrors))
+            return false;
+        if (rxFrameErr == null) {
+            if (other.rxFrameErr != null)
+                return false;
+        } else if (!rxFrameErr.equals(other.rxFrameErr))
+            return false;
+        if (rxOverErr == null) {
+            if (other.rxOverErr != null)
+                return false;
+        } else if (!rxOverErr.equals(other.rxOverErr))
+            return false;
+        if (rxCrcErr == null) {
+            if (other.rxCrcErr != null)
+                return false;
+        } else if (!rxCrcErr.equals(other.rxCrcErr))
+            return false;
+        if (collisions == null) {
+            if (other.collisions != null)
+                return false;
+        } else if (!collisions.equals(other.collisions))
+            return false;
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+
+        result = prime * result + ((portNo == null) ? 0 : portNo.hashCode());
+        result = prime * result + ((rxPackets == null) ? 0 : rxPackets.hashCode());
+        result = prime * result + ((txPackets == null) ? 0 : txPackets.hashCode());
+        result = prime * result + ((rxBytes == null) ? 0 : rxBytes.hashCode());
+        result = prime * result + ((txBytes == null) ? 0 : txBytes.hashCode());
+        result = prime * result + ((rxDropped == null) ? 0 : rxDropped.hashCode());
+        result = prime * result + ((txDropped == null) ? 0 : txDropped.hashCode());
+        result = prime * result + ((rxErrors == null) ? 0 : rxErrors.hashCode());
+        result = prime * result + ((txErrors == null) ? 0 : txErrors.hashCode());
+        result = prime * result + ((rxFrameErr == null) ? 0 : rxFrameErr.hashCode());
+        result = prime * result + ((rxOverErr == null) ? 0 : rxOverErr.hashCode());
+        result = prime * result + ((rxCrcErr == null) ? 0 : rxCrcErr.hashCode());
+        result = prime * result + ((collisions == null) ? 0 : collisions.hashCode());
+        return result;
+    }
+
+}
