lots of changes
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index cb2746a..87c5ae6 100755
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -103,8 +103,55 @@
 			
 		parent = False
 
+class DbusProperties(dbus.service.Object):
+	def __init__(self):
+		dbus.service.Object.__init__(self)
+		self.properties = {}
 
-class DbusProperty:
+	@dbus.service.method(dbus.PROPERTIES_IFACE,
+		in_signature='ss', out_signature='v')
+	def Get(self, interface_name, property_name):
+		d = self.GetAll(interface_name)
+		try:
+			v = d[property_name]
+			return v
+		except:
+ 			raise dbus.exceptions.DBusException(
+				"org.freedesktop.UnknownPropery: "+property_name)
+
+	@dbus.service.method(dbus.PROPERTIES_IFACE,
+		in_signature='s', out_signature='a{sv}')
+	def GetAll(self, interface_name):
+		try:
+			d = self.properties[interface_name]
+			return d
+ 		except:
+ 			raise dbus.exceptions.DBusException(
+				"org.freedesktop.UnknownInterface: "+interface_name)
+
+	@dbus.service.method(dbus.PROPERTIES_IFACE,
+		in_signature='ssv')
+	def Set(self, interface_name, property_name, new_value):
+		if (self.properties.has_key(interface_name) == False):
+			self.properties[interface_name] = {}
+		try:
+			old_value = self.properties[interface_name][property_name] 
+			if (old_value != new_value):
+				self.properties[interface_name][property_name] = new_value
+				self.PropertiesChanged(interface_name,{ property_name: new_value }, [])
+				
+		except:
+        		self.properties[interface_name][property_name] = new_value
+
+	@dbus.service.signal(dbus.PROPERTIES_IFACE,
+		signature='sa{sv}as')
+	def PropertiesChanged(self, interface_name, changed_properties,
+		invalidated_properties):
+		pass
+
+
+
+class DbusVariable:
 	def __init__(self,name,value):
 		self.name = str(name)	
 		self.dbusType = str(type(value)).split("'")[1]
diff --git a/bin/Palmetto.py b/bin/Palmetto.py
index db940b7..e7425d4 100755
--- a/bin/Palmetto.py
+++ b/bin/Palmetto.py
@@ -10,30 +10,51 @@
 
 SYSTEM_NAME = "Palmetto"
 
+
+## System states
+##   state can change to next state in 2 ways:
+##   - a process emits a GotoSystemState signal with state name to goto
+##   - objects specified in EXIT_STATE_DEPEND have started
 SYSTEM_STATES = [
-	'INIT',
-	'STANDBY',
-	'POWERING_ON',
-	'POWERED_ON',
-	'BOOTING',
+	'BMC_INIT',
+	'BMC_STARTING',
+	'BMC_READY',
+	'HOST_POWERING_ON',
+	'HOST_POWERED_ON',
+	'HOST_BOOTING',
 	'HOST_UP',
-	'SHUTTING_DOWN',
-	'POWERING_DOWN'
+	'HOST_POWERED_DOWN',
 ]
 
