diff --git a/obmc/mapper/bindings.py b/obmc/mapper/bindings.py
index bd19f19..f5f96d0 100644
--- a/obmc/mapper/bindings.py
+++ b/obmc/mapper/bindings.py
@@ -122,7 +122,7 @@
 
         obj = {}
 
-        for owner, interfaces in mapper_data[path].items():
+        for owner, interfaces in list(mapper_data[path].items()):
             obj.update(
                 self.__get_properties_on_bus(
                     path, owner, interfaces, match))
@@ -140,8 +140,8 @@
 
         # look for objectmanager implementations as they result
         # in fewer dbus calls
-        for path, bus_data in mapper_data.items():
-            for owner, interfaces in bus_data.items():
+        for path, bus_data in list(mapper_data.items()):
+            for owner, interfaces in list(bus_data.items()):
                 owners.append(owner)
                 if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces:
                     managers[owner] = path
@@ -156,14 +156,14 @@
             if e.get_dbus_name() != MAPPER_NOT_FOUND:
                 raise
 
-        for path, bus_data in ancestors.items():
-            for owner, interfaces in bus_data.items():
+        for path, bus_data in list(ancestors.items()):
+            for owner, interfaces in list(bus_data.items()):
                 if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces:
                     managers[owner] = path
 
         # make all the manager gmo (get managed objects) calls
         results = {}
-        for owner, path in managers.items():
+        for owner, path in list(managers.items()):
             if owner not in owners:
                 continue
             obj = self.bus.get_object(owner, path, introspect=False)
@@ -171,17 +171,18 @@
                 obj, dbus.BUS_DAEMON_IFACE + '.ObjectManager')
 
             # flatten (remove interface names) gmo results
-            for path, interfaces in iface.GetManagedObjects().items():
-                if path not in iter(mapper_data.keys()):
+            for path, interfaces in \
+                    list(iface.GetManagedObjects().items()):
+                if path not in iter(list(mapper_data.keys())):
                     continue
                 properties = {}
-                for iface, props in interfaces.items():
+                for iface, props in list(interfaces.items()):
                     properties.update(props)
                 results.setdefault(path, {}).setdefault(owner, properties)
 
         # make dbus calls for any remaining objects
-        for path, bus_data in mapper_data.items():
-            for owner, interfaces in bus_data.items():
+        for path, bus_data in list(mapper_data.items()):
+            for owner, interfaces in list(bus_data.items()):
                 if results.setdefault(path, {}).setdefault(owner, {}):
                     continue
                 results[path][owner].update(
@@ -189,8 +190,8 @@
                         path, owner, interfaces, match))
 
         objs = obmc.utils.pathtree.PathTree()
-        for path, owners in results.items():
-            for owner, properties in owners.items():
+        for path, owners in list(results.items()):
+            for owner, properties in list(owners.items()):
                 objs.setdefault(path, {}).update(properties)
 
         return objs
diff --git a/obmc/mapper/server.py b/obmc/mapper/server.py
index a6df224..01c18ee 100644
--- a/obmc/mapper/server.py
+++ b/obmc/mapper/server.py
@@ -18,7 +18,11 @@
 import dbus.service
 import dbus.exceptions
 import dbus.mainloop.glib
-import gobject
+# TODO: openbmc/openbmc#2994 remove python 2 support
+try:  # python 2
+    import gobject
+except ImportError:  # python 3
+    from gi.repository import GObject as gobject
 import xml.etree.ElementTree as ET
 import obmc.utils.pathtree
 import obmc.mapper
@@ -97,7 +101,7 @@
         def _gmo_callback(self, path, objs):
             try:
                 self.gmo_pending.remove(path)
-                for k, v in objs.items():
+                for k, v in list(objs.items()):
                     self.results[k] = v
             except Exception as e:
                 error_callback(service, path, e)
@@ -308,7 +312,7 @@
         owner = self.bus_normalize(str(kw['sender']))
         if not owner:
             return
-        interfaces = self.filter_signal_interfaces(iter(iprops.keys()))
+        interfaces = self.filter_signal_interfaces(iter(list(iprops.keys())))
         if not interfaces:
             return
 
@@ -439,7 +443,7 @@
             path, owner, old_assoc, new_assoc, created, destroyed)
 
     def add_items(self, owner, bus_items):
-        for path, items in bus_items.items():
+        for path, items in list(bus_items.items()):
             self.update_interfaces(path, str(owner), old=[], new=items)
 
     def path_match(self, path):
@@ -569,7 +573,8 @@
             obj_map = lambda o: (
                 tuple(*list(filter(svc_filter, list(map(svc_map, [o]))))))
 
-            return dict([x for x in map(obj_map, iter(item.items())) if x])
+            return dict(
+                [x for x in map(obj_map, iter(list(item.items()))) if x])
 
         # Called with a list of path/object tuples.
         if not ifaces:
@@ -611,7 +616,7 @@
 
     @staticmethod
     def has_interfaces(item):
-        for owner in item.keys():
+        for owner in list(item.keys()):
             if ObjectMapper.interfaces_get(item, owner):
                 return True
         return False
diff --git a/obmc/mapper/utils.py b/obmc/mapper/utils.py
index 75b4229..a7b93b2 100644
--- a/obmc/mapper/utils.py
+++ b/obmc/mapper/utils.py
@@ -17,7 +17,11 @@
 import sys
 import dbus
 import dbus.mainloop.glib
-import gobject
+# TODO: openbmc/openbmc#2994 remove python 2 support
+try:  # python 2
+    import gobject
+except ImportError:  # python 3
+    from gi.repository import GObject as gobject
 import obmc.mapper
 
 
