diff --git a/bin/gpio_manager.py b/bin/gpio_manager.py
new file mode 100644
index 0000000..e0a264e
--- /dev/null
+++ b/bin/gpio_manager.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import System
+
+DBUS_NAME = 'org.openbmc.managers.Gpios'
+OBJ_NAME = '/org/openbmc/managers/Gpios'
+
+gpio_config = System.BarreleyeGpios()
+gpio_dev = '/sys/class/gpio'
+
+class GpioManager(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		bus = dbus.SessionBus()
+		self.gpio_locks = {}
+		
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='sis')
+	def init(self,name):
+		gpio_path = ''
+		if (gpio_config.has_key(name) == False):
+			# TODO: Error handling
+			print "ERROR: "+name+" not found in GPIO config table"
+		else:
+			gpio_num = gpio_config[name]['gpio_num']
+			print "GPIO Lookup: "+name+" = "+str(gpio_num)
+
+		return [gpio_dev, gpio_num, gpio_config[name]['direction']]
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='')
+	def open(self,name):
+		gpio_num = gpio_config[name]['gpio_num']
+		self.gpio_locks[gpio_num] = 1
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='')
+	def close(self,name):
+		# unexport?
+		gpio_num = gpio_config[name]['gpio_num']
+		self.gpio_locks[gpio_num] = 0
+
+
+	## Signal handler
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME, bus)
+    obj = GpioManager(bus, OBJ_NAME)
+    mainloop = gobject.MainLoop()
+    
+    print "Running GpioManager"
+    mainloop.run()
+
diff --git a/bin/sensor_management2.py b/bin/sensor_management2.py
new file mode 100644
index 0000000..e897410
--- /dev/null
+++ b/bin/sensor_management2.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+
+
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+import System
+
+DBUS_NAME = 'org.openbmc.managers.Sensors'
+OBJ_NAME = '/org/openbmc/managers/Sensors'
+
+NORMAL   = 0
+LOWER_WARNING  = 1
+LOWER_CRITICAL = 2
+UPPER_WARNING  = 3
+UPPER_CRITICAL = 4
+
+
+sensor_config = System.BarreleyeSensors()
+
+## finds objects held by Dbus ObjectManager
+def get_interface(bus_name):
+	obj_name = "/"+bus_name.replace('.','/')
+	obj = bus.get_object(bus_name, obj_name)
+	
+	#Find object in object manager and retrieve interface name
+	manager = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
+	objects = manager.GetManagedObjects()
+	obj_path = None
+	interface = None
+
+	for o in objects:
+		for intf in objects[o].keys():
+			if (intf.find('Sensor') > 0):
+				interface = intf
+				obj_path = o
+
+	if (interface == None):
+		raise Exception("Unable to find sensor: "+obj_path)	
+	
+	return [obj_path, interface]
+
+
+class SensorManagement(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		self.sensor_cache = {}
+		for bus_name in bus.list_names():
+			if (bus_name.find('org.openbmc.sensors')==0):
+				self.request_name(bus_name,"",bus_name)
+
+		bus.add_signal_receiver(self.request_name,
+			dbus_interface = 'org.freedesktop.DBus', 
+					signal_name = "NameOwnerChanged")
+
+
+	def request_name(self, bus_name, a, b):
+		if (len(b) > 0 and bus_name.find('org.openbmc.sensors') == 0):
+			if (sensor_config.has_key(bus_name) == True):
+				try:
+					print "Loading: "+bus_name
+					obj_info = get_interface(bus_name)
+					obj = bus.get_object(bus_name,obj_info[0])
+					intf = dbus.Interface(obj,obj_info[1])
+					intf.setThresholds(sensor_config[bus_name]['lower_critical'],
+						sensor_config[bus_name]['lower_warning'],
+						sensor_config[bus_name]['upper_warning'],
+						sensor_config[bus_name]['upper_critical'])
+					if (sensor_config[bus_name].has_key('parameters')):
+						intf.setConfigData(sensor_config[bus_name]['parameters'])
+	
+				except dbus.exceptions.DBusException, e:
+					# TODO: not sure what to do if can't find other services
+					print "Unable to find dependent services: ",e
+			else:
+				print "Sensor found on bus but no config: "+bus_name
+		if (len(b) == 0  and bus_name.find('org.openbmc') ==0):
+			print "Sensor stopped: "+bus_name
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='a{ss}')
+	def getAllSensors(self,obj_name):
+		return None
+		
+	@dbus.service.method(DBUS_NAME,
+		in_signature='s', out_signature='i')
+	def getSensorValue(self,obj_name):
+		sensor = self.sensor_cache[obj_name]
+		return sensor.get_value()
+
+	@dbus.service.signal(DBUS_NAME)
+	def CriticalThreshold(self, obj):
+		print "Critical: "+obj
+
+	@dbus.service.signal(DBUS_NAME)
+	def WarningThreshold(self, obj):
+		print "Warning: "+obj
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    obj = SensorManagement(bus,OBJ_NAME)
+    mainloop = gobject.MainLoop()
+    
+    print "Running SensorManagerService"
+    mainloop.run()
+
