lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index d7c596b..2d5c800 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -5,7 +5,7 @@
 import Openbmc
 
 HOME_PATH = './'
-BIN_PATH = HOME_PATH
+BIN_PATH = HOME_PATH+'bin/'
 CACHE_PATH = HOME_PATH+'cache/'
 FRU_PATH = CACHE_PATH+'frus/'
 
@@ -45,32 +45,17 @@
 		]
 	}
 
-SYSTEM_CONFIG['org.openbmc.managers.Frus'] = {
+SYSTEM_CONFIG['org.openbmc.managers.Inventory'] = {
 		'system_state' : 'STANDBY',
 		'start_process' : True,
 		'monitor_process' : True,
-		'process_name' : 'fru_manager.py',
+		'process_name' : 'inventory_manager.py',
 		'heartbeat' : 'no',
 		'rest_name' : 'frus',
 		'instances' : [	
 			{
 				'name' : 'Barreleye',
-				'user_label': 'Fru Manager',
-			}
-		]
-	}
-
-SYSTEM_CONFIG['org.openbmc.managers.Ipmi'] = {
-		'system_state' : 'STANDBY',
-		'start_process' : True,
-		'monitor_process' : True,
-		'process_name' : 'ipmi_manager.py',
-		'heartbeat' : 'no',
-		'rest_name' : 'frus',
-		'instances' : [	
-			{
-				'name' : 'Barreleye',
-				'user_label': 'Ipmi Manager',
+				'user_label': 'Inventory Manager',
 			}
 		]
 	}
@@ -348,7 +333,6 @@
 		'manufacturer' : 'DELTA',
 		'fru'	       : True,
 		'location' : 'F0',
-		'sensor_link' : 'fans/Fan_0',
 	},
 	'/system/fan1' :
 	{
@@ -356,7 +340,6 @@
 		'manufacturer' : 'DELTA',
 		'fru'	       : True,
 		'location' : 'F1',
-		'sensor_link' : 'fans/Fan_1',
 	},
 	'/system/motherboard/bmc' :
 	{
@@ -376,27 +359,27 @@
 	{
 		'ftype'        : Openbmc.FRU_TYPES['CORE'],
 		'fru'	       : False,
-		'sensor_link' : 1,	
+		'sensor_id'    : 1,	
 	},
 	'/system/motherboard/cpu0/core1' :
 	{
 		'ftype'        : Openbmc.FRU_TYPES['CORE'],
 		'fru'	       : False,
-		'sensor_link' : 2,	
+		'sensor_id'    : 2,	
 	},
 	'/system/motherboard/dimm0' :
 	{
 		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
 		'fru'	       : True,
 		'fru_id'       : 12,
-		'sensor_link'  : 20,	
+		'sensor_id'    : 20,	
 	},
 	'/system/motherboard/dimm1' :
 	{
 		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
 		'fru'	       : True,
 		'fru_id'       : 13,
-		'sensor_link'  : 21,	
+		'sensor_id'    : 21,	
 	},
 }
 
