Implementing list reading
diff --git a/wireshark_gen/templates/_ofclass_dissector.lua b/wireshark_gen/templates/_ofclass_dissector.lua
index 8ab20db..cb776c4 100644
--- a/wireshark_gen/templates/_ofclass_dissector.lua
+++ b/wireshark_gen/templates/_ofclass_dissector.lua
@@ -43,44 +43,34 @@
 :: if ofclass.virtual:
     return ${ofclass.name}_v${version.wire_version}_dissectors[reader.peek(${ofclass.discriminator.offset},${ofclass.discriminator.length}):uint()](reader, subtree)
 :: else:
-:: r_name = "reader"
 :: if not ofclass.is_fixed_length:
-    local packet_length = ${r_name}.peek(${ofclass.message_length.offset}, ${ofclass.message_length.base_length}):uint()
-    local packet_reader = ${r_name}.slice(packet_length)
-:: r_name = "packet_reader"
+    local _length = reader.peek(${ofclass.length_member.offset}, ${ofclass.length_member.base_length}):uint()
+    local orig_reader = reader
+    reader = orig_reader.slice(_length)
 :: #endif
 :: for m in ofclass.members:
 :: if isinstance(m, OFPadMember):
-    ${r_name}.skip(${m.length})
+    reader.skip(${m.length})
 :: continue
 :: #endif
 :: if isinstance(m, OFFieldLengthMember):
-    local field_length = ${r_name}.read(${m.base_length}):uint()
-    local field_reader = ${r_name}.slice(field_length)
+    local _list_length = reader.peek(0, ${m.base_length}):uint()
 :: field = "true"
-:: continue
 :: #endif
 :: if m.oftype.startswith("list"):
 :: class_name = m.oftype.replace('_t)', '').replace('(', '').replace('list', '')
-:: if field == "true":
-:: r_name = "field_reader"
+:: if field == "true" :
+    read_list(reader.slice(_list_length), dissect_${class_name}_v${version.wire_version}, subtree, "${class_name}")
+:: else:
+    read_list(reader, dissect_${class_name}_v${version.wire_version}, subtree, "${class_name}")
 :: #endif
-    if not ${r_name}.is_empty() then
-        local field_subtree = subtree:add("${class_name} list", ${r_name}.peek_all(0))
-        while not ${r_name}.is_empty() do
-            local atom_subtree = field_subtree:add("${class_name}", ${r_name}.peek_all(0))
-            local info = dissect_${class_name}_v${version.wire_version}(${r_name}, atom_subtree)
-            atom_subtree:set_text(info)
-        end
-    end
-:: r_name = "packet_reader"
 :: if ofclass.has_external_alignment:
-    reader.skip_align()
+    orig_reader.skip_align()
 :: #endif
 :: else:
 :: field_name = make_field_name(version, ofclass.name, m.name)
 :: reader_name = get_reader(version, ofclass, m)
-    ${reader_name}(${r_name}, ${version.wire_version}, subtree, '${field_name}')
+    ${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
 :: #endif
 :: #endfor
     return '${ofclass.name}'