lots of changes
diff --git a/bin/System/Barreleye.py b/bin/System/Barreleye.py
deleted file mode 100644
index 364a280..0000000
--- a/bin/System/Barreleye.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#! /usr/bin/python
-
-def BarreleyeProcesses():
-	config = {}
-
-	config['org.openbmc.control.Power'] = {
-		'exe_name' : 'bin/power_control.exe',
-		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'PowerControl1',
-				'user_label': 'Power control',
-			}
-		]
-	}
-
-	config['org.openbmc.sensors.Temperature.Ambient'] = {
-		'exe_name' : 'bin/sensor_ambient.exe',
-		'heartbeat' : "yes",
-		'instances' : [	
-			{
-				'name' : 'AmbientTemperature1',
-				'user_label': 'Ambient Temperature 1',
-				'parameters': ['/dev/i2c0','0xA0'],
-				'poll_interval': 5000,          
-				'lower_critical': 5,
-				'lower_warning' : 10,
-				'upper_warning' : 15,
-				'upper_critical': 20
-			},
-			{
-				'name' : 'AmbientTemperature2',
-				'user_label': 'Ambient Temperature 2',
-				'parameters': ['/dev/i2c0','0xA2'],
-				'poll_interval': 5000,          
-				'lower_critical': 5,
-				'lower_warning' : 10,
-				'upper_warning' : 15,
-				'upper_critical': 20
-			}
-		]
-	}
-	config['org.openbmc.buttons.ButtonPower'] = {
-		'exe_name' : 'bin/button_power.exe',
-		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'PowerButton1',
-				'user_label': 'Main Power Button',
-			}
-		]
-	}
-	config['org.openbmc.sensors.HostStatus'] = {
-		'exe_name' : 'bin/sensor_host_status.exe',
-		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'HostStatus1',
-				'user_label': 'Host Status',
-			}
-		]
-	}
-	config['org.openbmc.leds.ChassisIdentify'] = {
-		'exe_name' : 'bin/chassis_identify.exe',
-		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'ChassisIdentify1',
-				'user_label': 'Chassis Identify LED',
-			}
-		]
-	}
-	config['org.openbmc.flash.BIOS'] = {
-		'exe_name' : 'bin/flash_bios.exe',
-		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'BIOS1',
-				'user_label': 'BIOS SPI Flash',
-			}
-		]
-	}
-	config['org.openbmc.control.Host'] = {
-		'exe_name' : 'bin/control_host.exe',
-		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'HostControl1',
-				'user_label': 'Host Control',
-			}
-		]
-	}
-	config['org.openbmc.control.Chassis'] = {
-		'exe_name' : 'bin/chassis_control.py',
-		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'Chassis',
-				'user_label': 'Chassis Control',
-			}
-		]
-	}
-
-
-	return config
-
-def BarreleyeGpios():
-	gpio = {}
-	gpio['FSI_CLK']    = { 'gpio_num': 23, 'direction': 'out' }
-	gpio['FSI_DATA']   = { 'gpio_num': 24, 'direction': 'out' }
-	gpio['FSI_ENABLE'] = { 'gpio_num': 25, 'direction': 'out' }
-	gpio['POWER_PIN']  = { 'gpio_num': 26, 'direction': 'out'  }
-	gpio['CRONUS_SEL'] = { 'gpio_num': 27, 'direction': 'out'  }
-	gpio['PGOOD']      = { 'gpio_num': 28, 'direction': 'in'  }
-	gpio['IDENTIFY']   = { 'gpio_num': 30, 'direction': 'out' }
-	gpio['POWER_BUTTON'] = { 'gpio_num': 31, 'direction': 'in' }
-
-
-	return gpio
-
diff --git a/bin/System/Barreleye.pyc b/bin/System/Barreleye.pyc
deleted file mode 100644
index c79f477..0000000
--- a/bin/System/Barreleye.pyc
+++ /dev/null
Binary files differ
diff --git a/bin/System/__init__.py b/bin/System/__init__.py
deleted file mode 100644
index 0cb7ef8..0000000
--- a/bin/System/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from Barreleye import BarreleyeProcesses
-from Barreleye import BarreleyeGpios
diff --git a/bin/System/__init__.pyc b/bin/System/__init__.pyc
deleted file mode 100644
index 92a4920..0000000
--- a/bin/System/__init__.pyc
+++ /dev/null
Binary files differ
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index d11ab40..22c0314 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -1,42 +1,63 @@
 #!/usr/bin/env python
 
