diff --git a/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver11/OFActionsVer11.java b/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver11/OFActionsVer11.java
new file mode 100644
index 0000000..c496634
--- /dev/null
+++ b/of-save/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver11/OFActionsVer11.java
@@ -0,0 +1,299 @@
+// 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.ver11;
+
+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 java.util.Set;
+
+
+public class OFActionsVer11 implements OFActions {
+    public final static OFActionsVer11 INSTANCE = new OFActionsVer11();
+
+
+
+
+    public OFActionBsnChecksum.Builder buildBsnChecksum() {
+        return new OFActionBsnChecksumVer11.Builder();
+    }
+    public OFActionBsnChecksum bsnChecksum(U128 checksum) {
+        return new OFActionBsnChecksumVer11(
+                checksum
+                    );
+    }
+
+    public OFActionBsnMirror.Builder buildBsnMirror() {
+        return new OFActionBsnMirrorVer11.Builder();
+    }
+
+    public OFActionBsnSetTunnelDst.Builder buildBsnSetTunnelDst() {
+        return new OFActionBsnSetTunnelDstVer11.Builder();
+    }
+    public OFActionBsnSetTunnelDst bsnSetTunnelDst(long dst) {
+        return new OFActionBsnSetTunnelDstVer11(
+                dst
+                    );
+    }
+
+    public OFActionEnqueue.Builder buildEnqueue() {
+        throw new UnsupportedOperationException("OFActionEnqueue not supported in version 1.1");
+    }
+    public OFActionEnqueue enqueue(OFPort port, long queueId) {
+        throw new UnsupportedOperationException("OFActionEnqueue not supported in version 1.1");
+    }
+
+    public OFActionNiciraDecTtl niciraDecTtl() {
+        return OFActionNiciraDecTtlVer11.INSTANCE;
+    }
+
+    public OFActionOutput.Builder buildOutput() {
+        return new OFActionOutputVer11.Builder();
+    }
+    public OFActionOutput output(OFPort port, int maxLen) {
+        return new OFActionOutputVer11(
+                port,
+                      maxLen
+                    );
+    }
+
+    public OFActionSetDlDst.Builder buildSetDlDst() {
+        return new OFActionSetDlDstVer11.Builder();
+    }
+    public OFActionSetDlDst setDlDst(MacAddress dlAddr) {
+        return new OFActionSetDlDstVer11(
+                dlAddr
+                    );
+    }
+
+    public OFActionSetDlSrc.Builder buildSetDlSrc() {
+        return new OFActionSetDlSrcVer11.Builder();
+    }
+    public OFActionSetDlSrc setDlSrc(MacAddress dlAddr) {
+        return new OFActionSetDlSrcVer11(
+                dlAddr
+                    );
+    }
+
+    public OFActionSetNwDst.Builder buildSetNwDst() {
+        return new OFActionSetNwDstVer11.Builder();
+    }
+    public OFActionSetNwDst setNwDst(IPv4Address nwAddr) {
+        return new OFActionSetNwDstVer11(
+                nwAddr
+                    );
+    }
+
+    public OFActionSetNwSrc.Builder buildSetNwSrc() {
+        return new OFActionSetNwSrcVer11.Builder();
+    }
+    public OFActionSetNwSrc setNwSrc(IPv4Address nwAddr) {
+        return new OFActionSetNwSrcVer11(
+                nwAddr
+                    );
+    }
+
+    public OFActionSetNwTos.Builder buildSetNwTos() {
+        return new OFActionSetNwTosVer11.Builder();
+    }
+    public OFActionSetNwTos setNwTos(short nwTos) {
+        return new OFActionSetNwTosVer11(
+                nwTos
+                    );
+    }
+
+    public OFActionSetTpDst.Builder buildSetTpDst() {
+        return new OFActionSetTpDstVer11.Builder();
+    }
+    public OFActionSetTpDst setTpDst(TransportPort tpPort) {
+        return new OFActionSetTpDstVer11(
+                tpPort
+                    );
+    }
+
+    public OFActionSetTpSrc.Builder buildSetTpSrc() {
+        return new OFActionSetTpSrcVer11.Builder();
+    }
+    public OFActionSetTpSrc setTpSrc(TransportPort tpPort) {
+        return new OFActionSetTpSrcVer11(
+                tpPort
+                    );
+    }
+
+    public OFActionSetVlanPcp.Builder buildSetVlanPcp() {
+        return new OFActionSetVlanPcpVer11.Builder();
+    }
+    public OFActionSetVlanPcp setVlanPcp(VlanPcp vlanPcp) {
+        return new OFActionSetVlanPcpVer11(
+                vlanPcp
+                    );
+    }
+
+    public OFActionSetVlanVid.Builder buildSetVlanVid() {
+        return new OFActionSetVlanVidVer11.Builder();
+    }
+    public OFActionSetVlanVid setVlanVid(VlanVid vlanVid) {
+        return new OFActionSetVlanVidVer11(
+                vlanVid
+                    );
+    }
+
+    public OFActionStripVlan stripVlan() {
+        throw new UnsupportedOperationException("OFActionStripVlan not supported in version 1.1");
+    }
+
+    public OFActionCopyTtlIn copyTtlIn() {
+        return OFActionCopyTtlInVer11.INSTANCE;
+    }
+
+    public OFActionCopyTtlOut copyTtlOut() {
+        return OFActionCopyTtlOutVer11.INSTANCE;
+    }
+
+    public OFActionDecMplsTtl decMplsTtl() {
+        return OFActionDecMplsTtlVer11.INSTANCE;
+    }
+
+    public OFActionDecNwTtl decNwTtl() {
+        return OFActionDecNwTtlVer11.INSTANCE;
+    }
+
+    public OFActionGroup.Builder buildGroup() {
+        return new OFActionGroupVer11.Builder();
+    }
+    public OFActionGroup group(OFGroup group) {
+        return new OFActionGroupVer11(
+                group
+                    );
+    }
+
+    public OFActionPopMpls.Builder buildPopMpls() {
+        return new OFActionPopMplsVer11.Builder();
+    }
+    public OFActionPopMpls popMpls(EthType ethertype) {
+        return new OFActionPopMplsVer11(
+                ethertype
+                    );
+    }
+
+    public OFActionPopVlan popVlan() {
+        return OFActionPopVlanVer11.INSTANCE;
+    }
+
+    public OFActionPushMpls.Builder buildPushMpls() {
+        return new OFActionPushMplsVer11.Builder();
+    }
+    public OFActionPushMpls pushMpls(EthType ethertype) {
+        return new OFActionPushMplsVer11(
+                ethertype
+                    );
+    }
+
+    public OFActionPushVlan.Builder buildPushVlan() {
+        return new OFActionPushVlanVer11.Builder();
+    }
+    public OFActionPushVlan pushVlan(EthType ethertype) {
+        return new OFActionPushVlanVer11(
+                ethertype
+                    );
+    }
+
+    public OFActionSetMplsLabel.Builder buildSetMplsLabel() {
+        return new OFActionSetMplsLabelVer11.Builder();
+    }
+    public OFActionSetMplsLabel setMplsLabel(long mplsLabel) {
+        return new OFActionSetMplsLabelVer11(
+                mplsLabel
+                    );
+    }
+
+    public OFActionSetMplsTc.Builder buildSetMplsTc() {
+        return new OFActionSetMplsTcVer11.Builder();
+    }
+    public OFActionSetMplsTc setMplsTc(short mplsTc) {
+        return new OFActionSetMplsTcVer11(
+                mplsTc
+                    );
+    }
+
+    public OFActionSetMplsTtl.Builder buildSetMplsTtl() {
+        return new OFActionSetMplsTtlVer11.Builder();
+    }
+    public OFActionSetMplsTtl setMplsTtl(short mplsTtl) {
+        return new OFActionSetMplsTtlVer11(
+                mplsTtl
+                    );
+    }
+
+    public OFActionSetNwEcn.Builder buildSetNwEcn() {
+        return new OFActionSetNwEcnVer11.Builder();
+    }
+    public OFActionSetNwEcn setNwEcn(IpEcn nwEcn) {
+        return new OFActionSetNwEcnVer11(
+                nwEcn
+                    );
+    }
+
+    public OFActionSetNwTtl.Builder buildSetNwTtl() {
+        return new OFActionSetNwTtlVer11.Builder();
+    }
+    public OFActionSetNwTtl setNwTtl(short nwTtl) {
+        return new OFActionSetNwTtlVer11(
+                nwTtl
+                    );
+    }
+
+    public OFActionSetQueue.Builder buildSetQueue() {
+        return new OFActionSetQueueVer11.Builder();
+    }
+    public OFActionSetQueue setQueue(long queueId) {
+        return new OFActionSetQueueVer11(
+                queueId
+                    );
+    }
+
+    public OFActionSetField.Builder buildSetField() {
+        throw new UnsupportedOperationException("OFActionSetField not supported in version 1.1");
+    }
+    public OFActionSetField setField(OFOxm<?> field) {
+        throw new UnsupportedOperationException("OFActionSetField not supported in version 1.1");
+    }
+
+    public OFActionPopPbb popPbb() {
+        throw new UnsupportedOperationException("OFActionPopPbb not supported in version 1.1");
+    }
+
+    public OFActionPushPbb.Builder buildPushPbb() {
+        throw new UnsupportedOperationException("OFActionPushPbb not supported in version 1.1");
+    }
+    public OFActionPushPbb pushPbb(EthType ethertype) {
+        throw new UnsupportedOperationException("OFActionPushPbb not supported in version 1.1");
+    }
+
+    public OFMessageReader<OFAction> getReader() {
+        return OFActionVer11.READER;
+    }
+
+
+    public OFVersion getVersion() {
+            return OFVersion.OF_11;
+    }
+}
