diff --git a/objects/chassis_identify_obj.c b/objects/chassis_identify_obj.c
deleted file mode 100644
index 1206d17..0000000
--- a/objects/chassis_identify_obj.c
+++ /dev/null
@@ -1,151 +0,0 @@
-#include "interfaces/openbmc_intf.h"
-#include <stdio.h>
-#include "openbmc.h"
-#include "gpio.h"
-
-/* ---------------------------------------------------------------------------------------------------- */
-static const gchar* dbus_object_path = "/org/openbmc/leds";
-static const gchar* dbus_name        = "org.openbmc.leds.ChassisIdentify";
-
-static GDBusObjectManagerServer *manager = NULL;
-
-GPIO led_gpio = (GPIO){"IDENTIFY"};
-
-static gboolean
-on_set_on       (Led          *led,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
-{
-	printf("Turn on chassis identify led\n");
-	led_complete_set_on(led,invocation);
-	int rc = GPIO_OK;
-	do {
-		rc = gpio_open(&led_gpio);
-		if (rc != GPIO_OK) { break; }
-		rc = gpio_write(&led_gpio,1); 
-		if (rc != GPIO_OK) { break; }
-	} while(0);
-	gpio_close(&led_gpio);
-	if (rc != GPIO_OK)
-	{
-		printf("ERROR ChassisIdentify: GPIO error %s (rc=%d)\n",led_gpio.name,rc);
-	}
-
-	return TRUE;
-
-}
-
-static gboolean
-on_set_off       (Led          *led,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
-{
-	g_print("Turn off chassis identify led\n");
-	led_complete_set_off(led,invocation);
-	int rc = GPIO_OK;
-	do {
-		rc = gpio_open(&led_gpio);
-		if (rc != GPIO_OK) { break; }
-		rc = gpio_write(&led_gpio,0); 
-		if (rc != GPIO_OK) { break; }
-	} while(0);
-	gpio_close(&led_gpio);
-	if (rc != GPIO_OK)
-	{
-		printf("ERROR ChassisIdentify: GPIO error %s (rc=%d)\n",led_gpio.name,rc);
-	}
-	return TRUE;
-}
-
-static void 
-on_bus_acquired (GDBusConnection *connection,
-                 const gchar     *name,
-                 gpointer         user_data)
-{
-	ObjectSkeleton *object;
-
-	cmdline *cmd = user_data;
-	if (cmd->argc < 2)
-	{
-		g_print("No objects created.  Put object name(s) on command line\n");
-		return;
-	}	
-
-	manager = g_dbus_object_manager_server_new (dbus_object_path);
-	int i = 0;
-	for (i=1;i<cmd->argc;i++)
-  	{
-		gchar *s;
-		s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
-		object = object_skeleton_new (s);
-		g_free (s);
-
-		Led *led = led_skeleton_new ();
-		object_skeleton_set_led (object, led);
-		g_object_unref (led);
-
-		//define method callbacks
-		g_signal_connect (led,
-                    "handle-set-on",
-                    G_CALLBACK (on_set_on),
-                    NULL); /* user_data */
-		g_signal_connect (led,
-                    "handle-set-off",
-                    G_CALLBACK (on_set_off),
-                    NULL);
-
-		led_set_color(led,0);
-		led_set_function(led,"CHASSIS_IDENTIFY");
- 
-		/* Export the object (@manager takes its own reference to @object) */
-		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
-		g_object_unref (object);
-	}
-	/* Export all objects */
- 	g_dbus_object_manager_server_set_connection (manager, connection);
-	gpio_init(connection,&led_gpio);
-
-}
-
-static void
-on_name_acquired (GDBusConnection *connection,
-                  const gchar     *name,
-                  gpointer         user_data)
-{
-}
-
-static void
-on_name_lost (GDBusConnection *connection,
-              const gchar     *name,
-              gpointer         user_data)
-{
-}
-
-
-gint
-main (gint argc, gchar *argv[])
-{
-  GMainLoop *loop;
-  cmdline cmd;
-  cmd.argc = argc;
-  cmd.argv = argv;
-
-  guint id;
-  loop = g_main_loop_new (NULL, FALSE);
-
-  id = g_bus_own_name (DBUS_TYPE,
-                       dbus_name,
-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
-                       on_bus_acquired,
-                       on_name_acquired,
-                       on_name_lost,
-                       &cmd,
-                       NULL);
-
-  g_main_loop_run (loop);
-  
-  g_bus_unown_name (id);
-  g_main_loop_unref (loop);
-  return 0;
-}
diff --git a/objects/control_bmc_obj.c b/objects/control_bmc_obj.c
index 4355f63..caba185 100644
--- a/objects/control_bmc_obj.c
+++ b/objects/control_bmc_obj.c
@@ -108,7 +108,7 @@
 	reg_init();
 	#endif
 	control_complete_init(control,invocation);
-	control_emit_goto_system_state(control,"STANDBY");
+	control_emit_goto_system_state(control,"BMC_STARTING");
 	
 	return TRUE;
 }
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index 928d11b..ebc71aa 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -24,10 +24,10 @@
 		const gchar* name = flash_get_flasher_name(flash);
 		const gchar* inst = flash_get_flasher_instance(flash);
 		const gchar* filename = flash_get_filename(flash);
-
 		status = execl(path, name, inst, filename, NULL);
+		return status;
 	}