+import sys
 import gobject
 import dbus
 import dbus.service
 import dbus.mainloop.glib
+import System
 
 DBUS_NAME = 'org.openbmc.control.Chassis'
-OBJ_NAME = '/org/openbmc/control/Chassis'
+OBJ_NAME = '/org/openbmc/control/Chassis/'+sys.argv[1]
 
 POWER_OFF = 0
 POWER_ON = 1
 
+process_config = System.BarreleyeProcesses()
+
+
+
 class ChassisControlObject(dbus.service.Object):
 	def __init__(self,bus,name):
+		self.dbus_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' } ]
+		}
 		self.power_sequence = 0
 		dbus.service.Object.__init__(self,bus,name)
 		bus = dbus.SessionBus()
 		try: 
-			# Get PowerControl object
-			power_control_service = bus.get_object('org.openbmc.control.Power','/org/openbmc/control/Power/0')
-			self.power_control_iface = dbus.Interface(power_control_service, 'org.openbmc.control.Power')
-			# Get ChassisIdentify object
-			chassis_identify_service = bus.get_object('org.openbmc.leds.ChassisIdentify','/org/openbmc/leds/ChassisIdentify/0')
-			self.identify_led_iface = dbus.Interface(chassis_identify_service, 'org.openbmc.Led');
-			# Get HostControl object
-			host_control_service = bus.get_object('org.openbmc.control.Host','/org/openbmc/control/Host/0')
-			self.host_control_iface = dbus.Interface(host_control_service, 'org.openbmc.control.Host');
-
-			bus.add_signal_receiver(self.power_button_signal_handler, 
-						dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed")
-    			bus.add_signal_receiver(self.power_good_signal_handler, 
-						dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
-
-
+			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 "Unable to find dependent services: ",e
+			print e
 
+		bus.add_signal_receiver(self.power_button_signal_handler, 
+					dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed", 
+					path="/org/openbmc/buttons/ButtonPower/PowerButton1" )
+    		bus.add_signal_receiver(self.power_good_signal_handler, 
+					dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood",
+					path="/org/openbmc/control/Power/PowerControl1")
+
+
+	
+	def request_name(self, bus_name, a, b):
+		# bus added
+		if (len(b) > 0 ):
+			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'])
+	
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='s')
@@ -48,7 +69,7 @@
 		in_signature='', out_signature='')
 	def setIdentify(self):
 		print "Turn on identify"
-		self.identify_led_iface.setOn()
+		self.dbus_objects['ChassisIdentify1'].setOn()
 		return None
 
 
@@ -56,7 +77,7 @@
 		in_signature='', out_signature='')
 	def clearIdentify(self):
 		print "Turn off identify"
-		r=self.identify_led_iface.setOff()
+		r=self.dbus_objects['ChassisIdentify1'].setOff()
 		return None
 
 	@dbus.service.method(DBUS_NAME,
@@ -65,7 +86,7 @@
 		print "Turn on power and boot"
 		self.power_sequence = 0
 		if (self.getPowerState()==0):
-			self.power_control_iface.setPowerState(POWER_ON)
+			self.dbus_objects['PowerControl1'].setPowerState(POWER_ON)
 			self.power_sequence = 1
 		return None
 
@@ -73,13 +94,13 @@
 		in_signature='', out_signature='')
 	def setPowerOff(self):
 		print "Turn off power"
-		self.power_control_iface.setPowerState(POWER_OFF);
+		self.dbus_objects['PowerControl1'].setPowerState(POWER_OFF);
 		return None
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='i')
 	def getPowerState(self):
