lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index ce24a0b..7d0bf12 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -2,20 +2,61 @@
 import dbus
 import Openbmc
 
+CACHED_INTERFACES = {
+	'org.openbmc.Fru' : True
+}
+
 SYSTEM_CONFIG = {}
 
+SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
+		'exe_name' : 'bin/sensor_manager.py',
+		'heartbeat' : 'no',
+		'rest_name' : 'sensors',
+		'instances' : [	
+			{
+				'name' : 'Barreleye',
+				'user_label': 'Sensor Manager',
+			}
+		]
+	}
+
+#SYSTEM_CONFIG['org.openbmc.managers.Frus'] = {
+#		'exe_name' : 'bin/fru_manager.py',
+#		'heartbeat' : 'no',
+#		'rest_name' : 'frus',
+#		'instances' : [	
+#			{
+#				'name' : 'Barreleye',
+#				'user_label': 'Fru Manager',
+#			}
+#		]
+#	}
+
+
 SYSTEM_CONFIG['org.openbmc.loggers.EventLogger'] = {
 		'exe_name' : 'bin/eventlogger.py',
 		'heartbeat' : 'no',
 		'rest_name' : 'events',
 		'instances' : [	
 			{
-				'name' : 'Chassis',
-				'user_label': 'Chassis Control',
+				'name' : 'Barreleye',
+				'user_label': 'Event Logger',
 			}
 		]
 	}
 
+SYSTEM_CONFIG['org.openbmc.managers.IpmiTranslator'] = {
+		'exe_name' : 'bin/ipmi_translator.py',
+		'heartbeat' : 'no',
+		'instances' : [	
+			{
+				'name' : 'Barreleye',
+				'user_label': 'IPMI Translator',
+			}
+		]
+	}
+
+
 SYSTEM_CONFIG['org.openbmc.control.Power'] = {
 		'exe_name' : 'bin/power_control.exe',
 		'heartbeat' : 'yes',
@@ -30,35 +71,41 @@
 SYSTEM_CONFIG['org.openbmc.sensors.Temperature.Ambient'] = {
 		'exe_name' : 'bin/sensor_ambient.exe',
 		'heartbeat' : 'yes',
+		'init_methods' : ['org.openbmc.SensorInteger'],
+		'poll_interval': 5000,    
 		'instances' : [	
 			{
 				'name' : 'AmbientTemperature1',
 				'user_label': 'Ambient Temperature 1',
-				'parameters': ['/dev/i2c0','0xA0'],
-				'poll_interval': 5000,     
+				'sensor_id' : 41,
 				'properties' : { 
 					'org.openbmc.SensorIntegerThreshold' : {
 						'lower_critical': 5,
 						'lower_warning' : 10,
 						'upper_warning' : 15,
 						'upper_critical': 20
+					},
+					'org.openbmc.SensorI2c' : {
+						'dev_path' : '/dev/i2c/i2c0',
+						'address' : '0xA0'
 					}
 				}
 			},
 			{
 				'name' : 'AmbientTemperature2',
 				'user_label': 'Ambient Temperature 2',
-				'parameters': ['/dev/i2c0','0xA2'],
-				'poll_interval': 5000,    
  				'properties' : { 
 					'org.openbmc.SensorIntegerThreshold' : {
 						'lower_critical': 5,
 						'lower_warning' : 10,
 						'upper_warning' : 15,
 						'upper_critical': 20
+					},
+					'org.openbmc.SensorI2c' : {
+						'dev_path' : '/dev/i2c/i2c0',
+						'address' : '0xA2'
 					}
 				}
-     
 			}
 		]
 	}
@@ -79,6 +126,7 @@
 			{
 				'name' : 'HostStatus1',
 				'user_label': 'Host Status',
+				'sensor_id' : 43,
 			}
 		]
 	}
@@ -204,13 +252,50 @@
 		]
 	}
 
