diff --git a/bin/system_manager.py b/bin/system_manager.py
index 75fb74f..b33f78f 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -7,9 +7,10 @@
 import dbus.service
 import dbus.mainloop.glib
 import os
-import PropertyManager
 import time
 import json
+import xml.etree.ElementTree as ET
+
 import Openbmc
 
 if (len(sys.argv) < 2):
@@ -27,10 +28,37 @@
 INTF_ITEM = 'org.openbmc.InventoryItem'
 INTF_CONTROL = 'org.openbmc.Control'
 
+def get_objects(bus,bus_name,path,objects):
+	tmp_path = path
+	if (path == ""):
+		tmp_path="/"
+
+	obj = bus.get_object(bus_name,tmp_path)
+	introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
+ 	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
+ 	root = tree.getroot()
+	parent = True
+	##print introspect_iface.Introspect()
+	for node in root.iter('node'):
+		for intf in node.iter('interface'):
+			objects[path] = True
+
+		if (node.attrib.has_key('name') == True):
+			node_name = node.attrib['name']
+			if (parent == False):
+				get_objects(bus,bus_name,path+"/"+node_name,objects)
+			else:
+				if (node_name != "" and node_name != path):
+					get_objects(bus,bus_name,node_name,objects)
+			
+		parent = False
+
+
+
+
 class SystemManager(dbus.service.Object):
 	def __init__(self,bus,name):
 		dbus.service.Object.__init__(self,bus,name)
-		self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
 
 		## Signal handlers
 		bus.add_signal_receiver(self.NewBusHandler,
@@ -43,11 +71,11 @@
 		self.bus_name_lookup = {}
 		self.bin_path = os.path.dirname(os.path.realpath(sys.argv[0]))
 
-		for bus_name in System.SYSTEM_CONFIG.keys():
-			sys_state = System.SYSTEM_CONFIG[bus_name]['system_state']
+		for name in System.APPS.keys():
+			sys_state = System.APPS[name]['system_state']
 			if (self.system_states.has_key(sys_state) == False):
 				self.system_states[sys_state] = []
-			self.system_states[sys_state].append(bus_name)
+			self.system_states[sys_state].append(name)
 	
 		## replace symbolic path in ID_LOOKUP
 		for category in System.ID_LOOKUP:
@@ -61,18 +89,6 @@
 
 
 	def SystemStateHandler(self,state_name):
-		print "Checking previous state started..."
-		i = 0
-		started = self.check_state_started()	
-		while(i<10 and started == False):
-			started = self.check_state_started()	
-			i=i+1
-			time.sleep(1)	
-
-		if (i == STATE_START_TIMEOUT):
-			print "ERROR: Timeout waiting for state to finish: "+self.current_state
-			return					
-		
 		## clearing object started flags
 		try:
 			for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
@@ -82,8 +98,8 @@
 
 		print "Running System State: "+state_name
 		if (self.system_states.has_key(state_name)):
-			for bus_name in self.system_states[state_name]:
-				self.start_process(bus_name)
+			for name in self.system_states[state_name]:
+				self.start_process(name)
 		
 		if (state_name == "BMC_INIT"):
 			## Add poll for heartbeat
@@ -144,81 +160,56 @@
 		byte = int(key)
 		return self.doObjectLookup(category,byte)
 	
-	def start_process(self,bus_name):
-		if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
-			process_name = self.bin_path+"/"+System.SYSTEM_CONFIG[bus_name]['process_name']
+	def start_process(self,name):
+		if (System.APPS[name]['start_process'] == True):
+			app = System.APPS[name]
+			process_name = self.bin_path+"/"+app['process_name']
 			cmdline = [ ]
 			cmdline.append(process_name)
-			System.SYSTEM_CONFIG[bus_name]['popen'] = None
-			for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
-				cmdline.append(instance['name'])
+			app['popen'] = None
+			if (app.has_key('args')):
+				for a in app['args']:
+					cmdline.append(a)
 			try:
-				print "Starting process: "+" ".join(cmdline)+": "+bus_name
-				System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline)
+				print "Starting process: "+" ".join(cmdline)+": "+name
+				app['popen'] = subprocess.Popen(cmdline)
 			except Exception as e:
 				## TODO: error
 				print "ERROR: starting process: "+" ".join(cmdline)
 
 	def heartbeat_check(self):