-	return status;
+	return 0;
 }
 
 static gboolean
@@ -53,9 +53,18 @@
 		gchar*                  name,
                 gpointer                user_data)
 {
-	printf("Locking BIOS Flash: %s\n",name);
-	shared_resource_set_lock(lock,true);
-	shared_resource_set_name(lock,name);
+	gboolean locked = shared_resource_get_lock(lock);
+	if (locked)
+	{
+		const gchar* name = shared_resource_get_name(lock);
+		printf("ERROR: BIOS Flash is already locked: %s\n",name);
+	}
+	else
+	{	
+		printf("Locking BIOS Flash: %s\n",name);
+		shared_resource_set_lock(lock,true);
+		shared_resource_set_name(lock,name);
+	}
 	shared_resource_complete_lock(lock,invocation);
 	return TRUE;
 }
@@ -347,7 +356,7 @@
                                    object,
                                    NULL );
 		g_free(s);
-		s = g_strdup_printf ("/org/openbmc/control/%s\0",cmd->argv[i]);
+		s = g_strdup_printf ("/org/openbmc/control/%s",cmd->argv[i]);
 		g_dbus_connection_signal_subscribe(connection,
                                    NULL,
                                    "org.openbmc.FlashControl",
diff --git a/objects/pcie_slot_present_obj.c b/objects/pcie_slot_present_obj.c
index cceb637..f1f882b 100644
--- a/objects/pcie_slot_present_obj.c
+++ b/objects/pcie_slot_present_obj.c
@@ -2,6 +2,7 @@
 #include "openbmc.h"
 #include <stdio.h>
 #include <stdbool.h>
+#include <string.h>
 #include "gpio.h"
 
 #define NUM_SLOTS 4
@@ -48,7 +49,7 @@
 
 	g_variant_get(v_result,"(sss)",&obj_info->bus_name,&obj_info->path,&obj_info->intf_name);
 int rc=0;
-	if (strcmp(obj_info->bus_name,"") == 0) {
+	if (strlen(obj_info->bus_name) == 0) {
 		rc = 1;
 	}
 	g_variant_unref(v_result);
@@ -78,7 +79,7 @@
 	return rc; 
 }
 
-void update_fru_obj(GDBusConnection* connection, object_info* obj_info, bool present)
+void update_fru_obj(GDBusConnection* connection, object_info* obj_info, const char* present)
 {
 	GDBusProxy *proxy;
  	GError *error;
@@ -97,7 +98,7 @@
 	g_assert_no_error (error);
 
 	error = NULL;
-	parm = g_variant_new("(b)",present);
+	parm = g_variant_new("(s)",present);
 	
 	result = g_dbus_proxy_call_sync (proxy,
                                    "setPresent",
@@ -142,15 +143,18 @@
 	{
 		object_info obj_info;
 		uint8_t present;
-		bool b_present=false;
+		char* chr_present;
 		do {
 			rc = get_object(sys_proxy,&slots[i],&obj_info);
 			if (rc) { break; }
 			rc = get_presence(c,&slots[i],&present);
-			if (present==1) { b_present=true; }
 			//if (rc) { break; }
 			// TODO: send correct state
-			update_fru_obj(c,&obj_info,b_present);
+			if (present == 1) {
+				update_fru_obj(c,&obj_info,"PRESENT");
+			} else {
+				update_fru_obj(c,&obj_info,"NOT PRESENT");
+			}
 		} while(0);
 	}
 
diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index a943b5e..bdb7c9a 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -64,16 +64,18 @@
  			if (gpio==0)
  			{
  				control_power_emit_power_lost(control_power);
-				control_emit_goto_system_state(control,"POWERED_OFF");
+				control_emit_goto_system_state(control,"HOST_POWERED_OFF");
  			}
  			else
  			{
  				control_power_emit_power_good(control_power);
-				control_emit_goto_system_state(control,"POWERED_ON");
+				control_emit_goto_system_state(control,"HOST_POWERED_ON");
  			}
 		}
 	} else {
 		printf("ERROR PowerControl: GPIO read error (gpio=%s,rc=%d)\n",pgood.name,rc);
+		//return false so poll won't get called anymore
+		return FALSE;
 	}
 	//pgood is not at desired state yet
 	if (gpio != control_power_get_state(control_power) &&
@@ -118,9 +120,9 @@
 		int error = 0;
 		do {
 			if (state == 1) {
-				control_emit_goto_system_state(control,"POWERING_ON");
+				control_emit_goto_system_state(control,"HOST_POWERING_ON");
 			} else {
-				control_emit_goto_system_state(control,"POWERING_OFF");
+				control_emit_goto_system_state(control,"HOST_POWERING_OFF");
 			}
 			error = gpio_open(&power_pin);
 			if (error != GPIO_OK) { break;	}
diff --git a/objects/sensor_host_status_obj.c b/objects/sensor_host_status_obj.c
deleted file mode 100644
index d631200..0000000
--- a/objects/sensor_host_status_obj.c
+++ /dev/null
@@ -1,181 +0,0 @@
-#include "interfaces/openbmc_intf.h"
-#include "openbmc.h"
-
-#define BOOTED 100
-/* ---------------------------------------------------------------------------------------------------- */
-
-static const gchar* dbus_object_path = "/org/openbmc/sensors";
-static const gchar* dbus_name        = "org.openbmc.sensors.HostStatus";
-static guint heartbeat = 0;
-
-static GDBusObjectManagerServer *manager = NULL;
-
-static gboolean
-on_init         (SensorValue  *sen,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
-{
-	sensor_value_complete_init(sen,invocation);
-	return TRUE;
-}
-
-static gboolean
-on_init_control         (Control *control,
-                GDBusMethodInvocation  *invocation,
-                gpointer                user_data)
-{
-	control_complete_init(control,invocation);
-	return TRUE;
-}
-static gboolean
-on_set_value    (SensorValue *sen,
-                GDBusMethodInvocation  *invocation,
-		guchar                  host_status,
-                gpointer                user_data)
-{
-	SensorValue *v = object_get_sensor_value((Object*)user_data);
-	SensorMatch *match = object_get_sensor_match((Object*)user_data);
-	Control* control = object_get_control((Object*)user_data);
-	
-	GVariant *old_value = sensor_value_get_value(sen);
-	GVariant *value = NEW_VARIANT_B(host_status);
-	if (VARIANT_COMPARE(old_value,value) != 0)
-	{
-		sensor_value_set_value(sen, value);
-		sensor_value_emit_changed(sen, value, "");
-		if (host_status == BOOTED)
-		{
-			sensor_match_set_state(match,host_status);
-			sensor_match_emit_sensor_match(match,host_status);
-			control_emit_goto_system_state(control,"BOOTED");
-		}
-	}
-	sensor_value_complete_set_value(sen,invocation);
-	return TRUE;
-}
-
-static void 
-on_bus_acquired (GDBusConnection *connection,
-                 const gchar     *name,
-                 gpointer         user_data)
-{
-//  	g_print ("Acquired a message bus connection: %s\n",name);
-
-  	cmdline *cmd = user_data;
-	if (cmd->argc < 2)
-	{
-		g_print("No objects created.  Put object name(s) on command line\n");
-		return;
-	}	
-  	manager = g_dbus_object_manager_server_new (dbus_object_path);
-  	int i=0;
-  	for (i=1;i<cmd->argc;i++)
-  	{
-		gchar *s;
- 		s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
-		ObjectSkeleton *object = object_skeleton_new (s);
-		g_free (s);
-
-		SensorValue *sensor = sensor_value_skeleton_new ();
-  		object_skeleton_set_sensor_value (object, sensor);
-  		g_object_unref (sensor);
-
-		SensorMatch *match = sensor_match_skeleton_new ();
-  		object_skeleton_set_sensor_match (object, match);
-  		g_object_unref (match);
-
-		Control *control = control_skeleton_new ();
-  		object_skeleton_set_control (object, control);
-  		g_object_unref (control);
-
-		//must init variant
-		GVariant* v = NEW_VARIANT_B(0);
-		sensor_value_set_value(sensor,v);
-	
-		// set units
-  		sensor_value_set_units(sensor,"");
-  		sensor_value_set_settable(sensor,TRUE);
-		//must emit change so sensor manager sees initial value
-		sensor_value_emit_changed(sensor,v,"");
-
-		//signal handlers
-		/*g_dbus_connection_signal_subscribe(connection,
-                                   "org.openbmc.sensors.IpmiBt",
-                                   "org.openbmc.sensors.IpmiBt",
-                                   "SetSensor",
-                                   "/org/openbmc/sensors/IpmiBt",
-                                   NULL,
-                                   G_DBUS_SIGNAL_FLAGS_NONE,
-                                   (GDBusSignalCallback) on_set_ipmi,
-                                   object,
-                                   NULL );
-		*/
-  		//define method callbacks here
-  		g_signal_connect (sensor,
-                    "handle-init",
-                    G_CALLBACK (on_init),
-                    NULL); /* user_data */
-  
- 		g_signal_connect (control,
-                    "handle-init",
-                    G_CALLBACK (on_init_control),
-                    NULL); /* user_data */
-
-		g_signal_connect (sensor,
-                    "handle-set-value",
-                    G_CALLBACK (on_set_value),
-                    object); /* user_data */
-
-
-  		/* Export the object (@manager takes its own reference to @object) */
-  		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
-  		g_object_unref (object);
-	}
-
-  /* Export all objects */
-  g_dbus_object_manager_server_set_connection (manager, connection);
-}
-
-static void
-on_name_acquired (GDBusConnection *connection,
-                  const gchar     *name,
-                  gpointer         user_data)
-{
-  //g_print ("Acquired the name %s\n", name);
-}
-
-static void
-on_name_lost (GDBusConnection *connection,
-              const gchar     *name,
-              gpointer         user_data)
-{
-  //g_print ("Lost the name %s\n", name);
-}
-
-
-gint
-main (gint argc, gchar *argv[])
-{
-  GMainLoop *loop;
-  cmdline cmd;
-  cmd.argc = argc;
-  cmd.argv = argv;
-  guint id;
-  loop = g_main_loop_new (NULL, FALSE);
-
-  id = g_bus_own_name (DBUS_TYPE,
-                       dbus_name,
-                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
-                       on_bus_acquired,
-                       on_name_acquired,
-                       on_name_lost,
-                       &cmd,
-                       NULL);
-
-  g_main_loop_run (loop);
-  
-  g_bus_unown_name (id);
-  g_main_loop_unref (loop);
-  return 0;
-}