+SYSTEM_CONFIG['org.openbmc.frus.Board'] = {
+		'exe_name' : 'bin/fru_board.exe',
+		'init_methods' : ['org.openbmc.Fru'],
+		'heartbeat' : 'no',
+		'instances' : [
+			{
+				'name' : 'IO_Planer',
+				'user_label': 'IO Planar',
+				'fru_id' : 61,
+				'properties' : { 
+					'org.openbmc.Fru' : {
+						'label' : 'IO Planar',
+						'location' : 'IO_PLANAR',
+						'type' : Openbmc.FRU_TYPES['BACKPLANE']
+					},
+					'org.openbmc.Fru.Eeprom' : {
+						'i2c_address' : '0xA8',
+						'i2c_dev_path' : '/dev/i2c/i2c5'
+					}
+				}
+			}
+		]
+	}
+
 SYSTEM_CONFIG['org.openbmc.frus.Fru'] = {
 		'exe_name' : 'bin/fru_generic.exe',
 		'heartbeat' : 'no',
-		'instances' : [	
+		'instances' : [
+			{
+				'name' : 'Backplane',
+				'user_label': '2S Motherboard',
+				'fru_id' : 60,
+				'properties' : { 
+					'org.openbmc.Fru' : {
+						'label' : 'MAIN_PLANAR',
+						'location' : 'C0',
+						'type' : Openbmc.FRU_TYPES['BACKPLANE'],
+					}
+				}
+			},
 			{
 				'name' : 'DIMM0',
 				'user_label': 'DIMM A0 Slot 0',
+				'fru_id' : 12,
 				'properties' : { 
 					'org.openbmc.Fru' : {
 						'label' : 'DIMM0',
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index c250bdf..ffa38dd 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -5,17 +5,56 @@
 
 
 FRU_TYPES = {
-	'CPU' : dbus.Byte(1),
-	'DIMM' : dbus.Byte(2),
-	'BACKPLANE' : dbus.Byte(3),
-	'RISER_CARD' : dbus.Byte(4),
-	'FAN' : dbus.Byte(4)
+	'CPU' : 1,
+	'DIMM' : 2,
+	'BACKPLANE' : 3,
+	'RISER_CARD' : 4,
+	'FAN' : 5
 }
-
 ENUMS = {
 	'org.openbmc.SensorIntegerThreshold.state' : 
 		['NOT_SET','NORMAL','LOWER_CRITICAL','LOWER_WARNING','UPPER_WARNING','UPPER_CRITICAL'],
 	'org.openbmc.Fru.type' :
 		['NONE','CPU','DIMM','BACKPLANE','RISER_CARD','FAN']
 }
-	
+
+class DbusProperty:
+	def __init__(self,name,value):
+		self.dbusBaseType = {
+			'dbus.Byte' : 'int',
+			'dbus.Float' : 'float',
+			'dbus.Int32' : 'int',
+			'dbus.UInt32' : 'long',
+			'dbus.String' : 'str',
+			'dbus.UInt64' : 'long',
+		}
+		self.name = str(name)	
+		self.dbusType = str(type(value)).split("'")[1]
+		self.value = None
+		try: 
+			self.value = eval(self.dbusBaseType[self.dbusType]+"(value)")
+		except:
+			raise Exception("Unknown dbus type: "+self.dbusType)
+
+	def changeValue(self,value):
+		try: 
+			self.value = eval(self.dbusBaseType[self.dbusType]+"(value)")
+		except:
+			raise Exception("Unknown dbus type: "+self.dbusType)
+
+
+	def getName(self):
+		return self.name
+	def getValue(self):
+		e = self.dbusType+"(self.value)"
+		return eval(e)
+
+	#def __getstate__(self):
+	#	odict = self.__dict__.copy() # copy the dict since we change it
+ 	#	return odict
+
+	##def __setstate__(self, dict):
+        #	self.__dict__.update(dict)   # update attributes
+
+	def __str__(self):
+		return self.dbusType+":"+str(self.value)
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index c319527..ccea354 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -15,10 +15,15 @@
 class ChassisControlObject(dbus.service.Object):
 	def __init__(self,bus,name):
 		self.dbus_objects = { }
+
+		## load utilized objects
 		self.dbus_busses = {
-				'org.openbmc.control.Power' :        [ { 'name' : 'PowerControl1' ,   'intf' : 'org.openbmc.control.Power' } ],
-				'org.openbmc.leds.ChassisIdentify' : [ { 'name' : 'ChassisIdentify1', 'intf' : 'org.openbmc.control.Chassis' } ],
-				'org.openbmc.control.Host' :         [ { 'name' : 'HostControl1',     'intf' : 'org.openbmc.control.Host' } ]
+			'org.openbmc.control.Power' : 
+				[ { 'name' : 'PowerControl1' ,   'intf' : 'org.openbmc.control.Power' } ],
+			'org.openbmc.leds.ChassisIdentify' :
+				[ { 'name' : 'ChassisIdentify1', 'intf' : 'org.openbmc.control.Chassis' } ],
+			'org.openbmc.control.Host' :
+				[ { 'name' : 'HostControl1',     'intf' : 'org.openbmc.control.Host' } ]
 		}
 		self.power_sequence = 0
 		dbus.service.Object.__init__(self,bus,name)
@@ -26,12 +31,16 @@
 		try: 
 			for bus_name in self.dbus_busses.keys():
 				self.request_name(bus_name,"",bus_name)
-			bus.add_signal_receiver(self.request_name,
-					dbus_interface = 'org.freedesktop.DBus', 
-					signal_name = "NameOwnerChanged")
-		except dbus.exceptions.DBusException, e:
-			# TODO: not sure what to do if can't find other services
-			print e
+
+		except:
+			## its ok if this fails.  hotplug will detect too
+			print "Warning: One of processes not started yet."
+			pass
+
+		## add signal handler to detect when new objects show up on dbus
+		bus.add_signal_receiver(self.request_name,
+				dbus_interface = 'org.freedesktop.DBus', 
+				signal_name = "NameOwnerChanged")
 
 		bus.add_signal_receiver(self.power_button_signal_handler, 
 					dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed", 
@@ -45,12 +54,13 @@
 	def request_name(self, bus_name, a, b):
 		# bus added
 		if (len(b) > 0 ):
+			## if bus in required list for this object, then save a pointer to interface
+			## for method calls
 			if (self.dbus_busses.has_key(bus_name)):
 				obj_path = "/"+bus_name.replace('.','/')
 				for objs in self.dbus_busses[bus_name]:
 					inst_name = objs['name']
 					obj =  bus.get_object(bus_name,obj_path+"/"+inst_name)
-					print "Interface:  "+inst_name+","+objs['intf']
 					self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
 	
 
diff --git a/bin/eventlogger.py b/bin/eventlogger.py
new file mode 100644
index 0000000..113bd03
--- /dev/null
+++ b/bin/eventlogger.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import syslog
+import json
+
+DBUS_NAME = 'org.openbmc.loggers.EventLogger'
+OBJ_NAME = '/org/openbmc/loggers/EventLogger/'+sys.argv[1]
+
+class EventLogger(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		bus = dbus.SessionBus()
+		syslog.openlog('openbmc')
+
+		bus.add_signal_receiver(self.event_log_signal_handler, 
+					dbus_interface = "org.openbmc.EventLog", signal_name = "EventLog" )
+
+	## Signal handler
+	def event_log_signal_handler(self,message):
+		syslog.syslog(json.dumps(message))
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME, bus)
+    obj = EventLogger(bus, OBJ_NAME)
+    mainloop = gobject.MainLoop()
+    
+    print "Running EventLogger"
+    mainloop.run()
+
diff --git a/bin/ipmi_bt.py b/bin/ipmi_bt.py
new file mode 100644
index 0000000..8e4566e
--- /dev/null
+++ b/bin/ipmi_bt.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+
+if (len(sys.argv) < 2):
+	print "Usage:  ipmi_bt.py [system name]"
+	exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.control.IpmiBt'
+OBJ_NAME = '/org/openbmc/control/IpmiBt'
+
+class IpmiBt(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+	
+	@dbus.service.signal(DBUS_NAME)
+	def UpdateFru(self, iid, message):
+ 		pass
+
+	@dbus.service.signal(DBUS_NAME)
+	def UpdateSensor(self, iid, message):
+ 		pass
+
+	@dbus.service.method(DBUS_NAME)
+	def emitUpdateFru(self,ipmi_id,mfg):
+		data = {
+			'manufacturer' : mfg
+		}
+        	self.UpdateFru(ipmi_id,data)
+        	return 'Signal emitted'
+
+	@dbus.service.method(DBUS_NAME)
+	def emitUpdateSensor(self,ipmi_id,data):
+        	self.UpdateSensor(ipmi_id,int(data))
+		print "update sensor emitted"
+        	return 'Signal emitted'
+
+	def getSensor(self,ipmi_id):
+		obj =  bus.get_object('org.openbmc.managers.IpmiTranslator',
+				'/org/openbmc/managers/IpmiTranslator/Barreleye')
+		intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+		return intf.getSensor(ipmi_id)
+
+
+if __name__ == '__main__':
+
+	cmd = sys.argv[2]
+	ipmi_id = int(sys.argv[3])
+	if (len(sys.argv)>4):
+		data = sys.argv[4]
+
+	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+	bus = dbus.SessionBus()
+	name = dbus.service.BusName(DBUS_NAME,bus)
+	obj = IpmiBt(bus,OBJ_NAME)
+	mainloop = gobject.MainLoop()
+
+	if (cmd == 'updatefru'):
+		obj.emitUpdateFru(ipmi_id,data)
+	elif (cmd == 'setsensor'):
+		obj.emitUpdateSensor(ipmi_id,data)
+	elif (cmd == 'getsensor'):
+		print obj.getSensor(ipmi_id)
+		
+
+    #mainloop.run()
+
diff --git a/bin/ipmi_translator.py b/bin/ipmi_translator.py
new file mode 100644
index 0000000..ec56057
--- /dev/null
+++ b/bin/ipmi_translator.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+import PropertyManager
+
+if (len(sys.argv) < 2):
+	print "Usage:  ipmi_translator.py [system name]"
+	exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.IpmiTranslator'
+OBJ_NAME = '/org/openbmc/managers/IpmiTranslator/'+sys.argv[1]
+ID_LOOKUP = {
+	'BUS_NAME' : {},
+	'FRU' : {},
+	'SENSOR' : {}, 
+}
+
+
+class IpmiTranslator(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		bus.add_signal_receiver(self.UpdateFruHandler,
+					dbus_interface = 'org.openbmc.control.IpmiBt', 
+					signal_name = "UpdateFru")
+		bus.add_signal_receiver(self.UpdateSensorHandler,
+					dbus_interface = 'org.openbmc.control.IpmiBt', 
+					signal_name = "UpdateSensor")
+
+		## generate fru and sensor id to dbus object path lookup
+		for bus_name in System.SYSTEM_CONFIG.keys():
+			obj_name = "/"+bus_name.replace('.','/')
+			for instances in System.SYSTEM_CONFIG[bus_name]['instances']:
+				obj_path = obj_name+"/"+instances['name']
+				if (instances.has_key('sensor_id')):
+					iid = instances['sensor_id']
+					ID_LOOKUP['BUS_NAME'][iid] = bus_name
+					ID_LOOKUP['SENSOR'][iid] = obj_path
+				if (instances.has_key('fru_id')):
+					iid = instances['fru_id']
+					ID_LOOKUP['BUS_NAME'][iid] = bus_name
+					ID_LOOKUP['FRU'][iid] = obj_path
+
+				
+	## TODO: Should be event driven instead of calling object methods because
+	##       object could be hung
+	def UpdateFruHandler(self,fru_id,data):
+		if (ID_LOOKUP['FRU'].has_key(fru_id)):
+			obj_path = ID_LOOKUP['FRU'][fru_id]
+			bus_name = ID_LOOKUP['BUS_NAME'][fru_id]
+			## save fru object to object and disk
+			interface_name = 'org.openbmc.Fru'
+			cache = System.CACHED_INTERFACES.has_key(interface_name)
+			PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
+		else:
+			## TODO: error handling
+			pass
+
+	def UpdateSensorHandler(self,sensor_id,value):
+		if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
+			obj_path = ID_LOOKUP['SENSOR'][sensor_id]
+			bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
+			data = { 'value' : value }
+			## save sensor value
+			## TODO:  need to accomodate any sensor interface
+			interface_name = 'org.openbmc.SensorInteger'
+			#cache = System.CACHED_INTERFACES.has_key(interface_name)
+			obj = bus.get_object(bus_name,obj_path)
+			intf = dbus.Interface(obj, interface_name)
+			#intf.setValue(value)
+			PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
+		else:
+			## TODO: error handling
+			pass
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='i', out_signature='i')
+	def getSensor(self,sensor_id):
+		val = 0
+		if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
+			obj_path = ID_LOOKUP['SENSOR'][sensor_id]
+			bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
+			print "getSensor: "+obj_path+","+bus_name
+			## TODO don't do hardcoding
+			obj =  bus.get_object('org.openbmc.managers.Sensors',
+					'/org/openbmc/managers/Sensors/Barreleye')
+			intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
+			val = intf.getSensor(obj_path)
+			print "value = "+str(val)
+
+		return val
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    obj = IpmiTranslator(bus,OBJ_NAME)
+    mainloop = gobject.MainLoop()
+
+    print "Running IpmiTranslator"
+    mainloop.run()
+
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
new file mode 100644
index 0000000..33feebf
--- /dev/null
+++ b/bin/sensor_manager.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+
+if (len(sys.argv) < 2):
+	print "Usage:  sensor_manager.py [system name]"
+	exit(1)
+
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.Sensors'
+OBJ_NAME = '/org/openbmc/managers/Sensors/'+sys.argv[1]
+
+class SensorManager(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		bus.add_signal_receiver(self.UpdateSensor,
+					dbus_interface = 'org.openbmc.SensorInteger', 
+					signal_name = 'Changed', path_keyword='path')
+		bus.add_signal_receiver(self.NormalThreshold,
+					dbus_interface = 'org.openbmc.SensorIntegerThreshold', 
+					signal_name = 'Normal', path_keyword='path')
+		bus.add_signal_receiver(self.WarningThreshold,
+					dbus_interface = 'org.openbmc.SensorIntegerThreshold', 
+					signal_name = 'Warning', path_keyword='path')
+		bus.add_signal_receiver(self.CriticalThreshold,
+					dbus_interface = 'org.openbmc.SensorIntegerThreshold', 
+					signal_name = 'Critical', path_keyword='path')
+
+		self.sensor_cache = {}
+		
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='i')
+	def getSensor(self,path):
+		val = None
+		if (self.sensor_cache.has_key(path) == True):
+			val = self.sensor_cache[path]['value']
+		return val
+		
+	def UpdateSensor(self,value, units, path = None):
+		if (self.sensor_cache.has_key(path) == False):
+			self.sensor_cache[path] = {}
+		self.sensor_cache[path]['value'] = value
+		self.sensor_cache[path]['units'] = units
+
+	@dbus.service.signal(DBUS_NAME)
+	def CriticalThreshold(self, path = None):
+		print "Critical: "+path
+		if (self.sensor_cache.has_key(path) == False):
+			self.sensor_cache[path] = {}
+		self.sensor_cache[path]['threshold'] = "CRITICAL"
+
+
+	@dbus.service.signal(DBUS_NAME)
+	def WarningThreshold(self, path = None):
+		print "Warning: "+path
+		if (self.sensor_cache.has_key(path) == False):
+			self.sensor_cache[path] = {}
+		self.sensor_cache[path]['threshold'] = "WARNING"
+
+
+	@dbus.service.signal(DBUS_NAME)
+	def NormalThreshold(self, path = None):
+		print "Normal: "+path
+		if (self.sensor_cache.has_key(path) == False):
+			self.sensor_cache[path] = {}
+		self.sensor_cache[path]['threshold'] = "NORMAL"
+
+
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    obj = SensorManager(bus,OBJ_NAME)
+    mainloop = gobject.MainLoop()
+
+    print "Running Sensor Manager"
+    mainloop.run()
+
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 7b902c2..3275dc9 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -6,7 +6,9 @@
 import dbus
 import dbus.service
 import dbus.mainloop.glib
-import xml.etree.ElementTree as ET
+#import xml.etree.ElementTree as ET
+import os
+import PropertyManager
 
 if (len(sys.argv) < 2):
 	print "Usage:  system_manager.py [system name]"
@@ -19,50 +21,47 @@
 OBJ_NAME = '/org/openbmc/managers/System'
 HEARTBEAT_CHECK_INTERVAL = 20000
 
-def findConfigInstance(bus_name,obj_path):
-	line = obj_path.split('/')
-	instance_name = line[len(line)-1]
-	if (System.SYSTEM_CONFIG.has_key(bus_name) == False):
-		return {}
-	for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
-		if (instance['name'] == instance_name):
-			return instance
-
-def parseIntrospection(bus_name,obj_name,interfaces,init_interfaces):
-	obj = bus.get_object(bus_name, obj_name)
-	introspect_iface = dbus.Interface(obj,'org.freedesktop.DBus.Introspectable')
-	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
-	root = tree.getroot()
-	interfaces[obj_name] = []
-	init_interfaces[obj_name] = {}
-	for intf in root.iter('interface'):
-		intf_name = intf.attrib['name']
-		if (intf_name == 'org.freedesktop.DBus.ObjectManager'):
-			manager = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
-			for managed_obj in manager.GetManagedObjects():
-				parseIntrospection(bus_name,managed_obj,interfaces,init_interfaces)
-		elif (intf_name.find(Openbmc.BUS_PREFIX) == 0):
-			interfaces[obj_name].append(intf_name)
-			for method in intf.iter('method'):
-				if (method.attrib['name'] == 'init'):
-					#print "Init: "+obj_name+" : "+intf_name
-					init_interfaces[obj_name][intf_name]=1
-				
-
-
 
 class SystemManager(dbus.service.Object):
 	def __init__(self,bus,name):
 		dbus.service.Object.__init__(self,bus,name)
-		bus.add_signal_receiver(self.request_name,
+		#self.sensor_manager_running = False
+		#self.fru_manager_running = False
+		#self.inited = False
+		
+		## Signal handlers
+		bus.add_signal_receiver(self.NewBusHandler,
 					dbus_interface = 'org.freedesktop.DBus', 
 					signal_name = "NameOwnerChanged")
-		# launch dbus object processes
-		for bus_name in System.SYSTEM_CONFIG.keys():
-			self.start_process(bus_name)
+		#bus.add_signal_receiver(self.FruRunningHandler,
+		#			dbus_interface = 'org.openbmc.managers.Frus'
+		#			signal_name = "OpenBmcRunning")
+		#bus.add_signal_receiver(self.SensorRunningHandler,
+		#			dbus_interface = 'org.openbmc.managers.Sensors'
+		#			signal_name = "OpenBmcRunning")
+		bus.add_signal_receiver(self.CacheMeHandler,
+					signal_name = 'CacheMe', path_keyword='path',interface_keyword='interface')
 
+
+		try:
+			# launch dbus object processes
+			for bus_name in System.SYSTEM_CONFIG.keys():
+				self.start_process(bus_name)
+		except Exception as e:
+			## TODO: error handling
+			pass
+		
+		bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
     		gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
 
+	def CacheMeHandler(self,busname,path=None,interface=None):
+		#interface_name = 'org.openbmc.Fru'
+		print "CacheME: "+busname+","+path+","+interface
+		data = {}
+		cache = System.CACHED_INTERFACES.has_key(interface)
+		PropertyManager.saveProperties(bus,busname,path,interface,cache,data)
+
+
 	def start_process(self,bus_name):
 		exe_name = System.SYSTEM_CONFIG[bus_name]['exe_name']
 		cmdline = [ ]
@@ -76,7 +75,6 @@
 			## TODO: error
 			print "Error starting process: "+" ".join(cmdline)
 
-
 	def heartbeat_check(self):
 		print "heartbeat check"
 		for bus_name in System.SYSTEM_CONFIG.keys():
@@ -88,10 +86,13 @@
 				print "Process for "+bus_name+" appears to be dead"
 				self.start_process(bus_name)
 
+			## process is alive, now check if heartbeat received
+			## during previous interval
 			elif (System.SYSTEM_CONFIG[bus_name]['heartbeat'] == 'yes'):
 				if (System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] == 0):
 					print "Heartbeat error: "+bus_name
 					p = System.SYSTEM_CONFIG[bus_name]['popen']
+					## TODO: error checking
 					p.poll()
 					if (p.returncode == None):
 						print "Process must be hung, so killing"
@@ -104,61 +105,34 @@
 					
 		return True
 
-	def heartbeat_update(self,bus_name):
+	def HeartbeatHandler(self,bus_name):
 		System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1	
 
-	def setup_sensor(self,intf):
-		pass 
-
-	def request_name(self, bus_name, a, b):
+	def NewBusHandler(self, bus_name, a, b):
 		if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
 			if (System.SYSTEM_CONFIG.has_key(bus_name)):
 				System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
-				obj_name = "/"+bus_name.replace('.','/')
-				interfaces = {}
-				init_interfaces = {}
-				# introspect object to get used interfaces
-				parseIntrospection(bus_name,obj_name,interfaces,init_interfaces)
-				for obj_path in interfaces.keys():
-					# find instance in system config
-					instance = findConfigInstance(bus_name,obj_path)
-					for intf_name in interfaces[obj_path]:
-						self.initObject(bus_name,obj_path,intf_name,instance)
-					for init_intf in init_interfaces[obj_path].keys():
-						obj = bus.get_object(bus_name,obj_path)
-						intf = dbus.Interface(obj,init_intf)
-						intf.init()
+				obj_root = "/"+bus_name.replace('.','/')
+				obj_paths = []
+
+				## Loads object properties from system config file
+				##  then overlays saved properties from file
+				for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
+					obj_path = obj_root+'/'+instance['name']
+					obj_paths.append(obj_path)
+					if (instance.has_key('properties')):
+						PropertyManager.loadProperties(bus,bus_name,obj_path,												instance['properties'])
+
+				## After object properties are setup, call init method if requested
+				if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
+					for obj_path in obj_paths:
+						for init_interface in System.SYSTEM_CONFIG[bus_name]['init_methods']:
+							obj = bus.get_object(bus_name,obj_path)
+							intf = dbus.Interface(obj,init_interface)
+							print "calling init:" +init_interface
+							intf.init()
 
 
-	def initObject(self,bus_name,obj_path,intf_name,instance):
-		obj = bus.get_object(bus_name,obj_path)
-		intf = dbus.Interface(obj,intf_name)
-		if (instance.has_key('properties')):
-			properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
-			for prop_intf in instance['properties']:
-				for prop in instance['properties'][prop_intf]:
-					value = instance['properties'][prop_intf][prop]
-					properties.Set(prop_intf,prop,value)
-
-		## TODO: fix this explicit check
-		if (intf_name == 'org.openbmc.Control' or intf_name == 'org.openbmc.SensorInteger'):
-			if (System.SYSTEM_CONFIG[bus_name]['heartbeat'] == 'yes'):
-				print "Add heartbeat: "+intf_name;
-				bus.add_signal_receiver(self.heartbeat_update,
-						dbus_interface = intf_name, 
-						signal_name = "Heartbeat")
-		
-			if (instance.has_key('parameters')):
-				intf.setConfigData(instance['parameters'])
-
-
-	@dbus.service.signal(DBUS_NAME)
-	def CriticalThreshold(self, obj):
-		print "Critical: "+obj
-
-	@dbus.service.signal(DBUS_NAME)
-	def WarningThreshold(self, obj):
-		print "Warning: "+obj
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='s', out_signature='sis')