diff --git a/objects/button_power_obj.c b/objects/button_power_obj.c
index 98916dc..d0b0001 100644
--- a/objects/button_power_obj.c
+++ b/objects/button_power_obj.c
@@ -1,12 +1,12 @@
 #include "interfaces/button.h"
+#include "gpio.h"
+#include "openbmc.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/buttons/ButtonPower";
 static const gchar* dbus_name        = "org.openbmc.buttons.ButtonPower";
 
 static GDBusObjectManagerServer *manager = NULL;
-static Button *button = NULL;
-static const int gpio = 12;
 
 static gboolean
 on_is_on       (Button          *btn,
@@ -36,39 +36,44 @@
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  guint n;
+	ObjectSkeleton *object;
+	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]);
+		object = object_skeleton_new (s);
+		g_free (s);
 
-  g_print ("Acquired a message bus connection: %s\n",name);
+		Button* button = button_skeleton_new ();
+		object_skeleton_set_button (object, button);
+		g_object_unref (button);
 
-  manager = g_dbus_object_manager_server_new (dbus_object_path);
-
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  object = object_skeleton_new (s);
-  g_free (s);
-
-  button = button_skeleton_new ();
-  object_skeleton_set_button (object, button);
-  g_object_unref (button);
-
-  //define method callbacks
-  g_signal_connect (button,
+		//define method callbacks
+		g_signal_connect (button,
                     "handle-is-on",
                     G_CALLBACK (on_is_on),
                     NULL); /* user_data */
-  g_signal_connect (button,
+		g_signal_connect (button,
                     "handle-sim-button-press",
                     G_CALLBACK (on_sim_button_press),
                     NULL); /* 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 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);
+	}
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection (manager, connection);
 }
 
 static void
diff --git a/objects/chassis_identify_obj.c b/objects/chassis_identify_obj.c
index 53cf893..e01225c 100644
--- a/objects/chassis_identify_obj.c
+++ b/objects/chassis_identify_obj.c
@@ -1,22 +1,27 @@
 #include "interfaces/led.h"
+#include "openbmc.h"
+#include "gpio.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/leds/ChassisIdentify";
 static const gchar* dbus_name        = "org.openbmc.leds.ChassisIdentify";
 
 static GDBusObjectManagerServer *manager = NULL;
-//static Led *led = NULL;
-static uint gpio = 12;
+
+GPIO led_gpio = (GPIO){"IDENTIFY"};
 
 static gboolean
 on_set_on       (Led          *led,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
-  g_print("Turn on chassis identify led\n");
-  //TODO:  implement in hardware
-  led_complete_set_on(led,invocation);
-  return TRUE;
+	g_print("Turn on chassis identify led\n");
+	led_complete_set_on(led,invocation);
+	gpio_open(&led_gpio);
+	gpio_write(&led_gpio,1); 
+	gpio_close(&led_gpio);
+
+	return TRUE;
 
 }
 
@@ -25,10 +30,13 @@
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
-  g_print("Turn off chassis identify led\n");
-  //TODO:  implement in hardware
-  led_complete_set_off(led,invocation);
-  return TRUE;
+	g_print("Turn off chassis identify led\n");
+	led_complete_set_off(led,invocation);
+	gpio_open(&led_gpio);
+	gpio_write(&led_gpio,0); 
+	gpio_close(&led_gpio);
+
+	return TRUE;
 }
 
 static void 
@@ -36,42 +44,50 @@
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  Led *led;
-  guint n;
+	ObjectSkeleton *object;
 
-  g_print ("Acquired a message bus connection: %s\n",name);
+	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);
+	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);
 
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  object = object_skeleton_new (s);
-  g_free (s);
+		Led *led = led_skeleton_new ();
+		object_skeleton_set_led (object, led);
+		g_object_unref (led);
 
-  led = led_skeleton_new ();
-  object_skeleton_set_led (object, led);
-  g_object_unref (led);
-
-  //define method callbacks
-  g_signal_connect (led,
+		//define method callbacks
+		g_signal_connect (led,
                     "handle-set-on",
                     G_CALLBACK (on_set_on),
                     NULL); /* user_data */
-  g_signal_connect (led,
+		g_signal_connect (led,
                     "handle-set-off",
                     G_CALLBACK (on_set_off),
                     NULL);
 
-  led_set_color(led,0);
-  led_set_function(led,"CHASSIS_IDENTIFY");
+		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 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);
 
-  /* Export all objects */
-  g_dbus_object_manager_server_set_connection (manager, connection);
 }
 
 static void
diff --git a/objects/control_host_obj.c b/objects/control_host_obj.c
index fafcd31..5809576 100644
--- a/objects/control_host_obj.c
+++ b/objects/control_host_obj.c
@@ -6,7 +6,8 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 #include "interfaces/control_host.h"
-#include "objects/openbmc_utilities.h"
+#include "openbmc.h"
+#include "gpio.h"
 
 
 /* ---------------------------------------------------------------------------------------------------- */
@@ -14,7 +15,6 @@
 static const gchar* dbus_name        = "org.openbmc.control.Host";
 
 static GDBusObjectManagerServer *manager = NULL;
-static ControlHost *control_host = NULL;
 
 GPIO fsi_data     = (GPIO){ "FSI_DATA" };
 GPIO fsi_clk      = (GPIO){ "FSI_CLK" };
@@ -87,26 +87,34 @@
 {
 	ObjectSkeleton *object;
 	g_print ("Acquired a message bus connection: %s\n",name);
-	manager = g_dbus_object_manager_server_new (dbus_object_path);
+ 	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);
+		ControlHost* control_host = control_host_skeleton_new ();
+		object_skeleton_set_control_host (object, control_host);
+		g_object_unref (control_host);
 
-	gchar *s;
-	s = g_strdup_printf ("%s/0",dbus_object_path);
-	object = object_skeleton_new (s);
-	g_free (s);
-	control_host = control_host_skeleton_new ();
-	object_skeleton_set_control_host (object, control_host);
-	g_object_unref (control_host);
-
-	//define method callbacks here
-	g_signal_connect (control_host,
+		//define method callbacks here
+		g_signal_connect (control_host,
                   "handle-boot",
                   G_CALLBACK (on_boot),
                   NULL); /* 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 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);
 	
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index 3a4ae1f..f74ce90 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -1,12 +1,12 @@
 #include "interfaces/flash.h"
 #include "pflash/pflash.c"
+#include "openbmc.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/flash/BIOS";
 static const gchar* dbus_name        = "org.openbmc.flash.BIOS";
 
 static GDBusObjectManagerServer *manager = NULL;
-static Flash *flash = NULL;
 
 static gboolean
 on_update_via_file (Flash          *f,
@@ -36,34 +36,40 @@
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  guint n;
+	ObjectSkeleton *object;
+	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]);
+		object = object_skeleton_new (s);
+		g_free (s);
 
-  g_print ("Acquired a message bus connection: %s\n",name);
+		Flash* flash = flash_skeleton_new ();
+		object_skeleton_set_flash (object, flash);
+ 		g_object_unref (flash);
 
-  manager = g_dbus_object_manager_server_new (dbus_object_path);
-
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  object = object_skeleton_new (s);
-  g_free (s);
-
-  flash = flash_skeleton_new ();
-  object_skeleton_set_flash (object, flash);
-  g_object_unref (flash);
-
-  //define method callbacks here
-  g_signal_connect (flash,
+		//define method callbacks here
+		g_signal_connect (flash,
                     "handle-update-via-file",
                     G_CALLBACK (on_update_via_file),
                     NULL); /* 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 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);
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection (manager, connection);
 }
 
 static void
diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index a290653..26006b4 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -7,7 +7,8 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 #include "interfaces/power_control.h"
-#include "objects/openbmc_utilities.h"
+#include "openbmc.h"
+#include "gpio.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/control/Power";
@@ -17,7 +18,6 @@
 GPIO pgood        = (GPIO){ "PGOOD" };
 
 static GDBusObjectManagerServer *manager = NULL;
-static ControlPower *control_power = NULL;
 
 static gboolean
 on_set_power_state (ControlPower          *pwr,
@@ -69,32 +69,40 @@
 {
 	ObjectSkeleton *object;
 	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]);
+  		object = object_skeleton_new (s);
+  		g_free (s);
 
-	manager = g_dbus_object_manager_server_new (dbus_object_path);
-	gchar *s;
-  	s = g_strdup_printf ("%s/0",dbus_object_path);
-  	object = object_skeleton_new (s);
-  	g_free (s);
+		ControlPower* control_power = control_power_skeleton_new ();
+		object_skeleton_set_control_power (object, control_power);
+		g_object_unref (control_power);
 
-	control_power = control_power_skeleton_new ();
-	object_skeleton_set_control_power (object, control_power);
-	g_object_unref (control_power);
+		//define method callbacks here
+		g_signal_connect (control_power,
+        	            "handle-set-power-state",
+                	    G_CALLBACK (on_set_power_state),
+                	    NULL); /* user_data */
 
-	//define method callbacks here
-	g_signal_connect (control_power,
-                    "handle-set-power-state",
-                    G_CALLBACK (on_set_power_state),
-                    NULL); /* user_data */
+		g_signal_connect (control_power,
+                	    "handle-get-power-state",
+                	    G_CALLBACK (on_get_power_state),
+                	    NULL); /* user_data */
 
-	g_signal_connect (control_power,
-                    "handle-get-power-state",
-                    G_CALLBACK (on_get_power_state),
-                    NULL); /* 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 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);
 
@@ -120,9 +128,10 @@
   g_print ("Lost the name %s\n", name);
 }
 
-static gboolean
-poll_pgood()
+static gboolean poll_pgood(gpointer user_data)
 {
+	ControlPower *control_power = object_get_control_power((Object*)user_data);
+
 	if (pgood.fd >= 0)
 	{
 		uint8_t gpio = gpio_read(&pgood);
diff --git a/objects/sensor_host_status_obj.c b/objects/sensor_host_status_obj.c
index 17085e4..df5c326 100644
--- a/objects/sensor_host_status_obj.c
+++ b/objects/sensor_host_status_obj.c
@@ -1,82 +1,95 @@
-#include "interfaces/sensor.h"
+#include "interfaces/sensor2.h"
+#include "openbmc.h"
+
 
 /* ---------------------------------------------------------------------------------------------------- */
+
 static const gchar* dbus_object_path = "/org/openbmc/sensors/HostStatus";
 static const gchar* dbus_name        = "org.openbmc.sensors.HostStatus";
+static const guint poll_interval = 3000;
+static guint heartbeat = 0;
 
 static GDBusObjectManagerServer *manager = NULL;
-static SensorIntegerSettable *sensor = NULL;
 
 static gboolean
-on_get_units    (SensorIntegerSettable  *sen,
+on_get_units    (SensorInteger  *sen,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
-  const gchar* val = sensor_integer_settable_get_units(sen);
-  sensor_integer_settable_complete_get_units(sen,invocation,val);
+  const gchar* val = sensor_integer_get_units(sen);
+  sensor_integer_complete_get_units(sen,invocation,val);
   return TRUE;
 }
 
 static gboolean
-on_get          (SensorIntegerSettable  *sen,
+on_get (SensorInteger                 *sen,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
-  guint val = sensor_integer_settable_get_value(sen);
-  sensor_integer_settable_complete_get_value(sen,invocation,val);
+  guint reading = sensor_integer_get_value(sen);
+  sensor_integer_complete_get_value(sen,invocation,reading);
   return TRUE;
 }
+
 static gboolean
-on_set          (SensorIntegerSettable  *sen,
+on_set_config (SensorInteger                 *sen,
                 GDBusMethodInvocation  *invocation,
-                guint                   value,
+		gchar**                  config,
                 gpointer                user_data)
 {
-  sensor_integer_settable_set_value(sen,value);
-  sensor_integer_settable_complete_set_value(sen,invocation);
-  sensor_integer_settable_emit_changed(sen,value);
+  sensor_integer_complete_set_config_data(sen,invocation);
   return TRUE;
 }
 
+
 static void 
 on_bus_acquired (GDBusConnection *connection,
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  guint n;
+  	g_print ("Acquired a message bus connection: %s\n",name);
 
-  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);
 
-  manager = g_dbus_object_manager_server_new (dbus_object_path);
-
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  object = object_skeleton_new (s);
-  g_free (s);
-
-  sensor = sensor_integer_settable_skeleton_new ();
-  object_skeleton_set_sensor_integer_settable (object, sensor);
-  g_object_unref (sensor);
-
-  //define method callbacks here
-  g_signal_connect (sensor,
+		SensorInteger *sensor = sensor_integer_skeleton_new ();
+  		object_skeleton_set_sensor_integer (object, sensor);
+  		g_object_unref (sensor);
+		
+  		// set units
+  		sensor_integer_set_units(sensor,"C");
+  		//define method callbacks here
+  		g_signal_connect (sensor,
                     "handle-get-value",
                     G_CALLBACK (on_get),
                     NULL); /* user_data */
-  g_signal_connect (sensor,
-                    "handle-set-value",
-                    G_CALLBACK (on_set),
-                    NULL); /* user_data */
-  g_signal_connect (sensor,
+  		g_signal_connect (sensor,
                     "handle-get-units",
                     G_CALLBACK (on_get_units),
                     NULL); /* user_data */
 
-  sensor_integer_settable_set_units(sensor,"");
-  /* 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);
+  		g_signal_connect (sensor,
+                    "handle-set-config-data",
+                    G_CALLBACK (on_set_config),
+                    NULL); /* 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);
@@ -98,13 +111,15 @@
   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;
-  //g_type_init ();
   loop = g_main_loop_new (NULL, FALSE);
 
   id = g_bus_own_name (G_BUS_TYPE_SESSION,
@@ -114,8 +129,9 @@
                        on_bus_acquired,
                        on_name_acquired,
                        on_name_lost,
-                       loop,
+                       &cmd,
                        NULL);
+
   g_main_loop_run (loop);
   
   g_bus_unown_name (id);
diff --git a/objects/sensor_temperature_ambient_obj.c b/objects/sensor_temperature_ambient_obj.c
index 8a05fd2..b1271e9 100644
--- a/objects/sensor_temperature_ambient_obj.c
+++ b/objects/sensor_temperature_ambient_obj.c
@@ -1,23 +1,54 @@
-#include "interfaces/sensor.h"
-
+#include "interfaces/sensor2.h"
+#include "openbmc.h"
+#include "sensor_threshold.h"
 
 
 /* ---------------------------------------------------------------------------------------------------- */
-typedef enum { NORMAL,LOWER_CRITICAL,LOWER_WARNING,UPPER_WARNING,UPPER_CRITICAL } threshold_states;
-
 
 static const gchar* dbus_object_path = "/org/openbmc/sensors/Temperature/Ambient";
 static const gchar* dbus_name        = "org.openbmc.sensors.Temperature.Ambient";
-
-
+static const guint poll_interval = 3000;
+static guint heartbeat = 0;
 
 static GDBusObjectManagerServer *manager = NULL;
-static SensorInteger *sensor = NULL;
 
 static gchar* i2c_bus = "";
 static gchar* i2c_address = "";
-static gboolean thresholds_set = FALSE;
 
+static gboolean
+poll_sensor(gpointer user_data)
+{
+	SensorInteger *sensor = object_get_sensor_integer((Object*)user_data);
+	SensorIntegerThreshold *threshold = object_get_sensor_integer_threshold((Object*)user_data);
+
+ 	guint value = sensor_integer_get_value(sensor);
+	//TOOD:  Change to actually read sensor
+	value = value+1;
+
+	if (heartbeat > 10000)
+	{
+		heartbeat = 0;
+		g_print(">>> Send Heartbeat\n");
+		sensor_integer_emit_heartbeat(sensor);
+	}
+	else
+ 	{
+		heartbeat = heartbeat+poll_interval;
+	}
+
+    // End actually reading sensor
+    g_print("Polling sensor:  %d\n",value);
+
+    //if changed, set property and emit signal
+    if (value != sensor_integer_get_value(sensor))
+    {
+       g_print("Sensor changed\n");
+       sensor_integer_set_value(sensor,value);
+       sensor_integer_emit_changed(sensor,value);
+       check_thresholds(threshold,value);
+    }
+    return TRUE;
+}
 
 
 static gboolean
@@ -52,123 +83,71 @@
   return TRUE;
 }
 
-static gboolean
-on_set_thresholds (SensorInteger                 *sen,
-                   GDBusMethodInvocation  *invocation,
-		   guint                  lc,
-		   guint                  lw,
-		   guint                  uw,
-		   guint                  uc,
-                   gpointer               user_data)
-{
-  sensor_integer_set_threshold_lower_critical(sen,lc);
-  sensor_integer_set_threshold_lower_warning(sen,lw);
-  sensor_integer_set_threshold_upper_warning(sen,uw);
-  sensor_integer_set_threshold_upper_critical(sen,uc);
-  sensor_integer_complete_set_thresholds(sen,invocation);
-  thresholds_set = TRUE;
-  return TRUE;
-}
-
-static gboolean
-on_get_threshold_state (SensorInteger                 *sen,
-                   GDBusMethodInvocation  *invocation,
-                   gpointer               user_data)
-{
-  guint state = sensor_integer_get_threshold_state(sen);
-  sensor_integer_complete_get_threshold_state(sen,invocation,state);
-  return TRUE;
-}
-
-
-static gboolean
-check_thresholds()
-{
-  if (thresholds_set == TRUE) {
-  threshold_states state = NORMAL;
-  guint value = sensor_integer_get_value(sensor);
-
-  if (value < sensor_integer_get_threshold_lower_critical(sensor)) {
-    state = LOWER_CRITICAL;
-  }
-  else if(value < sensor_integer_get_threshold_lower_warning(sensor)) {
-    state = LOWER_WARNING;
-  }
-  else if(value > sensor_integer_get_threshold_upper_critical(sensor)) {
-    state = UPPER_CRITICAL;
-  }
-  else if(value > sensor_integer_get_threshold_upper_warning(sensor)) {
-    state = UPPER_WARNING;
-  }
-  // only emit signal if threshold state changes
-  if (state != sensor_integer_get_threshold_state(sensor))
-  {
-     sensor_integer_set_threshold_state(sensor,state);
-     if (state == LOWER_CRITICAL || state == UPPER_CRITICAL)
-     {
-       sensor_integer_emit_critical(sensor);
-       g_print("Critical\n");
-     }
-     else if (state == LOWER_WARNING || state == UPPER_WARNING)
-     {
-       sensor_integer_emit_warning(sensor);
-       g_print("Warning\n");
-     }
-  }
-  }
-}
 
 static void 
 on_bus_acquired (GDBusConnection *connection,
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  guint n;
+  	g_print ("Acquired a message bus connection: %s\n",name);
 
-  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);
 
-  manager = g_dbus_object_manager_server_new (dbus_object_path);
+		SensorInteger *sensor = sensor_integer_skeleton_new ();
+  		object_skeleton_set_sensor_integer (object, sensor);
+  		g_object_unref (sensor);
+		
+		SensorIntegerThreshold *threshold = sensor_integer_threshold_skeleton_new();
+		object_skeleton_set_sensor_integer_threshold (object,threshold);
+		g_object_unref (threshold);
 
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  object = object_skeleton_new (s);
-  g_free (s);
-
-  sensor = sensor_integer_skeleton_new ();
-  object_skeleton_set_sensor_integer (object, sensor);
-  g_object_unref (sensor);
-
-  sensor_integer_set_units(sensor,"C");
-  //define method callbacks here
-  g_signal_connect (sensor,
+  		// set units
+  		sensor_integer_set_units(sensor,"C");
+		sensor_integer_threshold_set_state(threshold,NOT_SET);
+  		//define method callbacks here
+  		g_signal_connect (sensor,
                     "handle-get-value",
                     G_CALLBACK (on_get),
                     NULL); /* user_data */
-  g_signal_connect (sensor,
+  		g_signal_connect (sensor,
                     "handle-get-units",
                     G_CALLBACK (on_get_units),
                     NULL); /* user_data */
 
-  g_signal_connect (sensor,
+  		g_signal_connect (sensor,
                     "handle-set-config-data",
                     G_CALLBACK (on_set_config),
                     NULL); /* user_data */
  
-  g_signal_connect (sensor,
-                    "handle-set-thresholds",
-                    G_CALLBACK (on_set_thresholds),
+  		g_signal_connect (threshold,
+                    "handle-set",
+                    G_CALLBACK (set_thresholds),
                     NULL); /* user_data */
 
-  g_signal_connect (sensor,
-                    "handle-get-threshold-state",
-                    G_CALLBACK (on_get_threshold_state),
+  		g_signal_connect (threshold,
+                    "handle-get-state",
+                    G_CALLBACK (get_threshold_state),
                     NULL); /* user_data */
 
+  		g_timeout_add(poll_interval, poll_sensor, object);
 
-  /* 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 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);
@@ -190,35 +169,15 @@
   g_print ("Lost the name %s\n", name);
 }
 
-static gboolean
-poll_sensor()
-{
-    guint value = sensor_integer_get_value(sensor);
-    //TOOD:  Change to actually read sensor
-    value = value+1;
-    g_print("Polling sensor:  %d\n",value);
-
-    //if changed, set property and emit signal
-    if (value != sensor_integer_get_value(sensor))
-    {
-       g_print("Sensor changed\n");
-       sensor_integer_set_value(sensor,value);
-       sensor_integer_emit_changed(sensor,value);
-       if (thresholds_set == TRUE)
-       {
-         check_thresholds();
-       }
-    }
-    return TRUE;
-}
 
 gint
 main (gint argc, gchar *argv[])
 {
   GMainLoop *loop;
-
+  cmdline cmd;
+  cmd.argc = argc;
+  cmd.argv = argv;
   guint id;
-  //g_type_init ();
   loop = g_main_loop_new (NULL, FALSE);
 
   id = g_bus_own_name (G_BUS_TYPE_SESSION,
@@ -228,10 +187,9 @@
                        on_bus_acquired,
                        on_name_acquired,
                        on_name_lost,
-                       loop,
+                       &cmd,
                        NULL);
 
-  g_timeout_add(5000, poll_sensor, NULL);
   g_main_loop_run (loop);
   
   g_bus_unown_name (id);