-		state = self.power_control_iface.getPowerState();
+		state = self.dbus_objects['PowerControl1'].getPowerState();
 		return state
 
 	@dbus.service.method(DBUS_NAME,
@@ -106,7 +127,7 @@
 	## Signal handler
 	def power_good_signal_handler(self):
 		if (self.power_sequence==1):
-			self.host_control_iface.boot()
+			self.dbus_objects['HostControl1'].boot()
 			self.power_sequence = 2
 
 
diff --git a/bin/gpio_manager.py b/bin/gpio_manager.py
deleted file mode 100644
index e0a264e..0000000
--- a/bin/gpio_manager.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python
-
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import System
-
-DBUS_NAME = 'org.openbmc.managers.Gpios'
-OBJ_NAME = '/org/openbmc/managers/Gpios'
-
-gpio_config = System.BarreleyeGpios()
-gpio_dev = '/sys/class/gpio'
-
-class GpioManager(dbus.service.Object):
-	def __init__(self,bus,name):
-		dbus.service.Object.__init__(self,bus,name)
-		bus = dbus.SessionBus()
-		self.gpio_locks = {}
-		
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='s', out_signature='sis')
-	def init(self,name):
-		gpio_path = ''
-		if (gpio_config.has_key(name) == False):
-			# TODO: Error handling
-			print "ERROR: "+name+" not found in GPIO config table"
-		else:
-			gpio_num = gpio_config[name]['gpio_num']
-			print "GPIO Lookup: "+name+" = "+str(gpio_num)
-
-		return [gpio_dev, gpio_num, gpio_config[name]['direction']]
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='s', out_signature='')
-	def open(self,name):
-		gpio_num = gpio_config[name]['gpio_num']
-		self.gpio_locks[gpio_num] = 1
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='s', out_signature='')
-	def close(self,name):
-		# unexport?
-		gpio_num = gpio_config[name]['gpio_num']
-		self.gpio_locks[gpio_num] = 0
-
-
-	## Signal handler
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName(DBUS_NAME, bus)
-    obj = GpioManager(bus, OBJ_NAME)
-    mainloop = gobject.MainLoop()
-    
-    print "Running GpioManager"
-    mainloop.run()
-
diff --git a/bin/sensor_management.py b/bin/sensor_management.py
deleted file mode 100644
index 014a5b4..0000000
--- a/bin/sensor_management.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env python
-
-
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import xml.etree.ElementTree as ET
-import System
-
-NORMAL   = 0
-LOWER_WARNING  = 1
-LOWER_CRITICAL = 2
-UPPER_WARNING  = 3
-UPPER_CRITICAL = 4
-
-
-sensor_config = System.Barreleye()
-
-## finds objects held by Dbus ObjectManager
-def get_interface(obj_path):
-	bus_name = sensor_config[obj_path]['bus_name']
-	obj_name = "/"+bus_name.replace('.','/')
-	obj = bus.get_object(bus_name, obj_name)
-	#Find object in object manager and retrieve interface name
-	manager = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
-	objects = manager.GetManagedObjects()
-	interface = None
-	if (objects.has_key(obj_path)):
-		for intf in objects[obj_path].keys():
-			if (intf.find('Sensor') > 0):
-				interface = intf
-
-	if (interface == None):
-		raise Exception("Unable to find sensor: "+obj_path)	
-	
-	return interface
-
-
-## Maintains last value, handles sensor changed events, applies thresholds
-## The Sensor class is not exported onto dbus
-class Sensor:
-
-	def __init__(self, bus, obj_name, warning_callback, critical_callback):
-		obj = bus.get_object(sensor_config[obj_name]['bus_name'],obj_name)
-
-		## member variables
-		self.object_name = obj_name
-		interface_name = get_interface(obj_name)
-		self.interface = dbus.Interface(obj,interface_name)
-		self.value = self.interface.getValue()
-		self.upper_critical_threshold = None
-		self.lower_critical_threshold = None
-		self.upper_warning_threshold = None
-		self.lower_warning_threshold = None
-		self.threshold_state = NORMAL
-		self.emit_warning = warning_callback
-		self.emit_critical = critical_callback
-		
-		## add signal handler to update cached value when sensor changes
-		bus.add_signal_receiver(self.sensor_changed_signal_handler,
-					dbus_interface = interface_name, signal_name = "Changed")
- 						
-	def set_thresholds(self,lc,lw,uw,uc):
-		self.upper_critical_threshold = uc
-		self.lower_critical_threshold = lc
-		self.upper_warning_threshold = uw
-		self.lower_warning_threshold = lw
-	
-	def set_config(self,data):
-		self.interface.setConfigData(data)
-
-	## called when associated sensor dbus object emits a Changed signal
-	def sensor_changed_signal_handler(self,value):
-		## update value from signal data
-		self.value = value
-		
-		## check thresholds
-		state = NORMAL
-		if (value < self.lower_critical_threshold):
-			state = LOWER_CRITICAL
-		elif (value < self.lower_warning_threshold):
-			state = LOWER_WARNING
-		elif (value > self.upper_critical_threshold):
-			state = UPPER_CRITICAL
-		elif (value > self.upper_warning_threshold):
-			state = UPPER_WARNING
-		## only emit signal if threshold state has changed
-		if (state != self.threshold_state):
-			self.threshold_state = state
-			if (state == LOWER_CRITICAL or state == UPPER_CRITICAL):
-				self.emit_critical(self.object_name)
-			if (state == LOWER_WARNING or state == UPPER_WARNING):
-				self.emit_warning(self.object_name)
-
-
-	def get_value(self):
-		return self.value	
-
-
-class SensorManagement(dbus.service.Object):
-	def __init__(self,bus,name):
-		dbus.service.Object.__init__(self,bus,name)
-		self.sensor_cache = {}
-		try:
-			for objname in sensor_config.keys():
-				print "Loading: "+objname
-				sensor_new = Sensor(bus,objname,
-						self.WarningThreshold,self.CriticalThreshold)
-				sensor_new.set_thresholds(sensor_config[objname]['lower_critical'],
-						 	  sensor_config[objname]['lower_warning'],
-							  sensor_config[objname]['upper_warning'],
-							  sensor_config[objname]['upper_critical'])
-				if (sensor_config[objname].has_key('parameters')):
-					sensor_new.set_config(sensor_config[objname]['parameters'])
-				self.sensor_cache[objname] = sensor_new
-
-		except dbus.exceptions.DBusException, e:
-			# TODO: not sure what to do if can't find other services
-			print "Unable to find dependent services: ",e
-
-
-	@dbus.service.method("org.openbmc.SensorManagement",
-		in_signature='s', out_signature='a{ss}')
-	def getAllSensors(self,obj_name):
-		return None
-		
-	@dbus.service.method("org.openbmc.SensorManagement",
-		in_signature='s', out_signature='i')
-	def getSensorValue(self,obj_name):
-		sensor = self.sensor_cache[obj_name]
-		return sensor.get_value()
-
-	@dbus.service.signal('org.openbmc.SensorManagement')
-	def CriticalThreshold(self, obj):
-		print "Critical: "+obj
-
-	@dbus.service.signal('org.openbmc.SensorManagement')
-	def WarningThreshold(self, obj):
-		print "Warning: "+obj
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName("org.openbmc.SensorManagement",bus)
-    obj = SensorManagement(bus,'/org/openbmc/SensorManagement')
-    mainloop = gobject.MainLoop()
-    
-    print "Running SensorManagementService"
-    mainloop.run()
-
diff --git a/bin/sensor_management2.py b/bin/sensor_management2.py
deleted file mode 100644
index e897410..0000000
--- a/bin/sensor_management2.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-
-
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import xml.etree.ElementTree as ET
-import System
-
-DBUS_NAME = 'org.openbmc.managers.Sensors'
-OBJ_NAME = '/org/openbmc/managers/Sensors'
-
-NORMAL   = 0
-LOWER_WARNING  = 1
-LOWER_CRITICAL = 2
-UPPER_WARNING  = 3
-UPPER_CRITICAL = 4
-
-
-sensor_config = System.BarreleyeSensors()
-
-## finds objects held by Dbus ObjectManager
-def get_interface(bus_name):
-	obj_name = "/"+bus_name.replace('.','/')
-	obj = bus.get_object(bus_name, obj_name)
-	
-	#Find object in object manager and retrieve interface name
-	manager = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
-	objects = manager.GetManagedObjects()
-	obj_path = None
-	interface = None
-
-	for o in objects:
-		for intf in objects[o].keys():
-			if (intf.find('Sensor') > 0):
-				interface = intf
-				obj_path = o
-
-	if (interface == None):
-		raise Exception("Unable to find sensor: "+obj_path)	
-	
-	return [obj_path, interface]
-
-
-class SensorManagement(dbus.service.Object):
-	def __init__(self,bus,name):
-		dbus.service.Object.__init__(self,bus,name)
-		self.sensor_cache = {}
-		for bus_name in bus.list_names():
-			if (bus_name.find('org.openbmc.sensors')==0):
-				self.request_name(bus_name,"",bus_name)
-
-		bus.add_signal_receiver(self.request_name,
-			dbus_interface = 'org.freedesktop.DBus', 
-					signal_name = "NameOwnerChanged")
-
-
-	def request_name(self, bus_name, a, b):
-		if (len(b) > 0 and bus_name.find('org.openbmc.sensors') == 0):
-			if (sensor_config.has_key(bus_name) == True):
-				try:
-					print "Loading: "+bus_name
-					obj_info = get_interface(bus_name)
-					obj = bus.get_object(bus_name,obj_info[0])
-					intf = dbus.Interface(obj,obj_info[1])
-					intf.setThresholds(sensor_config[bus_name]['lower_critical'],
-						sensor_config[bus_name]['lower_warning'],
-						sensor_config[bus_name]['upper_warning'],
-						sensor_config[bus_name]['upper_critical'])
-					if (sensor_config[bus_name].has_key('parameters')):
-						intf.setConfigData(sensor_config[bus_name]['parameters'])
-	
-				except dbus.exceptions.DBusException, e:
-					# TODO: not sure what to do if can't find other services
-					print "Unable to find dependent services: ",e
-			else:
-				print "Sensor found on bus but no config: "+bus_name
-		if (len(b) == 0  and bus_name.find('org.openbmc') ==0):
-			print "Sensor stopped: "+bus_name
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='s', out_signature='a{ss}')
-	def getAllSensors(self,obj_name):
-		return None
-		
-	@dbus.service.method(DBUS_NAME,
-		in_signature='s', out_signature='i')
-	def getSensorValue(self,obj_name):
-		sensor = self.sensor_cache[obj_name]
-		return sensor.get_value()
-
-	@dbus.service.signal(DBUS_NAME)
-	def CriticalThreshold(self, obj):
-		print "Critical: "+obj
-
-	@dbus.service.signal(DBUS_NAME)
-	def WarningThreshold(self, obj):
-		print "Warning: "+obj
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName(DBUS_NAME,bus)
-    obj = SensorManagement(bus,OBJ_NAME)
-    mainloop = gobject.MainLoop()
-    
-    print "Running SensorManagerService"
-    mainloop.run()
-
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 7d17da6..7b902c2 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -1,43 +1,54 @@
 #!/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 System
