diff --git a/Makefile b/Makefile
index 2c49960..9ff50ed 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,21 @@
-CC=gcc
+#CC=gcc
 OBJS    = objects/pflash/progress.o objects/pflash/ast-sf-ctrl.o
 OBJS	+= objects/pflash/libflash/libflash.o objects/pflash/libflash/libffs.o
 OBJS	+= objects/pflash/arm_io.o
-LIBS=/gsa/ausgsa/home/n/j/njames/openbmc
-OFLAGS =-L$(HOME)/lib -lopenbmc_intf
-HOME = /media/sf_vbox/openbmc
-#CFLAGS=$(shell pkg-config --libs --cflags gtk+-2.0 glib-2.0)
-CFLAGS = -pthread -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgio-2.0 -lgobject-2.0 -lglib-2.0
+LIBS = ./bin
+OFLAGS =-L$(LIBS) -lopenbmc_intf
+HOME = .
+CFLAGS=$(shell pkg-config --libs --cflags gio-unix-2.0 glib-2.0)
+#CFLAGS = -pthread -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgio-2.0 -lgobject-2.0 -lglib-2.0
 
 %.o: interfaces/%.c 
 	$(CC) -c -fPIC -o obj/$@ $< -I$(HOME) -I$(HOME)/includes $(CFLAGS)
 
 %.o: objects/%.c
-	$(CC) -c -o obj/$@ $< -L$(HOME)/lib -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash -lfru $(CFLAGS)
+	$(CC) -c -o obj/$@ $< -L$(LIBS) -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash  $(CFLAGS)
 
 %.o: includes/%.c
-	$(CC) -c -o obj/$@ $< -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash $(CFLAGS)
+	$(CC) -c -o obj/$@ $< -L$(LIBS) -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash $(CFLAGS)
 
 %.o: objects/pflash/%.c
 	$(CC) -c -o obj/$@ $< -I$(HOME) -I$(HOME)/objects/pflash $(CFLAGS)
@@ -23,7 +23,7 @@
 
 
 libopenbmc_intf: openbmc_intf.o
-	$(CC) -shared -o lib/$@.so obj/openbmc_intf.o $(CFLAGS)
+	$(CC) -shared -o bin/$@.so obj/openbmc_intf.o $(CFLAGS)
 
 power_control: power_control_obj.o gpio.o
 	$(CC) -o bin/$@.exe obj/gpio.o obj/power_control_obj.o $(OFLAGS) $(CFLAGS)
@@ -62,4 +62,4 @@
 	$(CC) -o bin/$@.exe obj/board_vpd_obj.o $(OFLAGS) $(CFLAGS)
 
 
-all: libopenbmc_intf power_control chassis_identify sensor_ambient button_power sensor_host_status control_host flash_bios fan host_watchdog control_bmc sensor_occ board_vpd
+all: libopenbmc_intf power_control chassis_identify sensor_ambient button_power sensor_host_status control_host fan host_watchdog control_bmc sensor_occ board_vpd
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index e32f559..ae48df0 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -1,10 +1,9 @@
 #! /usr/bin/python
 
-## todos: event logger, 
 import dbus
 import Openbmc
 
-HOME_PATH = '/media/sf_vbox/openbmc/'
+HOME_PATH = './'
 BIN_PATH = HOME_PATH+'bin/'
 CACHE_PATH = HOME_PATH+'cache/'
 FRU_PATH = CACHE_PATH+'frus/'
@@ -37,42 +36,16 @@
 		'monitor_process' : True,
 		'process_name' : 'control_bmc.exe',
 		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'Bmc_0',
-				'user_label': 'Master Bmc',
-			}
-		]
+		'instances' : [	{ 'name' : 'Bmc_0' } ]
 	}
 
-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': 'Fru Manager',
-			}
-		]
+		'instances' : [	{ 'name' : 'Barreleye' } ]
 	}
 
 
@@ -82,28 +55,7 @@
 		'monitor_process' : True,
 		'process_name' : 'sensor_manager.py',
 		'heartbeat' : 'no',
-		'rest_name' : 'sensors',
-		'instances' : [	
-			{
-				'name' : 'Barreleye',
-				'user_label': 'Sensor Manager',
-			}
-		]
-	}
-
-SYSTEM_CONFIG['org.openbmc.loggers.EventLogger'] = {
-		'system_state' : 'STANDBY',
-		'start_process' : True,
-		'monitor_process' : True,
-		'process_name' : 'eventlogger.py',
-		'heartbeat' : 'no',
-		'rest_name' : 'events',
-		'instances' : [	
-			{
-				'name' : 'Barreleye',
-				'user_label': 'Event Logger',
-			}
-		]
+		'instances' : [ { 'name' : 'Barreleye' } ]
 	}
 
 SYSTEM_CONFIG['org.openbmc.watchdog.Host'] = {
@@ -112,11 +64,9 @@
 		'monitor_process' : True,
 		'process_name' : 'host_watchdog.exe',
 		'heartbeat' : 'no',
-		'rest_name' : 'watchdog',
 		'instances' : [	
 			{
 				'name' : 'HostWatchdog_0',
-				'user_label': 'Host Watchdog',
 				'properties' : { 
 					'org.openbmc.Watchdog' : {
 						'poll_interval': 3000,
@@ -141,7 +91,7 @@
 						'poll_interval' : 3000
 					},
 					'org.openbmc.control.Power': {
-						'pgood_timeout' : 10000
+						'pgood_timeout' : 10
 					}
 				}
 			}
@@ -182,12 +132,7 @@
 		'monitor_process' : True,
 		'process_name' : 'button_power.exe',
 		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'PowerButton_0',
-				'user_label': 'Main Power Button',
-			}
-		]
+		'instances' : [	{ 'name' : 'PowerButton_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.sensors.HostStatus'] = {
 		'system_state' : 'STANDBY',
@@ -195,13 +140,10 @@
 		'monitor_process' : True,
 		'process_name' : 'sensor_host_status.exe',
 		'heartbeat' : "no",
-		'instances' : [	
-			{
-				'name' : 'HostStatus_0',
-				'user_label': 'Host Status',
+		'instances' : [ { 'name' : 'HostStatus_0',
 				'properties' : { 
-					'org.openbmc.SensorValue': {
-						'ipmi_id' : 43,
+					'org.openbmc.SensorIpmi': {
+						'sensor_id' : 43,
 					},
 				}
 
@@ -214,26 +156,15 @@
 		'monitor_process' : True,
 		'process_name' : 'chassis_identify.exe',
 		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'ChassisIdentify_0',
-				'user_label': 'Chassis Identify LED',
-			}
-		]
+		'instances' : [	{ 'name' : 'ChassisIdentify_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.flash.BIOS'] = {
 		'system_state' : 'STANDBY',
-		'start_process' : True,
+		'start_process' : False,
 		'monitor_process' : True,
 		'process_name' : 'flash_bios.exe',
 		'heartbeat' : 'no',
-		'rest_name' : 'flash',
-		'instances' : [	
-			{
-				'name' : 'BIOS_0',
-				'user_label': 'BIOS SPI Flash',
-			}
-		]
+		'instances' : [	{ 'name' : 'BIOS_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.control.Host'] = {
 		'system_state' : 'STANDBY',
@@ -241,12 +172,7 @@
 		'monitor_process' : True,
 		'process_name' : 'control_host.exe',
 		'heartbeat' : 'no',
-		'instances' : [	
-			{
-				'name' : 'Host_0',
-				'user_label': 'Host Control',
-			}
-		]
+		'instances' : [ { 'name' : 'Host_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.control.Chassis'] = {
 		'system_state' : 'STANDBY',
@@ -254,13 +180,7 @@
 		'monitor_process' : True,
 		'process_name' : 'chassis_control.py',
 		'heartbeat' : 'no',
-		'rest_name' : 'chassis',
-		'instances' : [	
-			{
-				'name' : 'Chassis',
-				'user_label': 'Chassis Control',
-			}
-		]
+		'instances' : [ { 'name' : 'Chassis' } ]
 	}
 
 SYSTEM_CONFIG['org.openbmc.vpd'] = {
@@ -269,13 +189,7 @@
 		'monitor_process' : False,
 		'process_name' : 'board_vpd.exe',
 		'heartbeat' : 'no',
-		'instances' : [
-			{
-				'name' : 'MBVPD_0',
-				'user_label': 'VPD',
-			},
-
-		]
+		'instances' : [ { 'name' : 'MBVPD_0' } ]
 	}
 
 SYSTEM_CONFIG['org.openbmc.sensors.Occ'] = {
@@ -287,7 +201,6 @@
 		'instances' : [
 			{
 				'name' : 'Occ_0',
-				'user_label': 'CPU0',
 				'properties' : { 
 					'org.openbmc.Occ' : {
 						'poll_interval' : 3000,
@@ -304,53 +217,86 @@
 		'monitor_process' : True,
 		'process_name' : 'fan.exe',
 		'heartbeat' : 'no',
-		'instances' : [
-			{
-				'name' : 'Fan_0',
-				'user_label': 'FAN 0',
-			},
-			{
-				'name' : 'Fan_1',
-				'user_label': 'FAN 1',
-			},
-			{
-				'name' : 'Fan_2',
-				'user_label': 'FAN 2',
-			},
-
-		]
+		'instances' : [	{'name' : 'Fan_0' }, {'name' : 'Fan_1'}, {'name' : 'Fan_2'} ]
 	}
 
 NON_CACHABLE_PROPERTIES = {
 	'name'       : True,
 	'user_label' : True,
 	'location'   : True,
+	'state'   : True,
 	'cache'      : True
 }
 
-FRUS = {}
-
-## key is IPMI FRU ID
-
-FRUS[32] = {
-		'name' : 'CPU0',
-		'user_label' : "IBM POWER8 CPU",
-		'ftype' : Openbmc.FRU_TYPES['CPU'],
-		'location' : "P0",
-		'manufacturer' : "IBM",
-		'cache' : True,
-		'state' : Openbmc.FRU_STATES['NORMAL'],
-		'sensor_id' : 10,
-	}
-
-FRUS[21] = {
-		'name' : 'IO_PLANAR',
-		'user_label' : "BARRELEYE IO PLANAR",
-		'ftype' : Openbmc.FRU_TYPES['BACKPLANE'],	
-		'cache' : False,
-		'state' : Openbmc.FRU_STATES['NORMAL'],
-		'sensor_id' : 11,
-	}
+FRU_INSTANCES = {
+	'/system' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['SYSTEM'],
+		'fru'	       : True,
+	},
+	'/system/motherboard' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['MAIN_PLANAR'],
+		'manufacturer' : 'FOXCONN',
+		'fru'	       : True,
+		'fru_id'       : 31,
+		'location' : 'C0',
+	},
+	'/system/fan0' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['FAN'],
+		'manufacturer' : 'DELTA',
+		'fru'	       : True,
+		'location' : 'F0',
+	},
+	'/system/fan1' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['FAN'],
+		'manufacturer' : 'DELTA',
+		'fru'	       : True,
+		'location' : 'F1',
+	},
+	'/system/motherboard/bmc' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['BMC'],
+		'manufacturer' : 'ASPEED',
+		'fru'	       : True,
+	},
+	'/system/motherboard/cpu0' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['CPU'],
+		'manufacturer' : 'IBM',
+		'fru'	       : True,
+		'location' : 'P0',
+		'fru_id'   : 10,
+	},
+	'/system/motherboard/cpu0/core0' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['CORE'],
+		'fru'	       : False,
+		'sensor_id'    : 1,	
+	},
+	'/system/motherboard/cpu0/core1' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['CORE'],
+		'fru'	       : False,
+		'sensor_id'    : 2,	
+	},
+	'/system/motherboard/dimm0' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
+		'fru'	       : True,
+		'fru_id'       : 12,
+		'sensor_id'    : 20,	
+	},
+	'/system/motherboard/dimm1' :
+	{
+		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
+		'fru'	       : True,
+		'fru_id'       : 13,
+		'sensor_id'    : 21,	
+	},
+}
 
 
 GPIO_CONFIG = {}
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index 9cfeffb..625f36c 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -7,11 +7,14 @@
 
 
 FRU_TYPES = {
+	'SYSTEM' : 0,
 	'CPU' : 1,
 	'DIMM' : 2,
-	'BACKPLANE' : 3,
+	'MAIN_PLANAR' : 3,
 	'RISER_CARD' : 4,
-	'FAN' : 5
+	'FAN' : 5,
+	'BMC' : 6,
+	'CORE' : 7,
 }
 FRU_STATES = {
 	'NORMAL'            : 0,
@@ -79,21 +82,6 @@
 				get_objs(bus,bus_name,path+"/"+node.attrib['name'],objects)
 
 
-
-#def get_methods(obj):
-#	methods = {}
-#	introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
- #	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
- #	root = tree.getroot()
-#	for intf in root.iter('interface'):
- #		intf_name = intf.attrib['name']
-#		if (intf_name.find(BUS_PREFIX)==0):
-#			methods[intf_name] = {}
-#			for method in intf.iter('method'):
-#				methods[intf_name][method.attrib['name']] = True
-#		
-#	return methods
-
 class DbusProperty:
 	def __init__(self,name,value):
 		self.name = str(name)	
diff --git a/bin/eventlogger.py b/bin/eventlogger.py
index 131faec..e36f928 100644
--- a/bin/eventlogger.py
+++ b/bin/eventlogger.py
@@ -25,13 +25,14 @@
 					path_keyword='path')
 
 	## Signal handler
-	def event_log_signal_handler(self,priority,msg,path = None):
+	def event_log_signal_handler(self,priority,msg,rc,path = None):
 		message = {}
 		ts = time.time()
 
 		message['priority'] = priority
 		message['object_path'] = path
 		message['message'] = msg
+		message['rc'] = rc
 
 		json_dump = json.dumps(message)
 		print "EVENT_LOG: "+json_dump
diff --git a/bin/fru_manager.py b/bin/fru_manager.py
deleted file mode 100644
index 1150552..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'
-FRU_PATH = System.FRU_PATH
-
-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 = {}
-		for fid in System.FRUS.keys():
-			self.updateFru(fid,System.FRUS[fid])
-			
-			
-	#@dbus.service.signal(DBUS_NAME)
-	#def OpenBmcRunning(self):
-	#	pass
-	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..75cc390
--- /dev/null
+++ b/bin/inventory_manager.py
@@ -0,0 +1,177 @@
+#!/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
+		name = self.fru.replace('/','.')
+		filename = FRU_PATH+name[1:]+".fru"
+		return filename
+	
+	def saveToCache(self):
+		if (self.isCached() == False):
+			return
+		print "Caching: "+self.fru
+		# TODO: error handling
+		output = open(self.getCacheFilename(), 'wb')
+		## just pickle dict not whole object
+		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
+			# TODO: error handling
+			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,
+					dbus_interface = "org.openbmc.sensors.IpmiBt", 
+					signal_name = 'UpdateFru')
+
+		bus.add_signal_receiver(self.SetSensorHandler, 
+					dbus_interface = "org.openbmc.sensors.IpmiBt", 
+					signal_name = "SetSensor")
+
+		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
+
+	@dbus.service.signal('org.openbmc.EventLog')
+	def EventLog(self, priority, message, rc):
+        	pass
+		
+	def UpdateFruHandler(self,fru_id,data):
+		self.updateFruFromId(fru_id,data)		
+
+	def SetSensorHandler(self,sensor_id,data):
+		fru_path = self.getFruSensor(sensor_id)
+		if (fru_path != ""):
+			state = { 'state' : data }
+			self.updateFru(fru_path,state)
+			
+	@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):
+			self.EventLog(1,"FRU ID not found: "+str(iid),1)
+		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..1d0061d
--- /dev/null
+++ b/bin/ipmi_example.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import PropertyManager
+
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.sensors.IpmiBt'
+OBJ_NAME = '/org/openbmc/sensors/IpmiBt'
+
+class IpmiBt(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+
+	@dbus.service.signal('org.openbmc.sensors.IpmiBt')
+	def SetSensor(self, ipmi_id, value):
+        	pass
+
+	@dbus.service.signal('org.openbmc.sensors.IpmiBt')
+	def UpdateFru(self, ipmi_id, data):
+        	pass
+
+
+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__':
+	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ 	bus = dbus.SessionBus()
+	name = dbus.service.BusName(DBUS_NAME,bus)
+	obj = IpmiBt(bus,OBJ_NAME)
+	mainloop = gobject.MainLoop()
+
+	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"):
+		obj.SetSensor(ipmi_id,dbus.Byte(int(data)))
+	elif (cmd == "getsensors"):
+		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
+		data = intf_sens.getSensors()
+		prettyPrint(data)
+	elif (cmd == "updatefru"):
+		d = { 'manufacturer' : data }	
+		obj.UpdateFru(ipmi_id,d)
+	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..886438a 100644
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -36,34 +36,15 @@
 					signal_name = 'Critical', path_keyword='path')
 
 		self.sensor_cache = {}
+	@dbus.service.signal('org.openbmc.EventLog')
+	def EventLog(self, priority, message, rc):
+        	pass
 
 	@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,
-		in_signature='y', out_signature='v')
-	def getSensorFromId(self,ipmi_id):
-		intf_sys = Openbmc.getManagerInterface(bus,"System")
-		obj_info = intf_sys.getObjFromIpmi(ipmi_id)
-		intf_name = str(obj_info[0])
-		obj_name = str(obj_info[1])
-		return self.getSensor(obj_name)
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='yv', out_signature='')
-	def setSensorFromId(self,ipmi_id,value):
-		intf_sys = Openbmc.getManagerInterface(bus,"System")
-		obj_info = intf_sys.getObjFromIpmi(ipmi_id)
-		
-		obj = bus.get_object(obj_info[0],obj_info[1])
-		intf = dbus.Interface(obj,"org.openbmc.SensorValue")
-		intf.setValue(value)
-		return None
-
 	
 	@dbus.service.method(DBUS_NAME,
 		in_signature='s', out_signature='v')
@@ -72,8 +53,7 @@
 		if (self.sensor_cache.has_key(path) == True):
 			val = self.sensor_cache[path]['value']
 		else:
-			# TODO: error handling
-			print "Unknown sensor at: "+path
+			self.EventLog(1,"Unknown sensor: "+path,1)
 		return val
 	
 	## Signal handlers
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 1a4fe99..1bc90a3 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -9,7 +9,8 @@
 import dbus.mainloop.glib
 import os
 import PropertyManager
-
+import time
+import json
 import Openbmc
 
 if (len(sys.argv) < 2):
@@ -35,10 +36,15 @@
 					signal_name = "NameOwnerChanged")
 		bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
 		bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
