diff --git a/objects/button_power_obj.c b/objects/button_power_obj.c
new file mode 100644
index 0000000..f0583dd
--- /dev/null
+++ b/objects/button_power_obj.c
@@ -0,0 +1,113 @@
+#include "interfaces/button.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static Button *button = NULL;
+static const int gpio = 12;
+
+static gboolean
+on_is_on       (Button          *btn,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  gboolean btn_state=button_get_state(btn);
+  button_complete_is_on(btn,invocation,btn_state);
+  return TRUE;
+
+}
+
+static gboolean
+on_sim_button_press       (Button          *btn,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  g_print("Simulating button pressed\n");
+  button_emit_button_pressed(btn);
+  button_complete_sim_button_press(btn,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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/buttons/ButtonPower");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/buttons/ButtonPower/0");
+  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,
+                    "handle-is-on",
+                    G_CALLBACK (on_is_on),
+                    NULL); /* user_data */
+  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 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;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.buttons.ButtonPower",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/chassis_identify_obj.c b/objects/chassis_identify_obj.c
new file mode 100644
index 0000000..a4bc735
--- /dev/null
+++ b/objects/chassis_identify_obj.c
@@ -0,0 +1,116 @@
+#include "interfaces/led.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+//static Led *led = NULL;
+static uint gpio = 12;
+
+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;
+
+}
+
+static gboolean
+on_set_off       (Led          *led,
+                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;
+}
+
+static void 
+on_bus_acquired (GDBusConnection *connection,
+                 const gchar     *name,
+                 gpointer         user_data)
+{
+  ObjectSkeleton *object;
+  Led *led;
+  guint n;
+
+  g_print ("Acquired a message bus connection: %s\n",name);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/ChassisIdentify");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/ChassisIdentify/0");
+  object = object_skeleton_new (s);
+  g_free (s);
+
+  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);
+}
+
+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;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.ChassisIdentify",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
new file mode 100644
index 0000000..90c67c8
--- /dev/null
+++ b/objects/flash_bios_obj.c
@@ -0,0 +1,107 @@
+#include "interfaces/flash.h"
+#include "pflash/pflash.c"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static Flash *flash = NULL;
+
+static gboolean
+on_update_via_file (Flash          *f,
+                GDBusMethodInvocation  *invocation,
+                gchar*                  write_file,
+                gpointer                user_data)
+{
+  g_print("Flashing BIOS from file\n");
+  // get size from file
+  struct stat stbuf;
+  uint32_t address = 0, read_size = 0, write_size = 0;
+
+  if (stat(write_file, &stbuf))
+  {
+    g_print("Failed to get file size");
+    //TODO: Error handling
+  }
+  write_size = stbuf.st_size;
+  erase_chip();
+  program_file(write_file, address, write_size);
+  flash_complete_update_via_file(f,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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/Flash/BIOS");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/Flash/BIOS/0");
+  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,
+                    "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 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;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.Flash.BIOS",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/host_control_obj.c b/objects/host_control_obj.c
new file mode 100644
index 0000000..1b52590
--- /dev/null
+++ b/objects/host_control_obj.c
@@ -0,0 +1,97 @@
+#include "interfaces/host_control.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static HostControl *host_control = NULL;
+
+static guint gpio_fsiclk = 27;
+static guint gpio_fsidat = 28;
+
+static gboolean
+on_boot         (HostControl        *host,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  // TODO: Implement gpio toggling
+  g_print("Boot");
+  host_control_complete_boot(host,invocation);
+  host_control_emit_booted(host);
+  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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/HostControl");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/HostControl/0");
+  object = object_skeleton_new (s);
+  g_free (s);
+  host_control = host_control_skeleton_new ();
+  object_skeleton_set_host_control (object, host_control);
+  g_object_unref (host_control);
+
+  //define method callbacks here
+  g_signal_connect (host_control,
+                    "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 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;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.HostControl",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/pflash b/objects/pflash
new file mode 160000
index 0000000..8be47d0
--- /dev/null
+++ b/objects/pflash
@@ -0,0 +1 @@
+Subproject commit 8be47d0ca4dccf0cdd68930a597dc830237f6732
diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
new file mode 100644
index 0000000..e2560c4
--- /dev/null
+++ b/objects/power_control_obj.c
@@ -0,0 +1,169 @@
+#include "interfaces/power_control.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static PowerControl *power_control = NULL;
+
+static guint gpio_power = 26;
+static guint gpio_fsiclk = 27;
+static guint gpio_fsidat = 28;
+static guint gpio_pgood = 21;
+
+static guint tmp_pgood = 0;
+
+static gboolean
+on_set_power_state (PowerControl          *pwr,
+                GDBusMethodInvocation  *invocation,
+                guint                   state,
+                gpointer                user_data)
+{
+  if (state > 1)
+  {
+      g_dbus_method_invocation_return_dbus_error (invocation,
+                                                  "org.openbmc.PowerControl.Error.Failed",
+                                                  "Invalid power state");
+      return TRUE;
+  }
+  if (state == power_control_get_state(pwr))
+  {
+      g_dbus_method_invocation_return_dbus_error (invocation,
+                                                  "org.openbmc.PowerControl.Error.Failed",
+                                                  "Power Control is already at requested state");
+      return TRUE;     
+  }
+
+  // TODO: Implement gpio toggling
+  g_print("Set power state: %d\n",state);
+  if (state==1)
+  {
+    g_print("Turn on\n");
+    tmp_pgood=1;
+  }
+  else
+  {
+    g_print("Turn off\n");
+    tmp_pgood=0;
+  }
+  power_control_set_state(pwr,state);
+  power_control_complete_set_power_state(pwr,invocation);
+  return TRUE;
+}
+
+static gboolean
+on_get_power_state (PowerControl          *pwr,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  guint pgood = power_control_get_pgood(pwr);
+  power_control_complete_get_power_state(pwr,invocation,pgood);
+  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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/PowerControl");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/PowerControl/0");
+  object = object_skeleton_new (s);
+  g_free (s);
+
+  power_control = power_control_skeleton_new ();
+  object_skeleton_set_power_control (object, power_control);
+  g_object_unref (power_control);
+
+  //define method callbacks here
+  g_signal_connect (power_control,
+                    "handle-set-power-state",
+                    G_CALLBACK (on_set_power_state),
+                    NULL); /* user_data */
+
+  g_signal_connect (power_control,
+                    "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 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);
+}
+
+static gboolean
+poll_pgood()
+{
+  guint pgood = power_control_get_pgood(power_control);
+  //TOOD:  Change to actually read gpio
+  guint gpio = tmp_pgood;
+
+  g_print("Polling pgood:  %d\n",gpio);
+
+  //if changed, set property and emit signal
+  if (gpio != power_control_get_pgood(power_control))
+  {
+     power_control_set_pgood(power_control,gpio);
+     if (gpio==0)
+     {
+       power_control_emit_power_lost(power_control);
+     }
+     else
+     {
+       power_control_emit_power_good(power_control);
+     }
+  }
+  return TRUE;
+}
+
+gint
+main (gint argc, gchar *argv[])
+{
+  GMainLoop *loop;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.PowerControl",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_timeout_add(5000, poll_pgood, NULL);
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/sensor_host_status_obj.c b/objects/sensor_host_status_obj.c
new file mode 100644
index 0000000..fea3e5c
--- /dev/null
+++ b/objects/sensor_host_status_obj.c
@@ -0,0 +1,122 @@
+#include "interfaces/sensor.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static SensorIntegerSettable *sensor = NULL;
+
+static gboolean
+on_get_units    (SensorIntegerSettable  *sen,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  const gchar* val = sensor_integer_settable_get_units(sen);
+  sensor_integer_settable_complete_get_units(sen,invocation,val);
+  return TRUE;
+}
+
+static gboolean
+on_get          (SensorIntegerSettable  *sen,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  guint val = sensor_integer_settable_get_value(sen);
+  sensor_integer_settable_complete_get_value(sen,invocation,val);
+  return TRUE;
+}
+static gboolean
+on_set          (SensorIntegerSettable  *sen,
+                GDBusMethodInvocation  *invocation,
+                guint                   value,
+                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);
+  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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/Sensors/HostStatus");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/Sensors/HostStatus/0");
+  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,
+                    "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,
+                    "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);
+
+  /* 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;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.Sensors.HostStatus",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
diff --git a/objects/sensor_temperature_ambient_obj.c b/objects/sensor_temperature_ambient_obj.c
new file mode 100644
index 0000000..a16cbb1
--- /dev/null
+++ b/objects/sensor_temperature_ambient_obj.c
@@ -0,0 +1,129 @@
+#include "interfaces/sensor.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusObjectManagerServer *manager = NULL;
+static SensorInteger *sensor = NULL;
+
+static guint i2c_bus = 1;
+
+static gboolean
+on_get_units    (SensorInteger  *sen,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  const gchar* val = sensor_integer_get_units(sen);
+  sensor_integer_complete_get_units(sen,invocation,val);
+  return TRUE;
+}
+
+static gboolean
+on_get (SensorInteger                 *sen,
+                GDBusMethodInvocation  *invocation,
+                gpointer                user_data)
+{
+  guint reading = sensor_integer_get_value(sen);
+  sensor_integer_complete_get_value(sen,invocation,reading);
+  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);
+
+  manager = g_dbus_object_manager_server_new ("/org/openbmc/Sensors/Temperature/Ambient");
+
+  gchar *s;
+  s = g_strdup_printf ("/org/openbmc/Sensors/Temperature/Ambient/0");
+  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,
+                    "handle-get-value",
+                    G_CALLBACK (on_get),
+                    NULL); /* user_data */
+  g_signal_connect (sensor,
+                    "handle-get-units",
+                    G_CALLBACK (on_get_units),
+                    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);
+}
+
+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);
+}
+
+static gboolean
+poll_sensor()
+{
+  guint value = sensor_integer_get_value(sensor);
+  //TOOD:  Change to actually read sensor
+
+  g_print("Polling sensor:  %d\n",value);
+
+  //if changed, set property and emit signal
+  if (value != sensor_integer_get_value(sensor))
+  {
+     sensor_integer_set_value(sensor,value);
+     sensor_integer_emit_changed(sensor,value);
+  }
+  return TRUE;
+}
+
+gint
+main (gint argc, gchar *argv[])
+{
+  GMainLoop *loop;
+
+  guint id;
+  //g_type_init ();
+  loop = g_main_loop_new (NULL, FALSE);
+
+  id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                       "org.openbmc.Sensors.Temperature.Ambient",
+                       G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       on_bus_acquired,
+                       on_name_acquired,
+                       on_name_lost,
+                       loop,
+                       NULL);
+
+  g_timeout_add(5000, poll_sensor, NULL);
+  g_main_loop_run (loop);
+  
+  g_bus_unown_name (id);
+  g_main_loop_unref (loop);
+  return 0;
+}