diff --git a/bin/fru_manager.py b/bin/fru_manager.py
deleted file mode 100644
index 220b7d3..0000000
--- a/bin/fru_manager.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import sys
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import cPickle
-import json
-
-if (len(sys.argv) < 2):
-	print "Usage:  fru_manager.py [system name]"
-	exit(1)
-System = __import__(sys.argv[1])
-import Openbmc
-
-DBUS_NAME = 'org.openbmc.managers.Frus'
-OBJ_NAME = '/org/openbmc/managers/Frus'
-FRUS = System.FRU_INSTANCES
-
-class Fru:
-	def __init__(self,fru_id,data):
-		if (data.has_key('ftype') == False):
-			raise Exception("Fru must have ftype")
-
-		self.fru_id = fru_id
-		self.data = { 'fru_id' : fru_id }
-		self.ftype = data['ftype']
-		self.update(data)
-	
-	def getField(self,field):
-		return self.data[field]
-
-	def getId(self):
-		return self.fru_id
-
-	def update(self,data):
-		for k in data.keys():
-			self.data[k] = data[k]
-
-	def isCached(self):
-		is_cached = False
-		if (self.data.has_key('cache')):
-			if (self.data['cache']):
-				is_cached = True
-		return is_cached
-	
-	def saveToCache(self):
-		if (self.isCached() == False):
-			return
-		global FRU_PATH
-		print "Caching: "+str(self.fru_id)
-		filename = FRU_PATH+"fru_"+str(self.fru_id)
-		output = open(filename, 'wb')
-		## just pickle dict not whole object
-		cPickle.dump(self.data,output)
-		output.close()		
-
-	def loadFromCache(self):
-		if (self.isCached() == False):
-			return;
-		## overlay with pickled data
-		global FRU_PATH
-		filename = FRU_PATH+"fru_"+str(self.fru_id)
-
-		if (os.path.isfile(filename)):
-			print "Loading from cache: "+filename
-			p = open(filename, 'rb')
-			data2 = cPickle.load(p)
-			for k in data2.keys():
-				self.data[k] = data2[k]
-	def toJson(self):
-		return json.dumps(self.data)
-
-	def __str__(self):	
-		r = "Fru: "+str(self.fru_id)+"\n"
-		for f in self.data.keys():
-			r = r+f+" = "+str(self.data[f])+"\n"
-		return r
-
-		
-
-class FruManager(dbus.service.Object):
-	def __init__(self,bus,name):
-		dbus.service.Object.__init__(self,bus,name)
-		
-		bus.add_signal_receiver(self.UpdateFruHandler,
-					signal_name = 'UpdateFru')
-
-		self.fru_db = {}
-		self.fru_id_lookup = {}
-		for fru in FRUS.keys():
-			#self.updateFru(fid,System.FRUS[fid])
-			if (FRUS[fru].has_key('fru_id')):
-				print fru
-				print FRUS[fru]['fru_id']
-			
-	def UpdateFruHandler(self,fru_id,data):
-		self.updateFru(fru_id,data)		
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='isv', out_signature='')
-	def updateFruField(self,fru_id,field,value):
-		data = { field : value }
-		self.updateFru(fru_id,data)
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='ia{sv}', out_signature='')
-	def updateFru(self,fru_id,data):
-		## translate dbus data into basic data types
-		for k in data.keys():
-			d = Openbmc.DbusProperty(k,data[k])
-			data[k] = d.getBaseValue()
-
-		if (self.fru_db.has_key(fru_id)):
-			## update properties then save to cache
-			print "Updating FRU: "+str(fru_id)
-			self.fru_db[fru_id].update(data)
-			self.fru_db[fru_id].saveToCache()
-		else:
-			## fru doesn't exist, so add
-			## then overlay with data from cache
-			print "Adding FRU: "+str(fru_id)
-			fru = Fru(fru_id,data)
-			self.fru_db[fru_id] = fru
-			fru.loadFromCache()
-
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='s')
-	def getFrus(self):
-		r = ""
-		for f in self.fru_db.keys():
-			r=r+"["+self.fru_db[f].toJson()+"],"
-		return r
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName(DBUS_NAME,bus)
-    obj = FruManager(bus,OBJ_NAME)
-    mainloop = gobject.MainLoop()
-
-    print "Running Fru Manager"
-    mainloop.run()
-
diff --git a/bin/inventory_manager.py b/bin/inventory_manager.py
new file mode 100644
index 0000000..dcc0114
--- /dev/null
+++ b/bin/inventory_manager.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import cPickle
+import json
+
+if (len(sys.argv) < 2):
+	print "Usage:  inventory_manager.py [system name]"
+	exit(1)
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.Inventory'
+OBJ_NAME = '/org/openbmc/managers/Inventory'
+FRUS = System.FRU_INSTANCES
+FRU_PATH = System.FRU_PATH
+
+## accessor class to FRU data structure
+class Fru:
+	def __init__(self,fru):
+		## validation
+		if (FRUS.has_key(fru) == False):
+			# TODO: event log
+			raise Exception("Invalid FRU path: "+fru)
+		
+		self.fru = fru
+	
+	def getField(self,field):
+		if (FRUS[self.fru].has_key(field) == False):
+			# TODO: event log
+			raise Exception("Invalid field: "+field)
+			
+		return FRUS[self.fru][field]
+
+	def isFru(self):
+		return FRUS[self.fru]['fru']
+
+	def update(self,data):
+		for k in data.keys():
+			FRUS[self.fru][k] = data[k]
+
+	def isCached(self):
+		return True
+
+	def getCacheFilename(self):
+		global FRU_PATH
+		filename = FRU_PATH+self.fru.replace('/','.')
+		return filename
+	
+	def saveToCache(self):
+		if (self.isCached() == False):
+			return
+		print "Caching: "+self.fru
+		output = open(self.getCacheFilename(), 'wb')
+		## just pickle dict not whole object
+		print FRUS[self.fru]
+		cPickle.dump(FRUS[self.fru],output)
+		output.close()
+
+	def loadFromCache(self):
+		if (self.isCached() == False):
+			return;
+		## overlay with pickled data
+		filename=self.getCacheFilename()
+		if (os.path.isfile(filename)):
+			print "Loading from cache: "+filename
+			p = open(filename, 'rb')
+			data2 = cPickle.load(p)
+			for k in data2.keys():
+				FRUS[self.fru][k] = data2[k]
+
+	def __str__(self):	
+		r = "Fru: "+str(self.fru_id)+"\n"
+		for f in self.data.keys():
+			r = r+f+" = "+str(self.data[f])+"\n"
+		return r
+
+		
+
+class InventoryManager(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		
+		bus.add_signal_receiver(self.UpdateFruHandler,
+					signal_name = 'UpdateFru')
+
+		self.fru_db = {}
+		self.fru_id_lookup = {}
+		self.sensor_id_lookup = {}
+
+		for fru_path in FRUS.keys():
+			self.addFru(fru_path)
+			f = FRUS[fru_path]
+			if (f.has_key('fru_id')):
+				self.fru_id_lookup[f['fru_id']] = fru_path
+			if (f.has_key('sensor_id')):
+				self.sensor_id_lookup[f['sensor_id']] = fru_path
+
+			
+	def UpdateFruHandler(self,fru_id,data):
+		self.updateFru(fru_id,data)		
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='y', out_signature='s')	
+	def getFruSensor(self,sensor_id):
+		if (self.sensor_id_lookup.has_key(sensor_id) == False):
+			return ""
+		return self.sensor_id_lookup[sensor_id]
+		
+	def addFru(self,fru_path):
+		new_fru = Fru(fru_path)
+		new_fru.loadFromCache()
+		self.fru_db[fru_path] = new_fru
+				
+	@dbus.service.method(DBUS_NAME,
+		in_signature='ia{sv}', out_signature='')
+	def updateFruFromId(self,fru_id,data):
+		iid = int(fru_id)
+		if (self.fru_id_lookup.has_key(iid) == False):
+			# TODO: event log
+			print "fru id "+str(iid)+" not found"
+		else:
+			self.updateFru(self.fru_id_lookup[iid],data)
+		
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='sa{sv}', out_signature='')
+	def updateFru(self,fru_path,data):
+		## translate dbus data into basic data types
+		clean_data = {}
+		for k in data.keys():
+			d = Openbmc.DbusProperty(k,data[k])
+			clean_data[str(k)] = d.getBaseValue()
+
+		if (self.fru_db.has_key(fru_path)):
+			## update properties then save to cache
+			print "Updating FRU: "+fru_path
+			self.fru_db[fru_path].update(clean_data)
+			self.fru_db[fru_path].saveToCache()
+
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='', out_signature='a{sa{sv}}')
+	def getFrus(self):
+		return FRUS
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    obj = InventoryManager(bus,OBJ_NAME)
+    mainloop = gobject.MainLoop()
+
+    print "Running Inventory Manager"
+    mainloop.run()
+
diff --git a/bin/ipmi_example.py b/bin/ipmi_example.py
new file mode 100644
index 0000000..a0c5a86
--- /dev/null
+++ b/bin/ipmi_example.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import PropertyManager
+
+import Openbmc
+
+
+
+def getWatchdog():
+	obj =  bus.get_object('org.openbmc.watchdog.Host',
+			'/org/openbmc/watchdog/HostWatchdog_0')
+	intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+	return intf
+
+def getChassisControl():
+	obj =  bus.get_object('org.openbmc.control.Chassis',
+			'/org/openbmc/control/Chassis')
+	intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
+	return intf
+
+def prettyPrint(data):
+	for k in data.keys():
+		print k
+		for k2 in data[k].keys():
+			print "\t"+k2+" = "+str(data[k][k2])
+
+if __name__ == '__main__':
+ 	bus = dbus.SessionBus()
+	cmd = sys.argv[1]
+	data = None
+	ipmi_id = dbus.Byte(0)
+	if (len(sys.argv) > 2):
+		ipmi_id = dbus.Byte(int(sys.argv[2]))
+	if (len(sys.argv)>3):
+		data = sys.argv[3]
+
+	if (cmd == "poweron"):
+		intf = getChassisControl()
+		intf.powerOn()
+	elif (cmd == "poweroff"):
+		intf = getChassisControl()
+		intf.powerOff()
+	elif (cmd == "setsensor"):
+		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+		intf_sens.setSensorFromId(ipmi_id,data)
+	elif (cmd == "getsensor"):
+		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+		print intf_sens.getSensorFromId(ipmi_id)
+	elif (cmd == "getsensors"):
+		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+		data = intf_sens.getSensors()
+		prettyPrint(data)
+	elif (cmd == "updatefru"):
+		intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
+		intf_fru.updateFruFromId(ipmi_id,data)
+	elif (cmd == "getfrus"):
+		intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
+		data = intf_fru.getFrus()
+		prettyPrint(data)
+	elif (cmd == "pokewatchdog"):
+		intf = self.getWatchdog()
+		intf.poke()
+	elif (cmd == "statewatchdog"):
+		intf = self.getWatchdog()
+		intf.start()
+	else:
+		print "Unsupported command"
+
+
+
+
+
+
diff --git a/bin/ipmi_manager.py b/bin/ipmi_manager.py
deleted file mode 100644
index 24c36f4..0000000
--- a/bin/ipmi_manager.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-#from gi.repository import GObject
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import PropertyManager
-
-if (len(sys.argv) < 2):
-	print "Usage:  ipmi_manager.py [system name]"
-	exit(1)
-
-System = __import__(sys.argv[1])
-import Openbmc
-
-DBUS_NAME = 'org.openbmc.managers.Ipmi'
-OBJ_NAME = '/org/openbmc/managers/Ipmi'
-
-
-class IpmiManager(dbus.service.Object):
-	def __init__(self,bus,name):
-		dbus.service.Object.__init__(self,bus,name)
-
-	## IPMI commands
-	@dbus.service.method(DBUS_NAME,
-		in_signature='yv', out_signature='')
-	def setSensor(self,sensor_id,value):
-		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
-		intf_sens.setSensorFromId(sensor_id,value)
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='y', out_signature='v')
-	def getSensor(self,sensor_id):
-		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
-		return intf_sens.getSensorFromId(sensor_id)
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='ia{sv}', out_signature='')
-	def updateFru(self,fru_id,data):
-		intf_fru = Openbmc.getManagerInterface(bus,"Frus")
-		intf_fru.updateFru(fru_id,data)
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='s')
-	def getFrus(self):
-		intf_fru = Openbmc.getManagerInterface(bus,"Frus")
-		return intf_fru.getFrus()
-
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='')
-	def pokeHostWatchdog(self):
-		## TODO don't do hardcoding
-		obj =  bus.get_object('org.openbmc.watchdog.Host',
-				'/org/openbmc/watchdog/HostWatchdog_0')
-		intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
-		intf.poke()
-		return None
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='')
-	def startHostWatchdog(self):
-		## TODO don't do hardcoding
-		obj =  bus.get_object('org.openbmc.watchdog.Host',
-				'/org/openbmc/watchdog/HostWatchdog_0')
-		intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
-		intf.start()
-		return None
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='')
-	def powerOn(self):
-		## TODO don't do hardcoding
-		obj =  bus.get_object('org.openbmc.control.Chassis',
-				'/org/openbmc/control/Chassis')
-		intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
-		intf.powerOn()
-		return None
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='')
-	def powerOff(self):
-		## TODO don't do hardcoding
-		obj =  bus.get_object('org.openbmc.control.Chassis',
-				'/org/openbmc/control/Chassis')
-		intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
-		intf.powerOff()
-		return None
-
-
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName(DBUS_NAME,bus)
-    obj = IpmiManager(bus,OBJ_NAME)
-    mainloop = gobject.MainLoop()
-
-    print "Running IpmiManager"
-    mainloop.run()
-
diff --git a/bin/ipmitool.py b/bin/ipmitool.py
deleted file mode 100644
index 973f071..0000000
--- a/bin/ipmitool.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-import dbus
-from gi.repository import GObject
-import dbus.service
-import dbus.mainloop.glib
-import Openbmc
-
-
-if __name__ == '__main__':
-	cmd = sys.argv[1]
-	data = None
-	ipmi_id = dbus.Byte(0)
-	if (len(sys.argv) > 2):
-		ipmi_id = dbus.Byte(int(sys.argv[2]))
-	if (len(sys.argv)>3):
-		data = sys.argv[3]
-
-	bus = dbus.SessionBus()
-	intf = Openbmc.getManagerInterface(bus,"Ipmi")
-
-	if (cmd == 'updatefru'):
-		d = { 'manufacturer' : data }
-		intf.updateFru(ipmi_id,d)
-	elif (cmd == 'getfrus'):
-		print intf.getFrus()
-	elif (cmd == 'setsensor'):
-		data_b = dbus.Byte(int(data))
-		intf.setSensor(ipmi_id,data_b)
-	elif (cmd == 'getsensor'):
-		print intf.getSensor(ipmi_id)
-	elif (cmd == 'pokewatchdog'):
-		print intf.pokeHostWatchdog()
-	elif (cmd == 'startwatchdog'):
-		print intf.startHostWatchdog()
-	elif (cmd == 'poweron'):
-		print intf.powerOn()
-	elif (cmd == 'poweroff'):
-		print intf.powerOff()
-	else:
-		print "ERROR: Invalid command"
-		print "Valid commands: updatefru, setsensor, getsensor, startwatchdog, pokewatchdog"		
-
-    #mainloop.run()
-
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 9a193d6..4d8eccd 100644
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -39,9 +39,7 @@
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='a{sa{sv}}')
-	def getSensorsAll(self):
-		## this is probably not ok
-		##sensors = []
+	def getSensors(self):
 		return self.sensor_cache;
 	
 	@dbus.service.method(DBUS_NAME,
@@ -56,6 +54,15 @@
 	@dbus.service.method(DBUS_NAME,
 		in_signature='yv', out_signature='')
 	def setSensorFromId(self,ipmi_id,value):
+		## first check if fru functional sensor
+		intf_inv = Openbmc.getManagerInterface(bus,"Inventory")
+		fru_path = intf_inv.getFruSensor(ipmi_id)
+		if (fru_path != ""):
+			data = { 'state': value }
+			intf_inv.updateFru(fru_path,data)
+			print "Found Fru Based Sensor: "+fru_path
+			return None
+
 		intf_sys = Openbmc.getManagerInterface(bus,"System")
 		obj_info = intf_sys.getObjFromIpmi(ipmi_id)
 		
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 015aa8d..b852543 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -56,6 +56,14 @@
 
 
 	def SystemStateHandler(self,state_name):
+		print "Checking previous state started..."
+		i = 0
+		not_started=True
+		while(i<10 and not_started):
+			not_started = self.check_state_started()	
+			i=i+1
+			# add sleep	
+
 		print "Running System State: "+state_name
 		if (self.system_states.has_key(state_name)):
 			for bus_name in self.system_states[state_name]:
@@ -67,22 +75,23 @@
 		
 		if (System.ENTER_STATE_CALLBACK.has_key(state_name)):
 			cb = System.ENTER_STATE_CALLBACK[state_name]
-			obj = bus.get_object(cb['bus_name'],cb['obj_name'])
+			obj = bus.get_<F11>object(cb['bus_name'],cb['obj_name'])
 			method = obj.get_dbus_method(cb['method_name'],cb['interface_name'])
 			method()
 
-		current_state = state_name
+		self.current_state = state_name
 			
 	def start_process(self,bus_name):
 		if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
 			process_name = System.BIN_PATH+System.SYSTEM_CONFIG[bus_name]['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'])
 			try:
 				print "Starting process: "+" ".join(cmdline)+": "+bus_name