+		bus.add_signal_receiver(self.event_log_signal_handler, 
+					dbus_interface = "org.openbmc.EventLog", 
+					signal_name = "EventLog",
+					path_keyword='path')
+
+
 
 		self.current_state = ""
 		self.system_states = {}
-		self.IPMI_ID_LOOKUP = {}
 		for bus_name in System.SYSTEM_CONFIG.keys():
 			sys_state = System.SYSTEM_CONFIG[bus_name]['system_state']
 			if (self.system_states.has_key(sys_state) == False):
@@ -47,8 +53,23 @@
 		self.SystemStateHandler("INIT")
 		print "SystemManager Init Done"
 
+	@dbus.service.signal('org.openbmc.EventLog')
+	def EventLog(self, priority, message, rc):
+        	pass
 
 	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 == 10):
+			self.EventLog(1,"Timeout waiting for state to finish: "+self.current_state,1)	
+			return					
+
 		print "Running System State: "+state_name
 		if (self.system_states.has_key(state_name)):
 			for bus_name in self.system_states[state_name]:
@@ -60,22 +81,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)
@@ -117,13 +139,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']:
@@ -131,28 +166,13 @@
 							props = instance['properties']
 							print "Load Properties: "+obj_path
 							self.property_manager.loadProperties(bus_name,obj_path,props)
-							## create a lookup for ipmi id to object path
-							if (props.has_key('org.openbmc.SensorValue')):
-								if (props['org.openbmc.SensorValue'].has_key('ipmi_id')):
-									ipmi_id = props['org.openbmc.SensorValue']['ipmi_id']
-									## TODO: check for duplicate ipmi id
-									self.IPMI_ID_LOOKUP[ipmi_id]=[bus_name,obj_path]
-
 					## 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()
-#
-	@dbus.service.method(DBUS_NAME,
-		in_signature='y', out_signature='ss')
-	def getObjFromIpmi(self,ipmi_id):
-		obj_path = ""
-		## TODO: handle lookup failing
-		if (self.IPMI_ID_LOOKUP.has_key(ipmi_id) == True):
-			obj_info = self.IPMI_ID_LOOKUP[ipmi_id]
-		return obj_info
+
 
 	@dbus.service.method(DBUS_NAME,
 		in_signature='s', out_signature='sis')
@@ -168,6 +188,22 @@
 
 		return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
 
+	## Signal handler
+	def event_log_signal_handler(self,priority,msg,rc,path = None):
+		message = {}
+		ts = time.time()
+
+		message['priority'] = priority
+		message['object_path'] = path
+		message['message'] = msg
+		message['rc'] = rc
+
+		json_dump = json.dumps(message)
+		print "EVENT_LOG: "+json_dump
+		#syslog.openlog('OpenBmc',logoption=syslog.LOG_PID)
+		#syslog.syslog(priority,json_dump)
+		#syslog.closelog()
+		
 
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
diff --git a/includes/gpio.c b/includes/gpio.c
index 992745f..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';
@@ -39,8 +41,9 @@
 	return rc;
 }
 
