diff --git a/py_gen/templates/init.py b/py_gen/templates/init.py
index 4a14228..75d52be 100644
--- a/py_gen/templates/init.py
+++ b/py_gen/templates/init.py
@@ -30,7 +30,7 @@
 :: include('_autogen.py')
 
 import action, common, const, message
-:: if version >= 4:
+:: if version >= 3:
 import oxm
 :: #endif
 from const import *
diff --git a/py_gen/templates/message.py b/py_gen/templates/message.py
index 69c3fe1..de8fb86 100644
--- a/py_gen/templates/message.py
+++ b/py_gen/templates/message.py
@@ -217,7 +217,11 @@
     const.OFPST_TABLE : table_stats_reply.unpack,
     const.OFPST_PORT : port_stats_reply.unpack,
     const.OFPST_QUEUE : queue_stats_reply.unpack,
+:: if version < of_g.VERSION_1_1:
     const.OFPST_VENDOR : experimenter_stats_reply.unpack,
+:: else:
+    const.OFPST_EXPERIMENTER : experimenter_stats_reply.unpack,
+:: #endif
 }
 
 stats_request_parsers = {
@@ -227,7 +231,11 @@
     const.OFPST_TABLE : table_stats_request.unpack,
     const.OFPST_PORT : port_stats_request.unpack,
     const.OFPST_QUEUE : queue_stats_request.unpack,
+:: if version < of_g.VERSION_1_1:
     const.OFPST_VENDOR : experimenter_stats_request.unpack,
+:: else:
+    const.OFPST_EXPERIMENTER : experimenter_stats_request.unpack,
+:: #endif
 }
 :: else:
 
