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')
