diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index b370d8b..b87fec8 100755
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -5,17 +5,11 @@
 GPIO_DEV = '/sys/class/gpio'
 BUS = "system"
 
-ENUMS = {
-	'org.openbmc.SensorIntegerThreshold.state' : 
-		['NOT_SET','NORMAL','LOWER_CRITICAL','LOWER_WARNING','UPPER_WARNING','UPPER_CRITICAL'],
-}
-
 def getSystemName():
 	#use filename as system name, strip off path and ext
 	parts = __file__.replace('.pyc','').replace('.py','').split('/')
 	return parts[len(parts)-1]
 
-
 def getDBus():
 	bus = None
 	if (BUS == "session"):
@@ -24,18 +18,11 @@
 		bus = dbus.SystemBus()
 	return bus
 
-
-def getManagerInterface(bus,manager):
-	bus_name = "org.openbmc.managers."+manager
-	obj_name = "/org/openbmc/managers/"+manager
-	obj = bus.get_object(bus_name,obj_name)
-	return dbus.Interface(obj,bus_name)
-
-
 class DbusProperties(dbus.service.Object):
 	def __init__(self):
 		dbus.service.Object.__init__(self)
 		self.properties = {}
+		self.object_path = ""
 
 	@dbus.service.method(dbus.PROPERTIES_IFACE,
 		in_signature='ss', out_signature='v')
@@ -94,17 +81,66 @@
 		if (value_changed == True):
 			self.PropertiesChanged(interface_name, prop_dict, [])
 	
-
 	@dbus.service.signal(dbus.PROPERTIES_IFACE,
 		signature='sa{sv}as')
 	def PropertiesChanged(self, interface_name, changed_properties,
 		invalidated_properties):
 		pass
 
+class DbusObjectManager(dbus.service.Object):
+	def __init__(self):
+		dbus.service.Object.__init__(self)
+		self.objects = {}
+
+	def add(self,object_path,obj):
+		self.objects[object_path] = obj
+		self.InterfacesAdded(object_path,obj.properties)
+
+	def remove(self,object_path):
+		obj = self.objects.pop(object_path,None)
+		obj.remove_from_connection()
+		self.InterfacesRemoved(object_path,obj.properties.keys())
+
+	def get(self,object_path):
+		return self.objects[object_path]
+
+	@dbus.service.method("org.freedesktop.DBus.ObjectManager",
+		in_signature='', out_signature='a{oa{sa{sv}}}')
+	def GetManagedObjects(self):
+		data = {}
+		for objpath in self.objects.keys():
+			data[objpath] = self.objects[objpath].properties
+		return data
+
+	@dbus.service.signal("org.freedesktop.DBus.ObjectManager",
+		signature='oa{sa{sv}}')
+	def InterfacesAdded(self,object_path,properties):
+		self.ObjectAdded(object_path,"")
+
+	@dbus.service.signal("org.freedesktop.DBus.ObjectManager",
+		signature='oas')
+	def InterfacesRemoved(self,object_path,interfaces):
+		pass
+
+	## Legacy support, need to eventually refactor out
 	@dbus.service.signal("org.openbmc.Object.ObjectMapper",
 		signature='ss')
 	def ObjectAdded(self,object_path,interface_name):
 		pass
 
+	## flattens interfaces
+	@dbus.service.method('org.openbmc.Object.Enumerate',
+		in_signature='', out_signature='a{sa{sv}}')
+	def enumerate(self):
+		data = {}
+		for objpath in self.objects.keys():
+			props = self.objects[objpath].properties
+			data[objpath] = { }
+			for iface in props.keys():
+				data[objpath].update(props[iface])
+				
+		return data
+		
+
 
 
