diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py
index 1ca1d6e89a4b3655175113f03a02b69ccfaa0ca1..9d9f30767b0397f56a3c72100f19cd22fa4e6a79 100644
--- a/linux-ramdump-parser-v2/iommulib.py
+++ b/linux-ramdump-parser-v2/iommulib.py
@@ -11,6 +11,7 @@
 
 import rb_tree
 import linux_list as llist
+from mm import phys_to_virt
 
 ARM_SMMU_DOMAIN = 0
 MSM_SMMU_DOMAIN = 1
@@ -112,30 +113,25 @@ class IommuLib(object):
             if pgtbl_ops_ptr is None or pgtbl_ops_ptr == 0:
                 return
 
-            pg_table = 0
             level = 0
             fn = self.ramdump.read_structure_field(pgtbl_ops_ptr,
                     'struct io_pgtable_ops', 'map')
             if fn == self.ramdump.address_of('av8l_fast_map'):
-                av8l_fast_io_pgtable_ptr = self.ramdump.container_of(
-                    pgtbl_ops_ptr, 'struct av8l_fast_io_pgtable', 'iop.ops')
-
-                pg_table = self.ramdump.read_structure_field(
-                    av8l_fast_io_pgtable_ptr, 'struct av8l_fast_io_pgtable',
-                    'pgd')
                 level = 3
             else:
                 arm_lpae_io_pgtable_ptr = self.ramdump.container_of(
                     pgtbl_ops_ptr, 'struct arm_lpae_io_pgtable', 'iop.ops')
 
-                pg_table = self.ramdump.read_structure_field(
-                    arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable',
-                    'pgd')
-
                 level = self.ramdump.read_structure_field(
                     arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable',
                     'levels')
 
+            pg_table = self.ramdump.read_structure_field(
+                arm_smmu_domain_ptr, 'struct arm_smmu_domain',
+                'pgtbl_cfg.arm_lpae_s1_cfg.ttbr[0]')
+
+            pg_table = phys_to_virt(self.ramdump, pg_table)
+
             domain_create = Domain(pg_table, 0, [], client_name,
                                    ARM_SMMU_DOMAIN, level)
             domain_list.append(domain_create)
diff --git a/linux-ramdump-parser-v2/mm.py b/linux-ramdump-parser-v2/mm.py
index b626981030d598dcc23e1fee4e98c7cf90baccbf..b6633d458f5d4764e5d550d98558ccca56707643 100644
--- a/linux-ramdump-parser-v2/mm.py
+++ b/linux-ramdump-parser-v2/mm.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+# Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 and
@@ -309,6 +309,16 @@ def page_address(ramdump, page):
         if pam == start:
             return None
 
+def phys_to_virt(ramdump, phys):
+    if not ramdump.arm64:
+        return phys - ramdump.phys_offset + ramdump.page_offset
+
+    if ramdump.kernel_version < (4, 4, 0):
+        return None
+
+    memstart_addr = ramdump.read_s64('memstart_addr')
+    val = (phys - memstart_addr) | ramdump.page_offset
+    return val
 
 def for_each_pfn(ramdump):
     """ creates a generator for looping through valid pfn