diff --git a/bin/property_manager.py b/bin/property_manager.py
new file mode 100755
index 0000000..e891bd4
--- /dev/null
+++ b/bin/property_manager.py
@@ -0,0 +1,117 @@
+#!/usr/bin/python -u
+
+import sys
+#from gi.repository import GObject
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import cPickle
+import glob
+import os
+
+if (len(sys.argv) < 2):
+	print "Usage:  property_manager.py [system name]"
+	exit(1)
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.Property'
+OBJ_NAME = '/org/openbmc/managers/Property'
+INTF_NAME = 'org.openbmc.managers.Property'
+
+class PropertyManager(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		if not os.path.exists(System.CACHE_PATH):
+   			os.makedirs(System.CACHE_PATH)
+
+		
+		bus.add_signal_receiver(self.PropertyChangedHandler,
+			dbus_interface = 'org.freedesktop.DBus.Properties', 
+			signal_name = 'PropertiesChanged', sender_keyword='bus_name', path_keyword='path')
+
+		bus.add_signal_receiver(self.RegisterPersistantInterface,
+			dbus_interface = 'org.openbmc.PersistantInterface', 
+			signal_name = 'Register', sender_keyword='bus_name', path_keyword='path')
+		
+		self.registered_interfaces = {}	
+
+
+	def RegisterPersistantInterface(self,interface_name, bus_name = None, path = None):
+		interface_name = str(interface_name)
+		print "Registering cached object (interface): "+path+" ("+interface_name+")"
+		self.registered_interfaces[interface_name] = True
+		self.loadFromCache(bus_name,path,interface_name)
+		
+
+	def PropertyChangedHandler(self, interface_name, changed_properties, 
+		invalidated_properties, bus_name = None, path = None):
+		## TODO: just save all properties, probably should journal changes instead
+		if (self.registered_interfaces.has_key(interface_name)):
+			self.saveToCache(bus_name,path,interface_name)
+
+	def getCacheFilename(self,obj_path,intf_name):
+		name = obj_path.replace('/','.')
+		filename = System.CACHE_PATH+name[1:]+"@"+intf_name+".props"
+		return filename
+
+	def getCacheFilenames(self,obj_path):
+		name = obj_path.replace('/','.')
+		path = System.CACHE_PATH+name[1:]+"\@*"
+		return glob.glob(path)
+	
+	def saveToCache(self, bus_name, object_path, interface_name):
+		print "Caching: "+object_path
+		try:
+			obj = bus.get_object(bus_name,object_path)
+			intf = dbus.Interface(obj,"org.freedesktop.DBus.Properties")
+			props = intf.GetAll(interface_name)	
+			output = open(self.getCacheFilename(object_path,interface_name), 'wb')
+			## save properties
+			dbus_props = {}
+			for p in props.keys():
+				dbus_prop = Openbmc.DbusVariable(p,props[p])
+				dbus_props[str(p)] = dbus_prop.getBaseValue()
+			cPickle.dump(dbus_props,output)
+		except Exception as e:
+			print "ERROR: "+str(e)
+		finally:
+			output.close()
+
+	def loadFromCache(self,bus_name, object_path, interface_name):
+		## overlay with pickled data
+		filename=self.getCacheFilename(object_path,interface_name)
+		if (os.path.isfile(filename)):
+			print "Loading from cache: "+filename
+			try:			
+				p = open(filename, 'rb')
+				data = cPickle.load(p)
+				obj = bus.get_object(bus_name,object_path)
+				## TODO: don't use exception to determine whether interface is implemented
+				try:
+					intf = dbus.Interface(obj,"org.openbmc.Object.Properties")
+					props = intf.SetMultiple(interface_name,data)
+				except TypeError as t:
+					print "SetMultiple interface doesn't exist, doing 1 set a time"
+					intf = dbus.Interface(obj,dbus.PROPERTIES_IFACE)
+					for prop in data:
+						intf.Set(interface_name,prop,data[prop])
+						
+							
+			except Exception as e:
+				print "ERROR: Loading cache file: " +str(e)
+			finally:
+				p.close()
+	
+				
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = Openbmc.getDBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    obj = PropertyManager(bus,OBJ_NAME)
+    mainloop = gobject.MainLoop()
+
+    print "Running Property Manager"
+    mainloop.run()
+
