diff --git a/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFMeterFeaturesVer13.java b/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFMeterFeaturesVer13.java
new file mode 100644
index 0000000..a1168da
--- /dev/null
+++ b/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFMeterFeaturesVer13.java
@@ -0,0 +1,415 @@
+// 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.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.*;
+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 OFMeterFeaturesVer13 implements OFMeterFeatures {
+    private static final Logger logger = LoggerFactory.getLogger(OFMeterFeaturesVer13.class);
+    // version: 1.3
+    final static byte WIRE_VERSION = 4;
+    final static int LENGTH = 16;
+
+        private final static long DEFAULT_MAX_METER = 0x0L;
+        private final static long DEFAULT_BAND_TYPES = 0x0L;
+        private final static long DEFAULT_CAPABILITIES = 0x0L;
+        private final static short DEFAULT_MAX_BANDS = (short) 0x0;
+        private final static short DEFAULT_MAX_COLOR = (short) 0x0;
+
+    // OF message fields
+    private final long maxMeter;
+    private final long bandTypes;
+    private final long capabilities;
+    private final short maxBands;
+    private final short maxColor;
+//
+    // Immutable default instance
+    final static OFMeterFeaturesVer13 DEFAULT = new OFMeterFeaturesVer13(
+        DEFAULT_MAX_METER, DEFAULT_BAND_TYPES, DEFAULT_CAPABILITIES, DEFAULT_MAX_BANDS, DEFAULT_MAX_COLOR
+    );
+
+    // package private constructor - used by readers, builders, and factory
+    OFMeterFeaturesVer13(long maxMeter, long bandTypes, long capabilities, short maxBands, short maxColor) {
+        this.maxMeter = maxMeter;
+        this.bandTypes = bandTypes;
+        this.capabilities = capabilities;
+        this.maxBands = maxBands;
+        this.maxColor = maxColor;
+    }
+
+    // Accessors for OF message fields
+    @Override
+    public long getMaxMeter() {
+        return maxMeter;
+    }
+
+    @Override
+    public long getBandTypes() {
+        return bandTypes;
+    }
+
+    @Override
+    public long getCapabilities() {
+        return capabilities;
+    }
+
+    @Override
+    public short getMaxBands() {
+        return maxBands;
+    }
+
+    @Override
+    public short getMaxColor() {
+        return maxColor;
+    }
+
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_13;
+    }
+
+
+
+    public OFMeterFeatures.Builder createBuilder() {
+        return new BuilderWithParent(this);
+    }
+
+    static class BuilderWithParent implements OFMeterFeatures.Builder {
+        final OFMeterFeaturesVer13 parentMessage;
+
+        // OF message fields
+        private boolean maxMeterSet;
+        private long maxMeter;
+        private boolean bandTypesSet;
+        private long bandTypes;
+        private boolean capabilitiesSet;
+        private long capabilities;
+        private boolean maxBandsSet;
+        private short maxBands;
+        private boolean maxColorSet;
+        private short maxColor;
+
+        BuilderWithParent(OFMeterFeaturesVer13 parentMessage) {
+            this.parentMessage = parentMessage;
+        }
+
+    @Override
+    public long getMaxMeter() {
+        return maxMeter;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxMeter(long maxMeter) {
+        this.maxMeter = maxMeter;
+        this.maxMeterSet = true;
+        return this;
+    }
+    @Override
+    public long getBandTypes() {
+        return bandTypes;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setBandTypes(long bandTypes) {
+        this.bandTypes = bandTypes;
+        this.bandTypesSet = true;
+        return this;
+    }
+    @Override
+    public long getCapabilities() {
+        return capabilities;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setCapabilities(long capabilities) {
+        this.capabilities = capabilities;
+        this.capabilitiesSet = true;
+        return this;
+    }
+    @Override
+    public short getMaxBands() {
+        return maxBands;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxBands(short maxBands) {
+        this.maxBands = maxBands;
+        this.maxBandsSet = true;
+        return this;
+    }
+    @Override
+    public short getMaxColor() {
+        return maxColor;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxColor(short maxColor) {
+        this.maxColor = maxColor;
+        this.maxColorSet = true;
+        return this;
+    }
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_13;
+    }
+
+
+
+        @Override
+        public OFMeterFeatures build() {
+                long maxMeter = this.maxMeterSet ? this.maxMeter : parentMessage.maxMeter;
+                long bandTypes = this.bandTypesSet ? this.bandTypes : parentMessage.bandTypes;
+                long capabilities = this.capabilitiesSet ? this.capabilities : parentMessage.capabilities;
+                short maxBands = this.maxBandsSet ? this.maxBands : parentMessage.maxBands;
+                short maxColor = this.maxColorSet ? this.maxColor : parentMessage.maxColor;
+
+                //
+                return new OFMeterFeaturesVer13(
+                    maxMeter,
+                    bandTypes,
+                    capabilities,
+                    maxBands,
+                    maxColor
+                );
+        }
+
+    }
+
+    static class Builder implements OFMeterFeatures.Builder {
+        // OF message fields
+        private boolean maxMeterSet;
+        private long maxMeter;
+        private boolean bandTypesSet;
+        private long bandTypes;
+        private boolean capabilitiesSet;
+        private long capabilities;
+        private boolean maxBandsSet;
+        private short maxBands;
+        private boolean maxColorSet;
+        private short maxColor;
+
+    @Override
+    public long getMaxMeter() {
+        return maxMeter;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxMeter(long maxMeter) {
+        this.maxMeter = maxMeter;
+        this.maxMeterSet = true;
+        return this;
+    }
+    @Override
+    public long getBandTypes() {
+        return bandTypes;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setBandTypes(long bandTypes) {
+        this.bandTypes = bandTypes;
+        this.bandTypesSet = true;
+        return this;
+    }
+    @Override
+    public long getCapabilities() {
+        return capabilities;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setCapabilities(long capabilities) {
+        this.capabilities = capabilities;
+        this.capabilitiesSet = true;
+        return this;
+    }
+    @Override
+    public short getMaxBands() {
+        return maxBands;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxBands(short maxBands) {
+        this.maxBands = maxBands;
+        this.maxBandsSet = true;
+        return this;
+    }
+    @Override
+    public short getMaxColor() {
+        return maxColor;
+    }
+
+    @Override
+    public OFMeterFeatures.Builder setMaxColor(short maxColor) {
+        this.maxColor = maxColor;
+        this.maxColorSet = true;
+        return this;
+    }
+    @Override
+    public OFVersion getVersion() {
+        return OFVersion.OF_13;
+    }
+
+//
+        @Override
+        public OFMeterFeatures build() {
+            long maxMeter = this.maxMeterSet ? this.maxMeter : DEFAULT_MAX_METER;
+            long bandTypes = this.bandTypesSet ? this.bandTypes : DEFAULT_BAND_TYPES;
+            long capabilities = this.capabilitiesSet ? this.capabilities : DEFAULT_CAPABILITIES;
+            short maxBands = this.maxBandsSet ? this.maxBands : DEFAULT_MAX_BANDS;
+            short maxColor = this.maxColorSet ? this.maxColor : DEFAULT_MAX_COLOR;
+
+
+            return new OFMeterFeaturesVer13(
+                    maxMeter,
+                    bandTypes,
+                    capabilities,
+                    maxBands,
+                    maxColor
+                );
+        }
+
+    }
+
+
+    final static Reader READER = new Reader();
+    static class Reader implements OFMessageReader<OFMeterFeatures> {
+        @Override
+        public OFMeterFeatures readFrom(ChannelBuffer bb) throws OFParseError {
+            long maxMeter = U32.f(bb.readInt());
+            long bandTypes = U32.f(bb.readInt());
+            long capabilities = U32.f(bb.readInt());
+            short maxBands = U8.f(bb.readByte());
+            short maxColor = U8.f(bb.readByte());
+            // pad: 2 bytes
+            bb.skipBytes(2);
+
+            OFMeterFeaturesVer13 meterFeaturesVer13 = new OFMeterFeaturesVer13(
+                    maxMeter,
+                      bandTypes,
+                      capabilities,
+                      maxBands,
+                      maxColor
+                    );
+            if(logger.isTraceEnabled())
+                logger.trace("readFrom - read={}", meterFeaturesVer13);
+            return meterFeaturesVer13;
+        }
+    }
+
+    public void putTo(PrimitiveSink sink) {
+        FUNNEL.funnel(this, sink);
+    }
+
+    final static OFMeterFeaturesVer13Funnel FUNNEL = new OFMeterFeaturesVer13Funnel();
+    static class OFMeterFeaturesVer13Funnel implements Funnel<OFMeterFeaturesVer13> {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public void funnel(OFMeterFeaturesVer13 message, PrimitiveSink sink) {
+            sink.putLong(message.maxMeter);
+            sink.putLong(message.bandTypes);
+            sink.putLong(message.capabilities);
+            sink.putShort(message.maxBands);
+            sink.putShort(message.maxColor);
+            // skip pad (2 bytes)
+        }
+    }
+
+
+    public void writeTo(ChannelBuffer bb) {
+        WRITER.write(bb, this);
+    }
+
+    final static Writer WRITER = new Writer();
+    static class Writer implements OFMessageWriter<OFMeterFeaturesVer13> {
+        @Override
+        public void write(ChannelBuffer bb, OFMeterFeaturesVer13 message) {
+            bb.writeInt(U32.t(message.maxMeter));
+            bb.writeInt(U32.t(message.bandTypes));
+            bb.writeInt(U32.t(message.capabilities));
+            bb.writeByte(U8.t(message.maxBands));
+            bb.writeByte(U8.t(message.maxColor));
+            // pad: 2 bytes
+            bb.writeZero(2);
+
+
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder("OFMeterFeaturesVer13(");
+        b.append("maxMeter=").append(maxMeter);
+        b.append(", ");
+        b.append("bandTypes=").append(bandTypes);
+        b.append(", ");
+        b.append("capabilities=").append(capabilities);
+        b.append(", ");
+        b.append("maxBands=").append(maxBands);
+        b.append(", ");
+        b.append("maxColor=").append(maxColor);
+        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;
+        OFMeterFeaturesVer13 other = (OFMeterFeaturesVer13) obj;
+
+        if( maxMeter != other.maxMeter)
+            return false;
+        if( bandTypes != other.bandTypes)
+            return false;
+        if( capabilities != other.capabilities)
+            return false;
+        if( maxBands != other.maxBands)
+            return false;
+        if( maxColor != other.maxColor)
+            return false;
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+
+        result = prime *  (int) (maxMeter ^ (maxMeter >>> 32));
+        result = prime *  (int) (bandTypes ^ (bandTypes >>> 32));
+        result = prime *  (int) (capabilities ^ (capabilities >>> 32));
+        result = prime * result + maxBands;
+        result = prime * result + maxColor;
+        return result;
+    }
+
+}
