Adding instruction and actions dissector
diff --git a/wireshark_gen/templates/_oftype_readers.lua b/wireshark_gen/templates/_oftype_readers.lua
index 8f01718..c258953 100644
--- a/wireshark_gen/templates/_oftype_readers.lua
+++ b/wireshark_gen/templates/_oftype_readers.lua
@@ -111,9 +111,10 @@
         local action_len = reader.peek(2, 2):uint()
         local child_reader = reader.slice(action_len)
         local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
-        local info = dissect_of_action_v1(child_reader, child_subtree)
+        local info = dissect_of_action(child_reader, child_subtree, version)
         child_subtree:set_text(info)
     end
+    list:set_text("List of actions")
 end
 
 function read_list_of_port_desc_t(reader, version, subtree, field_name)
@@ -138,9 +139,11 @@
         local match_len = 4 + reader2.peek(3,1):uint()
         local child_reader = reader2.slice(match_len)
         local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
-        local info = dissect_of_oxm_v3(child_reader, child_subtree)
+        local info = dissect_of_oxm(child_reader, child_subtree, version)
         child_subtree:set_text(info)
     end
+    subtree:set_text("OXM")
+    list:set_text("List of matches")
     reader.skip_align()
 end
 
@@ -148,7 +151,7 @@
     if reader.is_empty() then
         return
     end
-    if not reader.is_empty() then
-        subtree:add(fields[field_name], reader.read_all())
-    end
+    local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
+    local info = dissect_of_instruction(reader, child_subtree, version)
+    child_subtree:set_text("Instructions")
 end
diff --git a/wireshark_gen/templates/openflow.lua b/wireshark_gen/templates/openflow.lua
index 5ab11cd..067dbdd 100644
--- a/wireshark_gen/templates/openflow.lua
+++ b/wireshark_gen/templates/openflow.lua
@@ -101,6 +101,24 @@
 :: #endfor
 }
 
+local of_oxm_dissectors = {
+:: for version in ir:
+    [${version}] = of_oxm_v${version}_dissectors,
+:: #endfor
+}
+
+local of_action_dissectors = {
+:: for version in ir:
+    [${version}] = of_action_v${version}_dissectors,
+:: #endfor
+}
+
+local of_instruction_dissectors = {
+:: for version in ir:
+    [${version}] = of_instruction_v${version}_dissectors,
+:: #endfor
+}
+
 function dissect_of_message(buf, root)
     local reader = OFReader.new(buf)
     local subtree = root:add(p_of, buf(0))
@@ -120,16 +138,36 @@
     return protocol, info
 end
 
-function dissect_of_oxm_v3(reader, subtree)
+function dissect_of_oxm(reader, subtree, version_val)
     local type_val = reader.peek(0,4):uint()
-
     local info = "unknown"
-    if of_oxm_v3_dissectors[type_val] then
-        info = of_oxm_v3_dissectors[type_val](reader, subtree)
+    if of_oxm_dissectors[version_val] and of_oxm_dissectors[version_val][type_val] then
+        info = of_oxm_dissectors[version_val][type_val](reader, subtree)
     end
 
     return info
 end
+
+function dissect_of_action(reader, subtree, version_val)
+    local type_val = reader.peek(0,2):uint()
+    local info = "unknown"
+    if of_action_dissectors[version_val] and of_action_dissectors[version_val][type_val] then
+        info = of_action_dissectors[version_val][type_val](reader, subtree)
+    end
+
+    return info
+end
+
+function dissect_of_instruction(reader, subtree, version_val)
+    local type_val = reader.peek(0,2):uint()
+    local info = "unknown"
+    if of_instruction_dissectors[version_val] and of_instruction_dissectors[version_val][type_val] then
+        info = of_instruction_dissectors[version_val][type_val](reader, subtree)
+    end
+
+    return info
+end
+
 -- of dissector function
 function p_of.dissector (buf, pkt, root)
     local offset = 0