diff --git a/bin/obmcutil b/bin/obmcutil
new file mode 100755
index 0000000..c30a03d
--- /dev/null
+++ b/bin/obmcutil
@@ -0,0 +1,167 @@
+#!/usr/bin/python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+
+def isDict(data):
+	if (str(type(data)) == "<type \'dbus.Dictionary\'>"):
+		return True
+	return False
+		
+
+def printDict(name,data):
+	if (isDict(data)):
+		print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+		print name
+		for p in data:
+			printDict(p,data[p])
+	else:
+		print name+" = "+str(data)
+
+def introspect(bus_name,obj_path,intf_name,method_name):
+	obj = bus.get_object(bus_name,obj_path)
+	introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
+ 	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
+	#print method_name
+	#print introspect_iface.Introspect()
+ 	root = tree.getroot()
+	found = False
+	for node in root.iter('node'):
+		for intf in node.iter('interface'):
+			if (intf.attrib['name'] == intf_name):
+				for method in intf.iter('method'):
+					if (method.attrib['name'] == method_name):
+						for ar in method.iter('arg'):
+							if (ar.attrib['direction'] == "in"):
+								print "\t"+ar.attrib['name']+" ("+ar.attrib['type']+")"
+								found = True
+
+	return found
+
+
+dbus_objects = {
+	'power' : { 
+		'bus_name' : 'org.openbmc.control.Power',
+		'object_name' : '/org/openbmc/control/power0',
+		'interface_name' : 'org.openbmc.control.Power'
+	},
+	'identify_led' : {
+		'bus_name' : 'org.openbmc.control.led',
+		'object_name' : '/org/openbmc/led/IDENTIFY',
+		'interface_name' : 'org.openbmc.Led'
+	},	
+	'chassis' : { 
+		'bus_name' : 'org.openbmc.control.Chassis',
+		'object_name' : '/org/openbmc/control/chassis0',
+		'interface_name' : 'org.openbmc.control.Chassis'
+	},
+	'poweron' : { 
+		'bus_name' : 'org.openbmc.control.Chassis',
+		'object_name' : '/org/openbmc/control/chassis0',
+		'interface_name' : 'org.openbmc.control.Chassis',
+		'method' : 'powerOn',
+	},
+	'poweroff' : { 
+		'bus_name' : 'org.openbmc.control.Chassis',
+		'object_name' : '/org/openbmc/control/chassis0',
+		'interface_name' : 'org.openbmc.control.Chassis',
+		'method' : 'powerOff',
+	},
+	'getsystemstate' : { 
+		'bus_name' : 'org.openbmc.managers.System',
+		'object_name' : '/org/openbmc/managers/System',
+		'interface_name' : 'org.openbmc.managers.System',
+		'method' : 'getSystemState',
+	},
+	'bootprogress' : { 
+		'bus_name' : 'org.openbmc.sensor.Power8Virtual',
+		'object_name' : '/org/openbmc/sensor/virtual/BootProgress',
+		'interface_name' : 'org.openbmc.SensorValue'
+	},
+	'updatebios' : {
+		'bus_name' : 'org.openbmc.control.Flash',
+		'object_name' : '/org/openbmc/control/flash/bios',
+		'interface_name' : 'org.openbmc.Flash',
+		'method' : 'updateViaTftp',
+	},
+	'getinventory' : {
+		'bus_name' : 'org.openbmc.managers.Inventory',
+		'object_name' : '/org/openbmc/inventory',
+		'interface_name' : 'org.openbmc.Object.Enumerate',
+		'method' : 'enumerate'
+	},
+	'getsensors' : {
+		'bus_name' : 'org.openbmc.managers.Sensors',
+		'object_name' : '/org/openbmc/sensors',
+		'interface_name' : 'org.openbmc.Object.Enumerate',
+		'method' : 'enumerate'
+	},
+	'inventorytest' : {
+		'bus_name' : 'org.openbmc.managers.Inventory',
+		'object_name' : '/org/openbmc/inventory/system/chassis/motherboard/cpu0',
+		'interface_name' : 'org.openbmc.InventoryItem',
+		'method' : 'update'
+	},
+
+}
+
+bus = dbus.SystemBus()
+
+
+if (len(sys.argv) == 1):
+	print "Usage: obmcutil [command] [[method] [*args]]"
+	print "\tIf [method] is blank, then all properties are printed\n"
+	print "Available commands:"
+	for name in dbus_objects:
+		m = ""
+		if (dbus_objects[name].has_key('method') == True):
+			m=" ("+dbus_objects[name]['interface_name']+"->"+dbus_objects[name]['method']+")"
+		print "\t"+name+m
+	exit(0)
+
+method_name = ""
+
+sys.argv.pop(0)
+objinfo = dbus_objects[sys.argv.pop(0)]
+
+if (objinfo.has_key('method')):
+	method_name = objinfo['method']
+elif (len(sys.argv)>0):
+	## if command line args left and method not specified
+	## then next arg must be method name
+	method_name = sys.argv.pop(0)
+
+bus_name = objinfo['bus_name']
+obj_path = objinfo['object_name']
+intf_name = objinfo['interface_name']
+obj = bus.get_object(bus_name,obj_path)
+
+if (method_name == ""):
+	intf = dbus.Interface(obj,"org.freedesktop.DBus.Properties")
+	props = intf.GetAll(intf_name)	
+	for p in props:
+		print p+" = "+str(props[p])
+	
+else:
+	methd = obj.get_dbus_method(method_name,intf_name)
+	try:
+		tmp = { 'manufacturer' : sys.argv[0], 'part_num' : '3Nxxxx' }
+		if (method_name == "update"):
+			methd(tmp)
+		else:
+			data = methd(*sys.argv)
+			printDict("",data)
+	except Exception as e:
+		r = introspect(bus_name,obj_path,intf_name,method_name)
+		if (r == False):
+			print "ERROR: Invalid method: "+method_name
+		else:
+			print "ERROR: Incorrect arguments passed to method"
+			
+		
+