+
+if (len(sys.argv) < 2):
+	print "Usage:  system_manager.py [system name]"
+	exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
 
 DBUS_NAME = 'org.openbmc.managers.System'
 OBJ_NAME = '/org/openbmc/managers/System'
-
-gpio_dev = '/sys/class/gpio'
-process_config = System.BarreleyeProcesses()
-gpio_config = System.BarreleyeGpios()
+HEARTBEAT_CHECK_INTERVAL = 20000
 
 def findConfigInstance(bus_name,obj_path):
 	line = obj_path.split('/')
 	instance_name = line[len(line)-1]
-	if (process_config.has_key(bus_name) == False):
+	if (System.SYSTEM_CONFIG.has_key(bus_name) == False):
 		return {}
-	for instance in process_config[bus_name]['instances']:
+	for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
 		if (instance['name'] == instance_name):
 			return instance
 
-def parseIntrospection(bus_name,obj_name,interfaces):
+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)
-		elif (intf_name.find('org.openbmc') == 0):
+				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):
@@ -47,71 +58,99 @@
 					dbus_interface = 'org.freedesktop.DBus', 
 					signal_name = "NameOwnerChanged")
 		# launch dbus object processes
-		for bus_name in process_config.keys():
-			exe_name = process_config[bus_name]['exe_name']
-			cmdline = [ ]
-			cmdline.append(exe_name)
-			for instance in process_config[bus_name]['instances']:
-				cmdline.append(instance['name'])
-			subprocess.Popen(cmdline);
+		for bus_name in System.SYSTEM_CONFIG.keys():
+			self.start_process(bus_name)
 
