diff --git a/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFBsnTlvVer13.java b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFBsnTlvVer13.java
new file mode 100644
index 0000000..0601c93
--- /dev/null
+++ b/of/lib/gen-src/main/java/org/projectfloodlight/openflow/protocol/ver13/OFBsnTlvVer13.java
@@ -0,0 +1,119 @@
+// 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_virtual_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.jboss.netty.buffer.ChannelBuffer;
+
+abstract class OFBsnTlvVer13 {
+    // version: 1.3
+    final static byte WIRE_VERSION = 4;
+    final static int MINIMUM_LENGTH = 4;
+
+
+    public final static OFBsnTlvVer13.Reader READER = new Reader();
+
+    static class Reader implements OFMessageReader<OFBsnTlv> {
+        @Override
+        public OFBsnTlv readFrom(ChannelBuffer bb) throws OFParseError {
+            if(bb.readableBytes() < MINIMUM_LENGTH)
+                return null;
+            int start = bb.readerIndex();
+            short type = bb.readShort();
+            bb.readerIndex(start);
+            switch(type) {
+               case (short) 0xa:
+                   // discriminator value 0xa=0xa for class OFBsnTlvBroadcastQueryTimeoutVer13
+                   return OFBsnTlvBroadcastQueryTimeoutVer13.READER.readFrom(bb);
+               case (short) 0xe:
+                   // discriminator value 0xe=0xe for class OFBsnTlvCircuitIdVer13
+                   return OFBsnTlvCircuitIdVer13.READER.readFrom(bb);
+               case (short) 0x16:
+                   // discriminator value 0x16=0x16 for class OFBsnTlvCrcEnabledVer13
+                   return OFBsnTlvCrcEnabledVer13.READER.readFrom(bb);
+               case (short) 0x7:
+                   // discriminator value 0x7=0x7 for class OFBsnTlvIdleNotificationVer13
+                   return OFBsnTlvIdleNotificationVer13.READER.readFrom(bb);
+               case (short) 0x5:
+                   // discriminator value 0x5=0x5 for class OFBsnTlvIdleTimeVer13
+                   return OFBsnTlvIdleTimeVer13.READER.readFrom(bb);
+               case (short) 0x8:
+                   // discriminator value 0x8=0x8 for class OFBsnTlvIdleTimeoutVer13
+                   return OFBsnTlvIdleTimeoutVer13.READER.readFrom(bb);
+               case (short) 0x4:
+                   // discriminator value 0x4=0x4 for class OFBsnTlvIpv4Ver13
+                   return OFBsnTlvIpv4Ver13.READER.readFrom(bb);
+               case (short) 0x1:
+                   // discriminator value 0x1=0x1 for class OFBsnTlvMacVer13
+                   return OFBsnTlvMacVer13.READER.readFrom(bb);
+               case (short) 0xd:
+                   // discriminator value 0xd=0xd for class OFBsnTlvMissPacketsVer13
+                   return OFBsnTlvMissPacketsVer13.READER.readFrom(bb);
+               case (short) 0x0:
+                   // discriminator value 0x0=0x0 for class OFBsnTlvPortVer13
+                   return OFBsnTlvPortVer13.READER.readFrom(bb);
+               case (short) 0x14:
+                   // discriminator value 0x14=0x14 for class OFBsnTlvQueueIdVer13
+                   return OFBsnTlvQueueIdVer13.READER.readFrom(bb);
+               case (short) 0x15:
+                   // discriminator value 0x15=0x15 for class OFBsnTlvQueueWeightVer13
+                   return OFBsnTlvQueueWeightVer13.READER.readFrom(bb);
+               case (short) 0xc:
+                   // discriminator value 0xc=0xc for class OFBsnTlvReplyPacketsVer13
+                   return OFBsnTlvReplyPacketsVer13.READER.readFrom(bb);
+               case (short) 0xb:
+                   // discriminator value 0xb=0xb for class OFBsnTlvRequestPacketsVer13
+                   return OFBsnTlvRequestPacketsVer13.READER.readFrom(bb);
+               case (short) 0x2:
+                   // discriminator value 0x2=0x2 for class OFBsnTlvRxPacketsVer13
+                   return OFBsnTlvRxPacketsVer13.READER.readFrom(bb);
+               case (short) 0x3:
+                   // discriminator value 0x3=0x3 for class OFBsnTlvTxPacketsVer13
+                   return OFBsnTlvTxPacketsVer13.READER.readFrom(bb);
+               case (short) 0x10:
+                   // discriminator value 0x10=0x10 for class OFBsnTlvUdfAnchorVer13
+                   return OFBsnTlvUdfAnchorVer13.READER.readFrom(bb);
+               case (short) 0xf:
+                   // discriminator value 0xf=0xf for class OFBsnTlvUdfIdVer13
+                   return OFBsnTlvUdfIdVer13.READER.readFrom(bb);
+               case (short) 0x12:
+                   // discriminator value 0x12=0x12 for class OFBsnTlvUdfLengthVer13
+                   return OFBsnTlvUdfLengthVer13.READER.readFrom(bb);
+               case (short) 0x11:
+                   // discriminator value 0x11=0x11 for class OFBsnTlvUdfOffsetVer13
+                   return OFBsnTlvUdfOffsetVer13.READER.readFrom(bb);
+               case (short) 0x9:
+                   // discriminator value 0x9=0x9 for class OFBsnTlvUnicastQueryTimeoutVer13
+                   return OFBsnTlvUnicastQueryTimeoutVer13.READER.readFrom(bb);
+               case (short) 0x6:
+                   // discriminator value 0x6=0x6 for class OFBsnTlvVlanVidVer13
+                   return OFBsnTlvVlanVidVer13.READER.readFrom(bb);
+               case (short) 0x13:
+                   // discriminator value 0x13=0x13 for class OFBsnTlvVrfVer13
+                   return OFBsnTlvVrfVer13.READER.readFrom(bb);
+               default:
+                   throw new OFParseError("Unknown value for discriminator type of class OFBsnTlvVer13: " + type);
+            }
+        }
+    }
+}