-int gpio_read(GPIO* gpio, uint8_t* value)
+int gpio_read(GPIO* gpio, uint8_t *value)
 {
+	g_assert (gpio != NULL);
 	char buf[1];
 	int r = GPIO_OK;
 	if (gpio->fd <= 0)
@@ -51,10 +54,8 @@
 	{
 		if (read(gpio->fd,&buf,1) != 1)
 		{
-			g_print("here1\n");
 			r = GPIO_READ_ERROR;
 		} else {
-			g_print("here2\n");
 			if (buf[0]=='1') {
 				*value = 1;
 			} else {
@@ -65,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++) {
@@ -121,21 +123,28 @@
 	//export and set direction
 	char dev[254];
 	char data[4];
-	sprintf(dev,"%s/export",gpio->dev);
+	int fd;
 	do {
-		int fd = open(dev, O_WRONLY);
-		if (fd == GPIO_ERROR) {
-			rc = GPIO_OPEN_ERROR;
-			break;
-		} 
-		sprintf(data,"%d",gpio->num);
-		rc = write(fd,data,strlen(data));
-		close(fd);
-		if (rc == GPIO_ERROR) {
-			rc = GPIO_WRITE_ERROR;
-			break;
+		struct stat st;
+		
+		sprintf(dev,"%s/gpio%d/direction",gpio->dev,gpio->num);
+    		int result = stat(dev, &st);
+    		if (result)
+		{
+			sprintf(dev,"%s/export",gpio->dev);
+			fd = open(dev, O_WRONLY);
+			if (fd == GPIO_ERROR) {
+				rc = GPIO_OPEN_ERROR;
+				break;
+			} 
+			sprintf(data,"%d",gpio->num);
+			rc = write(fd,data,strlen(data));
+			close(fd);
+			if (rc != strlen(data)) {
+				rc = GPIO_WRITE_ERROR;
+				break;
+			}
 		}
-
 		sprintf(dev,"%s/gpio%d/direction",gpio->dev,gpio->num);
 		fd = open(dev,O_WRONLY);
 		if (fd == GPIO_ERROR) {
@@ -143,7 +152,13 @@
 			break;
 		}
 		rc = write(fd,gpio->direction,strlen(gpio->direction));
+		if (rc != strlen(gpio->direction)) {
+			rc = GPIO_WRITE_ERROR;
+			break;
+		}
+
 		close(fd);
+		rc = 0;
 	} while(0);
 
 	return rc;
@@ -157,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);
@@ -171,7 +190,10 @@
 		gpio->fd = open(buf, O_WRONLY);
 
 	}
-	return gpio->fd;
+	if (gpio->fd == -1) {
+		return GPIO_OPEN_ERROR;
+	}
+	return GPIO_OK;
 }
 
 void gpio_close(GPIO* gpio)
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/interfaces/openbmc_intf.c b/interfaces/openbmc_intf.c
index 5ccc4f5..203a0e7 100644
--- a/interfaces/openbmc_intf.c
+++ b/interfaces/openbmc_intf.c
@@ -3607,41 +3607,10 @@
   FALSE
 };
 
-static const _ExtendedGDBusArgInfo _sensor_value_method_info_set_value_IN_ARG_value =
-{
-  {
-    -1,
-    (gchar *) "value",
-    (gchar *) "v",
-    NULL
-  },
-  FALSE
-};
-
-static const _ExtendedGDBusArgInfo * const _sensor_value_method_info_set_value_IN_ARG_pointers[] =
-{
-  &_sensor_value_method_info_set_value_IN_ARG_value,
-  NULL
-};
-
-static const _ExtendedGDBusMethodInfo _sensor_value_method_info_set_value =
-{
-  {
-    -1,
-    (gchar *) "setValue",
-    (GDBusArgInfo **) &_sensor_value_method_info_set_value_IN_ARG_pointers,
-    NULL,
-    NULL
-  },
-  "handle-set-value",
-  FALSE
-};
-
 static const _ExtendedGDBusMethodInfo * const _sensor_value_method_info_pointers[] =
 {
   &_sensor_value_method_info_init,
   &_sensor_value_method_info_get_value,
-  &_sensor_value_method_info_set_value,
   NULL
 };
 
@@ -3797,32 +3766,6 @@
   FALSE
 };
 
-static const _ExtendedGDBusPropertyInfo _sensor_value_property_info_ipmi_entity_id =
-{
-  {
-    -1,
-    (gchar *) "ipmi_entity_id",
-    (gchar *) "y",
-    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
-    NULL
-  },
-  "ipmi-entity-id",
-  FALSE
-};
-
-static const _ExtendedGDBusPropertyInfo _sensor_value_property_info_ipmi_id =
-{
-  {
-    -1,
-    (gchar *) "ipmi_id",
-    (gchar *) "y",
-    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
-    NULL
-  },
-  "ipmi-id",
-  FALSE
-};
-
 static const _ExtendedGDBusPropertyInfo * const _sensor_value_property_info_pointers[] =
 {
   &_sensor_value_property_info_value,
@@ -3830,8 +3773,6 @@
   &_sensor_value_property_info_poll_interval,
   &_sensor_value_property_info_heatbeat,
   &_sensor_value_property_info_settable,
-  &_sensor_value_property_info_ipmi_entity_id,
-  &_sensor_value_property_info_ipmi_id,
   NULL
 };
 
@@ -3880,8 +3821,6 @@
   g_object_class_override_property (klass, property_id_begin++, "poll-interval");
   g_object_class_override_property (klass, property_id_begin++, "heatbeat");
   g_object_class_override_property (klass, property_id_begin++, "settable");
-  g_object_class_override_property (klass, property_id_begin++, "ipmi-entity-id");
-  g_object_class_override_property (klass, property_id_begin++, "ipmi-id");
   return property_id_begin - 1;
 }
 
@@ -3898,10 +3837,7 @@
  * @parent_iface: The parent interface.
  * @handle_get_value: Handler for the #SensorValue::handle-get-value signal.
  * @handle_init: Handler for the #SensorValue::handle-init signal.
- * @handle_set_value: Handler for the #SensorValue::handle-set-value signal.
  * @get_heatbeat: Getter for the #SensorValue:heatbeat property.
- * @get_ipmi_entity_id: Getter for the #SensorValue:ipmi-entity-id property.
- * @get_ipmi_id: Getter for the #SensorValue:ipmi-id property.
  * @get_poll_interval: Getter for the #SensorValue:poll-interval property.
  * @get_settable: Getter for the #SensorValue:settable property.
  * @get_units: Getter for the #SensorValue:units property.
@@ -3964,29 +3900,6 @@
     1,
     G_TYPE_DBUS_METHOD_INVOCATION);
 