-		gobject.timeout_add(5000, self.heartbeat_check)
+    		gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
+
+	def start_process(self,bus_name):
+		exe_name = System.SYSTEM_CONFIG[bus_name]['exe_name']
+		cmdline = [ ]
+		cmdline.append(exe_name)
+		for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
+			cmdline.append(instance['name'])
+		try:
+			print "Starting process: "+" ".join(cmdline)
+			System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline);
+		except Exception as e:
+			## TODO: error
+			print "Error starting process: "+" ".join(cmdline)
+
 
 	def heartbeat_check(self):
 		print "heartbeat check"
-		for bus_name in process_config.keys():
-			if (process_config[bus_name]['heartbeat'] == 'yes'):
-				if (process_config[bus_name]['heartbeat_count'] == 0):
+		for bus_name in System.SYSTEM_CONFIG.keys():
+			## even if process doesn't request heartbeat check, 
+			##   make sure process is still alive
+			p = System.SYSTEM_CONFIG[bus_name]['popen']
+			p.poll()
+			if (p.returncode != None):
+				print "Process for "+bus_name+" appears to be dead"
+				self.start_process(bus_name)
+
+			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']
+					p.poll()
+					if (p.returncode == None):
+						print "Process must be hung, so killing"
+						p.kill()
+						
+					self.start_process(bus_name)			
 				else:
-					process_config[bus_name]['heartbeat_count'] == 0
-					print "Heartbeat ok"
+					System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
+					print "Heartbeat ok: "+bus_name
+					
+		return True
 
 	def heartbeat_update(self,bus_name):
-		process_config[bus_name]['heartbeat_count']=1	
+		System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1	
 
 	def setup_sensor(self,intf):
 		pass 
 
 	def request_name(self, bus_name, a, b):
-		if (len(b) > 0 and bus_name.find('org.openbmc') == 0):
-			try:
-				if (process_config.has_key(bus_name)):
-					process_config[bus_name]['heartbeat_count'] = 0
-					obj_name = "/"+bus_name.replace('.','/')
-					interfaces = {}
-					parseIntrospection(bus_name,obj_name,interfaces)
-					for obj_path in interfaces.keys():
-						instance = findConfigInstance(bus_name,obj_path)
-						for intf_name in interfaces[obj_path]:
-							obj = bus.get_object(bus_name,obj_path)
-							intf = dbus.Interface(obj,intf_name)
-							if (intf_name == 'org.openbmc.SensorIntegerThreshold'):
-								intf.set(instance['lower_critical'],
-								instance['lower_warning'],
-								instance['upper_warning'],
-								instance['upper_critical'])
-									
-							if (intf_name == 'org.openbmc.SensorInteger'):
-								if (process_config[bus_name]['heartbeat'] == 'yes'):
-									bus.add_signal_receiver(self.heartbeat_update,
-										dbus_interface = intf_name, 
-										signal_name = "Heartbeat")
+		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()
 
-								if (instance.has_key('parameters')):
-									intf.setConfigData(instance['parameters'])
 
-			except Exception as e:
-				print e
+	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)
 
-		if (len(b)==0  and bus_name.find('org.openbmc.sensors') == 0):
-			exe_name = process_config[bus_name]['exe_name']
-			cmdline = [ ]
-			cmdline.append(exe_name)
-			for instance in process_config[bus_name]['instances']:
-				cmdline.append(instance['name'])
- 
-			subprocess.Popen(cmdline);
+		## 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):
@@ -126,14 +165,14 @@
 	def gpioInit(self,name):
 		gpio_path = ''
 		gpio_num = 0
-		if (gpio_config.has_key(name) == False):
+		if (System.GPIO_CONFIG.has_key(name) == False):
 			# TODO: Error handling
 			print "ERROR: "+name+" not found in GPIO config table"
 			return ['',0,'']
 		else:
-			gpio_num = gpio_config[name]['gpio_num']
+			gpio_num = System.GPIO_CONFIG[name]['gpio_num']
 
-		return [gpio_dev, gpio_num, gpio_config[name]['direction']]
+		return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
 
 
 if __name__ == '__main__':
@@ -143,7 +182,6 @@
     obj = SystemManager(bus,OBJ_NAME)
     mainloop = gobject.MainLoop()
 
-    
     print "Running SystemManager"
     mainloop.run()