diff --git a/bin/PropertyManager.py b/bin/PropertyManager.py
index 312c688..ff0e200 100644
--- a/bin/PropertyManager.py
+++ b/bin/PropertyManager.py
@@ -4,81 +4,84 @@
 import cPickle
 import os
 import Openbmc
-import gobject
 import dbus
 import dbus.service
 import dbus.mainloop.glib
+from gi.repository import Gio, GLib, GObject
 
 
-SAVE_PATH = 'data/'
-
-def loadProperties(bus,bus_name,obj_path,properties):
-	## Load properties from system config
-	obj = bus.get_object(bus_name,obj_path)
-	dbus_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
-	for prop_interface in properties.keys():
-		print "Intf: "+prop_interface
-		for prop in properties[prop_interface]:
-			tmp_val = dbus_properties.Get(prop_interface,prop)
-			dbus_prop = Openbmc.DbusProperty(prop,tmp_val)
-			value = properties[prop_interface][prop]
-			dbus_prop.changeValue(value)
-			dbus_properties.Set(prop_interface,prop,dbus_prop.getValue())
-		
-		## if save file exists, overlay properties from file
-		directory = obj_path.replace('/','.')
-		directory = SAVE_PATH+directory.lstrip('.')
-		filename = directory+"/"+prop_interface
-		if (os.path.isfile(filename) == False):
-			## not an error	
-			print "No cache available for: "+filename
-		else:
-			try:
-				print "Loading from disk: "+obj_path
-				output = open(filename, 'rb')
-				dbus_props = cPickle.load(output)
-				output.close()
-				save_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
-				for dbus_prop in dbus_props:
-					save_properties.Set(prop_interface,dbus_prop.getName(),dbus_prop.getValue())
-		
-			except Exception as e:
-				## TODO: Error handling
-				print "Error loadFru: "+str(e)
-
-	return None
-
-def saveProperties(bus,bus_name,obj_path,interface_name,cache,properties):
-	obj = bus.get_object(bus_name,obj_path)
-	prop_intf = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
-
-	for prop in properties.keys():
-		print "Saving properties: "+prop
-		prop_intf.Set(interface_name,prop,properties[prop])
-
-
-	dbus_props = []
-	if (cache):
-		print "Caching: "+obj_path
-		all_properties = prop_intf.GetAll(interface_name)
-		for prop in all_properties.keys():
-			dbus_prop = Openbmc.DbusProperty(prop,all_properties[prop])
-			dbus_props.append(dbus_prop)
-		
-		try:
+class PropertyManager():
+	def __init__(self,bus,save_path):
+		self.bus = bus
+		self.save_path = save_path
+	
+	def loadProperties(self,bus_name,obj_path,properties):
+		## Load properties from system config
+		obj = self.bus.get_object(bus_name,obj_path)
+		dbus_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+		for prop_interface in properties.keys():
+			for prop in properties[prop_interface]:
+				tmp_val = dbus_properties.Get(prop_interface,prop)
+				dbus_prop = Openbmc.DbusProperty(prop,tmp_val)
+				value = properties[prop_interface][prop]
+				dbus_prop.setValue(value)
+				dbus_properties.Set(prop_interface,prop,dbus_prop.getValue())
+			
+			## if save file exists, overlay properties from file
 			directory = obj_path.replace('/','.')
-			directory = SAVE_PATH+directory.lstrip('.')
-			filename = directory+"/"+interface_name	
-			if not os.path.exists(directory):
-   				os.makedirs(directory)
-
-			output = open(filename, 'wb')
-			cPickle.dump(dbus_props,output)
-			output.close()	
-		except Exception as e:
-			## TODO: error handling
-			print str(e)
+			directory = self.save_path+directory.lstrip('.')
+			filename = directory+"/"+prop_interface
+			if (os.path.isfile(filename) == False):
+				## not an error	
+				print "No cache available for: "+filename
+			else:
+				try:
+					print "Loading from disk: "+obj_path
+					output = open(filename, 'rb')
+					dbus_props = cPickle.load(output)
+					output.close()
+					save_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+					for dbus_prop in dbus_props:
+						save_properties.Set(prop_interface,dbus_prop.getName(),dbus_prop.getValue())
 		
-	return None
+				except Exception as e:
+					## TODO: Error handling
+					print "Error loadFru: "+str(e)
+
+		return None
+
+	def saveProperties(self,bus_name,obj_path,interface_name,cache,properties):
+		obj = self.bus.get_object(bus_name,obj_path)
+		prop_intf = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+
+		for prop in properties.keys():
+			print "Saving properties: "+prop
+			## convert property to correct dbus type
+			print type(properties[prop])
+			prop_intf.Set(interface_name,prop,properties[prop])
+
+		dbus_props = []
+		if (cache):
+			print "Caching: "+obj_path
+			all_properties = prop_intf.GetAll(interface_name)
+			for prop in all_properties.keys():
+				dbus_prop = Openbmc.DbusProperty(prop,all_properties[prop])
+				dbus_props.append(dbus_prop)
+		
+			try:
+				directory = obj_path.replace('/','.')
+				directory = self.save_path+directory.lstrip('.')
+				filename = directory+"/"+interface_name	
+				if not os.path.exists(directory):
+   					os.makedirs(directory)
+
+				output = open(filename, 'wb')
+				cPickle.dump(dbus_props,output)
+				output.close()	
+			except Exception as e:
+				## TODO: error handling
+				print str(e)
+		
+		return None
 
 