+EXIT_STATE_DEPEND = {
+	'BMC_STARTING' : {
+		'/org/openbmc/control/chassis0': 0,
+		'/org/openbmc/control/power0' : 0,
+		'/org/openbmc/control/led/BMC_READY' : 0,
+		'/org/openbmc/control/Host_0' : 0,
+	}
+}
+
+## method will be called when state is entered
 ENTER_STATE_CALLBACK = {
-	'POWERED_ON' : { 
+	'HOST_POWERED_ON' : { 
 		'bus_name'    : 'org.openbmc.control.Host',
 		'obj_name'    : '/org/openbmc/control/Host_0',
 		'interface_name' : 'org.openbmc.control.Host',
 		'method_name' : 'boot'
+	},
+	'BMC_READY' : {
+		'bus_name'   : 'org.openbmc.control.led',
+		'obj_name'   : '/org/openbmc/control/led/BMC_READY',
+		'interface_name' : 'org.openbmc.Led',
+		'method_name' : 'setOn'
 	}
 }
 
 SYSTEM_CONFIG = {}
 
 SYSTEM_CONFIG['org.openbmc.control.Bmc'] = {
-		'system_state' : 'INIT',
+		'system_state' : 'BMC_INIT',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'control_bmc.exe',
@@ -42,7 +63,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.managers.Inventory'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'inventory_items.py',
@@ -50,7 +71,7 @@
 		'instances' : [	{ 'name' : SYSTEM_NAME } ]
 	}
 SYSTEM_CONFIG['org.openbmc.control.PciePresent'] = {
-		'system_state' : 'POWERED_ON',
+		'system_state' : 'HOST_POWERED_ON',
 		'start_process' : True,
 		'monitor_process' : False,
 		'process_name' : 'pcie_slot_present.exe',
@@ -58,16 +79,16 @@
 		'instances' : [	{ 'name' : 'Slots_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.sensor.Power8Virtual'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'sensors_virtual_p8.py',
 		'heartbeat' : 'no',
-		'instances' : [	{ 'name' : 'Dummy' } ]
+		'instances' : [	{ 'name' : 'virtual' } ]
 	}
 
 SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'sensor_manager.py',
@@ -76,7 +97,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.watchdog.Host'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'host_watchdog.exe',
@@ -94,14 +115,14 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.control.Power'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'power_control.exe',
 		'heartbeat' : 'no',
 		'instances' : [	
 			{
-				'name' : 'SystemPower_0',
+				'name' : 'power0',
 				'user_label': 'Power control',
 				'properties' : { 
 					'org.openbmc.Control': {
@@ -116,7 +137,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.sensors.Temperature.Ambient'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'sensor_ambient.exe',
@@ -144,31 +165,23 @@
 		]
 	}
 SYSTEM_CONFIG['org.openbmc.buttons.Power'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'button_power.exe',
 		'heartbeat' : 'no',
 		'instances' : [	{ 'name' : 'PowerButton_0' } ]
 	}
-SYSTEM_CONFIG['org.openbmc.sensors.HostStatus'] = {
-		'system_state' : 'STANDBY',
-		'start_process' : False,
-		'monitor_process' : False,
-		'process_name' : 'sensor_host_status.exe',
-		'heartbeat' : "no",
-		'instances' : [ { 'name' : 'HostStatus_0' } ]
-	}
-SYSTEM_CONFIG['org.openbmc.leds.ChassisIdentify'] = {
-		'system_state' : 'STANDBY',
+SYSTEM_CONFIG['org.openbmc.control.led'] = {
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
-		'process_name' : 'chassis_identify.exe',
+		'process_name' : 'led_controller.exe',
 		'heartbeat' : 'no',
-		'instances' : [	{ 'name' : 'ChassisIdentify_0' } ]
+		'instances' : [	{ 'name' : 'Dummy' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.flash.Bios'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'flash_bios.exe',
@@ -177,7 +190,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.manager.Download'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'download_manager.py',
@@ -186,7 +199,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.control.Host'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'control_host.exe',
@@ -194,17 +207,17 @@
 		'instances' : [ { 'name' : 'Host_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.control.Chassis'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'chassis_control.py',
 		'heartbeat' : 'no',
-		'instances' : [ { 'name' : 'Chassis' } ]
+		'instances' : [ { 'name' : 'chassis0' } ]
 	}
 
 SYSTEM_CONFIG['org.openbmc.vpd'] = {
-		'system_state' : 'POWERING_ON',
-		'start_process' : True,
+		'system_state' : 'HOST_POWERED_ON',
+		'start_process' : False,
 		'monitor_process' : False,
 		'process_name' : 'board_vpd.exe',
 		'heartbeat' : 'no',
@@ -212,9 +225,9 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.sensors.Occ'] = {
-		'system_state' : 'BOOTED',
-		'start_process' : True,
-		'monitor_process' : True,
+		'system_state' : 'BMC_STARTING',
+		'start_process' : False,
+		'monitor_process' : False,
 		'process_name' : 'sensor_occ.exe',
 		'heartbeat' : 'no',
 		'instances' : [
@@ -231,7 +244,7 @@
 	}
 
 SYSTEM_CONFIG['org.openbmc.sensors.Fan'] = {
-		'system_state' : 'STANDBY',
+		'system_state' : 'BMC_STARTING',
 		'start_process' : True,
 		'monitor_process' : True,
 		'process_name' : 'fan.exe',
@@ -246,7 +259,7 @@
 	'state'      : True,
 	'cache'      : True
 }
-INVENTORY_ROOT = '/org/openbmc/inventory/items'
+INVENTORY_ROOT = '/org/openbmc/inventory'
 
 FRU_INSTANCES = {
 	'<inventory_root>/system' :
@@ -386,11 +399,14 @@
 
 ID_LOOKUP = {
 	'FRU' : {
+		0x0d : '<inventory_root>/system',
 		0x01 : '<inventory_root>/system/motherboard/cpu0',
+		0x02 : '<inventory_root>/system/motherboard/centaur0',
 		0x03 : '<inventory_root>/system/motherboard/dimm0',
 		0x04 : '<inventory_root>/system/motherboard/dimm1',
 		0x05 : '<inventory_root>/system/motherboard/dimm2',
 		0x06 : '<inventory_root>/system/motherboard/dimm3',
+		0xff : '<inventory_root>/system',
 	},
 	'SENSOR' : {
 		0x2f : '<inventory_root>/system/motherboard/cpu0',
@@ -420,7 +436,6 @@
 	'GPIO_PRESENT' : {
 		'SLOT0_PRESENT' : '<inventory_root>/system/io_board/pcie_slot0', 
 		'SLOT1_PRESENT' : '<inventory_root>/system/io_board/pcie_slot1', 
-		'SLOT2_PRESENT' : '<inventory_root>/system/io_board/pcie_slot2',
 	}
 }
 
@@ -432,6 +447,7 @@
 GPIO_CONFIG['CRONUS_SEL'] = { 'gpio_num': 486, 'direction': 'out'  }
 GPIO_CONFIG['PGOOD']      = { 'gpio_num': 503, 'direction': 'in'  }
 GPIO_CONFIG['IDENTIFY']   = { 'gpio_num': 365, 'direction': 'out' }
+GPIO_CONFIG['BMC_READY']   = { 'gpio_num': 365, 'direction': 'out' }
 GPIO_CONFIG['POWER_BUTTON'] =  { 'gpio_num': 448, 'direction': 'falling' }
 GPIO_CONFIG['SLOT0_RISER_PRESENT'] =   { 'gpio_num': 104, 'direction': 'in' }
 GPIO_CONFIG['SLOT1_RISER_PRESENT'] =   { 'gpio_num': 105, 'direction': 'in' }
diff --git a/bin/PropertyManager.py b/bin/PropertyManager.py
index b89ed12..1fa8d87 100755
--- a/bin/PropertyManager.py
+++ b/bin/PropertyManager.py
@@ -23,7 +23,7 @@
 		for prop_interface in properties.keys():
 			for prop in properties[prop_interface]:
 				tmp_val = dbus_properties.Get(prop_interface,prop)
-				dbus_prop = Openbmc.DbusProperty(prop,tmp_val)
+				dbus_prop = Openbmc.DbusVariable(prop,tmp_val)
 				value = properties[prop_interface][prop]
 				dbus_prop.setValue(value)
 				dbus_properties.Set(prop_interface,prop,dbus_prop.getValue())
@@ -66,7 +66,7 @@
 			print "Caching: "+obj_path
 			all_properties = prop_intf.GetAll(interface_name)
 			for prop in all_properties.keys():
-				dbus_prop = Openbmc.DbusProperty(prop,all_properties[prop])
+				dbus_prop = Openbmc.DbusVariable(prop,all_properties[prop])
 				dbus_props.append(dbus_prop)
 		
 			try:
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 2770507..bf84a13 100755
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -10,6 +10,7 @@
 
 DBUS_NAME = 'org.openbmc.control.Chassis'
 OBJ_NAME = '/org/openbmc/control/'+sys.argv[1]
+CONTROL_INTF = 'org.openbmc.Control'
 
 POWER_OFF = 0
 POWER_ON = 1
@@ -25,12 +26,12 @@
 		self.dbus_objects = {
 			'power_control' : { 
 				'bus_name' : 'org.openbmc.control.Power',
-				'object_name' : '/org/openbmc/control/SystemPower_0',
+				'object_name' : '/org/openbmc/control/power0',
 				'interface_name' : 'org.openbmc.control.Power'
 			},
 			'identify_led' : {
-				'bus_name' : 'org.openbmc.leds.ChassisIdentify',
-				'object_name' : '/org/openbmc/leds/ChassisIdentify_0',
+				'bus_name' : 'org.openbmc.control.led',
+				'object_name' : '/org/openbmc/led/IDENTIFY',
 				'interface_name' : 'org.openbmc.Led'
 			}
 		}
diff --git a/bin/inventory_items.py b/bin/inventory_items.py
index d337d95..d27abd3 100755
--- a/bin/inventory_items.py
+++ b/bin/inventory_items.py
@@ -18,6 +18,7 @@
 
 INTF_NAME = 'org.openbmc.InventoryItem'
 DBUS_NAME = 'org.openbmc.managers.Inventory'
+ENUM_INTF = 'org.openbmc.Object.Enumerate'
 
 FRUS = System.FRU_INSTANCES
 FRU_PATH = System.FRU_PATH
@@ -35,74 +36,70 @@
 	def addItem(self,item):
 		self.objects.append(item)
 
-	@dbus.service.method("org.openbmc.managers.Inventory",
+	@dbus.service.method(ENUM_INTF,
 		in_signature='', out_signature='a{sa{sv}}')
-	def getItems(self):
+	def enumerate(self):
 		tmp_obj = {}
 		for item in self.objects:
-			tmp_obj[str(item.item['name'])]=item.getItemDict()
+			tmp_obj[str(item.name)]=item.GetAll(INTF_NAME)
 		return tmp_obj
 			
 
 
-class InventoryItem(dbus.service.Object):
-	def __init__(self,bus,name):
+class InventoryItem(Openbmc.DbusProperties):
+	def __init__(self,bus,name):		
+		Openbmc.DbusProperties.__init__(self)
 		dbus.service.Object.__init__(self,bus,name)
-		## store all properties in a dict so can easily
-		## send on dbus
-		self.item = {
-			'name' : name,
-			'is_fru' : False,
-			'fru_type' : 0,
-			'state'  : 0,
-			'manufacturer' : "",
-		}
+		self.name = name
 		self.cache = True
-
-	def getItemDict(self):
-		return self.item
-
-	@dbus.service.method('org.openbmc.InventoryItem',
+		self.Set(INTF_NAME,'is_fru',False)
+		self.Set(INTF_NAME,'fru_type',0)
+		self.Set(INTF_NAME,'present',"INACTIVE")
+		self.Set(INTF_NAME,'fault',"NONE")
+	
+		
+		
+	@dbus.service.method(INTF_NAME,
 		in_signature='a{sv}', out_signature='')
 	def update(self,data):
 		## translate dbus data into basic data types
 		for k in data.keys():
-			d = Openbmc.DbusProperty(k,data[k])
-			self.item[str(k)] = d.getBaseValue()
+			self.setField(k,data[k])
+
 		self.saveToCache()
 
-	@dbus.service.method("org.openbmc.InventoryItem",
+	@dbus.service.method(INTF_NAME,
 		in_signature='s', out_signature='')
 	def setPresent(self,present):
-		self.item['present'] = present
-		print "Set Present: "+str(present)
+		self.setField('present',present)
 
-	@dbus.service.method("org.openbmc.InventoryItem",
+	@dbus.service.method(INTF_NAME,
 		in_signature='s', out_signature='')
 	def setFault(self,fault):
-		self.item['fault_state'] = fault
-		print "Set Fault: "+str(fault)
+		self.setField('fault',fault)
 
 	def setField(self,field,value):
-		self.item[field] = value
+		f = str(field)
+		d = Openbmc.DbusVariable(f,value)
+		self.Set(INTF_NAME,f,d.getBaseValue())
 
 	def isCached(self):
 		return self.cache
 
 	def getCacheFilename(self):
 		global FRU_PATH
-		name = self.item['name'].replace('/','.')
+		name = self.name.replace('/','.')
 		filename = FRU_PATH+name[1:]+".fru"
 		return filename
 	
 	def saveToCache(self):
 		if (self.isCached() == False):
 			return
-		print "Caching: "+self.item['name']
+		print "Caching: "+self.name
 		try: 
 			output = open(self.getCacheFilename(), 'wb')
-			## just pickle dict not whole object
-			cPickle.dump(self.item,output)
+			## save properties
+			cPickle.dump(self.properties[INTF_NAME],output)
 		except Exception as e:
 			print "ERROR: "+str(e)
 		finally:
@@ -119,7 +116,7 @@
 				p = open(filename, 'rb')
 				data2 = cPickle.load(p)
 				for k in data2.keys():
-					self.item[k] = data2[k]
+					self.setField(k,data2[k])
 			except Exception as e:
 				print "No cache file found: " +str(e)
 			finally:
@@ -131,7 +128,7 @@
     bus = Openbmc.getDBus()
     name = dbus.service.BusName(DBUS_NAME,bus)
     mainloop = gobject.MainLoop()
-    obj_parent = Inventory(bus, '/org/openbmc/managers/Inventory')
+    obj_parent = Inventory(bus, '/org/openbmc/inventory')
 
     for f in FRUS.keys():
 	obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
diff --git a/bin/ipmi_example.py b/bin/ipmi_example.py
index bc506fa..b998ba5 100755
--- a/bin/ipmi_example.py
+++ b/bin/ipmi_example.py
@@ -25,7 +25,7 @@
 
 def getChassisControl():
 	obj =  bus.get_object('org.openbmc.control.Chassis',
-			'/org/openbmc/control/Chassis')
+			'/org/openbmc/control/chassis0')
 	intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
 	return intf
 
@@ -76,18 +76,25 @@
 		d = { 'manufacturer' : data }	
 		intf_sys = Openbmc.getManagerInterface(bus,"System")
 		c = chr(int(ipmi_id))
-		obj_info = intf_sys.getObjectFromByteId("FRU",chr(int(ipmi_id)))
+		print c
+		obj_info = intf_sys.getObjectFromByteId("FRU",c)
+		intf_name = obj_info[2]
 		obj_path = obj_info[1]
 		bus_name = obj_info[0]
 		if (obj_path != "" and bus_name != ""):
 			obj = bus.get_object(bus_name,obj_path)
-			intf = dbus.Interface(obj,"org.openbmc.InventoryItem")
+			intf = dbus.Interface(obj,intf_name)
 			intf.update(d)	
 
 	elif (cmd == "getfrus"):
-		intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
-		data = intf_fru.getItems()
+		obj = bus.get_object('org.openbmc.managers.Inventory',
+				'/org/openbmc/inventory')
+		intf_fru = dbus.Interface(obj,'org.openbmc.Object.Enumerate')
+
+		data = intf_fru.enumerate()
 		for i in data:
+			print ">>>>>>>>"
+			print i
 			for k in data[i].keys():
 				print k+" = "+str(data[i][k]) 
 	elif (cmd == "updatefwftp"):
diff --git a/bin/ipmid.py b/bin/ipmid.py
deleted file mode 100755
index 4f01421..0000000
--- a/bin/ipmid.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-import dbus
-import string
-import os
-import fcntl
-import glib
-import gobject
-import dbus.service
-import dbus.mainloop.glib
-
-DBUS_NAME = 'org.openbmc.HostIpmi'
-OBJ_NAME = '/org/openbmc/HostIpmi/1'
-
-def print_packet(seq, netfn, cmd, data):
-#    print 'seq:   0x%02x\nnetfn: 0x%02x\ncmd:   0x%02x\ndata:  [%s]' % (
-#            seq, netfn, cmd,
-#            ", ".join(['0x%02x' % x for x in data]))
-        new_str = ""
-        for x in data:
-                new_str += "0x%s " % (x.encode('hex'))
-        print new_str
-
-
-class Ipmid(dbus.service.Object):
-    def __init__(self, bus, name):
-        dbus.service.Object.__init__(self,bus,name)
-
-    def setReader(self, reader):
-        self.reader = reader
-
-    @dbus.service.signal(DBUS_NAME, "yyyay")
-    def ReceivedMessage(self, seq, netfn, cmd, data):
-        print("IPMI packet from host. Seq = 0x%x Netfn = 0x%x Cmd = 0x%x" %
-              (ord(seq), ord(netfn), ord(cmd)))
-        print_packet(seq, netfn, cmd, data)
-
-    @dbus.service.method(DBUS_NAME, "", "")
-    def test(self):
-        print("TEST")
-
-    @dbus.service.method(DBUS_NAME, "yyyay", "x")
-    def sendMessage(self, seq, netfn, cmd, data):
-        print("IPMI packet sent to host. Seq = 0x%x Netfn = 0x%x Cmd = 0x%x" %
-              (int(seq), int(netfn), int(cmd)))
-        #print_packet(seq, netfn, cmd, data)
-
-        self.reader.write(seq, netfn, cmd, data)
-
-        return 0
-
-class BtReader(object):
-    def __init__(self, ipmi_obj):
-        self.ipmi_obj = ipmi_obj
-        flags = os.O_NONBLOCK | os.O_RDWR
-        self.bt = os.open("/dev/bt", flags)
-        glib.io_add_watch(self.bt, glib.IO_IN, self.io_callback)
-        ipmi_obj.setReader(self)
-
-    def write(self, seq, netfn, cmd, data):
-        # Untested
-        val = chr(netfn) + chr(seq) + chr(cmd)
-        val += reduce(lambda a, b: a + chr(b), data, "")
-        val = chr(len(val)) + val
-        os.write(self.bt, val)
-
-    def io_callback(self, fd, condition):
-        data = os.read(self.bt, 128)
-        if (len(data) > 2):
-            self.ipmi_obj.ReceivedMessage(data[2], data[1], data[3], data[4:])
-        return True
-
-def main():
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SystemBus()
-    name = dbus.service.BusName(DBUS_NAME, bus)
-    obj = Ipmid(bus, OBJ_NAME)
-    r = BtReader(obj)
-    mainloop = gobject.MainLoop()
-    print("Started")
-    mainloop.run()
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 9f3ab56..a91235e 100755
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -14,7 +14,8 @@
 import Openbmc
 
 DBUS_NAME = 'org.openbmc.managers.Sensors'
-OBJ_NAME = '/org/openbmc/managers/Sensors'
+OBJ_NAME = '/org/openbmc/sensors'
+ENUM_INTF = 'org.openbmc.Object.Enumerate'
 
 class SensorManager(dbus.service.Object):
 	def __init__(self,bus,name):
@@ -37,9 +38,9 @@
 
 		self.sensor_cache = {}
 
-	@dbus.service.method(DBUS_NAME,
+	@dbus.service.method(ENUM_INTF,
 		in_signature='', out_signature='a{sa{sv}}')
-	def getSensors(self):
+	def enumerate(self):
 		return self.sensor_cache;
 	
 	
diff --git a/bin/sensors_virtual_p8.py b/bin/sensors_virtual_p8.py
index d8bf1ef..1488256 100755
--- a/bin/sensors_virtual_p8.py
+++ b/bin/sensors_virtual_p8.py
@@ -8,151 +8,80 @@
 import dbus.mainloop.glib
 import Openbmc
 
-SENSOR_INTERFACE = 'org.openbmc.SensorValue'
 DBUS_NAME = 'org.openbmc.sensor.Power8Virtual'
 OBJ_NAME = '/org/openbmc/sensor/virtual/'
 
-class BootProgress(dbus.service.Object):
+class SensorValue(Openbmc.DbusProperties):
+	IFACE_NAME = 'org.openbmc.SensorValue'
+	def __init__(self):
+		Openbmc.DbusProperties.__init__(self)
+		self.Set(SensorValue.IFACE_NAME,'units',"")
+		
+	@dbus.service.method(IFACE_NAME,
+		in_signature='v', out_signature='')
+	def setValue(self,value):
+		changed = False
+		try:
+			old_value = self.Get(SensorValue.IFACE_NAME,'value')
+			if (value != old_value):
+				changed = True
+		except:
+			changed = True
+
+		if (changed == True):
+			self.Set(SensorValue.IFACE_NAME,'value',value)
+			self.Changed(self.getValue(),self.getUnits())
+
+
+
+	@dbus.service.method(IFACE_NAME,
+		in_signature='', out_signature='v')
+	def getValue(self):
+		return self.Get(SensorValue.IFACE_NAME,'value')
+
+	@dbus.service.method(IFACE_NAME,
+		in_signature='', out_signature='s')
+	def getUnits(self):
+		return self.Get(SensorValue.IFACE_NAME,'units')
+
+	@dbus.service.signal(IFACE_NAME,signature='vs')
+	def Changed(self,value,units):
+		pass
+
+
+
+
+
+class BootProgress(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "BootProgress"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed()
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
 		
-class HostStatus(dbus.service.Object):
+class HostStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "HostStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
-class OsStatus(dbus.service.Object):
+class OsStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "OperatingSystemStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-		
-class BootCount(dbus.service.Object):
+class BootCount(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "BootCount"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
-
-class OccStatus(dbus.service.Object):
+class OccStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "OccStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
 				
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
@@ -164,6 +93,12 @@
     boot_count = BootCount(bus,OBJ_NAME)
     occ_status = OccStatus(bus,OBJ_NAME)
     mainloop = gobject.MainLoop()
+    
+    boot_progress.setValue("INACTIVE")
+    host_status.setValue("OFF")
+    os_status.setValue("OFF")
+    boot_count.setValue(0)
+    occ_status.setValue(0)
 
     print "Starting virtual sensors"
     mainloop.run()
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 17285b2..441e957 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -25,7 +25,7 @@
 STATE_START_TIMEOUT = 10
 INTF_SENSOR = 'org.openbmc.SensorValue'
 INTF_ITEM = 'org.openbmc.InventoryItem'
-
+INTF_CONTROL = 'org.openbmc.Control'
 
 class SystemManager(dbus.service.Object):
 	def __init__(self,bus,name):
@@ -41,7 +41,6 @@
 		self.current_state = ""
 		self.system_states = {}
 		self.bus_name_lookup = {}
-
 		self.bin_path = os.path.dirname(os.path.realpath(sys.argv[0]))
 
 		for bus_name in System.SYSTEM_CONFIG.keys():
@@ -57,7 +56,7 @@
 				new_val = val.replace("<inventory_root>",System.INVENTORY_ROOT)
 				System.ID_LOOKUP[category][key] = new_val
 	
-		self.SystemStateHandler("INIT")
+		self.SystemStateHandler("BMC_INIT")
 		print "SystemManager Init Done"
 
 	def SystemStateHandler(self,state_name):
@@ -72,21 +71,30 @@
 		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]:
+				System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 0
+		except:
+			pass
 
 		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)
 		
-		if (state_name == "INIT"):
+		if (state_name == "BMC_INIT"):
 			## Add poll for heartbeat
 	    		gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
 		
-		if (System.ENTER_STATE_CALLBACK.has_key(state_name)):
+		try:	
 			cb = System.ENTER_STATE_CALLBACK[state_name]
 			obj = bus.get_object(cb['bus_name'],cb['obj_name'])
 			method = obj.get_dbus_method(cb['method_name'],cb['interface_name'])
 			method()
+		except:
+			pass
 
 		self.current_state = state_name
 		
@@ -119,7 +127,7 @@
 			obj_path = System.ID_LOOKUP[category][byte]
 			bus_name = self.bus_name_lookup[obj_path]
 			parts = obj_path.split('/')
-			if (parts[2] == 'sensor'):
+			if (parts[3] == 'sensor'):
 				intf_name = INTF_SENSOR
 		except Exception as e:
 			print "ERROR SystemManager: "+str(e)+" not found in lookup"
@@ -175,10 +183,14 @@
 			try:
 				Openbmc.get_objs(bus,bus_name,"",objects)
 				for instance_name in objects.keys():
-					self.bus_name_lookup[objects[instance_name]['PATH']] = bus_name
+					obj_path = objects[instance_name]['PATH']
+					self.bus_name_lookup[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:
 				pass
-			
+	
 			if (System.SYSTEM_CONFIG.has_key(bus_name)):
 				System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
 				for instance_name in objects.keys(): 
@@ -195,6 +207,28 @@
 						print "Calling init method: " +obj_path+" : "+init_intf
 						intf.init()
 
+			## check if all objects are started to move to next state
+			try:
+				state = 1
+				for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
+					if (System.EXIT_STATE_DEPEND[self.current_state][obj_path] == 0):
+						state = 0
+				if (state == 1):
+					s = 0
+					for i in range(len(System.SYSTEM_STATES)):
+						if (System.SYSTEM_STATES[i] == self.current_state):
+							s = i+1
+
+					if (s == len(System.SYSTEM_STATES)):
+						print "ERROR SystemManager: No more system states"
+					else:
+						new_state_name = System.SYSTEM_STATES[s]
+						print "SystemManager Goto System State: "+new_state_name
+						self.SystemStateHandler(new_state_name)
+			except:
+				pass
+
+
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='s', out_signature='sis')