diff --git a/phosphor-rest b/phosphor-rest
index 600b3d5..026eb74 100644
--- a/phosphor-rest
+++ b/phosphor-rest
@@ -20,14 +20,14 @@
 import SocketServer
 import json
 import dbus
-from OpenBMCMapper import Path
+from OpenBMCMapper import Path, Mapper, PathTree
 import OpenBMCMapper
 
 class RestException(Exception):
 	def __init__(self, msg, http_status=403):
 		self.status = http_status
 		super(RestException, self).__init__(msg)
-        
+
 class Response(object):
 	def render(self, handler):
 		raise NotImplemented()
@@ -55,7 +55,7 @@
 
 class RequestHandler(object):
 	def __init__(self, req, path, data):
-		self.req = req 
+		self.req = req
 		self.path = path
 		self.bus = req.server.bus
 		self.mapper = req.server.mapper
@@ -101,8 +101,8 @@
 		return m
 
 	def find_method(self):
-		busses = self.mapper.GetTree(
-				self.path, 0, 'exact')[self.path]
+		busses = self.mapper.get_object(
+				self.path)
 		for items in busses.iteritems():
 			m = self.find_method_on_bus(*items)
 			if not m:
@@ -166,7 +166,7 @@
 				obj, dbus_interface=dbus.PROPERTIES_IFACE)
 
 		for iface in interfaces:
-			if self.try_set_one_interface(prop, value, 
+			if self.try_set_one_interface(prop, value,
 					properties_iface, iface):
 				return True
 
@@ -209,7 +209,7 @@
 		super(AttrHandler, self).__init__(req, path, data)
 		try:
 			self.inst = InstanceHandler(req, path, data,
-					self.mapper.GetTree(path, 0, 'exact')[path])
+					self.mapper.get_object(path))
 		except KeyError:
 			raise RestException("Not Found", 404)
 		self.attr = Path(self.req.path).rel(first = -1)
@@ -229,7 +229,7 @@
 		super(TypesHandler, self).__init__(req, path, data)
 
 	def do_GET(self):
-		types = self.mapper.GetTreePaths(self.path, 1, 'exact')
+		types = self.mapper.get_subtree_paths(self.path, 1)
 		if not types:
 			raise RestException("Not Found", 404)
 
@@ -240,25 +240,57 @@
 		super(ListHandler, self).__init__(req, path, data)
 
 	def do_GET(self):
-		objs = self.mapper.GetTree(self.path, -1, 'fuzzy')
-		if self.path in objs:
-			del objs[self.path]
+		objs = self.mapper.get_subtree(self.path)
 		if not objs:
 			raise RestException("Not Found", 404)
 
-		return objs.keys() 
+		return objs.keys()
 
 class EnumerateHandler(RequestHandler):
 	def __init__(self, req, path, data):
 		super(EnumerateHandler, self).__init__(req, path, data)
 
+	def get_enumerate(self, path, data):
+		busses = []
+		for s, i in data.iteritems():
+			if OpenBMCMapper.ENUMERATE_IFACE in i:
+				busses.append(s)
+		return busses
+
+	def call_enumerate(self, path, busses):
+		objs = {}
+		for b in busses:
+			obj = self.bus.get_object(b, path)
+			iface = dbus.Interface(obj, OpenBMCMapper.ENUMERATE_IFACE)
+			objs.update(iface.enumerate())
+		return objs
+
 	def do_GET(self):
 		objs = {}
-		mapper_data = self.mapper.GetTree(self.path, -1, 'fuzzy')
-		if self.path in mapper_data:
-			del mapper_data[self.path]
-
+		mapper_data = self.mapper.get_subtree(self.path)
+		tree = PathTree()
 		for x,y in mapper_data.iteritems():
+			tree[x] = y
+
+		try:
+			# Check to see if the root path implements
+			# enumerate in addition to any sub tree
+			# objects.
+			root = self.mapper.get_object(self.path)
+			mapper_data[self.path] = root
+		except:
+			pass
+
+		have_enumerate = [ (x[0], self.get_enumerate(*x)) for x in mapper_data.iteritems() \
+				if self.get_enumerate(*x) ]
+
+		for x,y in have_enumerate:
+			objs.update(self.call_enumerate(x, y))
+			tmp = tree[x]
+			del tree[x]
+			tree[x] = tmp
+
+		for x,y in tree.dataitems():
 			objs[x] = InstanceHandler(self.req, x, self.data, y).do_GET()
 
 		if not objs:
@@ -279,18 +311,17 @@
 		if path.parts[-1] == 'enumerate':
 			return EnumerateHandler(self, path.fq(last = -1), data)
 
-		if path.parts[-2] == 'attr':
+		if path.depth() > 1 and path.parts[-2] == 'attr':
 			return AttrHandler(self, path.fq(last = -2), data)
 
-		if path.parts[-2] == 'action':
+		if path.depth() > 1 and path.parts[-2] == 'action':
 			return MethodHandler(self, path.fq(last = -2), data)
 
 		# have to do an objectmapper query at this point
-		mapper_entry = self.server.mapper.GetTree(
-				path.fq(), 0, 'exact')
+		mapper_entry = self.server.mapper.get_object(path.fq())
 		if mapper_entry:
-			return InstanceHandler(self, path.fq(), data, 
-					mapper_entry[path.fq()])
+			return InstanceHandler(self, path.fq(), data,
+					mapper_entry)
 
 		raise RestException("Not Found", 404)
 
@@ -328,15 +359,12 @@
 		return self.do_command()
 
 class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
-	def __init__(self, bind, handler):
+	def __init__(self, bind, handler, bus):
 		BaseHTTPServer.HTTPServer.__init__(self, bind, handler)
-		self.bus = dbus.SystemBus()
-		mapper = self.bus.get_object(OpenBMCMapper.MAPPER_NAME,
-				OpenBMCMapper.MAPPER_PATH)
-		self.mapper = dbus.Interface(mapper,
-				dbus_interface = OpenBMCMapper.MAPPER_IFACE)
+		self.bus = bus
+		self.mapper = Mapper(self.bus)
 
 if __name__ == '__main__':
 	bus = dbus.SystemBus()
-	server = HTTPServer(('', 80), DBusRestHandler)
+	server = HTTPServer(('', 80), DBusRestHandler, bus)
 	server.serve_forever()