-  /**
-   * SensorValue::handle-set-value:
-   * @object: A #SensorValue.
-   * @invocation: A #GDBusMethodInvocation.
-   * @arg_value: Argument passed by remote caller.
-   *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-SensorValue.setValue">setValue()</link> D-Bus method.
-   *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call sensor_value_complete_set_value() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
-   *
-   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
-   */
-  g_signal_new ("handle-set-value",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (SensorValueIface, handle_set_value),
-    g_signal_accumulator_true_handled,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_BOOLEAN,
-    2,
-    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT);
-
   /* GObject signals for received D-Bus signals: */
   /**
    * SensorValue::changed:
@@ -4091,24 +4004,6 @@
    */
   g_object_interface_install_property (iface,
     g_param_spec_boolean ("settable", "settable", "settable", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  /**
-   * SensorValue:ipmi-entity-id:
-   *
-   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_entity_id">"ipmi_entity_id"</link>.
-   *
-   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
-   */
-  g_object_interface_install_property (iface,
-    g_param_spec_uchar ("ipmi-entity-id", "ipmi_entity_id", "ipmi_entity_id", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  /**
-   * SensorValue:ipmi-id:
-   *
-   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_id">"ipmi_id"</link>.
-   *
-   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
-   */
-  g_object_interface_install_property (iface,
-    g_param_spec_uchar ("ipmi-id", "ipmi_id", "ipmi_id", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 /**
@@ -4307,68 +4202,6 @@
 }
 
 /**
- * sensor_value_get_ipmi_entity_id: (skip)
- * @object: A #SensorValue.
- *
- * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_entity_id">"ipmi_entity_id"</link> D-Bus property.
- *
- * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
- *
- * Returns: The property value.
- */
-guchar 
-sensor_value_get_ipmi_entity_id (SensorValue *object)
-{
-  return SENSOR_VALUE_GET_IFACE (object)->get_ipmi_entity_id (object);
-}
-
-/**
- * sensor_value_set_ipmi_entity_id: (skip)
- * @object: A #SensorValue.
- * @value: The value to set.
- *
- * Sets the <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_entity_id">"ipmi_entity_id"</link> D-Bus property to @value.
- *
- * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
- */
-void
-sensor_value_set_ipmi_entity_id (SensorValue *object, guchar value)
-{
-  g_object_set (G_OBJECT (object), "ipmi-entity-id", value, NULL);
-}
-
-/**
- * sensor_value_get_ipmi_id: (skip)
- * @object: A #SensorValue.
- *
- * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_id">"ipmi_id"</link> D-Bus property.
- *
- * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
- *
- * Returns: The property value.
- */
-guchar 
-sensor_value_get_ipmi_id (SensorValue *object)
-{
-  return SENSOR_VALUE_GET_IFACE (object)->get_ipmi_id (object);
-}
-
-/**
- * sensor_value_set_ipmi_id: (skip)
- * @object: A #SensorValue.
- * @value: The value to set.
- *
- * Sets the <link linkend="gdbus-property-org-openbmc-SensorValue.ipmi_id">"ipmi_id"</link> D-Bus property to @value.
- *
- * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
- */
-void
-sensor_value_set_ipmi_id (SensorValue *object, guchar value)
-{
-  g_object_set (G_OBJECT (object), "ipmi-id", value, NULL);
-}
-
-/**
  * sensor_value_emit_changed:
  * @object: A #SensorValue.
  * @arg_value: Argument to pass with the signal.
@@ -4604,104 +4437,6 @@
 }
 
 /**
- * sensor_value_call_set_value:
- * @proxy: A #SensorValueProxy.
- * @arg_value: Argument to pass with the method invocation.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorValue.setValue">setValue()</link> D-Bus method on @proxy.
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call sensor_value_call_set_value_finish() to get the result of the operation.
- *
- * See sensor_value_call_set_value_sync() for the synchronous, blocking version of this method.
- */
-void
-sensor_value_call_set_value (
-    SensorValue *proxy,
-    GVariant *arg_value,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data)
-{
-  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "setValue",
-    g_variant_new ("(@v)",
-                   arg_value),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    callback,
-    user_data);
-}
-
-/**
- * sensor_value_call_set_value_finish:
- * @proxy: A #SensorValueProxy.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_value_call_set_value().
- * @error: Return location for error or %NULL.
- *
- * Finishes an operation started with sensor_value_call_set_value().
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-sensor_value_call_set_value_finish (
-    SensorValue *proxy,
-    GAsyncResult *res,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * sensor_value_call_set_value_sync:
- * @proxy: A #SensorValueProxy.
- * @arg_value: Argument to pass with the method invocation.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorValue.setValue">setValue()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
- *
- * See sensor_value_call_set_value() for the asynchronous version of this method.
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-sensor_value_call_set_value_sync (
-    SensorValue *proxy,
-    GVariant *arg_value,
-    GCancellable *cancellable,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "setValue",
-    g_variant_new ("(@v)",
-                   arg_value),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
  * sensor_value_complete_init:
  * @object: A #SensorValue.
  * @invocation: (transfer full): A #GDBusMethodInvocation.
@@ -4740,24 +4475,6 @@
                    value));
 }
 
-/**
- * sensor_value_complete_set_value:
- * @object: A #SensorValue.
- * @invocation: (transfer full): A #GDBusMethodInvocation.
- *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-SensorValue.setValue">setValue()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
- *
- * This method will free @invocation, you cannot use it afterwards.
- */
-void
-sensor_value_complete_set_value (
-    SensorValue *object,
-    GDBusMethodInvocation *invocation)
-{
-  g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("()"));
-}
-
 /* ------------------------------------------------------------------------ */
 
 /**
@@ -4806,7 +4523,7 @@
 {
   const _ExtendedGDBusPropertyInfo *info;
   GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_assert (prop_id != 0 && prop_id - 1 < 5);
   info = _sensor_value_property_info_pointers[prop_id - 1];
   variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
   if (info->use_gvariant)
@@ -4853,7 +4570,7 @@
 {
   const _ExtendedGDBusPropertyInfo *info;
   GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_assert (prop_id != 0 && prop_id - 1 < 5);
   info = _sensor_value_property_info_pointers[prop_id - 1];
   variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
   g_dbus_proxy_call (G_DBUS_PROXY (object),
@@ -5008,36 +4725,6 @@
   return value;
 }
 
-static guchar 
-sensor_value_proxy_get_ipmi_entity_id (SensorValue *object)
-{
-  SensorValueProxy *proxy = SENSOR_VALUE_PROXY (object);
-  GVariant *variant;
-  guchar value = 0;
-  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "ipmi_entity_id");
-  if (variant != NULL)
-    {
-      value = g_variant_get_byte (variant);
-      g_variant_unref (variant);
-    }
-  return value;
-}
-
-static guchar 
-sensor_value_proxy_get_ipmi_id (SensorValue *object)
-{
-  SensorValueProxy *proxy = SENSOR_VALUE_PROXY (object);
-  GVariant *variant;
-  guchar value = 0;
-  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "ipmi_id");
-  if (variant != NULL)
-    {
-      value = g_variant_get_byte (variant);
-      g_variant_unref (variant);
-    }
-  return value;
-}
-
 static void
 sensor_value_proxy_init (SensorValueProxy *proxy)
 {
@@ -5080,8 +4767,6 @@
   iface->get_poll_interval = sensor_value_proxy_get_poll_interval;
   iface->get_heatbeat = sensor_value_proxy_get_heatbeat;
   iface->get_settable = sensor_value_proxy_get_settable;
-  iface->get_ipmi_entity_id = sensor_value_proxy_get_ipmi_entity_id;
-  iface->get_ipmi_id = sensor_value_proxy_get_ipmi_id;
 }
 
 /**
@@ -5580,7 +5265,7 @@
 {
   SensorValueSkeleton *skeleton = SENSOR_VALUE_SKELETON (object);
   guint n;
-  for (n = 0; n < 7; n++)
+  for (n = 0; n < 5; n++)
     g_value_unset (&skeleton->priv->properties[n]);
   g_free (skeleton->priv->properties);
   g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
@@ -5598,7 +5283,7 @@
   GParamSpec   *pspec G_GNUC_UNUSED)
 {
   SensorValueSkeleton *skeleton = SENSOR_VALUE_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_assert (prop_id != 0 && prop_id - 1 < 5);
   g_mutex_lock (&skeleton->priv->lock);
   g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
   g_mutex_unlock (&skeleton->priv->lock);
@@ -5715,7 +5400,7 @@
   GParamSpec   *pspec)
 {
   SensorValueSkeleton *skeleton = SENSOR_VALUE_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_assert (prop_id != 0 && prop_id - 1 < 5);
   g_mutex_lock (&skeleton->priv->lock);
   g_object_freeze_notify (object);
   if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
@@ -5740,14 +5425,12 @@
 
   g_mutex_init (&skeleton->priv->lock);
   skeleton->priv->context = g_main_context_ref_thread_default ();
-  skeleton->priv->properties = g_new0 (GValue, 7);
+  skeleton->priv->properties = g_new0 (GValue, 5);
   g_value_init (&skeleton->priv->properties[0], G_TYPE_VARIANT);
   g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
   g_value_init (&skeleton->priv->properties[2], G_TYPE_INT);
   g_value_init (&skeleton->priv->properties[3], G_TYPE_INT);
   g_value_init (&skeleton->priv->properties[4], G_TYPE_BOOLEAN);
-  g_value_init (&skeleton->priv->properties[5], G_TYPE_UCHAR);
-  g_value_init (&skeleton->priv->properties[6], G_TYPE_UCHAR);
 }
 
 static GVariant *
@@ -5805,28 +5488,6 @@
   return value;
 }
 
-static guchar 
-sensor_value_skeleton_get_ipmi_entity_id (SensorValue *object)
-{
-  SensorValueSkeleton *skeleton = SENSOR_VALUE_SKELETON (object);
-  guchar value;
-  g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_uchar (&(skeleton->priv->properties[5]));
-  g_mutex_unlock (&skeleton->priv->lock);
-  return value;
-}
-
-static guchar 
-sensor_value_skeleton_get_ipmi_id (SensorValue *object)
-{
-  SensorValueSkeleton *skeleton = SENSOR_VALUE_SKELETON (object);
-  guchar value;
-  g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_uchar (&(skeleton->priv->properties[6]));
-  g_mutex_unlock (&skeleton->priv->lock);
-  return value;
-}
-
 static void
 sensor_value_skeleton_class_init (SensorValueSkeletonClass *klass)
 {
@@ -5864,8 +5525,6 @@
   iface->get_poll_interval = sensor_value_skeleton_get_poll_interval;
   iface->get_heatbeat = sensor_value_skeleton_get_heatbeat;
   iface->get_settable = sensor_value_skeleton_get_settable;
-  iface->get_ipmi_entity_id = sensor_value_skeleton_get_ipmi_entity_id;
-  iface->get_ipmi_id = sensor_value_skeleton_get_ipmi_id;
 }
 
 /**
@@ -5882,6 +5541,1110 @@
 }
 
 /* ------------------------------------------------------------------------
+ * Code for interface org.openbmc.SensorIpmi
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:SensorIpmi
+ * @title: SensorIpmi
+ * @short_description: Generated C code for the org.openbmc.SensorIpmi D-Bus interface
+ *
+ * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link> D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.openbmc.SensorIpmi ---- */
+
+static const _ExtendedGDBusPropertyInfo _sensor_ipmi_property_info_sensor_id =
+{
+  {
+    -1,
+    (gchar *) "sensor_id",
+    (gchar *) "y",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "sensor-id",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _sensor_ipmi_property_info_entity_id =
+{
+  {
+    -1,
+    (gchar *) "entity_id",
+    (gchar *) "y",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "entity-id",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _sensor_ipmi_property_info_pointers[] =
+{
+  &_sensor_ipmi_property_info_sensor_id,
+  &_sensor_ipmi_property_info_entity_id,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _sensor_ipmi_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.openbmc.SensorIpmi",
+    NULL,
+    NULL,
+    (GDBusPropertyInfo **) &_sensor_ipmi_property_info_pointers,
+    NULL
+  },
+  "sensor-ipmi",
+};
+
+
+/**
+ * sensor_ipmi_interface_info:
+ *
+ * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link> D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+sensor_ipmi_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct;
+}
+
+/**
+ * sensor_ipmi_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #SensorIpmi interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+sensor_ipmi_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  g_object_class_override_property (klass, property_id_begin++, "sensor-id");
+  g_object_class_override_property (klass, property_id_begin++, "entity-id");
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * SensorIpmi:
+ *
+ * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>.
+ */
+
+/**
+ * SensorIpmiIface:
+ * @parent_iface: The parent interface.
+ * @get_entity_id: Getter for the #SensorIpmi:entity-id property.
+ * @get_sensor_id: Getter for the #SensorIpmi:sensor-id property.
+ *
+ * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>.
+ */
+
+typedef SensorIpmiIface SensorIpmiInterface;
+G_DEFINE_INTERFACE (SensorIpmi, sensor_ipmi, G_TYPE_OBJECT);
+
+static void
+sensor_ipmi_default_init (SensorIpmiIface *iface)
+{
+  /* GObject properties for D-Bus properties: */
+  /**
+   * SensorIpmi:sensor-id:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorIpmi.sensor_id">"sensor_id"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_uchar ("sensor-id", "sensor_id", "sensor_id", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * SensorIpmi:entity-id:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorIpmi.entity_id">"entity_id"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_uchar ("entity-id", "entity_id", "entity_id", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * sensor_ipmi_get_sensor_id: (skip)
+ * @object: A #SensorIpmi.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorIpmi.sensor_id">"sensor_id"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+guchar 
+sensor_ipmi_get_sensor_id (SensorIpmi *object)
+{
+  return SENSOR_IPMI_GET_IFACE (object)->get_sensor_id (object);
+}
+
+/**
+ * sensor_ipmi_set_sensor_id: (skip)
+ * @object: A #SensorIpmi.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorIpmi.sensor_id">"sensor_id"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+sensor_ipmi_set_sensor_id (SensorIpmi *object, guchar value)
+{
+  g_object_set (G_OBJECT (object), "sensor-id", value, NULL);
+}
+
+/**
+ * sensor_ipmi_get_entity_id: (skip)
+ * @object: A #SensorIpmi.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorIpmi.entity_id">"entity_id"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+guchar 
+sensor_ipmi_get_entity_id (SensorIpmi *object)
+{
+  return SENSOR_IPMI_GET_IFACE (object)->get_entity_id (object);
+}
+
+/**
+ * sensor_ipmi_set_entity_id: (skip)
+ * @object: A #SensorIpmi.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorIpmi.entity_id">"entity_id"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+sensor_ipmi_set_entity_id (SensorIpmi *object, guchar value)
+{
+  g_object_set (G_OBJECT (object), "entity-id", value, NULL);
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * SensorIpmiProxy:
+ *
+ * The #SensorIpmiProxy structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * SensorIpmiProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #SensorIpmiProxy.
+ */
+
+struct _SensorIpmiProxyPrivate
+{
+  GData *qdata;
+};
+
+static void sensor_ipmi_proxy_iface_init (SensorIpmiIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (SensorIpmiProxy, sensor_ipmi_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (SensorIpmiProxy)
+                         G_IMPLEMENT_INTERFACE (TYPE_SENSOR_IPMI, sensor_ipmi_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (SensorIpmiProxy, sensor_ipmi_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (TYPE_SENSOR_IPMI, sensor_ipmi_proxy_iface_init));
+
+#endif
+static void
+sensor_ipmi_proxy_finalize (GObject *object)
+{
+  SensorIpmiProxy *proxy = SENSOR_IPMI_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (sensor_ipmi_proxy_parent_class)->finalize (object);
+}
+
+static void
+sensor_ipmi_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  info = _sensor_ipmi_property_info_pointers[prop_id - 1];
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+  if (info->use_gvariant)
+    {
+      g_value_set_variant (value, variant);
+    }
+  else
+    {
+      if (variant != NULL)
+        g_dbus_gvariant_to_gvalue (variant, value);
+    }
+  if (variant != NULL)
+    g_variant_unref (variant);
+}
+
+static void
+sensor_ipmi_proxy_set_property_cb (GDBusProxy *proxy,
+  GAsyncResult *res,
+  gpointer      user_data)
+{
+  const _ExtendedGDBusPropertyInfo *info = user_data;
+  GError *error;
+  GVariant *_ret;
+  error = NULL;
+  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (!_ret)
+    {
+      g_warning ("Error setting property '%s' on interface org.openbmc.SensorIpmi: %s (%s, %d)",
+                 info->parent_struct.name, 
+                 error->message, g_quark_to_string (error->domain), error->code);
+      g_error_free (error);
+    }
+  else
+    {
+      g_variant_unref (_ret);
+    }
+}
+
+static void
+sensor_ipmi_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  info = _sensor_ipmi_property_info_pointers[prop_id - 1];
+  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+  g_dbus_proxy_call (G_DBUS_PROXY (object),
+    "org.freedesktop.DBus.Properties.Set",
+    g_variant_new ("(ssv)", "org.openbmc.SensorIpmi", info->parent_struct.name, variant),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    NULL, (GAsyncReadyCallback) sensor_ipmi_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
+  g_variant_unref (variant);
+}
+
+static void
+sensor_ipmi_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], TYPE_SENSOR_IPMI);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_SENSOR_IPMI);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+sensor_ipmi_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  SensorIpmiProxy *proxy = SENSOR_IPMI_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static guchar 
+sensor_ipmi_proxy_get_sensor_id (SensorIpmi *object)
+{
+  SensorIpmiProxy *proxy = SENSOR_IPMI_PROXY (object);
+  GVariant *variant;
+  guchar value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "sensor_id");
+  if (variant != NULL)
+    {
+      value = g_variant_get_byte (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static guchar 
+sensor_ipmi_proxy_get_entity_id (SensorIpmi *object)
+{
+  SensorIpmiProxy *proxy = SENSOR_IPMI_PROXY (object);
+  GVariant *variant;
+  guchar value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "entity_id");
+  if (variant != NULL)
+    {
+      value = g_variant_get_byte (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static void
+sensor_ipmi_proxy_init (SensorIpmiProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = sensor_ipmi_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_SENSOR_IPMI_PROXY, SensorIpmiProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), sensor_ipmi_interface_info ());
+}
+
+static void
+sensor_ipmi_proxy_class_init (SensorIpmiProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = sensor_ipmi_proxy_finalize;
+  gobject_class->get_property = sensor_ipmi_proxy_get_property;
+  gobject_class->set_property = sensor_ipmi_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = sensor_ipmi_proxy_g_signal;
+  proxy_class->g_properties_changed = sensor_ipmi_proxy_g_properties_changed;
+
+  sensor_ipmi_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (SensorIpmiProxyPrivate));
+#endif
+}
+
+static void
+sensor_ipmi_proxy_iface_init (SensorIpmiIface *iface)
+{
+  iface->get_sensor_id = sensor_ipmi_proxy_get_sensor_id;
+  iface->get_entity_id = sensor_ipmi_proxy_get_entity_id;
+}
+
+/**
+ * sensor_ipmi_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>. See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call sensor_ipmi_proxy_new_finish() to get the result of the operation.
+ *
+ * See sensor_ipmi_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+sensor_ipmi_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_SENSOR_IPMI_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.SensorIpmi", NULL);
+}
+
+/**
+ * sensor_ipmi_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_ipmi_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with sensor_ipmi_proxy_new().
+ *
+ * Returns: (transfer full) (type SensorIpmiProxy): The constructed proxy object or %NULL if @error is set.
+ */
+SensorIpmi *
+sensor_ipmi_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return SENSOR_IPMI (ret);
+  else
+    return NULL;
+}
+
+/**
+ * sensor_ipmi_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>. See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See sensor_ipmi_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type SensorIpmiProxy): The constructed proxy object or %NULL if @error is set.
+ */
+SensorIpmi *
+sensor_ipmi_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_SENSOR_IPMI_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.SensorIpmi", NULL);
+  if (ret != NULL)
+    return SENSOR_IPMI (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * sensor_ipmi_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like sensor_ipmi_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call sensor_ipmi_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See sensor_ipmi_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+sensor_ipmi_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_SENSOR_IPMI_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.SensorIpmi", NULL);
+}
+
+/**
+ * sensor_ipmi_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_ipmi_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with sensor_ipmi_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type SensorIpmiProxy): The constructed proxy object or %NULL if @error is set.
+ */
+SensorIpmi *
+sensor_ipmi_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return SENSOR_IPMI (ret);
+  else
+    return NULL;
+}
+
+/**
+ * sensor_ipmi_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like sensor_ipmi_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See sensor_ipmi_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type SensorIpmiProxy): The constructed proxy object or %NULL if @error is set.
+ */
+SensorIpmi *
+sensor_ipmi_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_SENSOR_IPMI_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.SensorIpmi", NULL);
+  if (ret != NULL)
+    return SENSOR_IPMI (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * SensorIpmiSkeleton:
+ *
+ * The #SensorIpmiSkeleton structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * SensorIpmiSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #SensorIpmiSkeleton.
+ */
+
+struct _SensorIpmiSkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_sensor_ipmi_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], TYPE_SENSOR_IPMI);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_SENSOR_IPMI);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_sensor_ipmi_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_sensor_ipmi_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_sensor_ipmi_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _sensor_ipmi_skeleton_vtable =
+{
+  _sensor_ipmi_skeleton_handle_method_call,
+  _sensor_ipmi_skeleton_handle_get_property,
+  _sensor_ipmi_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+sensor_ipmi_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return sensor_ipmi_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+sensor_ipmi_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_sensor_ipmi_skeleton_vtable;
+}
+
+static GVariant *
+sensor_ipmi_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_sensor_ipmi_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _sensor_ipmi_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _sensor_ipmi_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _sensor_ipmi_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.SensorIpmi", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static gboolean _sensor_ipmi_emit_changed (gpointer user_data);
+
+static void
+sensor_ipmi_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (_skeleton);
+  gboolean emit_changed = FALSE;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    {
+      g_source_destroy (skeleton->priv->changed_properties_idle_source);
+      skeleton->priv->changed_properties_idle_source = NULL;
+      emit_changed = TRUE;
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+
+  if (emit_changed)
+    _sensor_ipmi_emit_changed (skeleton);
+}
+
+static void sensor_ipmi_skeleton_iface_init (SensorIpmiIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (SensorIpmiSkeleton, sensor_ipmi_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (SensorIpmiSkeleton)
+                         G_IMPLEMENT_INTERFACE (TYPE_SENSOR_IPMI, sensor_ipmi_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (SensorIpmiSkeleton, sensor_ipmi_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TYPE_SENSOR_IPMI, sensor_ipmi_skeleton_iface_init));
+
+#endif
+static void
+sensor_ipmi_skeleton_finalize (GObject *object)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  guint n;
+  for (n = 0; n < 2; n++)
+    g_value_unset (&skeleton->priv->properties[n]);
+  g_free (skeleton->priv->properties);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (sensor_ipmi_skeleton_parent_class)->finalize (object);
+}
+
+static void
+sensor_ipmi_skeleton_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_sensor_ipmi_emit_changed (gpointer user_data)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (user_data);
+  GList *l;
+  GVariantBuilder builder;
+  GVariantBuilder invalidated_builder;
+  guint num_changes;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+    {
+      ChangedProperty *cp = l->data;
+      GVariant *variant;
+      const GValue *cur_value;
+
+      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+      if (!_g_value_equal (cur_value, &cp->orig_value))
+        {
+          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
+          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+          g_variant_unref (variant);
+          num_changes++;
+        }
+    }
+  if (num_changes > 0)
+    {
+      GList *connections, *ll;
+      GVariant *signal_variant;
+      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.openbmc.SensorIpmi",
+                                           &builder, &invalidated_builder));
+      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+      for (ll = connections; ll != NULL; ll = ll->next)
+        {
+          GDBusConnection *connection = ll->data;
+
+          g_dbus_connection_emit_signal (connection,
+                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
+                                         "org.freedesktop.DBus.Properties",
+                                         "PropertiesChanged",
+                                         signal_variant,
+                                         NULL);
+        }
+      g_variant_unref (signal_variant);
+      g_list_free_full (connections, g_object_unref);
+    }
+  else
+    {
+      g_variant_builder_clear (&builder);
+      g_variant_builder_clear (&invalidated_builder);
+    }
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  skeleton->priv->changed_properties = NULL;
+  skeleton->priv->changed_properties_idle_source = NULL;
+  g_mutex_unlock (&skeleton->priv->lock);
+  return FALSE;
+}
+
+static void
+_sensor_ipmi_schedule_emit_changed (SensorIpmiSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+  ChangedProperty *cp;
+  GList *l;
+  cp = NULL;
+  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+    {
+      ChangedProperty *i_cp = l->data;
+      if (i_cp->info == info)
+        {
+          cp = i_cp;
+          break;
+        }
+    }
+  if (cp == NULL)
+    {
+      cp = g_new0 (ChangedProperty, 1);
+      cp->prop_id = prop_id;
+      cp->info = info;
+      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+      g_value_copy (orig_value, &cp->orig_value);
+    }
+}
+
+static void
+sensor_ipmi_skeleton_notify (GObject      *object,
+  GParamSpec *pspec G_GNUC_UNUSED)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties != NULL &&
+      skeleton->priv->changed_properties_idle_source == NULL)
+    {
+      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _sensor_ipmi_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+      g_source_unref (skeleton->priv->changed_properties_idle_source);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+sensor_ipmi_skeleton_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_object_freeze_notify (object);
+  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+    {
+      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+        _sensor_ipmi_schedule_emit_changed (skeleton, _sensor_ipmi_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+      g_object_notify_by_pspec (object, pspec);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+  g_object_thaw_notify (object);
+}
+
+static void
+sensor_ipmi_skeleton_init (SensorIpmiSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = sensor_ipmi_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_SENSOR_IPMI_SKELETON, SensorIpmiSkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+  skeleton->priv->properties = g_new0 (GValue, 2);
+  g_value_init (&skeleton->priv->properties[0], G_TYPE_UCHAR);
+  g_value_init (&skeleton->priv->properties[1], G_TYPE_UCHAR);
+}
+
+static guchar 
+sensor_ipmi_skeleton_get_sensor_id (SensorIpmi *object)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  guchar value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_uchar (&(skeleton->priv->properties[0]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static guchar 
+sensor_ipmi_skeleton_get_entity_id (SensorIpmi *object)
+{
+  SensorIpmiSkeleton *skeleton = SENSOR_IPMI_SKELETON (object);
+  guchar value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_uchar (&(skeleton->priv->properties[1]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static void
+sensor_ipmi_skeleton_class_init (SensorIpmiSkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = sensor_ipmi_skeleton_finalize;
+  gobject_class->get_property = sensor_ipmi_skeleton_get_property;
+  gobject_class->set_property = sensor_ipmi_skeleton_set_property;
+  gobject_class->notify       = sensor_ipmi_skeleton_notify;
+
+
+  sensor_ipmi_override_properties (gobject_class, 1);
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = sensor_ipmi_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = sensor_ipmi_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = sensor_ipmi_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = sensor_ipmi_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (SensorIpmiSkeletonPrivate));
+#endif
+}
+
+static void
+sensor_ipmi_skeleton_iface_init (SensorIpmiIface *iface)
+{
+  iface->get_sensor_id = sensor_ipmi_skeleton_get_sensor_id;
+  iface->get_entity_id = sensor_ipmi_skeleton_get_entity_id;
+}
+
+/**
+ * sensor_ipmi_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>.
+ *
+ * Returns: (transfer full) (type SensorIpmiSkeleton): The skeleton object.
+ */
+SensorIpmi *
+sensor_ipmi_skeleton_new (void)
+{
+  return SENSOR_IPMI (g_object_new (TYPE_SENSOR_IPMI_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
  * Code for interface org.openbmc.SensorThreshold
  * ------------------------------------------------------------------------
  */
@@ -17832,10 +18595,22 @@
   FALSE
 };
 
+static const _ExtendedGDBusArgInfo _event_log_signal_info_event_log_ARG_rc =
+{
+  {
+    -1,
+    (gchar *) "rc",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
 static const _ExtendedGDBusArgInfo * const _event_log_signal_info_event_log_ARG_pointers[] =
 {
   &_event_log_signal_info_event_log_ARG_priority,
   &_event_log_signal_info_event_log_ARG_message,
+  &_event_log_signal_info_event_log_ARG_rc,
   NULL
 };
 
@@ -17951,6 +18726,7 @@
    * @object: A #EventLog.
    * @arg_priority: Argument.
    * @arg_message: Argument.
+   * @arg_rc: Argument.
    *
    * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-EventLog.EventLog">"EventLog"</link> is received.
    *
@@ -17964,7 +18740,7 @@
     NULL,
     g_cclosure_marshal_generic,
     G_TYPE_NONE,
-    2, G_TYPE_INT, G_TYPE_STRING);
+    3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT);
 
 }
 
@@ -17973,6 +18749,7 @@
  * @object: A #EventLog.
  * @arg_priority: Argument to pass with the signal.
  * @arg_message: Argument to pass with the signal.
+ * @arg_rc: Argument to pass with the signal.
  *
  * Emits the <link linkend="gdbus-signal-org-openbmc-EventLog.EventLog">"EventLog"</link> D-Bus signal.
  */
@@ -17980,9 +18757,10 @@
 event_log_emit_event_log (
     EventLog *object,
     gint arg_priority,
-    const gchar *arg_message)
+    const gchar *arg_message,
+    gint arg_rc)
 {
-  g_signal_emit_by_name (object, "event-log", arg_priority, arg_message);
+  g_signal_emit_by_name (object, "event-log", arg_priority, arg_message, arg_rc);
 }
 
 /**
@@ -18663,7 +19441,8 @@
 _event_log_on_signal_event_log (
     EventLog *object,
     gint arg_priority,
-    const gchar *arg_message)
+    const gchar *arg_message,
+    gint arg_rc)
 {
   EventLogSkeleton *skeleton = EVENT_LOG_SKELETON (object);
 
@@ -18671,9 +19450,10 @@
   GVariant   *signal_variant;
   connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
 
-  signal_variant = g_variant_ref_sink (g_variant_new ("(is)",
+  signal_variant = g_variant_ref_sink (g_variant_new ("(isi)",
                    arg_priority,
-                   arg_message));
+                   arg_message,
+                   arg_rc));
   for (l = connections; l != NULL; l = l->next)
     {
       GDBusConnection *connection = l->data;
@@ -23662,6 +24442,15 @@
   g_object_interface_install_property (iface, g_param_spec_object ("sensor-value", "sensor-value", "sensor-value", TYPE_SENSOR_VALUE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
 
   /**
+   * Object:sensor-ipmi:
+   *
+   * The #SensorIpmi instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link>, if any.
+   *
+   * Connect to the #GObject::notify signal to get informed of property changes.
+   */
+  g_object_interface_install_property (iface, g_param_spec_object ("sensor-ipmi", "sensor-ipmi", "sensor-ipmi", TYPE_SENSOR_IPMI, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+  /**
    * Object:sensor-threshold:
    *
    * The #SensorThreshold instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorThreshold.top_of_page">org.openbmc.SensorThreshold</link>, if any.
@@ -23832,6 +24621,23 @@
 }
 
 /**
+ * object_get_sensor_ipmi:
+ * @object: A #Object.
+ *
+ * Gets the #SensorIpmi instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link> on @object, if any.
+ *
+ * Returns: (transfer full): A #SensorIpmi that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
+ */
+SensorIpmi *object_get_sensor_ipmi (Object *object)
+{
+  GDBusInterface *ret;
+  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorIpmi");
+  if (ret == NULL)
+    return NULL;
+  return SENSOR_IPMI (ret);
+}
+
+/**
  * object_get_sensor_threshold:
  * @object: A #Object.
  *
@@ -24114,6 +24920,26 @@
 }
 
 /**
+ * object_peek_sensor_ipmi: (skip)
+ * @object: A #Object.
+ *
+ * Like object_get_sensor_ipmi() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #SensorIpmi or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
+ */
+SensorIpmi *object_peek_sensor_ipmi (Object *object)
+{
+  GDBusInterface *ret;
+  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorIpmi");
+  if (ret == NULL)
+    return NULL;
+  g_object_unref (ret);
+  return SENSOR_IPMI (ret);
+}
+
+/**
  * object_peek_sensor_threshold: (skip)
  * @object: A #Object.
  *
@@ -24456,66 +25282,71 @@
       break;
 
     case 4:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorThreshold");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorIpmi");
       g_value_take_object (value, interface);
       break;
 
     case 5:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorI2c");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorThreshold");
       g_value_take_object (value, interface);
       break;
 
     case 6:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorMatch");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorI2c");
       g_value_take_object (value, interface);
       break;
 
     case 7:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Process");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorMatch");
       g_value_take_object (value, interface);
       break;
 
     case 8:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Control");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Process");
       g_value_take_object (value, interface);
       break;
 
     case 9:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Bmc");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Control");
       g_value_take_object (value, interface);
       break;
 
     case 10:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Host");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Bmc");
       g_value_take_object (value, interface);
       break;
 
     case 11:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Host");
       g_value_take_object (value, interface);
       break;
 
     case 12:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Watchdog");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
       g_value_take_object (value, interface);
       break;
 
     case 13:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.EventLog");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Watchdog");
       g_value_take_object (value, interface);
       break;
 
     case 14:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Flash");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.EventLog");
       g_value_take_object (value, interface);
       break;
 
     case 15:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Button");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Flash");
       g_value_take_object (value, interface);
       break;
 
     case 16:
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Button");
+      g_value_take_object (value, interface);
+      break;
+
+    case 17:
       interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Led");
       g_value_take_object (value, interface);
       break;
@@ -24537,19 +25368,20 @@
   g_object_class_override_property (gobject_class, 1, "occ");
   g_object_class_override_property (gobject_class, 2, "fan");
   g_object_class_override_property (gobject_class, 3, "sensor-value");
-  g_object_class_override_property (gobject_class, 4, "sensor-threshold");
-  g_object_class_override_property (gobject_class, 5, "sensor-i2c");
-  g_object_class_override_property (gobject_class, 6, "sensor-match");
-  g_object_class_override_property (gobject_class, 7, "process");
-  g_object_class_override_property (gobject_class, 8, "control");
-  g_object_class_override_property (gobject_class, 9, "control-bmc");
-  g_object_class_override_property (gobject_class, 10, "control-host");
-  g_object_class_override_property (gobject_class, 11, "control-power");
-  g_object_class_override_property (gobject_class, 12, "watchdog");
-  g_object_class_override_property (gobject_class, 13, "event-log");
-  g_object_class_override_property (gobject_class, 14, "flash");
-  g_object_class_override_property (gobject_class, 15, "button");
-  g_object_class_override_property (gobject_class, 16, "led");
+  g_object_class_override_property (gobject_class, 4, "sensor-ipmi");
+  g_object_class_override_property (gobject_class, 5, "sensor-threshold");
+  g_object_class_override_property (gobject_class, 6, "sensor-i2c");
+  g_object_class_override_property (gobject_class, 7, "sensor-match");
+  g_object_class_override_property (gobject_class, 8, "process");
+  g_object_class_override_property (gobject_class, 9, "control");
+  g_object_class_override_property (gobject_class, 10, "control-bmc");
+  g_object_class_override_property (gobject_class, 11, "control-host");
+  g_object_class_override_property (gobject_class, 12, "control-power");
+  g_object_class_override_property (gobject_class, 13, "watchdog");
+  g_object_class_override_property (gobject_class, 14, "event-log");
+  g_object_class_override_property (gobject_class, 15, "flash");
+  g_object_class_override_property (gobject_class, 16, "button");
+  g_object_class_override_property (gobject_class, 17, "led");
 }
 
 /**
@@ -24659,6 +25491,19 @@
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
+          g_warn_if_fail (IS_SENSOR_IPMI (interface));
+          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+        }
+      else
+        {
+          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.SensorIpmi");
+        }
+      break;
+
+    case 5:
+      interface = g_value_get_object (value);
+      if (interface != NULL)
+        {
           g_warn_if_fail (IS_SENSOR_THRESHOLD (interface));
           g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
         }
@@ -24668,7 +25513,7 @@
         }
       break;
 
-    case 5:
+    case 6:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24681,7 +25526,7 @@
         }
       break;
 
-    case 6:
+    case 7:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24694,7 +25539,7 @@
         }
       break;
 
-    case 7:
+    case 8:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24707,7 +25552,7 @@
         }
       break;
 
-    case 8:
+    case 9:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24720,7 +25565,7 @@
         }
       break;
 
-    case 9:
+    case 10:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24733,7 +25578,7 @@
         }
       break;
 
-    case 10:
+    case 11:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24746,7 +25591,7 @@
         }
       break;
 
-    case 11:
+    case 12:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24759,7 +25604,7 @@
         }
       break;
 
-    case 12:
+    case 13:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24772,7 +25617,7 @@
         }
       break;
 
-    case 13:
+    case 14:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24785,7 +25630,7 @@
         }
       break;
 
-    case 14:
+    case 15:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24798,7 +25643,7 @@
         }
       break;
 
-    case 15:
+    case 16:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24811,7 +25656,7 @@
         }
       break;
 
-    case 16:
+    case 17:
       interface = g_value_get_object (value);
       if (interface != NULL)
         {
@@ -24857,66 +25702,71 @@
       break;
 
     case 4:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorThreshold");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorIpmi");
       g_value_take_object (value, interface);
       break;
 
     case 5:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorI2c");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorThreshold");
       g_value_take_object (value, interface);
       break;
 
     case 6:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorMatch");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorI2c");
       g_value_take_object (value, interface);
       break;
 
     case 7:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Process");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.SensorMatch");
       g_value_take_object (value, interface);
       break;
 
     case 8:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Control");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Process");
       g_value_take_object (value, interface);
       break;
 
     case 9:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Bmc");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Control");
       g_value_take_object (value, interface);
       break;
 
     case 10:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Host");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Bmc");
       g_value_take_object (value, interface);
       break;
 
     case 11:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Host");
       g_value_take_object (value, interface);
       break;
 
     case 12:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Watchdog");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
       g_value_take_object (value, interface);
       break;
 
     case 13:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.EventLog");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Watchdog");
       g_value_take_object (value, interface);
       break;
 
     case 14:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Flash");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.EventLog");
       g_value_take_object (value, interface);
       break;
 
     case 15:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Button");
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Flash");
       g_value_take_object (value, interface);
       break;
 
     case 16:
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Button");
+      g_value_take_object (value, interface);
+      break;
+
+    case 17:
       interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Led");
       g_value_take_object (value, interface);
       break;
@@ -24938,19 +25788,20 @@
   g_object_class_override_property (gobject_class, 1, "occ");
   g_object_class_override_property (gobject_class, 2, "fan");
   g_object_class_override_property (gobject_class, 3, "sensor-value");
-  g_object_class_override_property (gobject_class, 4, "sensor-threshold");
-  g_object_class_override_property (gobject_class, 5, "sensor-i2c");
-  g_object_class_override_property (gobject_class, 6, "sensor-match");
-  g_object_class_override_property (gobject_class, 7, "process");
-  g_object_class_override_property (gobject_class, 8, "control");
-  g_object_class_override_property (gobject_class, 9, "control-bmc");
-  g_object_class_override_property (gobject_class, 10, "control-host");
-  g_object_class_override_property (gobject_class, 11, "control-power");
-  g_object_class_override_property (gobject_class, 12, "watchdog");
-  g_object_class_override_property (gobject_class, 13, "event-log");
-  g_object_class_override_property (gobject_class, 14, "flash");
-  g_object_class_override_property (gobject_class, 15, "button");
-  g_object_class_override_property (gobject_class, 16, "led");
+  g_object_class_override_property (gobject_class, 4, "sensor-ipmi");
+  g_object_class_override_property (gobject_class, 5, "sensor-threshold");
+  g_object_class_override_property (gobject_class, 6, "sensor-i2c");
+  g_object_class_override_property (gobject_class, 7, "sensor-match");
+  g_object_class_override_property (gobject_class, 8, "process");
+  g_object_class_override_property (gobject_class, 9, "control");
+  g_object_class_override_property (gobject_class, 10, "control-bmc");
+  g_object_class_override_property (gobject_class, 11, "control-host");
+  g_object_class_override_property (gobject_class, 12, "control-power");
+  g_object_class_override_property (gobject_class, 13, "watchdog");
+  g_object_class_override_property (gobject_class, 14, "event-log");
+  g_object_class_override_property (gobject_class, 15, "flash");
+  g_object_class_override_property (gobject_class, 16, "button");
+  g_object_class_override_property (gobject_class, 17, "led");
 }
 
 /**
@@ -25005,6 +25856,18 @@
 }
 
 /**
+ * object_skeleton_set_sensor_ipmi:
+ * @object: A #ObjectSkeleton.
+ * @interface_: (allow-none): A #SensorIpmi or %NULL to clear the interface.
+ *
+ * Sets the #SensorIpmi instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorIpmi.top_of_page">org.openbmc.SensorIpmi</link> on @object.
+ */
+void object_skeleton_set_sensor_ipmi (ObjectSkeleton *object, SensorIpmi *interface_)
+{
+  g_object_set (G_OBJECT (object), "sensor-ipmi", interface_, NULL);
+}
+
+/**
  * object_skeleton_set_sensor_threshold:
  * @object: A #ObjectSkeleton.
  * @interface_: (allow-none): A #SensorThreshold or %NULL to clear the interface.
@@ -25225,6 +26088,7 @@
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.Occ", GSIZE_TO_POINTER (TYPE_OCC_PROXY));
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.Fan", GSIZE_TO_POINTER (TYPE_FAN_PROXY));
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.SensorValue", GSIZE_TO_POINTER (TYPE_SENSOR_VALUE_PROXY));
+      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.SensorIpmi", GSIZE_TO_POINTER (TYPE_SENSOR_IPMI_PROXY));
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.SensorThreshold", GSIZE_TO_POINTER (TYPE_SENSOR_THRESHOLD_PROXY));
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.SensorI2c", GSIZE_TO_POINTER (TYPE_SENSOR_I2C_PROXY));
       g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.SensorMatch", GSIZE_TO_POINTER (TYPE_SENSOR_MATCH_PROXY));
diff --git a/interfaces/openbmc_intf.h b/interfaces/openbmc_intf.h
index c064672..af4d22e 100644
--- a/interfaces/openbmc_intf.h
+++ b/interfaces/openbmc_intf.h
@@ -475,17 +475,8 @@
     SensorValue *object,
     GDBusMethodInvocation *invocation);
 
-  gboolean (*handle_set_value) (
-    SensorValue *object,
-    GDBusMethodInvocation *invocation,
-    GVariant *arg_value);
-
   gint  (*get_heatbeat) (SensorValue *object);
 
-  guchar  (*get_ipmi_entity_id) (SensorValue *object);
-
-  guchar  (*get_ipmi_id) (SensorValue *object);
-
   gint  (*get_poll_interval) (SensorValue *object);
 
   gboolean  (*get_settable) (SensorValue *object);
@@ -524,10 +515,6 @@
     GDBusMethodInvocation *invocation,
     GVariant *value);
 
-void sensor_value_complete_set_value (
-    SensorValue *object,
-    GDBusMethodInvocation *invocation);
-
 
 
 /* D-Bus signal emissions functions: */
@@ -580,24 +567,6 @@
     GCancellable *cancellable,
     GError **error);
 
-void sensor_value_call_set_value (
-    SensorValue *proxy,
-    GVariant *arg_value,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data);
-
-gboolean sensor_value_call_set_value_finish (
-    SensorValue *proxy,
-    GAsyncResult *res,
-    GError **error);
-
-gboolean sensor_value_call_set_value_sync (
-    SensorValue *proxy,
-    GVariant *arg_value,
-    GCancellable *cancellable,
-    GError **error);
-
 
 
 /* D-Bus property accessors: */
@@ -618,12 +587,6 @@
 gboolean sensor_value_get_settable (SensorValue *object);
 void sensor_value_set_settable (SensorValue *object, gboolean value);
 
-guchar sensor_value_get_ipmi_entity_id (SensorValue *object);
-void sensor_value_set_ipmi_entity_id (SensorValue *object, guchar value);
-
-guchar sensor_value_get_ipmi_id (SensorValue *object);
-void sensor_value_set_ipmi_id (SensorValue *object, guchar value);
-
 
 /* ---- */
 
@@ -722,6 +685,138 @@
 
 
 /* ------------------------------------------------------------------------ */
+/* Declarations for org.openbmc.SensorIpmi */
+
+#define TYPE_SENSOR_IPMI (sensor_ipmi_get_type ())
+#define SENSOR_IPMI(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_IPMI, SensorIpmi))
+#define IS_SENSOR_IPMI(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_IPMI))
+#define SENSOR_IPMI_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_IPMI, SensorIpmiIface))
+
+struct _SensorIpmi;
+typedef struct _SensorIpmi SensorIpmi;
+typedef struct _SensorIpmiIface SensorIpmiIface;
+
+struct _SensorIpmiIface
+{
+  GTypeInterface parent_iface;
+
+  guchar  (*get_entity_id) (SensorIpmi *object);
+
+  guchar  (*get_sensor_id) (SensorIpmi *object);
+
+};
+
+GType sensor_ipmi_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *sensor_ipmi_interface_info (void);
+guint sensor_ipmi_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus property accessors: */
+guchar sensor_ipmi_get_sensor_id (SensorIpmi *object);
+void sensor_ipmi_set_sensor_id (SensorIpmi *object, guchar value);
+
+guchar sensor_ipmi_get_entity_id (SensorIpmi *object);
+void sensor_ipmi_set_entity_id (SensorIpmi *object, guchar value);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_IPMI_PROXY (sensor_ipmi_proxy_get_type ())
+#define SENSOR_IPMI_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_IPMI_PROXY, SensorIpmiProxy))
+#define SENSOR_IPMI_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_IPMI_PROXY, SensorIpmiProxyClass))
+#define SENSOR_IPMI_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_IPMI_PROXY, SensorIpmiProxyClass))
+#define IS_SENSOR_IPMI_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_IPMI_PROXY))
+#define IS_SENSOR_IPMI_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_IPMI_PROXY))
+
+typedef struct _SensorIpmiProxy SensorIpmiProxy;
+typedef struct _SensorIpmiProxyClass SensorIpmiProxyClass;
+typedef struct _SensorIpmiProxyPrivate SensorIpmiProxyPrivate;
+
+struct _SensorIpmiProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  SensorIpmiProxyPrivate *priv;
+};
+
+struct _SensorIpmiProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType sensor_ipmi_proxy_get_type (void) G_GNUC_CONST;
+
+void sensor_ipmi_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorIpmi *sensor_ipmi_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorIpmi *sensor_ipmi_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void sensor_ipmi_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorIpmi *sensor_ipmi_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorIpmi *sensor_ipmi_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_IPMI_SKELETON (sensor_ipmi_skeleton_get_type ())
+#define SENSOR_IPMI_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_IPMI_SKELETON, SensorIpmiSkeleton))
+#define SENSOR_IPMI_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_IPMI_SKELETON, SensorIpmiSkeletonClass))
+#define SENSOR_IPMI_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_IPMI_SKELETON, SensorIpmiSkeletonClass))
+#define IS_SENSOR_IPMI_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_IPMI_SKELETON))
+#define IS_SENSOR_IPMI_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_IPMI_SKELETON))
+
+typedef struct _SensorIpmiSkeleton SensorIpmiSkeleton;
+typedef struct _SensorIpmiSkeletonClass SensorIpmiSkeletonClass;
+typedef struct _SensorIpmiSkeletonPrivate SensorIpmiSkeletonPrivate;
+
+struct _SensorIpmiSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  SensorIpmiSkeletonPrivate *priv;
+};
+
+struct _SensorIpmiSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType sensor_ipmi_skeleton_get_type (void) G_GNUC_CONST;
+
+SensorIpmi *sensor_ipmi_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
 /* Declarations for org.openbmc.SensorThreshold */
 
 #define TYPE_SENSOR_THRESHOLD (sensor_threshold_get_type ())
@@ -2357,7 +2452,8 @@
   void (*event_log) (
     EventLog *object,
     gint arg_priority,
-    const gchar *arg_message);
+    const gchar *arg_message,
+    gint arg_rc);
 
 };
 
@@ -2379,7 +2475,8 @@
 void event_log_emit_event_log (
     EventLog *object,
     gint arg_priority,
-    const gchar *arg_message);
+    const gchar *arg_message,
+    gint arg_rc);
 
 
 
@@ -3226,6 +3323,7 @@
 Occ *object_get_occ (Object *object);
 Fan *object_get_fan (Object *object);
 SensorValue *object_get_sensor_value (Object *object);
+SensorIpmi *object_get_sensor_ipmi (Object *object);
 SensorThreshold *object_get_sensor_threshold (Object *object);
 SensorI2c *object_get_sensor_i2c (Object *object);
 SensorMatch *object_get_sensor_match (Object *object);
@@ -3242,6 +3340,7 @@
 Occ *object_peek_occ (Object *object);
 Fan *object_peek_fan (Object *object);
 SensorValue *object_peek_sensor_value (Object *object);
+SensorIpmi *object_peek_sensor_ipmi (Object *object);
 SensorThreshold *object_peek_sensor_threshold (Object *object);
 SensorI2c *object_peek_sensor_i2c (Object *object);
 SensorMatch *object_peek_sensor_match (Object *object);
@@ -3310,6 +3409,7 @@
 void object_skeleton_set_occ (ObjectSkeleton *object, Occ *interface_);
 void object_skeleton_set_fan (ObjectSkeleton *object, Fan *interface_);
 void object_skeleton_set_sensor_value (ObjectSkeleton *object, SensorValue *interface_);
+void object_skeleton_set_sensor_ipmi (ObjectSkeleton *object, SensorIpmi *interface_);
 void object_skeleton_set_sensor_threshold (ObjectSkeleton *object, SensorThreshold *interface_);
 void object_skeleton_set_sensor_i2c (ObjectSkeleton *object, SensorI2c *interface_);
 void object_skeleton_set_sensor_match (ObjectSkeleton *object, SensorMatch *interface_);
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 835ed7a..bb0eaec 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -21,9 +21,9 @@
 
 static GDBusObjectManagerServer *manager = NULL;
 
-guint tmp_pgood = 0;
-guint last_pgood = 0;
-guint pgood_timeout_count = 0;
+//guint tmp_pgood = 0;
+//guint last_pgood = 0;
+time_t pgood_timeout_start = 0;
 
 static gboolean poll_pgood(gpointer user_data)
 {
@@ -38,32 +38,25 @@
 	guint poll_int = control_get_poll_interval(control);
 	if (poll_int == 0)
 	{
-		event_log_emit_event_log(event_log, LOG_ALERT, "Poll interval cannot be 0");
+		event_log_emit_event_log(event_log, LOG_ALERT, "Poll interval cannot be 0",0);
 		return FALSE;
 	}
-	//calculate timeout count
-	guint pgood_timeout = control_power_get_pgood_timeout(control_power)/poll_int;
-
-	if (pgood_timeout_count > pgood_timeout)
+	//handle timeout
+	time_t current_time = time(NULL);
+	if (difftime(current_time,pgood_timeout_start) > control_power_get_pgood_timeout(control_power)
+		&& pgood_timeout_start != 0)
 	{
-		event_log_emit_event_log(event_log, LOG_ALERT, "Pgood poll timeout");
+		event_log_emit_event_log(event_log, LOG_ALERT, "Pgood poll timeout",0);
 		// set timeout to 0 so timeout doesn't happen again
 		control_power_set_pgood_timeout(control_power,0);
-		pgood_timeout_count = 0;
+		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_read(&pgood,&gpio);
+	
+	int rc = gpio_open(&pgood);
+	rc = gpio_read(&pgood,&gpio);
+	gpio_close(&pgood);	
 	if (rc == GPIO_OK)
 	{
 		//if changed, set property and emit signal
@@ -82,18 +75,21 @@
  			}
 		}
 	} else {
-		event_log_emit_event_log(event_log, LOG_ALERT, "GPIO read error");
+		event_log_emit_event_log(event_log, LOG_ALERT, "GPIO read error",rc);
 		//return FALSE;
 	}
 	//pgood is not at desired state yet
+	//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)
+		control_power_get_pgood_timeout(control_power) > 0)
 	{
-		pgood_timeout_count++;
+		if (pgood_timeout_start == 0 ) {
+			pgood_timeout_start = current_time;
+		}
 	}
 	else 
 	{
-		pgood_timeout_count = 0;
+		pgood_timeout_start = 0;
 	}
 	return TRUE;
 }
@@ -126,13 +122,13 @@
 	{
 		g_print("Set power state: %d\n",state);
 		//temporary until real hardware works
-		tmp_pgood = state;
+		//tmp_pgood = state;
 		int error = 0;
 		do {
 			error = gpio_open(&power_pin);
-			if (error != GPIO_OK) {	break;	}
+			if (error != GPIO_OK) { break;	}
 			error = gpio_write(&power_pin,!state);
-			if (error != GPIO_OK) {	break;	}
+			if (error != GPIO_OK) { break;	}
 			gpio_close(&power_pin);
 			control_power_set_state(pwr,state);
 			if (state == 1) {
@@ -143,7 +139,7 @@
 		} while(0);
 		if (error != GPIO_OK)
 		{
-			event_log_emit_event_log(event_log, LOG_ALERT, "GPIO setup error");
+			event_log_emit_event_log(event_log, LOG_ALERT, "GPIO set power state error",error);
 		}
 	}
 	return TRUE;
@@ -154,6 +150,7 @@
          GDBusMethodInvocation  *invocation,
          gpointer                user_data)
 {
+	pgood_timeout_start = 0;
 	guint poll_interval = control_get_poll_interval(control);
 	g_timeout_add(poll_interval, poll_pgood, user_data);
 	control_complete_init(control,invocation);
@@ -184,67 +181,67 @@
 		return;
 	}	
   	manager = g_dbus_object_manager_server_new (dbus_object_path);
-  	int i=0;
-  	for (i=1;i<cmd->argc;i++)
-  	{
-		gchar *s;
-  		s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
-		g_print("%s\n",s);
-  		object = object_skeleton_new (s);
-  		g_free (s);
+	gchar *s;
+  	s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[1]);
+	g_print("%s\n",s);
+  	object = object_skeleton_new (s);
+  	g_free (s);
 
-		ControlPower* control_power = control_power_skeleton_new ();
-		object_skeleton_set_control_power (object, control_power);
-		g_object_unref (control_power);
+	ControlPower* control_power = control_power_skeleton_new ();
+	object_skeleton_set_control_power (object, control_power);
+	g_object_unref (control_power);
+	
+	Control* control = control_skeleton_new ();
+	object_skeleton_set_control (object, control);
+	g_object_unref (control);
 
-		Control* control = control_skeleton_new ();
-		object_skeleton_set_control (object, control);
-		g_object_unref (control);
+	EventLog* event_log = event_log_skeleton_new ();
+	object_skeleton_set_event_log (object, event_log);
+	g_object_unref (event_log);
 
-		EventLog* event_log = event_log_skeleton_new ();
-		object_skeleton_set_event_log (object, event_log);
-		g_object_unref (event_log);
+	//define method callbacks here
+	g_signal_connect (control_power,
+       	            "handle-set-power-state",
+               	    G_CALLBACK (on_set_power_state),
+               	    object); /* user_data */
 
-		//define method callbacks here
-		g_signal_connect (control_power,
-        	            "handle-set-power-state",
-                	    G_CALLBACK (on_set_power_state),
-                	    object); /* user_data */
+	g_signal_connect (control_power,
+               	    "handle-get-power-state",
+               	    G_CALLBACK (on_get_power_state),
+               	    NULL); /* user_data */
 
-		g_signal_connect (control_power,
-                	    "handle-get-power-state",
-                	    G_CALLBACK (on_get_power_state),
-                	    NULL); /* user_data */
-
-		g_signal_connect (control,
-                	    "handle-init",
-                	    G_CALLBACK (on_init),
-                	    object); /* user_data */
+	g_signal_connect (control,
+               	    "handle-init",
+               	    G_CALLBACK (on_init),
+               	    object); /* user_data */
 
 
+	/* Export the object (@manager takes its own reference to @object) */
+	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
+	g_object_unref (object);
 
-		/* Export the object (@manager takes its own reference to @object) */
-		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
-		g_object_unref (object);
-	}
 	/* Export all objects */
 	g_dbus_object_manager_server_set_connection (manager, connection);
 
 	// 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");