diff --git a/py_gen/tests/of11.py b/py_gen/tests/of11.py
new file mode 100644
index 0000000..ebbfcd4
--- /dev/null
+++ b/py_gen/tests/of11.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+# Copyright 2013, Big Switch Networks, Inc.
+#
+# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
+# the following special exception:
+#
+# LOXI Exception
+#
+# As a special exception to the terms of the EPL, you may distribute libraries
+# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
+# that copyright and licensing notices generated by LoxiGen are not altered or removed
+# from the LoxiGen Libraries and the notice provided below is (i) included in
+# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
+# documentation for the LoxiGen Libraries, if distributed in binary form.
+#
+# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
+#
+# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
+# a copy of the EPL at:
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# EPL for the specific language governing permissions and limitations
+# under the EPL.
+import unittest
+
+try:
+    import loxi.of11 as ofp
+except ImportError:
+    exit("loxi package not found. Try setting PYTHONPATH.")
+
+class TestImports(unittest.TestCase):
+    def test_toplevel(self):
+        import loxi
+        self.assertTrue(hasattr(loxi, "ProtocolError"))
+        ofp = loxi.protocol(2)
+        self.assertEquals(ofp.OFP_VERSION, 2)
+        self.assertTrue(hasattr(ofp, "action"))
+        self.assertTrue(hasattr(ofp, "common"))
+        self.assertTrue(hasattr(ofp, "const"))
+        self.assertTrue(hasattr(ofp, "message"))
+
+    def test_version(self):
+        import loxi
+        self.assertTrue(hasattr(loxi.of11, "ProtocolError"))
+        self.assertTrue(hasattr(loxi.of11, "OFP_VERSION"))
+        self.assertEquals(loxi.of11.OFP_VERSION, 2)
+        self.assertTrue(hasattr(loxi.of11, "action"))
+        self.assertTrue(hasattr(loxi.of11, "common"))
+        self.assertTrue(hasattr(loxi.of11, "const"))
+        self.assertTrue(hasattr(loxi.of11, "message"))
+
+class TestAllOF11(unittest.TestCase):
+    """
+    Round-trips every class through serialization/deserialization.
+    Not a replacement for handcoded tests because it only uses the
+    default member values.
+    """
+
+    def setUp(self):
+        mods = [ofp.action,ofp.message,ofp.common]
+        self.klasses = [klass for mod in mods
+                              for klass in mod.__dict__.values()
+                              if hasattr(klass, 'show')]
+        self.klasses.sort(key=lambda x: str(x))
+
+    def test_serialization(self):
+        expected_failures = [
+            ofp.common.flow_stats_entry,
+            ofp.common.group_desc_stats_entry,
+            ofp.common.instruction,
+            ofp.common.instruction_apply_actions,
+            ofp.common.instruction_clear_actions,
+            ofp.common.instruction_experimenter,
+            ofp.common.instruction_goto_table,
+            ofp.common.instruction_header,
+            ofp.common.instruction_write_actions,
+            ofp.common.instruction_write_metadata,
+            ofp.common.match_v2,
+            ofp.common.table_stats_entry,
+            ofp.message.aggregate_stats_request,
+            ofp.message.flow_add,
+            ofp.message.flow_delete,
+            ofp.message.flow_delete_strict,
+            ofp.message.flow_modify,
+            ofp.message.flow_modify_strict,
+            ofp.message.flow_removed,
+            ofp.message.flow_stats_request,
+            ofp.message.group_desc_stats_reply,
+            ofp.message.group_mod,
+            ofp.message.group_stats_reply,
+        ]
+        for klass in self.klasses:
+            def fn():
+                obj = klass()
+                if hasattr(obj, "xid"): obj.xid = 42
+                buf = obj.pack()
+                obj2 = klass.unpack(buf)
+                self.assertEquals(obj, obj2)
+            if klass in expected_failures:
+                self.assertRaises(Exception, fn)
+            else:
+                fn()
+
+    def test_show(self):
+        expected_failures = [
+            ofp.common.flow_stats_entry,
+            ofp.common.group_desc_stats_entry,
+            ofp.common.instruction,
+            ofp.common.instruction_apply_actions,
+            ofp.common.instruction_clear_actions,
+            ofp.common.instruction_experimenter,
+            ofp.common.instruction_goto_table,
+            ofp.common.instruction_header,
+            ofp.common.instruction_write_actions,
+            ofp.common.instruction_write_metadata,
+            ofp.common.match_v2,
+            ofp.message.aggregate_stats_request,
+            ofp.message.flow_add,
+            ofp.message.flow_delete,
+            ofp.message.flow_delete_strict,
+            ofp.message.flow_modify,
+            ofp.message.flow_modify_strict,
+            ofp.message.flow_removed,
+            ofp.message.flow_stats_request,
+        ]
+        for klass in self.klasses:
+            def fn():
+                obj = klass()
+                if hasattr(obj, "xid"): obj.xid = 42
+                obj.show()
+            if klass in expected_failures:
+                self.assertRaises(Exception, fn)
+            else:
+                fn()
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/py_gen/tests/of12.py b/py_gen/tests/of12.py
new file mode 100644
index 0000000..ce7ffe1
--- /dev/null
+++ b/py_gen/tests/of12.py
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+# Copyright 2013, Big Switch Networks, Inc.
+#
+# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
+# the following special exception:
+#
+# LOXI Exception
+#
+# As a special exception to the terms of the EPL, you may distribute libraries
+# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
+# that copyright and licensing notices generated by LoxiGen are not altered or removed
+# from the LoxiGen Libraries and the notice provided below is (i) included in
+# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
+# documentation for the LoxiGen Libraries, if distributed in binary form.
+#
+# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
+#
+# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
+# a copy of the EPL at:
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# EPL for the specific language governing permissions and limitations
+# under the EPL.
+import unittest
+
+try:
+    import loxi.of12 as ofp
+except ImportError:
+    exit("loxi package not found. Try setting PYTHONPATH.")
+
+class TestImports(unittest.TestCase):
+    def test_toplevel(self):
+        import loxi
+        self.assertTrue(hasattr(loxi, "ProtocolError"))
+        ofp = loxi.protocol(3)
+        self.assertEquals(ofp.OFP_VERSION, 3)
+        self.assertTrue(hasattr(ofp, "action"))
+        self.assertTrue(hasattr(ofp, "common"))
+        self.assertTrue(hasattr(ofp, "const"))
+        self.assertTrue(hasattr(ofp, "message"))
+        self.assertTrue(hasattr(ofp, "oxm"))
+
+    def test_version(self):
+        import loxi
+        self.assertTrue(hasattr(loxi.of12, "ProtocolError"))
+        self.assertTrue(hasattr(loxi.of12, "OFP_VERSION"))
+        self.assertEquals(loxi.of12.OFP_VERSION, 3)
+        self.assertTrue(hasattr(loxi.of12, "action"))
+        self.assertTrue(hasattr(loxi.of12, "common"))
+        self.assertTrue(hasattr(loxi.of12, "const"))
+        self.assertTrue(hasattr(loxi.of12, "message"))
+        self.assertTrue(hasattr(loxi.of12, "oxm"))
+
+class TestOXM(unittest.TestCase):
+    def test_oxm_in_phy_port_pack(self):
+        import loxi.of12 as ofp
+        obj = ofp.oxm.in_phy_port(value=42)
+        expected = ''.join([
+            '\x80\x00', # class
+            '\x02', # type/masked
+            '\x08', # length
+            '\x00\x00\x00\x2a' # value
+        ])
+        self.assertEquals(expected, obj.pack())
+
+    def test_oxm_in_phy_port_masked_pack(self):
+        import loxi.of12 as ofp
+        obj = ofp.oxm.in_phy_port_masked(value=42, value_mask=0xaabbccdd)
+        expected = ''.join([
+            '\x80\x00', # class
+            '\x03', # type/masked
+            '\x0c', # length
+            '\x00\x00\x00\x2a', # value
+            '\xaa\xbb\xcc\xdd' # mask
+        ])
+        self.assertEquals(expected, obj.pack())
+
+    def test_oxm_ipv6_dst_pack(self):
+        import loxi.of12 as ofp
+        obj = ofp.oxm.ipv6_dst(value='\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0d\x0f')
+        expected = ''.join([
+            '\x80\x00', # class
+            '\x36', # type/masked
+            '\x14', # length
+            '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0d\x0f', # value
+        ])
+        self.assertEquals(expected, obj.pack())
+
+class TestAllOF12(unittest.TestCase):
+    """
+    Round-trips every class through serialization/deserialization.
+    Not a replacement for handcoded tests because it only uses the
+    default member values.
+    """
+
+    def setUp(self):
+        mods = [ofp.action,ofp.message,ofp.common,ofp.oxm]
+        self.klasses = [klass for mod in mods
+                              for klass in mod.__dict__.values()
+                              if hasattr(klass, 'show')]
+        self.klasses.sort(key=lambda x: str(x))
+
+    def test_serialization(self):
+        expected_failures = [
+            ofp.common.flow_stats_entry,
+            ofp.common.group_desc_stats_entry,
+            ofp.common.instruction,
+            ofp.common.instruction_apply_actions,
+            ofp.common.instruction_clear_actions,
+            ofp.common.instruction_experimenter,
+            ofp.common.instruction_goto_table,
+            ofp.common.instruction_header,
+            ofp.common.instruction_write_actions,
+            ofp.common.instruction_write_metadata,
+            ofp.common.match_v3,
+            ofp.common.table_stats_entry,
+            ofp.message.aggregate_stats_request,
+            ofp.message.flow_add,
+            ofp.message.flow_delete,
+            ofp.message.flow_delete_strict,
+            ofp.message.flow_modify,
+            ofp.message.flow_modify_strict,
+            ofp.message.flow_removed,
+            ofp.message.flow_stats_request,
+            ofp.message.group_desc_stats_reply,
+            ofp.message.group_mod,
+            ofp.message.group_stats_reply,
+            ofp.message.packet_in,
+        ]
+        for klass in self.klasses:
+            def fn():
+                obj = klass()
+                if hasattr(obj, "xid"): obj.xid = 42
+                buf = obj.pack()
+                obj2 = klass.unpack(buf)
+                self.assertEquals(obj, obj2)
+            if klass in expected_failures:
+                self.assertRaises(Exception, fn)
+            else:
+                fn()
+
+    def test_show(self):
+        expected_failures = [
+            ofp.common.flow_stats_entry,
+            ofp.common.group_desc_stats_entry,
+            ofp.common.instruction,
+            ofp.common.instruction_apply_actions,
+            ofp.common.instruction_clear_actions,
+            ofp.common.instruction_experimenter,
+            ofp.common.instruction_goto_table,
+            ofp.common.instruction_header,
+            ofp.common.instruction_write_actions,
+            ofp.common.instruction_write_metadata,
+            ofp.common.match_v3,
+            ofp.common.table_stats_entry,
+            ofp.message.aggregate_stats_request,
+            ofp.message.flow_add,
+            ofp.message.flow_delete,
+            ofp.message.flow_delete_strict,
+            ofp.message.flow_modify,
+            ofp.message.flow_modify_strict,
+            ofp.message.flow_removed,
+            ofp.message.flow_stats_request,
+            ofp.message.packet_in,
+        ]
+        for klass in self.klasses:
+            def fn():
+                obj = klass()
+                if hasattr(obj, "xid"): obj.xid = 42
+                obj.show()
+            if klass in expected_failures:
+                self.assertRaises(Exception, fn)
+            else:
+                fn()
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/py_gen/tests/of13.py b/py_gen/tests/of13.py
index 68cbb1a..3a534e1 100644
--- a/py_gen/tests/of13.py
+++ b/py_gen/tests/of13.py
@@ -42,6 +42,7 @@
         self.assertTrue(hasattr(ofp, "common"))
         self.assertTrue(hasattr(ofp, "const"))
         self.assertTrue(hasattr(ofp, "message"))
+        self.assertTrue(hasattr(ofp, "oxm"))
 
     def test_version(self):
         import loxi
@@ -52,6 +53,7 @@
         self.assertTrue(hasattr(loxi.of13, "common"))
         self.assertTrue(hasattr(loxi.of13, "const"))
         self.assertTrue(hasattr(loxi.of13, "message"))
+        self.assertTrue(hasattr(loxi.of13, "oxm"))
 
 class TestCommon(unittest.TestCase):
     sample_hello_elem_buf = ''.join([
