diff --git a/phosphor-mapper b/phosphor-mapper
index e1f3635..b0b485b 100644
--- a/phosphor-mapper
+++ b/phosphor-mapper
@@ -43,13 +43,13 @@
             self.results = {}
 
         @staticmethod
-        def _introspect(service, path):
+        def _introspect(path):
             obj = conn.get_object(service, path, introspect=False)
             iface = dbus.Interface(obj, dbus.INTROSPECTABLE_IFACE)
             return iface.Introspect()
 
         @staticmethod
-        def _get_managed_objects(service, om):
+        def _get_managed_objects(om):
             obj = conn.get_object(service, om, introspect=False)
             iface = dbus.Interface(
                 obj, dbus.BUS_DAEMON_IFACE + '.ObjectManager')
@@ -63,9 +63,9 @@
         def _to_path_elements(path):
             return filter(bool, path.split('/'))
 
-        def __call__(self, service, path):
+        def __call__(self, path):
             self.results = {}
-            self._find_interfaces(service, path)
+            self._find_interfaces(path)
             return self.results
 
         @staticmethod
@@ -73,10 +73,10 @@
             return iface == dbus.BUS_DAEMON_IFACE + '.ObjectManager' \
                 or match(iface)
 
-        def _find_interfaces(self, service, path):
+        def _find_interfaces(self, path):
             path_elements = self._to_path_elements(path)
             path = self._to_path(path_elements)
-            root = ET.fromstring(self._introspect(service, path))
+            root = ET.fromstring(self._introspect(path))
 
             ifaces = filter(
                 self._match,
@@ -84,7 +84,7 @@
             self.results[path] = ifaces
 
             if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in ifaces:
-                objs = self._get_managed_objects(service, path)
+                objs = self._get_managed_objects(path)
                 for k, v in objs.iteritems():
                     self.results[k] = v
             else:
@@ -97,9 +97,9 @@
                     for x in sorted(children)]
                 for child in children:
                     if child not in self.results:
-                        self._find_interfaces(service, child)
+                        self._find_interfaces(child)
 
-    return _FindInterfaces()(service, path)
+    return _FindInterfaces()(path)
 
 
 class Association(dbus.service.Object):