-	}
+		event_log_emit_event_log(event_log, LOG_ALERT, "GPIO setup error",rc);
+	} 
 }
 
 static void
diff --git a/objects/sensor_host_status_obj.c b/objects/sensor_host_status_obj.c
index 57357d9..05e02b2 100644
--- a/objects/sensor_host_status_obj.c
+++ b/objects/sensor_host_status_obj.c
@@ -11,30 +11,6 @@
 static GDBusObjectManagerServer *manager = NULL;
 
 static gboolean
-on_set_value    (SensorValue  *sen,
-                GDBusMethodInvocation  *invocation,
-		GVariant*    value,
-                gpointer                user_data)
-{
-	SensorMatch *match = object_get_sensor_match((Object*)user_data);
-	Control* control = object_get_control((Object*)user_data);
-
-	sensor_value_set_value(sen,value);
-	sensor_value_emit_changed(sen,value,"");
-	// Important host status values
-	guchar host_status = g_variant_get_byte(g_variant_get_variant(value));
-
-	if (host_status == BOOTED)
-	{
-		sensor_match_set_state(match,host_status);
-		sensor_match_emit_sensor_match(match,host_status);
-		control_emit_goto_system_state(control,"BOOTED");
-	}
-	sensor_value_complete_set_value(sen,invocation);
-	return TRUE;
-}
-
-static gboolean
 on_init         (SensorValue  *sen,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
@@ -44,7 +20,7 @@
 }
 
 static gboolean
