diff --git a/bin/sensors_virtual_p8.py b/bin/sensors_virtual_p8.py
index d8bf1ef..1488256 100755
--- a/bin/sensors_virtual_p8.py
+++ b/bin/sensors_virtual_p8.py
@@ -8,151 +8,80 @@
 import dbus.mainloop.glib
 import Openbmc
 
-SENSOR_INTERFACE = 'org.openbmc.SensorValue'
 DBUS_NAME = 'org.openbmc.sensor.Power8Virtual'
 OBJ_NAME = '/org/openbmc/sensor/virtual/'
 
-class BootProgress(dbus.service.Object):
+class SensorValue(Openbmc.DbusProperties):
+	IFACE_NAME = 'org.openbmc.SensorValue'
+	def __init__(self):
+		Openbmc.DbusProperties.__init__(self)
+		self.Set(SensorValue.IFACE_NAME,'units',"")
+		
+	@dbus.service.method(IFACE_NAME,
+		in_signature='v', out_signature='')
+	def setValue(self,value):
+		changed = False
+		try:
+			old_value = self.Get(SensorValue.IFACE_NAME,'value')
+			if (value != old_value):
+				changed = True
+		except:
+			changed = True
+
+		if (changed == True):
+			self.Set(SensorValue.IFACE_NAME,'value',value)
+			self.Changed(self.getValue(),self.getUnits())
+
+
+
+	@dbus.service.method(IFACE_NAME,
+		in_signature='', out_signature='v')
+	def getValue(self):
+		return self.Get(SensorValue.IFACE_NAME,'value')
+
+	@dbus.service.method(IFACE_NAME,
+		in_signature='', out_signature='s')
+	def getUnits(self):
+		return self.Get(SensorValue.IFACE_NAME,'units')
+
+	@dbus.service.signal(IFACE_NAME,signature='vs')
+	def Changed(self,value,units):
+		pass
+
+
+
+
+
+class BootProgress(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "BootProgress"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed()
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
 		
-class HostStatus(dbus.service.Object):
+class HostStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "HostStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
-class OsStatus(dbus.service.Object):
+class OsStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "OperatingSystemStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-		
-class BootCount(dbus.service.Object):
+class BootCount(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "BootCount"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
-
-class OccStatus(dbus.service.Object):
+class OccStatus(SensorValue):
 	def __init__(self,bus,name):
+		SensorValue.__init__(self)
 		self.object_name = "OccStatus"
-		self.value = 0
-		self.units = ""
 		dbus.service.Object.__init__(self,bus,name+self.object_name)
 
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='v', out_signature='')
-	def setValue(self,value):
-		if (value != self.value):
-			self.value=value
-			self.Changed(self.value,self.units)
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='v')
-	def getValue(self):
-		return self.value;
-
-	@dbus.service.method(SENSOR_INTERFACE,
-		in_signature='', out_signature='s')
-	def getUnits(self):
-		return self.units;
-		
-	@dbus.service.signal(SENSOR_INTERFACE,signature='vs')
-	def Changed(self,value,units):
-		pass
-
 				
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
@@ -164,6 +93,12 @@
     boot_count = BootCount(bus,OBJ_NAME)
     occ_status = OccStatus(bus,OBJ_NAME)
     mainloop = gobject.MainLoop()
+    
+    boot_progress.setValue("INACTIVE")
+    host_status.setValue("OFF")
+    os_status.setValue("OFF")
+    boot_count.setValue(0)
+    occ_status.setValue(0)
 
     print "Starting virtual sensors"
     mainloop.run()