-				System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline);
+				System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline)
 			except Exception as e:
 				## TODO: error
 				print "Error starting process: "+" ".join(cmdline)
@@ -124,13 +133,26 @@
 		#print "Heartbeat seen: "+bus_name
 		System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1	
 
+	def check_state_started(self):
+		r = True
+		if (self.current_state == ""):
+			return True
+		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):
+				print "Not found: "+bus_name
+				r = False
+				break;	
+		return r
+	
+
 	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
 				objects = {}
-				Openbmc.get_objs(bus,bus_name,Openbmc.OBJ_PREFIX,objects)
-					
+				Openbmc.get_objs(bus,bus_name,Openbmc.OBJ_PREFIX,objects)				
+	
 				for instance_name in objects.keys(): 
 					obj_path = objects[instance_name]['PATH']
 					for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
diff --git a/includes/gpio.c b/includes/gpio.c
index 1bd10a7..b4b6139 100644
--- a/includes/gpio.c
+++ b/includes/gpio.c
@@ -13,6 +13,7 @@
 
 int gpio_writec(GPIO* gpio, char value)
 {
+	g_assert (gpio != NULL);
 	int rc = GPIO_OK;
 	char buf[1];
 	buf[0] = value;
@@ -25,6 +26,7 @@
 
 int gpio_write(GPIO* gpio, uint8_t value)
 {
+	g_assert (gpio != NULL);
 	int rc = GPIO_OK;
 	char buf[1];
 	buf[0] = '0';
@@ -41,6 +43,7 @@
 
 int gpio_read(GPIO* gpio, uint8_t *value)
 {
+	g_assert (gpio != NULL);
 	char buf[1];
 	int r = GPIO_OK;
 	if (gpio->fd <= 0)
@@ -63,6 +66,7 @@
 	return r;
 }
 int gpio_clock_cycle(GPIO* gpio, int num_clks) {
+	g_assert (gpio != NULL);
         int i=0;
 	int r=GPIO_OK;
         for (i=0;i<num_clks;i++) {
@@ -168,9 +172,13 @@
 
 int gpio_open(GPIO* gpio)
 {
+	g_assert (gpio != NULL);
 	// open gpio for writing or reading
 	char buf[254];
 	int rc = 0;
+	if (gpio->direction == NULL) {
+		return GPIO_OPEN_ERROR;
+	}
 	if (strcmp(gpio->direction,"in")==0)
 	{
 		sprintf(buf, "%s/gpio%d/value", gpio->dev, gpio->num);
diff --git a/includes/openbmc.h b/includes/openbmc.h
index bb6660b..576d3a4 100644
--- a/includes/openbmc.h
+++ b/includes/openbmc.h
@@ -16,16 +16,18 @@
 
 
 #ifdef __arm__
-static inline void write_reg(uint32_t val,void* addr)
+static inline void devmem(void* addr, uint32_t val)
 {
+	printf("devmem 0x%08x = 0x%08x\n",addr,val);
         asm volatile("" : : : "memory");
         *(volatile uint32_t *)addr = val;
 }
-static inline devmem(uint32_t val, uint32_t reg)
-{
-	void* r = (void*)reg;
-       write_reg(val,r);
-}
+//static inline devmem(uint32_t reg, uint32_t val)
+//{
+//	printf("devmem 0x%08x = 0x%08x\n",reg,val);
+//	//void* r = (void*)reg;
+ //       write_reg(reg,val);
+//}
 #else
 static inline devmem(uint32_t val, uint32_t reg)
 {
diff --git a/objects/control_bmc_obj.c b/objects/control_bmc_obj.c
index 7e9965f..9ceaf9b 100644
--- a/objects/control_bmc_obj.c
+++ b/objects/control_bmc_obj.c
@@ -14,46 +14,94 @@
 static const gchar* dbus_object_path = "/org/openbmc/control";

 static const gchar* dbus_name        = "org.openbmc.control.Bmc";

 

+//this probably should come from some global SOC config

+

+#define LPC_BASE		0x1e789000

+#define LPC_HICR6		0x80

+#define LPC_HICR7		0x88

+#define LPC_HICR8		0x8c

+

+#define SPI_BASE		0x1e630000

+#define SCU_BASE                0x1e780000

+#define UART_BASE               0x1e783000

+#define COM_BASE                0x1e789000

+#define GPIO_BASE		0x1e6e2000

 

 static GDBusObjectManagerServer *manager = NULL;

 

+void* memmap(int mem_fd,uint32_t* base)

+{

+	void* bmcreg;

+	bmcreg = mmap(NULL, getpagesize(),

+			PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, base);

+

+	if (bmcreg == MAP_FAILED) {

+		perror("Unable to map LPC register memory");

+		exit(1);

+	}

+	return bmcreg;

+}

+

+void reg_init()

+{

+	g_print("BMC init\n");

+	// BMC init done here

+

+	void *bmcreg;

+	int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);

+	if (mem_fd < 0) {

+		perror("Unable to open /dev/mem");

+		exit(1);

+	}

+

+	bmcreg = memmap(mem_fd,LPC_BASE);

+	devmem(bmcreg+LPC_HICR6,0x00000500); //Enable LPC FWH cycles, Enable LPC to AHB bridge

+	devmem(bmcreg+LPC_HICR7,0x30000E00); //32M PNOR

+	devmem(bmcreg+LPC_HICR8,0xFE0001FF);

+

+	//flash controller

+	bmcreg = memmap(mem_fd,SPI_BASE);

+	devmem(bmcreg+0x00,0x00000003);

+	devmem(bmcreg+0x04,0x00002404);

+

+	//UART

+

+	

+	bmcreg = memmap(mem_fd,UART_BASE);

+	devmem(bmcreg+0x00,0x00000000);  //Set Baud rate divisor -> 13 (Baud 115200)

+	devmem(bmcreg+0x04,0x00000000);  //Set Baud rate divisor -> 13 (Baud 115200)

+	devmem(bmcreg+0x08,0x000000c1);  //Disable Parity, 1 stop bit, 8 bits

+	bmcreg = memmap(mem_fd,COM_BASE);

+	devmem(bmcreg+0x9C,0x00000000);  //Set routing UART1 -> COM 1

+

+	bmcreg = memmap(mem_fd,SCU_BASE);

+	devmem(bmcreg+0x00,0x13008CE7);

+	devmem(bmcreg+0x04,0x0370E677);

+	devmem(bmcreg+0x20,0xDF48F7FF);

+	devmem(bmcreg+0x24,0xC738F202);

+

+

+	//GPIO

+	bmcreg = memmap(mem_fd,GPIO_BASE);

+	devmem(bmcreg+0x84,0x00fff0c0);  //Enable UART1

+	devmem(bmcreg+0x70,0x120CE406);

+	devmem(bmcreg+0x80,0xCB000000);

+	devmem(bmcreg+0x88,0x01C000FF);

+	devmem(bmcreg+0x8c,0xC1C000FF);

+	devmem(bmcreg+0x90,0x003FA009);

+

+

+	close(mem_fd);

+}

+

 static gboolean

 on_init (Control          *control,

          GDBusMethodInvocation  *invocation,

          gpointer                user_data)

 {

-	g_print("BMC init\n");

-	// BMC init done here

-	/*

-	devmem(0x1e789080,0x00000500); //Enable LPC FWH cycles, Enable LPC to AHB bridge

-	devmem(0x1e789088,0x30000E00); //32M PNOR

-	devmem(0x1e78908C,0xFE0001FF);

-

-	//flash controller

-	devmem(0x1e630000,0x00000003);

-	devmem(0x1e630004,0x00002404);

-

-	//UART

-	devmem(0x1e6e2084,0x00fff0c0);  //Enable UART1

-	devmem(0x1e783000,0x00000000);  //Set Baud rate divisor -> 13 (Baud 115200)

-	devmem(0x1e783004,0x00000000);  //Set Baud rate divisor -> 13 (Baud 115200)

-	devmem(0x1e783008,0x000000c1);  //Disable Parity, 1 stop bit, 8 bits

-	devmem(0x1E78909C,0x00000000);  //Set routing UART1 -> COM 1

-

-

-	//GPIO

-	devmem(0x1e6e2070,0x120CE406);

-	devmem(0x1e6e2080,0xCB000000);

-	devmem(0x1e6e2088,0x01C000FF);

-	devmem(0x1e6e208c,0xC1C000FF);

-	devmem(0x1e6e2090,0x003FA009);

-

-	devmem(0x1E780000,0x13008CE7);

-	devmem(0x1E780004,0x0370E677);

-	devmem(0x1E780020,0xDF48F7FF);

-	devmem(0x1E780024,0xC738F202);

-*/

-

+	#ifdef __arm__

+	reg_init();

+	#endif

 	control_complete_init(control,invocation);

 	control_emit_goto_system_state(control,"STANDBY");

 	

@@ -106,7 +154,6 @@
 	}

 	/* Export all objects */

 	g_dbus_object_manager_server_set_connection (manager, connection);

-

 }

 

 static void

diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index bb95d17..4c40708 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -13,9 +13,11 @@
                 GDBusMethodInvocation  *invocation,

                 gpointer                user_data)

 {

-  flash_complete_init(f,invocation);

-  return TRUE;

-

+	flash_complete_init(f,invocation);

+	//tune flash

+	g_print("Tuning BIOS Flash\n");

+	flash_access_setup_pnor(true, false, false);

+	return TRUE;

 }

 

 static gboolean

diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index 53df62d..bb0eaec 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -52,18 +52,6 @@
 		pgood_timeout_start = 0;

 		return TRUE;

 	}

-	//For simulation, remove

-	/*

-	if (tmp_pgood!=last_pgood) {

-		if (tmp_pgood == 1) {

-			control_emit_goto_system_state(control,"POWERED_ON");

-		} else {

-			control_emit_goto_system_state(control,"POWERED_OFF");

-		}

-	}

-	

-	last_pgood = tmp_pgood;

-	*/

 	uint8_t gpio;

 	

 	int rc = gpio_open(&pgood);

@@ -91,7 +79,7 @@
 		//return FALSE;

 	}

 	//pgood is not at desired state yet

-	g_print("GPIO: %d;  %d\n",gpio,control_power_get_state(control_power));

+	//g_print("GPIO: %d;  %d\n",gpio,control_power_get_state(control_power));

 	if (gpio != control_power_get_state(control_power) &&

 		control_power_get_pgood_timeout(control_power) > 0)

 	{

@@ -238,27 +226,22 @@
 	// get gpio device paths

 	int rc = GPIO_OK;

 	do {

-

 		rc = gpio_init(connection,&power_pin);

 		if (rc != GPIO_OK) { break; }

 		rc = gpio_init(connection,&pgood);

 		if (rc != GPIO_OK) { break; }

+		uint8_t gpio;

 		rc = gpio_open(&pgood);

-

+		if (rc != GPIO_OK) { break; }

+		rc = gpio_read(&pgood,&gpio);

+		if (rc != GPIO_OK) { break; }

+		gpio_close(&pgood);	

+		control_power_set_pgood(control_power,gpio);

 	} while(0);

 	if (rc != GPIO_OK)

 	{

 		event_log_emit_event_log(event_log, LOG_ALERT, "GPIO setup error",rc);

-	}

-	int rc = gpio_open(&pgood);

-	rc = gpio_read(&pgood,&gpio);

-	gpio_close(&pgood);	

-	if (rc == GPIO_OK) {

-		control_power_set_pgood(control_power,gpio);

-

-	} else {

-	}

-

+	} 

 }

 

 static void