-on_init_control         (Control  *control,
+on_init_control         (Control *control,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
@@ -52,6 +28,42 @@
 	return TRUE;
 }
 
+static void
+on_set_ipmi (GDBusConnection* connection,
+               const gchar* sender_name,
+               const gchar* object_path,
+               const gchar* interface_name,
+               const gchar* signal_name,
+               GVariant* parameters,
+               gpointer user_data) 
+{
+	SensorMatch *match = object_get_sensor_match((Object*)user_data);
+	SensorValue *sen = object_get_sensor_value((Object*)user_data);
+	SensorIpmi *ipmi = object_get_sensor_ipmi((Object*)user_data);
+	Control* control = object_get_control((Object*)user_data);
+	
+	guchar sensor_id;
+	guchar host_status;
+	g_variant_get (parameters, "(yy)", &sensor_id,&host_status);
+	guchar my_sensor_id = sensor_ipmi_get_sensor_id(ipmi);
+	if (my_sensor_id == sensor_id)
+	{
+		GVariant *old_value = sensor_value_get_value(sen);
+		GVariant *value = NEW_VARIANT_B(host_status);
+		if (VARIANT_COMPARE(old_value,value) != 0)
+		{
+			sensor_value_set_value(sen, value);
+			sensor_value_emit_changed(sen, value, "");
+			if (host_status == BOOTED)
+			{
+				sensor_match_set_state(match,host_status);
+				sensor_match_emit_sensor_match(match,host_status);
+				control_emit_goto_system_state(control,"BOOTED");
+			}
+		}
+	}
+}
+
 static void 
 on_bus_acquired (GDBusConnection *connection,
                  const gchar     *name,
@@ -82,10 +94,14 @@
   		object_skeleton_set_sensor_match (object, match);
   		g_object_unref (match);
 
-		Control* control = control_skeleton_new ();
-		object_skeleton_set_control (object, control);
-		g_object_unref (control);
-	
+		SensorIpmi *ipmi = sensor_ipmi_skeleton_new ();
+  		object_skeleton_set_sensor_ipmi (object, ipmi);
+  		g_object_unref (ipmi);
+
+		Control *control = control_skeleton_new ();
+  		object_skeleton_set_control (object, control);
+  		g_object_unref (control);
+
 		//must init variant
 		GVariant* v = NEW_VARIANT_B(0);
 		sensor_value_set_value(sensor,v);
@@ -96,6 +112,17 @@
 		//must emit change so sensor manager sees initial value
 		sensor_value_emit_changed(sensor,v,"");
 
+		//signal handlers
+		g_dbus_connection_signal_subscribe(connection,
+                                   "org.openbmc.sensors.IpmiBt",
+                                   "org.openbmc.sensors.IpmiBt",
+                                   "SetSensor",
+                                   "/org/openbmc/sensors/IpmiBt",
+                                   NULL,
+                                   G_DBUS_SIGNAL_FLAGS_NONE,
+                                   (GDBusSignalCallback) on_set_ipmi,
+                                   object,
+                                   NULL );
   		//define method callbacks here
   		g_signal_connect (sensor,
                     "handle-init",
@@ -107,10 +134,11 @@
                     G_CALLBACK (on_init_control),
                     NULL); /* user_data */
 
-		g_signal_connect (sensor,
-                    "handle-set-value",
-                    G_CALLBACK (on_set_value),
-                    object); /* user_data */
+		//g_signal_connect (sensor,
+                  //  "handle-set-value",
+                  //  G_CALLBACK (on_set_value),
+                  //  object); /* user_data */
+
 
   		/* Export the object (@manager takes its own reference to @object) */
   		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
diff --git a/xml/openbmc_intf.xml b/xml/openbmc_intf.xml
index 7599f56..3964e2a 100644
--- a/xml/openbmc_intf.xml
+++ b/xml/openbmc_intf.xml
@@ -30,17 +30,12 @@
 		<method name="getValue">
 			<arg name="value" type="v" direction="out"/>
 		</method>
-		<method name="setValue">
-			<arg name="value" type="v" direction="in"/>
-		</method>
 
                 <property name="value" type="v" access="read"/>
 		<property name="units" type="s" access="read"/>
 		<property name="poll_interval" type="i" access="readwrite"/>
 		<property name="heatbeat" type="i" access="read"/>
 		<property name="settable" type="b" access="read"/>
-		<property name="ipmi_entity_id" type="y" access="read"/>
-		<property name="ipmi_id" type="y" access="readwrite"/>
 
 		<signal name="Changed">
 			<arg name="value" type="v"/>
@@ -51,6 +46,10 @@
 			<arg name="bus_name" type="s"/>
 		</signal>
 	</interface>
+	<interface name="org.openbmc.SensorIpmi">
+		<property name="sensor_id" type="y" access="readwrite"/>
+		<property name="entity_id" type="y" access="readwrite"/>
+	</interface>
 	<interface name="org.openbmc.SensorThreshold">
 		<method name="getState">
 			<arg name="state" type="y" direction="out"/>
@@ -130,6 +129,7 @@
 		<signal name="EventLog">
 			<arg name="priority" type="i"/>
 			<arg name="message" type="s"/>
+			<arg name="rc" type="i"/>
 		</signal>
 	</interface>	
 	<interface name="org.openbmc.Flash">
