diff --git a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py
index e718a0f7478cdde0d516872b3f9007dfcd8461c1..de8a2e896d928769f140fd3b7487979f3488caee 100644
--- a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py
+++ b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py
@@ -164,41 +164,19 @@ def get_bufs(task, bufs, ion_info, ramdump):
 
 
 def get_proc_bufs(task, bufs, ion_info, ramdump):
-    group_offset = ramdump.field_offset('struct task_struct', 'thread_group')
-    group_node = ramdump.read_word(task + group_offset)
-    offset_signal = ramdump.field_offset('struct task_struct', 'signal')
     size = 0;
-    curr = None
-    while curr != task:
-        group_node = ramdump.read_pointer(group_node)
-        curr = group_node - group_offset
-        signal_struct = ramdump.read_word(curr + offset_signal)
-        if signal_struct == 0 or signal_struct is None:
-            break
+    for curr in ramdump.for_each_thread(task):
         size += get_bufs(curr, bufs, ion_info, ramdump)
     return size
 
 
 def ion_proc_info(self, ramdump, ion_info):
     ion_info = ramdump.open_file('ionproc.txt')
-    init_task = ramdump.address_of('init_task')
-    if init_task is None:
-        ion_info.write("NOTE: 'init_task' not found for process information")
-        return
     ion_info.write("*****Parsing dma proc info for ion leak debugging*****\n")
-    node_offset = ramdump.field_offset('struct task_struct', 'tasks')
-    offset_signal = ramdump.field_offset('struct task_struct', 'signal')
-    list_node = ramdump.read_word(init_task + node_offset)
-    task = None
     pid_offset = ramdump.field_offset('struct task_struct', 'tgid')
     comm_offset = ramdump.field_offset('struct task_struct', 'comm')
     dma_procs = []
-    while (task != init_task):
-        list_node = ramdump.read_pointer(list_node)
-        task = list_node - node_offset
-        signal_struct = ramdump.read_word(task + offset_signal)
-        if signal_struct == 0 or signal_struct is None:
-            break
+    for task in ramdump.for_each_process():
         bufs = []
         size = get_proc_bufs(task, bufs, ion_info, ramdump)
         if (size == 0):
diff --git a/linux-ramdump-parser-v2/parsers/memusage.py b/linux-ramdump-parser-v2/parsers/memusage.py
index 002c037d36ae8a13ac2f52e40fe9bb075a9b2129..432b814e95cc811615227ea9e6d5373dc77b5f16 100644
--- a/linux-ramdump-parser-v2/parsers/memusage.py
+++ b/linux-ramdump-parser-v2/parsers/memusage.py
@@ -34,22 +34,11 @@ def do_dump_process_memory(ramdump):
 
     total_slab = slab_rec + slab_unrec
     total_mem = ramdump.read_word('totalram_pages') * 4
-    offset_tasks = ramdump.field_offset('struct task_struct', 'tasks')
     offset_comm = ramdump.field_offset('struct task_struct', 'comm')
     offset_signal = ramdump.field_offset('struct task_struct', 'signal')
-    prev_offset = ramdump.field_offset('struct list_head','prev')
     offset_adj = ramdump.field_offset('struct signal_struct', 'oom_score_adj')
-    offset_thread_group = ramdump.field_offset(
-        'struct task_struct', 'thread_group')
     offset_pid = ramdump.field_offset('struct task_struct', 'pid')
-    init_addr = ramdump.address_of('init_task')
-    init_next_task = init_addr + offset_tasks
-    orig_init_next_task = init_next_task
-    init_thread_group = init_addr + offset_thread_group
-    seen_tasks = set()
     task_info = []
-    offset_thread_group = ramdump.field_offset(
-        'struct task_struct', 'thread_group')
     memory_file = ramdump.open_file('memory.txt')
     memory_file.write('Total RAM: {0:,}kB\n'.format(total_mem))
     memory_file.write('Total free memory: {0:,}kB({1:.1f}%)\n'.format(
@@ -62,78 +51,21 @@ def do_dump_process_memory(ramdump):
             total_slab * 4, (100.0 * total_slab * 4) / total_mem))
     memory_file.write('Total SHMEM: {0:,}kB({1:.1f}%)\n\n'.format(
         total_shmem * 4, (100.0 * total_shmem * 4) / total_mem))
-    while True:
-        task_struct = init_thread_group - offset_thread_group
-        next_thread_comm = task_struct + offset_comm
+
+    for task in ramdump.for_each_process():
+        next_thread_comm = task + offset_comm
         thread_task_name = cleanupString(
             ramdump.read_cstring(next_thread_comm, 16))
-        next_thread_pid = task_struct + offset_pid
+        next_thread_pid = task + offset_pid
         thread_task_pid = ramdump.read_int(next_thread_pid)
-        signal_struct = ramdump.read_word(task_struct + offset_signal)
-
-        next_task = ramdump.read_word(init_next_task)
-        if next_task is None:
-            init_next_task = init_addr + offset_tasks
-            init_next_task = init_next_task + prev_offset
-            init_next_task = ramdump.read_word(init_next_task)
-            init_thread_group = init_next_task - offset_tasks \
-                                + offset_thread_group
-            while True:
-                init_next_task = init_next_task + prev_offset
-                orig_init_next_task = init_next_task
-                task_struct = init_thread_group - offset_thread_group
-                next_thread_comm = task_struct + offset_comm
-                thread_task_name = cleanupString(
-                    ramdump.read_cstring(next_thread_comm, 16))
-                next_thread_pid = task_struct + offset_pid
-                thread_task_pid = ramdump.read_int(next_thread_pid)
-                signal_struct = ramdump.read_word(task_struct + offset_signal)
-                next_task = ramdump.read_word(init_next_task)
-                if next_task is None:
-                    break
-                if (next_task == init_next_task and
-                            next_task != orig_init_next_task):
-                    break
-                if next_task in seen_tasks:
-                    break
-                seen_tasks.add(next_task)
-                init_next_task = next_task
-                init_thread_group = init_next_task - offset_tasks\
-                                    + offset_thread_group
-                if init_next_task == orig_init_next_task:
-                    break
-
-                if signal_struct == 0 or signal_struct is None:
-                    continue
-                adj = ramdump.read_u16(signal_struct + offset_adj)
-                if adj & 0x8000:
-                    adj = adj - 0x10000
-                rss, swap = get_rss(ramdump, task_struct)
-                if rss != 0:
-                    task_info.append([thread_task_name, thread_task_pid, rss,
-                                      swap, rss + swap, adj])
-            break
-
-        if (next_task == init_next_task and
-                next_task != orig_init_next_task):
-            break
-
-        if next_task in seen_tasks:
-            break
-
-        seen_tasks.add(next_task)
-        init_next_task = next_task
-        init_thread_group = init_next_task - offset_tasks + offset_thread_group
-        if init_next_task == orig_init_next_task:
-            break
-
+        signal_struct = ramdump.read_word(task + offset_signal)
         if signal_struct == 0 or signal_struct is None:
             continue
 
         adj = ramdump.read_u16(signal_struct + offset_adj)
         if adj & 0x8000:
             adj = adj - 0x10000
-        rss, swap = get_rss(ramdump, task_struct)
+        rss, swap = get_rss(ramdump, task)
         if rss != 0:
             task_info.append([thread_task_name, thread_task_pid, rss, swap, rss + swap, adj])