diff --git a/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFGroupStatsRequestVer12.java b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFGroupStatsRequestVer12.java
new file mode 100644
index 0000000..2e0d1ce
--- /dev/null
+++ b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver12/OFGroupStatsRequestVer12.java
@@ -0,0 +1,410 @@
+// 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 com.google.common.collect.ImmutableSet;
+import org.jboss.netty.buffer.ChannelBuffer;
+import com.google.common.hash.PrimitiveSink;
+import com.google.common.hash.Funnel;
+
+class OFGroupStatsRequestVer12 implements OFGroupStatsRequest {
+    private static final Logger logger = LoggerFactory.getLogger(OFGroupStatsRequestVer12.class);
+    // version: 1.2
+    final static byte WIRE_VERSION = 3;
+    final static int LENGTH = 24;
+
+        private final static long DEFAULT_XID = 0x0L;
+        private final static Set<OFStatsRequestFlags> DEFAULT_FLAGS = ImmutableSet.<OFStatsRequestFlags>of();
+        private final static OFGroup DEFAULT_GROUP_ID = OFGroup.ALL;
+
+    // OF message fields
+    private final long xid;
+    private final Set<OFStatsRequestFlags> flags;
+    private final OFGroup group;
+//
+    // Immutable default instance
+    final static OFGroupStatsRequestVer12 DEFAULT = new OFGroupStatsRequestVer12(
+        DEFAULT_XID, DEFAULT_FLAGS, DEFAULT_GROUP_ID
+    );
+
+    // package private constructor - used by readers, builders, and factory
+    OFGroupStatsRequestVer12(long xid, Set<OFStatsRequestFlags> flags, OFGroup group) {
+        this.xid = xid;
+        this.flags = flags;
+        this.group = group;
+    }
+
+    // Accessors for OF message fields
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+    @Override
+    public OFType getType() {
+        return OFType.STATS_REQUEST;
+    }
+
+    @Override
+    public long getXid() {
+        return xid;
+    }
+
+    @Override
+    public OFStatsType getStatsType() {
+        return OFStatsType.GROUP;
+    }
+
+    @Override
+    public Set<OFStatsRequestFlags> getFlags() {
+        return flags;
+    }
+
+    @Override
+    public OFGroup getGroup() {
+        return group;
+    }
+
+
+
+    public OFGroupStatsRequest.Builder createBuilder() {
+        return new BuilderWithParent(this);
+    }
+
+    static class BuilderWithParent implements OFGroupStatsRequest.Builder {
+        final OFGroupStatsRequestVer12 parentMessage;
+
+        // OF message fields
+        private boolean xidSet;
+        private long xid;
+        private boolean flagsSet;
+        private Set<OFStatsRequestFlags> flags;
+        private boolean groupSet;
+        private OFGroup group;
+
+        BuilderWithParent(OFGroupStatsRequestVer12 parentMessage) {
+            this.parentMessage = parentMessage;
+        }
+
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+    @Override
+    public OFType getType() {
+        return OFType.STATS_REQUEST;
+    }
+
+    @Override
+    public long getXid() {
+        return xid;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setXid(long xid) {
+        this.xid = xid;
+        this.xidSet = true;
+        return this;
+    }
+    @Override
+    public OFStatsType getStatsType() {
+        return OFStatsType.GROUP;
+    }
+
+    @Override
+    public Set<OFStatsRequestFlags> getFlags() {
+        return flags;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setFlags(Set<OFStatsRequestFlags> flags) {
+        this.flags = flags;
+        this.flagsSet = true;
+        return this;
+    }
+    @Override
+    public OFGroup getGroup() {
+        return group;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setGroup(OFGroup group) {
+        this.group = group;
+        this.groupSet = true;
+        return this;
+    }
+
+
+        @Override
+        public OFGroupStatsRequest build() {
+                long xid = this.xidSet ? this.xid : parentMessage.xid;
+                Set<OFStatsRequestFlags> flags = this.flagsSet ? this.flags : parentMessage.flags;
+                if(flags == null)
+                    throw new NullPointerException("Property flags must not be null");
+                OFGroup group = this.groupSet ? this.group : parentMessage.group;
+                if(group == null)
+                    throw new NullPointerException("Property group must not be null");
+
+                //
+                return new OFGroupStatsRequestVer12(
+                    xid,
+                    flags,
+                    group
+                );
+        }
+
+    }
+
+    static class Builder implements OFGroupStatsRequest.Builder {
+        // OF message fields
+        private boolean xidSet;
+        private long xid;
+        private boolean flagsSet;
+        private Set<OFStatsRequestFlags> flags;
+        private boolean groupSet;
+        private OFGroup group;
+
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_12;
+    }
+
+    @Override
+    public OFType getType() {
+        return OFType.STATS_REQUEST;
+    }
+
+    @Override
+    public long getXid() {
+        return xid;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setXid(long xid) {
+        this.xid = xid;
+        this.xidSet = true;
+        return this;
+    }
+    @Override
+    public OFStatsType getStatsType() {
+        return OFStatsType.GROUP;
+    }
+
+    @Override
+    public Set<OFStatsRequestFlags> getFlags() {
+        return flags;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setFlags(Set<OFStatsRequestFlags> flags) {
+        this.flags = flags;
+        this.flagsSet = true;
+        return this;
+    }
+    @Override
+    public OFGroup getGroup() {
+        return group;
+    }
+
+    @Override
+    public OFGroupStatsRequest.Builder setGroup(OFGroup group) {
+        this.group = group;
+        this.groupSet = true;
+        return this;
+    }
+//
+        @Override
+        public OFGroupStatsRequest build() {
+            long xid = this.xidSet ? this.xid : DEFAULT_XID;
+            Set<OFStatsRequestFlags> flags = this.flagsSet ? this.flags : DEFAULT_FLAGS;
+            if(flags == null)
+                throw new NullPointerException("Property flags must not be null");
+            OFGroup group = this.groupSet ? this.group : DEFAULT_GROUP_ID;
+            if(group == null)
+                throw new NullPointerException("Property group must not be null");
+
+
+            return new OFGroupStatsRequestVer12(
+                    xid,
+                    flags,
+                    group
+                );
+        }
+
+    }
+
+
+    final static Reader READER = new Reader();
+    static class Reader implements OFMessageReader<OFGroupStatsRequest> {
+        @Override
+        public OFGroupStatsRequest readFrom(ChannelBuffer bb) throws OFParseError {
+            int start = bb.readerIndex();
+            // fixed value property version == 3
+            byte version = bb.readByte();
+            if(version != (byte) 0x3)
+                throw new OFParseError("Wrong version: Expected=OFVersion.OF_12(3), got="+version);
+            // fixed value property type == 18
+            byte type = bb.readByte();
+            if(type != (byte) 0x12)
+                throw new OFParseError("Wrong type: Expected=OFType.STATS_REQUEST(18), got="+type);
+            int length = U16.f(bb.readShort());
+            if(length != 24)
+                throw new OFParseError("Wrong length: Expected=24(24), got="+length);
+            if(bb.readableBytes() + (bb.readerIndex() - start) < length) {
+                // Buffer does not have all data yet
+                bb.readerIndex(start);
+                return null;
+            }
+            if(logger.isTraceEnabled())
+                logger.trace("readFrom - length={}", length);
+            long xid = U32.f(bb.readInt());
+            // fixed value property statsType == 6
+            short statsType = bb.readShort();
+            if(statsType != (short) 0x6)
+                throw new OFParseError("Wrong statsType: Expected=OFStatsType.GROUP(6), got="+statsType);
+            Set<OFStatsRequestFlags> flags = OFStatsRequestFlagsSerializerVer12.readFrom(bb);
+            // pad: 4 bytes
+            bb.skipBytes(4);
+            OFGroup group = OFGroup.read4Bytes(bb);
+            // pad: 4 bytes
+            bb.skipBytes(4);
+
+            OFGroupStatsRequestVer12 groupStatsRequestVer12 = new OFGroupStatsRequestVer12(
+                    xid,
+                      flags,
+                      group
+                    );
+            if(logger.isTraceEnabled())
+                logger.trace("readFrom - read={}", groupStatsRequestVer12);
+            return groupStatsRequestVer12;
+        }
+    }
+
+    public void putTo(PrimitiveSink sink) {
+        FUNNEL.funnel(this, sink);
+    }
+
+    final static OFGroupStatsRequestVer12Funnel FUNNEL = new OFGroupStatsRequestVer12Funnel();
+    static class OFGroupStatsRequestVer12Funnel implements Funnel<OFGroupStatsRequestVer12> {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public void funnel(OFGroupStatsRequestVer12 message, PrimitiveSink sink) {
+            // fixed value property version = 3
+            sink.putByte((byte) 0x3);
+            // fixed value property type = 18
+            sink.putByte((byte) 0x12);
+            // fixed value property length = 24
+            sink.putShort((short) 0x18);
+            sink.putLong(message.xid);
+            // fixed value property statsType = 6
+            sink.putShort((short) 0x6);
+            OFStatsRequestFlagsSerializerVer12.putTo(message.flags, sink);
+            // skip pad (4 bytes)
+            message.group.putTo(sink);
+            // skip pad (4 bytes)
+        }
+    }
+
+
+    public void writeTo(ChannelBuffer bb) {
+        WRITER.write(bb, this);
+    }
+
+    final static Writer WRITER = new Writer();
+    static class Writer implements OFMessageWriter<OFGroupStatsRequestVer12> {
+        @Override
+        public void write(ChannelBuffer bb, OFGroupStatsRequestVer12 message) {
+            // fixed value property version = 3
+            bb.writeByte((byte) 0x3);
+            // fixed value property type = 18
+            bb.writeByte((byte) 0x12);
+            // fixed value property length = 24
+            bb.writeShort((short) 0x18);
+            bb.writeInt(U32.t(message.xid));
+            // fixed value property statsType = 6
+            bb.writeShort((short) 0x6);
+            OFStatsRequestFlagsSerializerVer12.writeTo(bb, message.flags);
+            // pad: 4 bytes
+            bb.writeZero(4);
+            message.group.write4Bytes(bb);
+            // pad: 4 bytes
+            bb.writeZero(4);
+
+
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder("OFGroupStatsRequestVer12(");
+        b.append("xid=").append(xid);
+        b.append(", ");
+        b.append("flags=").append(flags);
+        b.append(", ");
+        b.append("group=").append(group);
+        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;
+        OFGroupStatsRequestVer12 other = (OFGroupStatsRequestVer12) obj;
+
+        if( xid != other.xid)
+            return false;
+        if (flags == null) {
+            if (other.flags != null)
+                return false;
+        } else if (!flags.equals(other.flags))
+            return false;
+        if (group == null) {
+            if (other.group != null)
+                return false;
+        } else if (!group.equals(other.group))
+            return false;
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+
+        result = prime *  (int) (xid ^ (xid >>> 32));
+        result = prime * result + ((flags == null) ? 0 : flags.hashCode());
+        result = prime * result + ((group == null) ? 0 : group.hashCode());
+        return result;
+    }
+
+}
