diff --git a/wireshark_gen/__init__.py b/wireshark_gen/__init__.py
index e74f55e..89a8ba1 100644
--- a/wireshark_gen/__init__.py
+++ b/wireshark_gen/__init__.py
@@ -27,9 +27,50 @@
 
 import os
 import loxi_utils.loxi_utils as utils
+import loxi_front_end
+import of_g
 
 templates_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'templates')
 
+# TODO move into IR
+def create_superclass_map():
+    superclasses = {}
+    for supercls, subcls_set in loxi_front_end.type_maps.inheritance_map.items():
+        for subcls in subcls_set:
+            superclasses[supercls + '_' + subcls] = supercls
+
+    for version, versioned in loxi_front_end.type_maps.message_types.items():
+        for subcls in versioned:
+            superclasses['of_' + subcls] = 'of_message'
+
+    for version, versioned in loxi_front_end.type_maps.extension_message_subtype.items():
+        for experimenter, classes in versioned.items():
+            for cls in classes:
+                superclasses[cls] = 'of_experimenter_' + experimenter
+
+    for version, versioned in loxi_front_end.type_maps.extension_action_subtype.items():
+        for experimenter, classes in versioned.items():
+            for cls in classes:
+                superclasses[cls] = 'of_action_' + experimenter
+
+    for version, versioned in loxi_front_end.type_maps.stats_types.items():
+        for subcls in versioned:
+            superclasses['of_' + subcls + '_stats_request'] = 'of_stats_request'
+            superclasses['of_' + subcls + '_stats_reply'] = 'of_stats_reply'
+
+    for version, versioned in loxi_front_end.type_maps.flow_mod_types.items():
+        for subcls in versioned:
+            superclasses['of_flow_' + subcls] = 'of_flow_mod'
+
+    return superclasses
+
 def generate(out, name):
-    context = {}
+    superclasses = create_superclass_map()
+    all_classes = sorted(of_g.unified.keys())
+
+    for cls in all_classes:
+        if cls not in superclasses:
+            print cls + ": " + superclasses.get(cls, "NONE")
+
+    context = { 'superclasses': superclasses }
     utils.render_template(out, "openflow.lua", [templates_dir], context)