-		for bus_name in System.SYSTEM_CONFIG.keys():
-			if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True and
-				System.SYSTEM_CONFIG[bus_name].has_key('popen') and
-				System.SYSTEM_CONFIG[bus_name]['monitor_process'] == True):
+		for name in System.APPS.keys():
+			app = System.APPS[name]
+			if (app['start_process'] == True and 
+				app.has_key('popen') and
+				app['monitor_process'] == True):
+
 				##   make sure process is still alive
-				p = System.SYSTEM_CONFIG[bus_name]['popen']
+				p = app['popen']
 				p.poll()
 				if (p.returncode != None):
-					print "Process for "+bus_name+" appears to be dead"
-					self.start_process(bus_name)
+					print "Process for "+name+" appears to be dead"
+					self.start_process(name)
 	
 		return True
 
-	def check_state_started(self):
-		r = True
-		if (self.current_state == ""):
-			return True
-		if (self.system_states.has_key(self.current_state)):
-			for bus_name in self.system_states[self.current_state]:
-				if (System.SYSTEM_CONFIG[bus_name].has_key('popen') == False and
-					System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
-					r = False
-					break;	
-		return r
-	
 	def NewBusHandler(self, bus_name, a, b):
 		if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
 			objects = {}
 			try:
-				Openbmc.get_objs(bus,bus_name,"",objects)
-				for instance_name in objects.keys():
-					obj_path = objects[instance_name]['PATH']
-					#obj = bus.get_object("org.openbmc.managers.Property",
-					#		"/org/openbmc/managers/Property")
-					#intf = dbus.Interface(obj,"org.openbmc.managers.Property")
-					#intf.loadFromCache(bus_name,obj_path)
+				get_objects(bus,bus_name,"",objects)
+				for obj_path in objects.keys():
 					self.bus_name_lookup[obj_path] = bus_name
+					print "New object: "+obj_path+" ("+bus_name+")"
 					if (System.EXIT_STATE_DEPEND[self.current_state].has_key(obj_path) == True):
 						System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 1
 								
 			except Exception as e:
+				## object probably disappeared
+				#print e
 				pass
 	
-			if (System.SYSTEM_CONFIG.has_key(bus_name)):
-				for instance_name in objects.keys(): 
-					obj_path = objects[instance_name]['PATH']
-					for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
-						if (instance.has_key('properties') and instance['name'] == instance_name):
-							props = instance['properties']
-							print "Load Properties: "+obj_path
-							self.property_manager.loadProperties(bus_name,obj_path,props)
-					## If object has an init method, call it
-					for init_intf in objects[instance_name]['INIT']:
-						obj = bus.get_object(bus_name,obj_path)
-						intf = dbus.Interface(obj,init_intf)
-						print "Calling init method: " +obj_path+" : "+init_intf
-						intf.init()
-
-			## check if all objects are started to move to next state
+			## check if all required objects are started to move to next state
 			try:
 				state = 1
 				for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
@@ -236,16 +227,26 @@
 		in_signature='s', out_signature='sis')
 	def gpioInit(self,name):
 		gpio_path = ''
-		gpio_num = 0
+		gpio_num = -1
+		r = ['',gpio_num,'']
 		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 = System.GPIO_CONFIG[name]['gpio_num']
-
-		return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
-
+			
+			gpio_num = -1
+			gpio = System.GPIO_CONFIG[name]
+			if (System.GPIO_CONFIG[name].has_key('gpio_num')):
+				gpio_num = gpio['gpio_num']
+			else:
+				if (System.GPIO_CONFIG[name].has_key('gpio_pin')):
+					gpio_num = System.convertGpio(gpio['gpio_pin'])
+				else:
+					print "ERROR: SystemManager - GPIO lookup failed for "+name
+		
+			if (gpio_num != -1):
+				r = [Openbmc.GPIO_DEV, gpio_num, gpio['direction']]
+		return r
 		
 
 if __name__ == '__main__':
