diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 1118c4b..d11ab40 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -5,6 +5,9 @@
 import dbus.service
 import dbus.mainloop.glib
 
+DBUS_NAME = 'org.openbmc.control.Chassis'
+OBJ_NAME = '/org/openbmc/control/Chassis'
+
 POWER_OFF = 0
 POWER_ON = 1
 
@@ -15,19 +18,19 @@
 		bus = dbus.SessionBus()
 		try: 
 			# Get PowerControl object
-			power_control_service = bus.get_object('org.openbmc.PowerControl','/org/openbmc/PowerControl/0')
-			self.power_control_iface = dbus.Interface(power_control_service, 'org.openbmc.PowerControl')
+			power_control_service = bus.get_object('org.openbmc.control.Power','/org/openbmc/control/Power/0')
+			self.power_control_iface = dbus.Interface(power_control_service, 'org.openbmc.control.Power')
 			# Get ChassisIdentify object
-			chassis_identify_service = bus.get_object('org.openbmc.ChassisIdentify','/org/openbmc/ChassisIdentify/0')
+			chassis_identify_service = bus.get_object('org.openbmc.leds.ChassisIdentify','/org/openbmc/leds/ChassisIdentify/0')
 			self.identify_led_iface = dbus.Interface(chassis_identify_service, 'org.openbmc.Led');
 			# Get HostControl object
-			host_control_service = bus.get_object('org.openbmc.HostControl','/org/openbmc/HostControl/0')
-			self.host_control_iface = dbus.Interface(host_control_service, 'org.openbmc.HostControl');
+			host_control_service = bus.get_object('org.openbmc.control.Host','/org/openbmc/control/Host/0')
+			self.host_control_iface = dbus.Interface(host_control_service, 'org.openbmc.control.Host');
 
 			bus.add_signal_receiver(self.power_button_signal_handler, 
 						dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed")
     			bus.add_signal_receiver(self.power_good_signal_handler, 
-						dbus_interface = "org.openbmc.PowerControl", signal_name = "PowerGood")
+						dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
 
 
 		except dbus.exceptions.DBusException, e:
@@ -35,13 +38,13 @@
 			print "Unable to find dependent services: ",e
 
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='s')
 	def getID(self):
 		return id
 
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setIdentify(self):
 		print "Turn on identify"
@@ -49,14 +52,14 @@
 		return None
 
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def clearIdentify(self):
 		print "Turn off identify"
 		r=self.identify_led_iface.setOff()
 		return None
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setPowerOn(self):
 		print "Turn on power and boot"
@@ -66,25 +69,25 @@
 			self.power_sequence = 1
 		return None
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setPowerOff(self):
 		print "Turn off power"
 		self.power_control_iface.setPowerState(POWER_OFF);
 		return None
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='i')
 	def getPowerState(self):
 		state = self.power_control_iface.getPowerState();
 		return state
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setDebugMode(self):
 		return None
 
-	@dbus.service.method("org.openbmc.ChassisControl",
+	@dbus.service.method(DBUS_NAME,
 		in_signature='i', out_signature='')
 	def setPowerPolicy(self,policy):
 		return None
@@ -112,8 +115,8 @@
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
 
     bus = dbus.SessionBus()
-    name = dbus.service.BusName("org.openbmc.ChassisControl", bus)
-    obj = ChassisControlObject(bus, '/org/openbmc/ChassisControl')
+    name = dbus.service.BusName(DBUS_NAME, bus)
+    obj = ChassisControlObject(bus, OBJ_NAME)
     mainloop = gobject.MainLoop()
     
     print "Running ChassisControlService"
diff --git a/interfaces/host_control.c b/interfaces/host_control.c
deleted file mode 100644
index 2c43703..0000000
--- a/interfaces/host_control.c
+++ /dev/null
@@ -1,1797 +0,0 @@
-/*
- * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
- *
- * The license of this code is the same as for the source it was derived from.
- */
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include "interfaces/host_control.h"
-
-#include <string.h>
-#ifdef G_OS_UNIX
-#  include <gio/gunixfdlist.h>
-#endif
-
-typedef struct
-{
-  GDBusArgInfo parent_struct;
-  gboolean use_gvariant;
-} _ExtendedGDBusArgInfo;
-
-typedef struct
-{
-  GDBusMethodInfo parent_struct;
-  const gchar *signal_name;
-  gboolean pass_fdlist;
-} _ExtendedGDBusMethodInfo;
-
-typedef struct
-{
-  GDBusSignalInfo parent_struct;
-  const gchar *signal_name;
-} _ExtendedGDBusSignalInfo;
-
-typedef struct
-{
-  GDBusPropertyInfo parent_struct;
-  const gchar *hyphen_name;
-  gboolean use_gvariant;
-} _ExtendedGDBusPropertyInfo;
-
-typedef struct
-{
-  GDBusInterfaceInfo parent_struct;
-  const gchar *hyphen_name;
-} _ExtendedGDBusInterfaceInfo;
-
-typedef struct
-{
-  const _ExtendedGDBusPropertyInfo *info;
-  guint prop_id;
-  GValue orig_value; /* the value before the change */
-} ChangedProperty;
-
-static void
-_changed_property_free (ChangedProperty *data)
-{
-  g_value_unset (&data->orig_value);
-  g_free (data);
-}
-
-static gboolean
-_g_strv_equal0 (gchar **a, gchar **b)
-{
-  gboolean ret = FALSE;
-  guint n;
-  if (a == NULL && b == NULL)
-    {
-      ret = TRUE;
-      goto out;
-    }
-  if (a == NULL || b == NULL)
-    goto out;
-  if (g_strv_length (a) != g_strv_length (b))
-    goto out;
-  for (n = 0; a[n] != NULL; n++)
-    if (g_strcmp0 (a[n], b[n]) != 0)
-      goto out;
-  ret = TRUE;
-out:
-  return ret;
-}
-
-static gboolean
-_g_variant_equal0 (GVariant *a, GVariant *b)
-{
-  gboolean ret = FALSE;
-  if (a == NULL && b == NULL)
-    {
-      ret = TRUE;
-      goto out;
-    }
-  if (a == NULL || b == NULL)
-    goto out;
-  ret = g_variant_equal (a, b);
-out:
-  return ret;
-}
-
-G_GNUC_UNUSED static gboolean
-_g_value_equal (const GValue *a, const GValue *b)
-{
-  gboolean ret = FALSE;
-  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
-  switch (G_VALUE_TYPE (a))
-    {
-      case G_TYPE_BOOLEAN:
-        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
-        break;
-      case G_TYPE_UCHAR:
-        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
-        break;
-      case G_TYPE_INT:
-        ret = (g_value_get_int (a) == g_value_get_int (b));
-        break;
-      case G_TYPE_UINT:
-        ret = (g_value_get_uint (a) == g_value_get_uint (b));
-        break;
-      case G_TYPE_INT64:
-        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
-        break;
-      case G_TYPE_UINT64:
-        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
-        break;
-      case G_TYPE_DOUBLE:
-        {
-          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
-          gdouble da = g_value_get_double (a);
-          gdouble db = g_value_get_double (b);
-          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
-        }
-        break;
-      case G_TYPE_STRING:
-        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
-        break;
-      case G_TYPE_VARIANT:
-        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
-        break;
-      default:
-        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
-          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
-        else
-          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
-        break;
-    }
-  return ret;
-}
-
-/* ------------------------------------------------------------------------
- * Code for interface org.openbmc.HostControl
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:HostControl
- * @title: HostControl
- * @short_description: Generated C code for the org.openbmc.HostControl D-Bus interface
- *
- * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link> D-Bus interface in C.
- */
-
-/* ---- Introspection data for org.openbmc.HostControl ---- */
-
-static const _ExtendedGDBusMethodInfo _host_control_method_info_boot =
-{
-  {
-    -1,
-    (gchar *) "boot",
-    NULL,
-    NULL,
-    NULL
-  },
-  "handle-boot",
-  FALSE
-};
-
-static const _ExtendedGDBusMethodInfo _host_control_method_info_shutdown =
-{
-  {
-    -1,
-    (gchar *) "shutdown",
-    NULL,
-    NULL,
-    NULL
-  },
-  "handle-shutdown",
-  FALSE
-};
-
-static const _ExtendedGDBusMethodInfo * const _host_control_method_info_pointers[] =
-{
-  &_host_control_method_info_boot,
-  &_host_control_method_info_shutdown,
-  NULL
-};
-
-static const _ExtendedGDBusSignalInfo _host_control_signal_info_booted =
-{
-  {
-    -1,
-    (gchar *) "booted",
-    NULL,
-    NULL
-  },
-  "booted"
-};
-
-static const _ExtendedGDBusSignalInfo * const _host_control_signal_info_pointers[] =
-{
-  &_host_control_signal_info_booted,
-  NULL
-};
-
-static const _ExtendedGDBusInterfaceInfo _host_control_interface_info =
-{
-  {
-    -1,
-    (gchar *) "org.openbmc.HostControl",
-    (GDBusMethodInfo **) &_host_control_method_info_pointers,
-    (GDBusSignalInfo **) &_host_control_signal_info_pointers,
-    NULL,
-    NULL
-  },
-  "host-control",
-};
-
-
-/**
- * host_control_interface_info:
- *
- * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link> D-Bus interface.
- *
- * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
- */
-GDBusInterfaceInfo *
-host_control_interface_info (void)
-{
-  return (GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct;
-}
-
-/**
- * host_control_override_properties:
- * @klass: The class structure for a #GObject<!-- -->-derived class.
- * @property_id_begin: The property id to assign to the first overridden property.
- *
- * Overrides all #GObject properties in the #HostControl interface for a concrete class.
- * The properties are overridden in the order they are defined.
- *
- * Returns: The last property id.
- */
-guint
-host_control_override_properties (GObjectClass *klass, guint property_id_begin)
-{
-  return property_id_begin - 1;
-}
-
-
-
-/**
- * HostControl:
- *
- * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>.
- */
-
-/**
- * HostControlIface:
- * @parent_iface: The parent interface.
- * @handle_boot: Handler for the #HostControl::handle-boot signal.
- * @handle_shutdown: Handler for the #HostControl::handle-shutdown signal.
- * @booted: Handler for the #HostControl::booted signal.
- *
- * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>.
- */
-
-typedef HostControlIface HostControlInterface;
-G_DEFINE_INTERFACE (HostControl, host_control, G_TYPE_OBJECT);
-
-static void
-host_control_default_init (HostControlIface *iface)
-{
-  /* GObject signals for incoming D-Bus method calls: */
-  /**
-   * HostControl::handle-boot:
-   * @object: A #HostControl.
-   * @invocation: A #GDBusMethodInvocation.
-   *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-HostControl.boot">boot()</link> D-Bus method.
-   *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call host_control_complete_boot() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
-   *
-   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
-   */
-  g_signal_new ("handle-boot",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (HostControlIface, handle_boot),
-    g_signal_accumulator_true_handled,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_BOOLEAN,
-    1,
-    G_TYPE_DBUS_METHOD_INVOCATION);
-
-  /**
-   * HostControl::handle-shutdown:
-   * @object: A #HostControl.
-   * @invocation: A #GDBusMethodInvocation.
-   *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-HostControl.shutdown">shutdown()</link> D-Bus method.
-   *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call host_control_complete_shutdown() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
-   *
-   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
-   */
-  g_signal_new ("handle-shutdown",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (HostControlIface, handle_shutdown),
-    g_signal_accumulator_true_handled,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_BOOLEAN,
-    1,
-    G_TYPE_DBUS_METHOD_INVOCATION);
-
-  /* GObject signals for received D-Bus signals: */
-  /**
-   * HostControl::booted:
-   * @object: A #HostControl.
-   *
-   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-HostControl.booted">"booted"</link> is received.
-   *
-   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
-   */
-  g_signal_new ("booted",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (HostControlIface, booted),
-    NULL,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_NONE,
-    0);
-
-}
-
-/**
- * host_control_emit_booted:
- * @object: A #HostControl.
- *
- * Emits the <link linkend="gdbus-signal-org-openbmc-HostControl.booted">"booted"</link> D-Bus signal.
- */
-void
-host_control_emit_booted (
-    HostControl *object)
-{
-  g_signal_emit_by_name (object, "booted");
-}
-
-/**
- * host_control_call_boot:
- * @proxy: A #HostControlProxy.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-HostControl.boot">boot()</link> D-Bus method on @proxy.
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call host_control_call_boot_finish() to get the result of the operation.
- *
- * See host_control_call_boot_sync() for the synchronous, blocking version of this method.
- */
-void
-host_control_call_boot (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data)
-{
-  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "boot",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    callback,
-    user_data);
-}
-
-/**
- * host_control_call_boot_finish:
- * @proxy: A #HostControlProxy.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to host_control_call_boot().
- * @error: Return location for error or %NULL.
- *
- * Finishes an operation started with host_control_call_boot().
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-host_control_call_boot_finish (
-    HostControl *proxy,
-    GAsyncResult *res,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * host_control_call_boot_sync:
- * @proxy: A #HostControlProxy.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-HostControl.boot">boot()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
- *
- * See host_control_call_boot() for the asynchronous version of this method.
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-host_control_call_boot_sync (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "boot",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * host_control_call_shutdown:
- * @proxy: A #HostControlProxy.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-HostControl.shutdown">shutdown()</link> D-Bus method on @proxy.
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call host_control_call_shutdown_finish() to get the result of the operation.
- *
- * See host_control_call_shutdown_sync() for the synchronous, blocking version of this method.
- */
-void
-host_control_call_shutdown (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data)
-{
-  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "shutdown",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    callback,
-    user_data);
-}
-
-/**
- * host_control_call_shutdown_finish:
- * @proxy: A #HostControlProxy.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to host_control_call_shutdown().
- * @error: Return location for error or %NULL.
- *
- * Finishes an operation started with host_control_call_shutdown().
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-host_control_call_shutdown_finish (
-    HostControl *proxy,
-    GAsyncResult *res,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * host_control_call_shutdown_sync:
- * @proxy: A #HostControlProxy.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-HostControl.shutdown">shutdown()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
- *
- * See host_control_call_shutdown() for the asynchronous version of this method.
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-host_control_call_shutdown_sync (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "shutdown",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * host_control_complete_boot:
- * @object: A #HostControl.
- * @invocation: (transfer full): A #GDBusMethodInvocation.
- *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-HostControl.boot">boot()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
- *
- * This method will free @invocation, you cannot use it afterwards.
- */
-void
-host_control_complete_boot (
-    HostControl *object,
-    GDBusMethodInvocation *invocation)
-{
-  g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("()"));
-}
-
-/**
- * host_control_complete_shutdown:
- * @object: A #HostControl.
- * @invocation: (transfer full): A #GDBusMethodInvocation.
- *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-HostControl.shutdown">shutdown()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
- *
- * This method will free @invocation, you cannot use it afterwards.
- */
-void
-host_control_complete_shutdown (
-    HostControl *object,
-    GDBusMethodInvocation *invocation)
-{
-  g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("()"));
-}
-
-/* ------------------------------------------------------------------------ */
-
-/**
- * HostControlProxy:
- *
- * The #HostControlProxy structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * HostControlProxyClass:
- * @parent_class: The parent class.
- *
- * Class structure for #HostControlProxy.
- */
-
-struct _HostControlProxyPrivate
-{
-  GData *qdata;
-};
-
-static void host_control_proxy_iface_init (HostControlIface *iface);
-
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-G_DEFINE_TYPE_WITH_CODE (HostControlProxy, host_control_proxy, G_TYPE_DBUS_PROXY,
-                         G_ADD_PRIVATE (HostControlProxy)
-                         G_IMPLEMENT_INTERFACE (TYPE_HOST_CONTROL, host_control_proxy_iface_init));
-
-#else
-G_DEFINE_TYPE_WITH_CODE (HostControlProxy, host_control_proxy, G_TYPE_DBUS_PROXY,
-                         G_IMPLEMENT_INTERFACE (TYPE_HOST_CONTROL, host_control_proxy_iface_init));
-
-#endif
-static void
-host_control_proxy_finalize (GObject *object)
-{
-  HostControlProxy *proxy = HOST_CONTROL_PROXY (object);
-  g_datalist_clear (&proxy->priv->qdata);
-  G_OBJECT_CLASS (host_control_proxy_parent_class)->finalize (object);
-}
-
-static void
-host_control_proxy_get_property (GObject      *object,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec G_GNUC_UNUSED)
-{
-}
-
-static void
-host_control_proxy_set_property (GObject      *object,
-  guint         prop_id,
-  const GValue *value,
-  GParamSpec   *pspec G_GNUC_UNUSED)
-{
-}
-
-static void
-host_control_proxy_g_signal (GDBusProxy *proxy,
-  const gchar *sender_name G_GNUC_UNUSED,
-  const gchar *signal_name,
-  GVariant *parameters)
-{
-  _ExtendedGDBusSignalInfo *info;
-  GVariantIter iter;
-  GVariant *child;
-  GValue *paramv;
-  guint num_params;
-  guint n;
-  guint signal_id;
-  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct, signal_name);
-  if (info == NULL)
-    return;
-  num_params = g_variant_n_children (parameters);
-  paramv = g_new0 (GValue, num_params + 1);
-  g_value_init (&paramv[0], TYPE_HOST_CONTROL);
-  g_value_set_object (&paramv[0], proxy);
-  g_variant_iter_init (&iter, parameters);
-  n = 1;
-  while ((child = g_variant_iter_next_value (&iter)) != NULL)
-    {
-      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
-      if (arg_info->use_gvariant)
-        {
-          g_value_init (&paramv[n], G_TYPE_VARIANT);
-          g_value_set_variant (&paramv[n], child);
-          n++;
-        }
-      else
-        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
-      g_variant_unref (child);
-    }
-  signal_id = g_signal_lookup (info->signal_name, TYPE_HOST_CONTROL);
-  g_signal_emitv (paramv, signal_id, 0, NULL);
-  for (n = 0; n < num_params + 1; n++)
-    g_value_unset (&paramv[n]);
-  g_free (paramv);
-}
-
-static void
-host_control_proxy_g_properties_changed (GDBusProxy *_proxy,
-  GVariant *changed_properties,
-  const gchar *const *invalidated_properties)
-{
-  HostControlProxy *proxy = HOST_CONTROL_PROXY (_proxy);
-  guint n;
-  const gchar *key;
-  GVariantIter *iter;
-  _ExtendedGDBusPropertyInfo *info;
-  g_variant_get (changed_properties, "a{sv}", &iter);
-  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
-    {
-      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct, key);
-      g_datalist_remove_data (&proxy->priv->qdata, key);
-      if (info != NULL)
-        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
-    }
-  g_variant_iter_free (iter);
-  for (n = 0; invalidated_properties[n] != NULL; n++)
-    {
-      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct, invalidated_properties[n]);
-      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
-      if (info != NULL)
-        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
-    }
-}
-
-static void
-host_control_proxy_init (HostControlProxy *proxy)
-{
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-  proxy->priv = host_control_proxy_get_instance_private (proxy);
-#else
-  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_HOST_CONTROL_PROXY, HostControlProxyPrivate);
-#endif
-
-  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), host_control_interface_info ());
-}
-
-static void
-host_control_proxy_class_init (HostControlProxyClass *klass)
-{
-  GObjectClass *gobject_class;
-  GDBusProxyClass *proxy_class;
-
-  gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize     = host_control_proxy_finalize;
-  gobject_class->get_property = host_control_proxy_get_property;
-  gobject_class->set_property = host_control_proxy_set_property;
-
-  proxy_class = G_DBUS_PROXY_CLASS (klass);
-  proxy_class->g_signal = host_control_proxy_g_signal;
-  proxy_class->g_properties_changed = host_control_proxy_g_properties_changed;
-
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-  g_type_class_add_private (klass, sizeof (HostControlProxyPrivate));
-#endif
-}
-
-static void
-host_control_proxy_iface_init (HostControlIface *iface)
-{
-}
-
-/**
- * host_control_proxy_new:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>. See g_dbus_proxy_new() for more details.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call host_control_proxy_new_finish() to get the result of the operation.
- *
- * See host_control_proxy_new_sync() for the synchronous, blocking version of this constructor.
- */
-void
-host_control_proxy_new (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data)
-{
-  g_async_initable_new_async (TYPE_HOST_CONTROL_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.HostControl", NULL);
-}
-
-/**
- * host_control_proxy_new_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to host_control_proxy_new().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with host_control_proxy_new().
- *
- * Returns: (transfer full) (type HostControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-HostControl *
-host_control_proxy_new_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return HOST_CONTROL (ret);
-  else
-    return NULL;
-}
-
-/**
- * host_control_proxy_new_sync:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>. See g_dbus_proxy_new_sync() for more details.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See host_control_proxy_new() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type HostControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-HostControl *
-host_control_proxy_new_sync (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_HOST_CONTROL_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.HostControl", NULL);
-  if (ret != NULL)
-    return HOST_CONTROL (ret);
-  else
-    return NULL;
-}
-
-
-/**
- * host_control_proxy_new_for_bus:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Like host_control_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call host_control_proxy_new_for_bus_finish() to get the result of the operation.
- *
- * See host_control_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
- */
-void
-host_control_proxy_new_for_bus (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data)
-{
-  g_async_initable_new_async (TYPE_HOST_CONTROL_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.HostControl", NULL);
-}
-
-/**
- * host_control_proxy_new_for_bus_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to host_control_proxy_new_for_bus().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with host_control_proxy_new_for_bus().
- *
- * Returns: (transfer full) (type HostControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-HostControl *
-host_control_proxy_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return HOST_CONTROL (ret);
-  else
-    return NULL;
-}
-
-/**
- * host_control_proxy_new_for_bus_sync:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Like host_control_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See host_control_proxy_new_for_bus() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type HostControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-HostControl *
-host_control_proxy_new_for_bus_sync (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_HOST_CONTROL_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.HostControl", NULL);
-  if (ret != NULL)
-    return HOST_CONTROL (ret);
-  else
-    return NULL;
-}
-
-
-/* ------------------------------------------------------------------------ */
-
-/**
- * HostControlSkeleton:
- *
- * The #HostControlSkeleton structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * HostControlSkeletonClass:
- * @parent_class: The parent class.
- *
- * Class structure for #HostControlSkeleton.
- */
-
-struct _HostControlSkeletonPrivate
-{
-  GValue *properties;
-  GList *changed_properties;
-  GSource *changed_properties_idle_source;
-  GMainContext *context;
-  GMutex lock;
-};
-
-static void
-_host_control_skeleton_handle_method_call (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name,
-  const gchar *method_name,
-  GVariant *parameters,
-  GDBusMethodInvocation *invocation,
-  gpointer user_data)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (user_data);
-  _ExtendedGDBusMethodInfo *info;
-  GVariantIter iter;
-  GVariant *child;
-  GValue *paramv;
-  guint num_params;
-  guint num_extra;
-  guint n;
-  guint signal_id;
-  GValue return_value = G_VALUE_INIT;
-  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
-  g_assert (info != NULL);
-  num_params = g_variant_n_children (parameters);
-  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
-  n = 0;
-  g_value_init (&paramv[n], TYPE_HOST_CONTROL);
-  g_value_set_object (&paramv[n++], skeleton);
-  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
-  g_value_set_object (&paramv[n++], invocation);
-  if (info->pass_fdlist)
-    {
-#ifdef G_OS_UNIX
-      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
-      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
-#else
-      g_assert_not_reached ();
-#endif
-    }
-  g_variant_iter_init (&iter, parameters);
-  while ((child = g_variant_iter_next_value (&iter)) != NULL)
-    {
-      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
-      if (arg_info->use_gvariant)
-        {
-          g_value_init (&paramv[n], G_TYPE_VARIANT);
-          g_value_set_variant (&paramv[n], child);
-          n++;
-        }
-      else
-        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
-      g_variant_unref (child);
-    }
-  signal_id = g_signal_lookup (info->signal_name, TYPE_HOST_CONTROL);
-  g_value_init (&return_value, G_TYPE_BOOLEAN);
-  g_signal_emitv (paramv, signal_id, 0, &return_value);
-  if (!g_value_get_boolean (&return_value))
-    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
-  g_value_unset (&return_value);
-  for (n = 0; n < num_params + num_extra; n++)
-    g_value_unset (&paramv[n]);
-  g_free (paramv);
-}
-
-static GVariant *
-_host_control_skeleton_handle_get_property (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name G_GNUC_UNUSED,
-  const gchar *property_name,
-  GError **error,
-  gpointer user_data)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (user_data);
-  GValue value = G_VALUE_INIT;
-  GParamSpec *pspec;
-  _ExtendedGDBusPropertyInfo *info;
-  GVariant *ret;
-  ret = NULL;
-  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct, property_name);
-  g_assert (info != NULL);
-  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
-  if (pspec == NULL)
-    {
-      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
-    }
-  else
-    {
-      g_value_init (&value, pspec->value_type);
-      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
-      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
-      g_value_unset (&value);
-    }
-  return ret;
-}
-
-static gboolean
-_host_control_skeleton_handle_set_property (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name G_GNUC_UNUSED,
-  const gchar *property_name,
-  GVariant *variant,
-  GError **error,
-  gpointer user_data)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (user_data);
-  GValue value = G_VALUE_INIT;
-  GParamSpec *pspec;
-  _ExtendedGDBusPropertyInfo *info;
-  gboolean ret;
-  ret = FALSE;
-  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_host_control_interface_info.parent_struct, property_name);
-  g_assert (info != NULL);
-  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
-  if (pspec == NULL)
-    {
-      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
-    }
-  else
-    {
-      if (info->use_gvariant)
-        g_value_set_variant (&value, variant);
-      else
-        g_dbus_gvariant_to_gvalue (variant, &value);
-      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
-      g_value_unset (&value);
-      ret = TRUE;
-    }
-  return ret;
-}
-
-static const GDBusInterfaceVTable _host_control_skeleton_vtable =
-{
-  _host_control_skeleton_handle_method_call,
-  _host_control_skeleton_handle_get_property,
-  _host_control_skeleton_handle_set_property,
-  {NULL}
-};
-
-static GDBusInterfaceInfo *
-host_control_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
-{
-  return host_control_interface_info ();
-}
-
-static GDBusInterfaceVTable *
-host_control_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
-{
-  return (GDBusInterfaceVTable *) &_host_control_skeleton_vtable;
-}
-
-static GVariant *
-host_control_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (_skeleton);
-
-  GVariantBuilder builder;
-  guint n;
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-  if (_host_control_interface_info.parent_struct.properties == NULL)
-    goto out;
-  for (n = 0; _host_control_interface_info.parent_struct.properties[n] != NULL; n++)
-    {
-      GDBusPropertyInfo *info = _host_control_interface_info.parent_struct.properties[n];
-      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
-        {
-          GVariant *value;
-          value = _host_control_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.HostControl", info->name, NULL, skeleton);
-          if (value != NULL)
-            {
-              g_variant_take_ref (value);
-              g_variant_builder_add (&builder, "{sv}", info->name, value);
-              g_variant_unref (value);
-            }
-        }
-    }
-out:
-  return g_variant_builder_end (&builder);
-}
-
-static void
-host_control_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
-{
-}
-
-static void
-_host_control_on_signal_booted (
-    HostControl *object)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (object);
-
-  GList      *connections, *l;
-  GVariant   *signal_variant;
-  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
-
-  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
-  for (l = connections; l != NULL; l = l->next)
-    {
-      GDBusConnection *connection = l->data;
-      g_dbus_connection_emit_signal (connection,
-        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.HostControl", "booted",
-        signal_variant, NULL);
-    }
-  g_variant_unref (signal_variant);
-  g_list_free_full (connections, g_object_unref);
-}
-
-static void host_control_skeleton_iface_init (HostControlIface *iface);
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-G_DEFINE_TYPE_WITH_CODE (HostControlSkeleton, host_control_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
-                         G_ADD_PRIVATE (HostControlSkeleton)
-                         G_IMPLEMENT_INTERFACE (TYPE_HOST_CONTROL, host_control_skeleton_iface_init));
-
-#else
-G_DEFINE_TYPE_WITH_CODE (HostControlSkeleton, host_control_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
-                         G_IMPLEMENT_INTERFACE (TYPE_HOST_CONTROL, host_control_skeleton_iface_init));
-
-#endif
-static void
-host_control_skeleton_finalize (GObject *object)
-{
-  HostControlSkeleton *skeleton = HOST_CONTROL_SKELETON (object);
-  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
-  if (skeleton->priv->changed_properties_idle_source != NULL)
-    g_source_destroy (skeleton->priv->changed_properties_idle_source);
-  g_main_context_unref (skeleton->priv->context);
-  g_mutex_clear (&skeleton->priv->lock);
-  G_OBJECT_CLASS (host_control_skeleton_parent_class)->finalize (object);
-}
-
-static void
-host_control_skeleton_init (HostControlSkeleton *skeleton)
-{
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-  skeleton->priv = host_control_skeleton_get_instance_private (skeleton);
-#else
-  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_HOST_CONTROL_SKELETON, HostControlSkeletonPrivate);
-#endif
-
-  g_mutex_init (&skeleton->priv->lock);
-  skeleton->priv->context = g_main_context_ref_thread_default ();
-}
-
-static void
-host_control_skeleton_class_init (HostControlSkeletonClass *klass)
-{
-  GObjectClass *gobject_class;
-  GDBusInterfaceSkeletonClass *skeleton_class;
-
-  gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize = host_control_skeleton_finalize;
-
-  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
-  skeleton_class->get_info = host_control_skeleton_dbus_interface_get_info;
-  skeleton_class->get_properties = host_control_skeleton_dbus_interface_get_properties;
-  skeleton_class->flush = host_control_skeleton_dbus_interface_flush;
-  skeleton_class->get_vtable = host_control_skeleton_dbus_interface_get_vtable;
-
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-  g_type_class_add_private (klass, sizeof (HostControlSkeletonPrivate));
-#endif
-}
-
-static void
-host_control_skeleton_iface_init (HostControlIface *iface)
-{
-  iface->booted = _host_control_on_signal_booted;
-}
-
-/**
- * host_control_skeleton_new:
- *
- * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>.
- *
- * Returns: (transfer full) (type HostControlSkeleton): The skeleton object.
- */
-HostControl *
-host_control_skeleton_new (void)
-{
-  return HOST_CONTROL (g_object_new (TYPE_HOST_CONTROL_SKELETON, NULL));
-}
-
-/* ------------------------------------------------------------------------
- * Code for Object, ObjectProxy and ObjectSkeleton
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:Object
- * @title: Object
- * @short_description: Specialized GDBusObject types
- *
- * This section contains the #Object, #ObjectProxy, and #ObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.
- */
-
-/**
- * Object:
- *
- * The #Object type is a specialized container of interfaces.
- */
-
-/**
- * ObjectIface:
- * @parent_iface: The parent interface.
- *
- * Virtual table for the #Object interface.
- */
-
-typedef ObjectIface ObjectInterface;
-G_DEFINE_INTERFACE_WITH_CODE (Object, object, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));
-
-static void
-object_default_init (ObjectIface *iface)
-{
-  /**
-   * Object:host-control:
-   *
-   * The #HostControl instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link>, if any.
-   *
-   * Connect to the #GObject::notify signal to get informed of property changes.
-   */
-  g_object_interface_install_property (iface, g_param_spec_object ("host-control", "host-control", "host-control", TYPE_HOST_CONTROL, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
-
-}
-
-/**
- * object_get_host_control:
- * @object: A #Object.
- *
- * Gets the #HostControl instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link> on @object, if any.
- *
- * Returns: (transfer full): A #HostControl that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
- */
-HostControl *object_get_host_control (Object *object)
-{
-  GDBusInterface *ret;
-  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.HostControl");
-  if (ret == NULL)
-    return NULL;
-  return HOST_CONTROL (ret);
-}
-
-
-/**
- * object_peek_host_control: (skip)
- * @object: A #Object.
- *
- * Like object_get_host_control() but doesn't increase the reference count on the returned object.
- *
- * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
- *
- * Returns: (transfer none): A #HostControl or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
- */
-HostControl *object_peek_host_control (Object *object)
-{
-  GDBusInterface *ret;
-  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.HostControl");
-  if (ret == NULL)
-    return NULL;
-  g_object_unref (ret);
-  return HOST_CONTROL (ret);
-}
-
-
-static void
-object_notify (GDBusObject *object, GDBusInterface *interface)
-{
-  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);
-  /* info can be NULL if the other end is using a D-Bus interface we don't know
-   * anything about, for example old generated code in this process talking to
-   * newer generated code in the other process. */
-  if (info != NULL)
-    g_object_notify (G_OBJECT (object), info->hyphen_name);
-}
-
-/**
- * ObjectProxy:
- *
- * The #ObjectProxy structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectProxyClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectProxy.
- */
-
-static void
-object_proxy__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
-{
-}
-
-static void
-object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)
-{
-  iface->interface_added = object_notify;
-  iface->interface_removed = object_notify;
-}
-
-
-G_DEFINE_TYPE_WITH_CODE (ObjectProxy, object_proxy, G_TYPE_DBUS_OBJECT_PROXY,
-                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_proxy__object_iface_init)
-                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_proxy__g_dbus_object_iface_init));
-
-static void
-object_proxy_init (ObjectProxy *object G_GNUC_UNUSED)
-{
-}
-
-static void
-object_proxy_set_property (GObject      *gobject,
-  guint         prop_id,
-  const GValue *value G_GNUC_UNUSED,
-  GParamSpec   *pspec)
-{
-  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-}
-
-static void
-object_proxy_get_property (GObject      *gobject,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec)
-{
-  ObjectProxy *object = OBJECT_PROXY (gobject);
-  GDBusInterface *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.HostControl");
-      g_value_take_object (value, interface);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_proxy_class_init (ObjectProxyClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-  gobject_class->set_property = object_proxy_set_property;
-  gobject_class->get_property = object_proxy_get_property;
-
-  g_object_class_override_property (gobject_class, 1, "host-control");
-}
-
-/**
- * object_proxy_new:
- * @connection: A #GDBusConnection.
- * @object_path: An object path.
- *
- * Creates a new proxy object.
- *
- * Returns: (transfer full): The proxy object.
- */
-ObjectProxy *
-object_proxy_new (GDBusConnection *connection,
-  const gchar *object_path)
-{
-  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
-  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
-  return OBJECT_PROXY (g_object_new (TYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));
-}
-
-/**
- * ObjectSkeleton:
- *
- * The #ObjectSkeleton structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectSkeletonClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectSkeleton.
- */
-
-static void
-object_skeleton__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
-{
-}
-
-
-static void
-object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)
-{
-  iface->interface_added = object_notify;
-  iface->interface_removed = object_notify;
-}
-
-G_DEFINE_TYPE_WITH_CODE (ObjectSkeleton, object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,
-                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_skeleton__object_iface_init)
-                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_skeleton__g_dbus_object_iface_init));
-
-static void
-object_skeleton_init (ObjectSkeleton *object G_GNUC_UNUSED)
-{
-}
-
-static void
-object_skeleton_set_property (GObject      *gobject,
-  guint         prop_id,
-  const GValue *value,
-  GParamSpec   *pspec)
-{
-  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
-  GDBusInterfaceSkeleton *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_value_get_object (value);
-      if (interface != NULL)
-        {
-          g_warn_if_fail (IS_HOST_CONTROL (interface));
-          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
-        }
-      else
-        {
-          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.HostControl");
-        }
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_skeleton_get_property (GObject      *gobject,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec)
-{
-  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
-  GDBusInterface *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.HostControl");
-      g_value_take_object (value, interface);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_skeleton_class_init (ObjectSkeletonClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-  gobject_class->set_property = object_skeleton_set_property;
-  gobject_class->get_property = object_skeleton_get_property;
-
-  g_object_class_override_property (gobject_class, 1, "host-control");
-}
-
-/**
- * object_skeleton_new:
- * @object_path: An object path.
- *
- * Creates a new skeleton object.
- *
- * Returns: (transfer full): The skeleton object.
- */
-ObjectSkeleton *
-object_skeleton_new (const gchar *object_path)
-{
-  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
-  return OBJECT_SKELETON (g_object_new (TYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));
-}
-
-/**
- * object_skeleton_set_host_control:
- * @object: A #ObjectSkeleton.
- * @interface_: (allow-none): A #HostControl or %NULL to clear the interface.
- *
- * Sets the #HostControl instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-HostControl.top_of_page">org.openbmc.HostControl</link> on @object.
- */
-void object_skeleton_set_host_control (ObjectSkeleton *object, HostControl *interface_)
-{
-  g_object_set (G_OBJECT (object), "host-control", interface_, NULL);
-}
-
-
-/* ------------------------------------------------------------------------
- * Code for ObjectManager client
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:ObjectManagerClient
- * @title: ObjectManagerClient
- * @short_description: Generated GDBusObjectManagerClient type
- *
- * This section contains a #GDBusObjectManagerClient that uses object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.
- */
-
-/**
- * ObjectManagerClient:
- *
- * The #ObjectManagerClient structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectManagerClientClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectManagerClient.
- */
-
-G_DEFINE_TYPE (ObjectManagerClient, object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);
-
-static void
-object_manager_client_init (ObjectManagerClient *manager G_GNUC_UNUSED)
-{
-}
-
-static void
-object_manager_client_class_init (ObjectManagerClientClass *klass G_GNUC_UNUSED)
-{
-}
-
-/**
- * object_manager_client_get_proxy_type:
- * @manager: A #GDBusObjectManagerClient.
- * @object_path: The object path of the remote object (unused).
- * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy #GType.
- * @user_data: User data (unused).
- *
- * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and #GDBusProxy<!-- -->-derived types.
- *
- * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for #ObjectProxy.
- */
-GType
-object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar *object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)
-{
-  static gsize once_init_value = 0;
-  static GHashTable *lookup_hash;
-  GType ret;
-
-  if (interface_name == NULL)
-    return TYPE_OBJECT_PROXY;
-  if (g_once_init_enter (&once_init_value))
-    {
-      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);
-      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.HostControl", GSIZE_TO_POINTER (TYPE_HOST_CONTROL_PROXY));
-      g_once_init_leave (&once_init_value, 1);
-    }
-  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));
-  if (ret == (GType) 0)
-    ret = G_TYPE_DBUS_PROXY;
-  return ret;
-}
-
-/**
- * object_manager_client_new:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call object_manager_client_new_finish() to get the result of the operation.
- *
- * See object_manager_client_new_sync() for the synchronous, blocking version of this constructor.
- */
-void
-object_manager_client_new (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data)
-{
-  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-}
-
-/**
- * object_manager_client_new_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with object_manager_client_new().
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-/**
- * object_manager_client_new_sync:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Synchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See object_manager_client_new() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_sync (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-
-/**
- * object_manager_client_new_for_bus:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Like object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call object_manager_client_new_for_bus_finish() to get the result of the operation.
- *
- * See object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.
- */
-void
-object_manager_client_new_for_bus (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data)
-{
-  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-}
-
-/**
- * object_manager_client_new_for_bus_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new_for_bus().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with object_manager_client_new_for_bus().
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-/**
- * object_manager_client_new_for_bus_sync:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Like object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See object_manager_client_new_for_bus() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_for_bus_sync (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-
diff --git a/interfaces/host_control.h b/interfaces/host_control.h
deleted file mode 100644
index ccbd7cf..0000000
--- a/interfaces/host_control.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
- *
- * The license of this code is the same as for the source it was derived from.
- */
-
-#ifndef __INTERFACES_HOST_CONTROL_H__
-#define __INTERFACES_HOST_CONTROL_H__
-
-#include <gio/gio.h>
-
-G_BEGIN_DECLS
-
-
-/* ------------------------------------------------------------------------ */
-/* Declarations for org.openbmc.HostControl */
-
-#define TYPE_HOST_CONTROL (host_control_get_type ())
-#define HOST_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_HOST_CONTROL, HostControl))
-#define IS_HOST_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_HOST_CONTROL))
-#define HOST_CONTROL_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_HOST_CONTROL, HostControlIface))
-
-struct _HostControl;
-typedef struct _HostControl HostControl;
-typedef struct _HostControlIface HostControlIface;
-
-struct _HostControlIface
-{
-  GTypeInterface parent_iface;
-
-
-  gboolean (*handle_boot) (
-    HostControl *object,
-    GDBusMethodInvocation *invocation);
-
-  gboolean (*handle_shutdown) (
-    HostControl *object,
-    GDBusMethodInvocation *invocation);
-
-  void (*booted) (
-    HostControl *object);
-
-};
-
-GType host_control_get_type (void) G_GNUC_CONST;
-
-GDBusInterfaceInfo *host_control_interface_info (void);
-guint host_control_override_properties (GObjectClass *klass, guint property_id_begin);
-
-
-/* D-Bus method call completion functions: */
-void host_control_complete_boot (
-    HostControl *object,
-    GDBusMethodInvocation *invocation);
-
-void host_control_complete_shutdown (
-    HostControl *object,
-    GDBusMethodInvocation *invocation);
-
-
-
-/* D-Bus signal emissions functions: */
-void host_control_emit_booted (
-    HostControl *object);
-
-
-
-/* D-Bus method calls: */
-void host_control_call_boot (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data);
-
-gboolean host_control_call_boot_finish (
-    HostControl *proxy,
-    GAsyncResult *res,
-    GError **error);
-
-gboolean host_control_call_boot_sync (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GError **error);
-
-void host_control_call_shutdown (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data);
-
-gboolean host_control_call_shutdown_finish (
-    HostControl *proxy,
-    GAsyncResult *res,
-    GError **error);
-
-gboolean host_control_call_shutdown_sync (
-    HostControl *proxy,
-    GCancellable *cancellable,
-    GError **error);
-
-
-
-/* ---- */
-
-#define TYPE_HOST_CONTROL_PROXY (host_control_proxy_get_type ())
-#define HOST_CONTROL_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_HOST_CONTROL_PROXY, HostControlProxy))
-#define HOST_CONTROL_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_HOST_CONTROL_PROXY, HostControlProxyClass))
-#define HOST_CONTROL_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_HOST_CONTROL_PROXY, HostControlProxyClass))
-#define IS_HOST_CONTROL_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_HOST_CONTROL_PROXY))
-#define IS_HOST_CONTROL_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_HOST_CONTROL_PROXY))
-
-typedef struct _HostControlProxy HostControlProxy;
-typedef struct _HostControlProxyClass HostControlProxyClass;
-typedef struct _HostControlProxyPrivate HostControlProxyPrivate;
-
-struct _HostControlProxy
-{
-  /*< private >*/
-  GDBusProxy parent_instance;
-  HostControlProxyPrivate *priv;
-};
-
-struct _HostControlProxyClass
-{
-  GDBusProxyClass parent_class;
-};
-
-GType host_control_proxy_get_type (void) G_GNUC_CONST;
-
-void host_control_proxy_new (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data);
-HostControl *host_control_proxy_new_finish (
-    GAsyncResult        *res,
-    GError             **error);
-HostControl *host_control_proxy_new_sync (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error);
-
-void host_control_proxy_new_for_bus (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data);
-HostControl *host_control_proxy_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error);
-HostControl *host_control_proxy_new_for_bus_sync (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error);
-
-
-/* ---- */
-
-#define TYPE_HOST_CONTROL_SKELETON (host_control_skeleton_get_type ())
-#define HOST_CONTROL_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_HOST_CONTROL_SKELETON, HostControlSkeleton))
-#define HOST_CONTROL_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_HOST_CONTROL_SKELETON, HostControlSkeletonClass))
-#define HOST_CONTROL_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_HOST_CONTROL_SKELETON, HostControlSkeletonClass))
-#define IS_HOST_CONTROL_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_HOST_CONTROL_SKELETON))
-#define IS_HOST_CONTROL_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_HOST_CONTROL_SKELETON))
-
-typedef struct _HostControlSkeleton HostControlSkeleton;
-typedef struct _HostControlSkeletonClass HostControlSkeletonClass;
-typedef struct _HostControlSkeletonPrivate HostControlSkeletonPrivate;
-
-struct _HostControlSkeleton
-{
-  /*< private >*/
-  GDBusInterfaceSkeleton parent_instance;
-  HostControlSkeletonPrivate *priv;
-};
-
-struct _HostControlSkeletonClass
-{
-  GDBusInterfaceSkeletonClass parent_class;
-};
-
-GType host_control_skeleton_get_type (void) G_GNUC_CONST;
-
-HostControl *host_control_skeleton_new (void);
-
-
-/* ---- */
-
-#define TYPE_OBJECT (object_get_type ())
-#define OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT, Object))
-#define IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT))
-#define OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_OBJECT, Object))
-
-struct _Object;
-typedef struct _Object Object;
-typedef struct _ObjectIface ObjectIface;
-
-struct _ObjectIface
-{
-  GTypeInterface parent_iface;
-};
-
-GType object_get_type (void) G_GNUC_CONST;
-
-HostControl *object_get_host_control (Object *object);
-HostControl *object_peek_host_control (Object *object);
-
-#define TYPE_OBJECT_PROXY (object_proxy_get_type ())
-#define OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_PROXY, ObjectProxy))
-#define OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_PROXY, ObjectProxyClass))
-#define OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_PROXY, ObjectProxyClass))
-#define IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_PROXY))
-#define IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_PROXY))
-
-typedef struct _ObjectProxy ObjectProxy;
-typedef struct _ObjectProxyClass ObjectProxyClass;
-typedef struct _ObjectProxyPrivate ObjectProxyPrivate;
-
-struct _ObjectProxy
-{
-  /*< private >*/
-  GDBusObjectProxy parent_instance;
-  ObjectProxyPrivate *priv;
-};
-
-struct _ObjectProxyClass
-{
-  GDBusObjectProxyClass parent_class;
-};
-
-GType object_proxy_get_type (void) G_GNUC_CONST;
-ObjectProxy *object_proxy_new (GDBusConnection *connection, const gchar *object_path);
-
-#define TYPE_OBJECT_SKELETON (object_skeleton_get_type ())
-#define OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_SKELETON, ObjectSkeleton))
-#define OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
-#define OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
-#define IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_SKELETON))
-#define IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_SKELETON))
-
-typedef struct _ObjectSkeleton ObjectSkeleton;
-typedef struct _ObjectSkeletonClass ObjectSkeletonClass;
-typedef struct _ObjectSkeletonPrivate ObjectSkeletonPrivate;
-
-struct _ObjectSkeleton
-{
-  /*< private >*/
-  GDBusObjectSkeleton parent_instance;
-  ObjectSkeletonPrivate *priv;
-};
-
-struct _ObjectSkeletonClass
-{
-  GDBusObjectSkeletonClass parent_class;
-};
-
-GType object_skeleton_get_type (void) G_GNUC_CONST;
-ObjectSkeleton *object_skeleton_new (const gchar *object_path);
-void object_skeleton_set_host_control (ObjectSkeleton *object, HostControl *interface_);
-
-/* ---- */
-
-#define TYPE_OBJECT_MANAGER_CLIENT (object_manager_client_get_type ())
-#define OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClient))
-#define OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
-#define OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
-#define IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_MANAGER_CLIENT))
-#define IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_MANAGER_CLIENT))
-
-typedef struct _ObjectManagerClient ObjectManagerClient;
-typedef struct _ObjectManagerClientClass ObjectManagerClientClass;
-typedef struct _ObjectManagerClientPrivate ObjectManagerClientPrivate;
-
-struct _ObjectManagerClient
-{
-  /*< private >*/
-  GDBusObjectManagerClient parent_instance;
-  ObjectManagerClientPrivate *priv;
-};
-
-struct _ObjectManagerClientClass
-{
-  GDBusObjectManagerClientClass parent_class;
-};
-
-GType object_manager_client_get_type (void) G_GNUC_CONST;
-
-GType object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);
-
-void object_manager_client_new (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data);
-GDBusObjectManager *object_manager_client_new_finish (
-    GAsyncResult        *res,
-    GError             **error);
-GDBusObjectManager *object_manager_client_new_sync (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error);
-
-void object_manager_client_new_for_bus (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data);
-GDBusObjectManager *object_manager_client_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error);
-GDBusObjectManager *object_manager_client_new_for_bus_sync (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error);
-
-
-G_END_DECLS
-
-#endif /* __INTERFACES_HOST_CONTROL_H__ */
diff --git a/interfaces/power_control.c b/interfaces/power_control.c
index ea1ce08..1680b95 100644
--- a/interfaces/power_control.c
+++ b/interfaces/power_control.c
@@ -1,2308 +1,2308 @@
-/*
- * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
- *
- * The license of this code is the same as for the source it was derived from.
- */
-
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include "interfaces/power_control.h"
-
-#include <string.h>
-#ifdef G_OS_UNIX
-#  include <gio/gunixfdlist.h>
-#endif
-
-typedef struct
-{
-  GDBusArgInfo parent_struct;
-  gboolean use_gvariant;
-} _ExtendedGDBusArgInfo;
-
-typedef struct
-{
-  GDBusMethodInfo parent_struct;
-  const gchar *signal_name;
-  gboolean pass_fdlist;
-} _ExtendedGDBusMethodInfo;
-
-typedef struct
-{
-  GDBusSignalInfo parent_struct;
-  const gchar *signal_name;
-} _ExtendedGDBusSignalInfo;
-
-typedef struct
-{
-  GDBusPropertyInfo parent_struct;
-  const gchar *hyphen_name;
-  gboolean use_gvariant;
-} _ExtendedGDBusPropertyInfo;
-
-typedef struct
-{
-  GDBusInterfaceInfo parent_struct;
-  const gchar *hyphen_name;
-} _ExtendedGDBusInterfaceInfo;
-
-typedef struct
-{
-  const _ExtendedGDBusPropertyInfo *info;
-  guint prop_id;
-  GValue orig_value; /* the value before the change */
-} ChangedProperty;
-
-static void
-_changed_property_free (ChangedProperty *data)
-{
-  g_value_unset (&data->orig_value);
-  g_free (data);
-}
-
-static gboolean
-_g_strv_equal0 (gchar **a, gchar **b)
-{
-  gboolean ret = FALSE;
-  guint n;
-  if (a == NULL && b == NULL)
-    {
-      ret = TRUE;
-      goto out;
-    }
-  if (a == NULL || b == NULL)
-    goto out;
-  if (g_strv_length (a) != g_strv_length (b))
-    goto out;
-  for (n = 0; a[n] != NULL; n++)
-    if (g_strcmp0 (a[n], b[n]) != 0)
-      goto out;
-  ret = TRUE;
-out:
-  return ret;
-}
-
-static gboolean
-_g_variant_equal0 (GVariant *a, GVariant *b)
-{
-  gboolean ret = FALSE;
-  if (a == NULL && b == NULL)
-    {
-      ret = TRUE;
-      goto out;
-    }
-  if (a == NULL || b == NULL)
-    goto out;
-  ret = g_variant_equal (a, b);
-out:
-  return ret;
-}
-
-G_GNUC_UNUSED static gboolean
-_g_value_equal (const GValue *a, const GValue *b)
-{
-  gboolean ret = FALSE;
-  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
-  switch (G_VALUE_TYPE (a))
-    {
-      case G_TYPE_BOOLEAN:
-        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
-        break;
-      case G_TYPE_UCHAR:
-        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
-        break;
-      case G_TYPE_INT:
-        ret = (g_value_get_int (a) == g_value_get_int (b));
-        break;
-      case G_TYPE_UINT:
-        ret = (g_value_get_uint (a) == g_value_get_uint (b));
-        break;
-      case G_TYPE_INT64:
-        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
-        break;
-      case G_TYPE_UINT64:
-        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
-        break;
-      case G_TYPE_DOUBLE:
-        {
-          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
-          gdouble da = g_value_get_double (a);
-          gdouble db = g_value_get_double (b);
-          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
-        }
-        break;
-      case G_TYPE_STRING:
-        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
-        break;
-      case G_TYPE_VARIANT:
-        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
-        break;
-      default:
-        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
-          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
-        else
-          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
-        break;
-    }
-  return ret;
-}
-
-/* ------------------------------------------------------------------------
- * Code for interface org.openbmc.PowerControl
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:PowerControl
- * @title: PowerControl
- * @short_description: Generated C code for the org.openbmc.PowerControl D-Bus interface
- *
- * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link> D-Bus interface in C.
- */
-
-/* ---- Introspection data for org.openbmc.PowerControl ---- */
-
-static const _ExtendedGDBusArgInfo _power_control_method_info_set_power_state_IN_ARG_state =
-{
-  {
-    -1,
-    (gchar *) "state",
-    (gchar *) "i",
-    NULL
-  },
-  FALSE
-};
-
-static const _ExtendedGDBusArgInfo * const _power_control_method_info_set_power_state_IN_ARG_pointers[] =
-{
-  &_power_control_method_info_set_power_state_IN_ARG_state,
-  NULL
-};
-
-static const _ExtendedGDBusMethodInfo _power_control_method_info_set_power_state =
-{
-  {
-    -1,
-    (gchar *) "setPowerState",
-    (GDBusArgInfo **) &_power_control_method_info_set_power_state_IN_ARG_pointers,
-    NULL,
-    NULL
-  },
-  "handle-set-power-state",
-  FALSE
-};
-
-static const _ExtendedGDBusArgInfo _power_control_method_info_get_power_state_OUT_ARG_state =
-{
-  {
-    -1,
-    (gchar *) "state",
-    (gchar *) "i",
-    NULL
-  },
-  FALSE
-};
-
-static const _ExtendedGDBusArgInfo * const _power_control_method_info_get_power_state_OUT_ARG_pointers[] =
-{
-  &_power_control_method_info_get_power_state_OUT_ARG_state,
-  NULL
-};
-
-static const _ExtendedGDBusMethodInfo _power_control_method_info_get_power_state =
-{
-  {
-    -1,
-    (gchar *) "getPowerState",
-    NULL,
-    (GDBusArgInfo **) &_power_control_method_info_get_power_state_OUT_ARG_pointers,
-    NULL
-  },
-  "handle-get-power-state",
-  FALSE
-};
-
-static const _ExtendedGDBusMethodInfo * const _power_control_method_info_pointers[] =
-{
-  &_power_control_method_info_set_power_state,
-  &_power_control_method_info_get_power_state,
-  NULL
-};
-
-static const _ExtendedGDBusSignalInfo _power_control_signal_info_power_good =
-{
-  {
-    -1,
-    (gchar *) "PowerGood",
-    NULL,
-    NULL
-  },
-  "power-good"
-};
-
-static const _ExtendedGDBusSignalInfo _power_control_signal_info_power_lost =
-{
-  {
-    -1,
-    (gchar *) "PowerLost",
-    NULL,
-    NULL
-  },
-  "power-lost"
-};
-
-static const _ExtendedGDBusSignalInfo * const _power_control_signal_info_pointers[] =
-{
-  &_power_control_signal_info_power_good,
-  &_power_control_signal_info_power_lost,
-  NULL
-};
-
-static const _ExtendedGDBusPropertyInfo _power_control_property_info_pgood =
-{
-  {
-    -1,
-    (gchar *) "pgood",
-    (gchar *) "i",
-    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
-    NULL
-  },
-  "pgood",
-  FALSE
-};
-
-static const _ExtendedGDBusPropertyInfo _power_control_property_info_state =
-{
-  {
-    -1,
-    (gchar *) "state",
-    (gchar *) "i",
-    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
-    NULL
-  },
-  "state",
-  FALSE
-};
-
-static const _ExtendedGDBusPropertyInfo * const _power_control_property_info_pointers[] =
-{
-  &_power_control_property_info_pgood,
-  &_power_control_property_info_state,
-  NULL
-};
-
-static const _ExtendedGDBusInterfaceInfo _power_control_interface_info =
-{
-  {
-    -1,
-    (gchar *) "org.openbmc.PowerControl",
-    (GDBusMethodInfo **) &_power_control_method_info_pointers,
-    (GDBusSignalInfo **) &_power_control_signal_info_pointers,
-    (GDBusPropertyInfo **) &_power_control_property_info_pointers,
-    NULL
-  },
-  "power-control",
-};
-
-
-/**
- * power_control_interface_info:
- *
- * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link> D-Bus interface.
- *
- * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
- */
-GDBusInterfaceInfo *
-power_control_interface_info (void)
-{
-  return (GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct;
-}
-
-/**
- * power_control_override_properties:
- * @klass: The class structure for a #GObject<!-- -->-derived class.
- * @property_id_begin: The property id to assign to the first overridden property.
- *
- * Overrides all #GObject properties in the #PowerControl interface for a concrete class.
- * The properties are overridden in the order they are defined.
- *
- * Returns: The last property id.
- */
-guint
-power_control_override_properties (GObjectClass *klass, guint property_id_begin)
-{
-  g_object_class_override_property (klass, property_id_begin++, "pgood");
-  g_object_class_override_property (klass, property_id_begin++, "state");
-  return property_id_begin - 1;
-}
-
-
-
-/**
- * PowerControl:
- *
- * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>.
- */
-
-/**
- * PowerControlIface:
- * @parent_iface: The parent interface.
- * @handle_get_power_state: Handler for the #PowerControl::handle-get-power-state signal.
- * @handle_set_power_state: Handler for the #PowerControl::handle-set-power-state signal.
- * @get_pgood: Getter for the #PowerControl:pgood property.
- * @get_state: Getter for the #PowerControl:state property.
- * @power_good: Handler for the #PowerControl::power-good signal.
- * @power_lost: Handler for the #PowerControl::power-lost signal.
- *
- * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>.
- */
-
-typedef PowerControlIface PowerControlInterface;
-G_DEFINE_INTERFACE (PowerControl, power_control, G_TYPE_OBJECT);
-
-static void
-power_control_default_init (PowerControlIface *iface)
-{
-  /* GObject signals for incoming D-Bus method calls: */
-  /**
-   * PowerControl::handle-set-power-state:
-   * @object: A #PowerControl.
-   * @invocation: A #GDBusMethodInvocation.
-   * @arg_state: Argument passed by remote caller.
-   *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-PowerControl.setPowerState">setPowerState()</link> D-Bus method.
-   *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call power_control_complete_set_power_state() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
-   *
-   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
-   */
-  g_signal_new ("handle-set-power-state",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (PowerControlIface, handle_set_power_state),
-    g_signal_accumulator_true_handled,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_BOOLEAN,
-    2,
-    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT);
-
-  /**
-   * PowerControl::handle-get-power-state:
-   * @object: A #PowerControl.
-   * @invocation: A #GDBusMethodInvocation.
-   *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-PowerControl.getPowerState">getPowerState()</link> D-Bus method.
-   *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call power_control_complete_get_power_state() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
-   *
-   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
-   */
-  g_signal_new ("handle-get-power-state",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (PowerControlIface, handle_get_power_state),
-    g_signal_accumulator_true_handled,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_BOOLEAN,
-    1,
-    G_TYPE_DBUS_METHOD_INVOCATION);
-
-  /* GObject signals for received D-Bus signals: */
-  /**
-   * PowerControl::power-good:
-   * @object: A #PowerControl.
-   *
-   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-PowerControl.PowerGood">"PowerGood"</link> is received.
-   *
-   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
-   */
-  g_signal_new ("power-good",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (PowerControlIface, power_good),
-    NULL,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_NONE,
-    0);
-
-  /**
-   * PowerControl::power-lost:
-   * @object: A #PowerControl.
-   *
-   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-PowerControl.PowerLost">"PowerLost"</link> is received.
-   *
-   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
-   */
-  g_signal_new ("power-lost",
-    G_TYPE_FROM_INTERFACE (iface),
-    G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (PowerControlIface, power_lost),
-    NULL,
-    NULL,
-    g_cclosure_marshal_generic,
-    G_TYPE_NONE,
-    0);
-
-  /* GObject properties for D-Bus properties: */
-  /**
-   * PowerControl:pgood:
-   *
-   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-PowerControl.pgood">"pgood"</link>.
-   *
-   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
-   */
-  g_object_interface_install_property (iface,
-    g_param_spec_int ("pgood", "pgood", "pgood", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  /**
-   * PowerControl:state:
-   *
-   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-PowerControl.state">"state"</link>.
-   *
-   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
-   */
-  g_object_interface_install_property (iface,
-    g_param_spec_int ("state", "state", "state", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/**
- * power_control_get_pgood: (skip)
- * @object: A #PowerControl.
- *
- * Gets the value of the <link linkend="gdbus-property-org-openbmc-PowerControl.pgood">"pgood"</link> D-Bus property.
- *
- * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
- *
- * Returns: The property value.
- */
-gint 
-power_control_get_pgood (PowerControl *object)
-{
-  return POWER_CONTROL_GET_IFACE (object)->get_pgood (object);
-}
-
-/**
- * power_control_set_pgood: (skip)
- * @object: A #PowerControl.
- * @value: The value to set.
- *
- * Sets the <link linkend="gdbus-property-org-openbmc-PowerControl.pgood">"pgood"</link> D-Bus property to @value.
- *
- * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
- */
-void
-power_control_set_pgood (PowerControl *object, gint value)
-{
-  g_object_set (G_OBJECT (object), "pgood", value, NULL);
-}
-
-/**
- * power_control_get_state: (skip)
- * @object: A #PowerControl.
- *
- * Gets the value of the <link linkend="gdbus-property-org-openbmc-PowerControl.state">"state"</link> D-Bus property.
- *
- * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
- *
- * Returns: The property value.
- */
-gint 
-power_control_get_state (PowerControl *object)
-{
-  return POWER_CONTROL_GET_IFACE (object)->get_state (object);
-}
-
-/**
- * power_control_set_state: (skip)
- * @object: A #PowerControl.
- * @value: The value to set.
- *
- * Sets the <link linkend="gdbus-property-org-openbmc-PowerControl.state">"state"</link> D-Bus property to @value.
- *
- * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
- */
-void
-power_control_set_state (PowerControl *object, gint value)
-{
-  g_object_set (G_OBJECT (object), "state", value, NULL);
-}
-
-/**
- * power_control_emit_power_good:
- * @object: A #PowerControl.
- *
- * Emits the <link linkend="gdbus-signal-org-openbmc-PowerControl.PowerGood">"PowerGood"</link> D-Bus signal.
- */
-void
-power_control_emit_power_good (
-    PowerControl *object)
-{
-  g_signal_emit_by_name (object, "power-good");
-}
-
-/**
- * power_control_emit_power_lost:
- * @object: A #PowerControl.
- *
- * Emits the <link linkend="gdbus-signal-org-openbmc-PowerControl.PowerLost">"PowerLost"</link> D-Bus signal.
- */
-void
-power_control_emit_power_lost (
-    PowerControl *object)
-{
-  g_signal_emit_by_name (object, "power-lost");
-}
-
-/**
- * power_control_call_set_power_state:
- * @proxy: A #PowerControlProxy.
- * @arg_state: Argument to pass with the method invocation.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-PowerControl.setPowerState">setPowerState()</link> D-Bus method on @proxy.
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call power_control_call_set_power_state_finish() to get the result of the operation.
- *
- * See power_control_call_set_power_state_sync() for the synchronous, blocking version of this method.
- */
-void
-power_control_call_set_power_state (
-    PowerControl *proxy,
-    gint arg_state,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data)
-{
-  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "setPowerState",
-    g_variant_new ("(i)",
-                   arg_state),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    callback,
-    user_data);
-}
-
-/**
- * power_control_call_set_power_state_finish:
- * @proxy: A #PowerControlProxy.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to power_control_call_set_power_state().
- * @error: Return location for error or %NULL.
- *
- * Finishes an operation started with power_control_call_set_power_state().
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-power_control_call_set_power_state_finish (
-    PowerControl *proxy,
-    GAsyncResult *res,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * power_control_call_set_power_state_sync:
- * @proxy: A #PowerControlProxy.
- * @arg_state: Argument to pass with the method invocation.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-PowerControl.setPowerState">setPowerState()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
- *
- * See power_control_call_set_power_state() for the asynchronous version of this method.
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-power_control_call_set_power_state_sync (
-    PowerControl *proxy,
-    gint arg_state,
-    GCancellable *cancellable,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "setPowerState",
-    g_variant_new ("(i)",
-                   arg_state),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "()");
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * power_control_call_get_power_state:
- * @proxy: A #PowerControlProxy.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-PowerControl.getPowerState">getPowerState()</link> D-Bus method on @proxy.
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call power_control_call_get_power_state_finish() to get the result of the operation.
- *
- * See power_control_call_get_power_state_sync() for the synchronous, blocking version of this method.
- */
-void
-power_control_call_get_power_state (
-    PowerControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data)
-{
-  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "getPowerState",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    callback,
-    user_data);
-}
-
-/**
- * power_control_call_get_power_state_finish:
- * @proxy: A #PowerControlProxy.
- * @out_state: (out): Return location for return parameter or %NULL to ignore.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to power_control_call_get_power_state().
- * @error: Return location for error or %NULL.
- *
- * Finishes an operation started with power_control_call_get_power_state().
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-power_control_call_get_power_state_finish (
-    PowerControl *proxy,
-    gint *out_state,
-    GAsyncResult *res,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "(i)",
-                 out_state);
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * power_control_call_get_power_state_sync:
- * @proxy: A #PowerControlProxy.
- * @out_state: (out): Return location for return parameter or %NULL to ignore.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL.
- *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-PowerControl.getPowerState">getPowerState()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
- *
- * See power_control_call_get_power_state() for the asynchronous version of this method.
- *
- * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
- */
-gboolean
-power_control_call_get_power_state_sync (
-    PowerControl *proxy,
-    gint *out_state,
-    GCancellable *cancellable,
-    GError **error)
-{
-  GVariant *_ret;
-  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "getPowerState",
-    g_variant_new ("()"),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    cancellable,
-    error);
-  if (_ret == NULL)
-    goto _out;
-  g_variant_get (_ret,
-                 "(i)",
-                 out_state);
-  g_variant_unref (_ret);
-_out:
-  return _ret != NULL;
-}
-
-/**
- * power_control_complete_set_power_state:
- * @object: A #PowerControl.
- * @invocation: (transfer full): A #GDBusMethodInvocation.
- *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-PowerControl.setPowerState">setPowerState()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
- *
- * This method will free @invocation, you cannot use it afterwards.
- */
-void
-power_control_complete_set_power_state (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation)
-{
-  g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("()"));
-}
-
-/**
- * power_control_complete_get_power_state:
- * @object: A #PowerControl.
- * @invocation: (transfer full): A #GDBusMethodInvocation.
- * @state: Parameter to return.
- *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-PowerControl.getPowerState">getPowerState()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
- *
- * This method will free @invocation, you cannot use it afterwards.
- */
-void
-power_control_complete_get_power_state (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation,
-    gint state)
-{
-  g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("(i)",
-                   state));
-}
-
-/* ------------------------------------------------------------------------ */
-
-/**
- * PowerControlProxy:
- *
- * The #PowerControlProxy structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * PowerControlProxyClass:
- * @parent_class: The parent class.
- *
- * Class structure for #PowerControlProxy.
- */
-
-struct _PowerControlProxyPrivate
-{
-  GData *qdata;
-};
-
-static void power_control_proxy_iface_init (PowerControlIface *iface);
-
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-G_DEFINE_TYPE_WITH_CODE (PowerControlProxy, power_control_proxy, G_TYPE_DBUS_PROXY,
-                         G_ADD_PRIVATE (PowerControlProxy)
-                         G_IMPLEMENT_INTERFACE (TYPE_POWER_CONTROL, power_control_proxy_iface_init));
-
-#else
-G_DEFINE_TYPE_WITH_CODE (PowerControlProxy, power_control_proxy, G_TYPE_DBUS_PROXY,
-                         G_IMPLEMENT_INTERFACE (TYPE_POWER_CONTROL, power_control_proxy_iface_init));
-
-#endif
-static void
-power_control_proxy_finalize (GObject *object)
-{
-  PowerControlProxy *proxy = POWER_CONTROL_PROXY (object);
-  g_datalist_clear (&proxy->priv->qdata);
-  G_OBJECT_CLASS (power_control_proxy_parent_class)->finalize (object);
-}
-
-static void
-power_control_proxy_get_property (GObject      *object,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec G_GNUC_UNUSED)
-{
-  const _ExtendedGDBusPropertyInfo *info;
-  GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 2);
-  info = _power_control_property_info_pointers[prop_id - 1];
-  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
-  if (info->use_gvariant)
-    {
-      g_value_set_variant (value, variant);
-    }
-  else
-    {
-      if (variant != NULL)
-        g_dbus_gvariant_to_gvalue (variant, value);
-    }
-  if (variant != NULL)
-    g_variant_unref (variant);
-}
-
-static void
-power_control_proxy_set_property_cb (GDBusProxy *proxy,
-  GAsyncResult *res,
-  gpointer      user_data)
-{
-  const _ExtendedGDBusPropertyInfo *info = user_data;
-  GError *error;
-  GVariant *_ret;
-  error = NULL;
-  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
-  if (!_ret)
-    {
-      g_warning ("Error setting property '%s' on interface org.openbmc.PowerControl: %s (%s, %d)",
-                 info->parent_struct.name, 
-                 error->message, g_quark_to_string (error->domain), error->code);
-      g_error_free (error);
-    }
-  else
-    {
-      g_variant_unref (_ret);
-    }
-}
-
-static void
-power_control_proxy_set_property (GObject      *object,
-  guint         prop_id,
-  const GValue *value,
-  GParamSpec   *pspec G_GNUC_UNUSED)
-{
-  const _ExtendedGDBusPropertyInfo *info;
-  GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 2);
-  info = _power_control_property_info_pointers[prop_id - 1];
-  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
-  g_dbus_proxy_call (G_DBUS_PROXY (object),
-    "org.freedesktop.DBus.Properties.Set",
-    g_variant_new ("(ssv)", "org.openbmc.PowerControl", info->parent_struct.name, variant),
-    G_DBUS_CALL_FLAGS_NONE,
-    -1,
-    NULL, (GAsyncReadyCallback) power_control_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
-  g_variant_unref (variant);
-}
-
-static void
-power_control_proxy_g_signal (GDBusProxy *proxy,
-  const gchar *sender_name G_GNUC_UNUSED,
-  const gchar *signal_name,
-  GVariant *parameters)
-{
-  _ExtendedGDBusSignalInfo *info;
-  GVariantIter iter;
-  GVariant *child;
-  GValue *paramv;
-  guint num_params;
-  guint n;
-  guint signal_id;
-  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct, signal_name);
-  if (info == NULL)
-    return;
-  num_params = g_variant_n_children (parameters);
-  paramv = g_new0 (GValue, num_params + 1);
-  g_value_init (&paramv[0], TYPE_POWER_CONTROL);
-  g_value_set_object (&paramv[0], proxy);
-  g_variant_iter_init (&iter, parameters);
-  n = 1;
-  while ((child = g_variant_iter_next_value (&iter)) != NULL)
-    {
-      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
-      if (arg_info->use_gvariant)
-        {
-          g_value_init (&paramv[n], G_TYPE_VARIANT);
-          g_value_set_variant (&paramv[n], child);
-          n++;
-        }
-      else
-        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
-      g_variant_unref (child);
-    }
-  signal_id = g_signal_lookup (info->signal_name, TYPE_POWER_CONTROL);
-  g_signal_emitv (paramv, signal_id, 0, NULL);
-  for (n = 0; n < num_params + 1; n++)
-    g_value_unset (&paramv[n]);
-  g_free (paramv);
-}
-
-static void
-power_control_proxy_g_properties_changed (GDBusProxy *_proxy,
-  GVariant *changed_properties,
-  const gchar *const *invalidated_properties)
-{
-  PowerControlProxy *proxy = POWER_CONTROL_PROXY (_proxy);
-  guint n;
-  const gchar *key;
-  GVariantIter *iter;
-  _ExtendedGDBusPropertyInfo *info;
-  g_variant_get (changed_properties, "a{sv}", &iter);
-  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
-    {
-      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct, key);
-      g_datalist_remove_data (&proxy->priv->qdata, key);
-      if (info != NULL)
-        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
-    }
-  g_variant_iter_free (iter);
-  for (n = 0; invalidated_properties[n] != NULL; n++)
-    {
-      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct, invalidated_properties[n]);
-      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
-      if (info != NULL)
-        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
-    }
-}
-
-static gint 
-power_control_proxy_get_pgood (PowerControl *object)
-{
-  PowerControlProxy *proxy = POWER_CONTROL_PROXY (object);
-  GVariant *variant;
-  gint value = 0;
-  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "pgood");
-  if (variant != NULL)
-    {
-      value = g_variant_get_int32 (variant);
-      g_variant_unref (variant);
-    }
-  return value;
-}
-
-static gint 
-power_control_proxy_get_state (PowerControl *object)
-{
-  PowerControlProxy *proxy = POWER_CONTROL_PROXY (object);
-  GVariant *variant;
-  gint value = 0;
-  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "state");
-  if (variant != NULL)
-    {
-      value = g_variant_get_int32 (variant);
-      g_variant_unref (variant);
-    }
-  return value;
-}
-
-static void
-power_control_proxy_init (PowerControlProxy *proxy)
-{
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-  proxy->priv = power_control_proxy_get_instance_private (proxy);
-#else
-  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_POWER_CONTROL_PROXY, PowerControlProxyPrivate);
-#endif
-
-  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), power_control_interface_info ());
-}
-
-static void
-power_control_proxy_class_init (PowerControlProxyClass *klass)
-{
-  GObjectClass *gobject_class;
-  GDBusProxyClass *proxy_class;
-
-  gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize     = power_control_proxy_finalize;
-  gobject_class->get_property = power_control_proxy_get_property;
-  gobject_class->set_property = power_control_proxy_set_property;
-
-  proxy_class = G_DBUS_PROXY_CLASS (klass);
-  proxy_class->g_signal = power_control_proxy_g_signal;
-  proxy_class->g_properties_changed = power_control_proxy_g_properties_changed;
-
-  power_control_override_properties (gobject_class, 1);
-
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-  g_type_class_add_private (klass, sizeof (PowerControlProxyPrivate));
-#endif
-}
-
-static void
-power_control_proxy_iface_init (PowerControlIface *iface)
-{
-  iface->get_pgood = power_control_proxy_get_pgood;
-  iface->get_state = power_control_proxy_get_state;
-}
-
-/**
- * power_control_proxy_new:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>. See g_dbus_proxy_new() for more details.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call power_control_proxy_new_finish() to get the result of the operation.
- *
- * See power_control_proxy_new_sync() for the synchronous, blocking version of this constructor.
- */
-void
-power_control_proxy_new (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data)
-{
-  g_async_initable_new_async (TYPE_POWER_CONTROL_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.PowerControl", NULL);
-}
-
-/**
- * power_control_proxy_new_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to power_control_proxy_new().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with power_control_proxy_new().
- *
- * Returns: (transfer full) (type PowerControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-PowerControl *
-power_control_proxy_new_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return POWER_CONTROL (ret);
-  else
-    return NULL;
-}
-
-/**
- * power_control_proxy_new_sync:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>. See g_dbus_proxy_new_sync() for more details.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See power_control_proxy_new() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type PowerControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-PowerControl *
-power_control_proxy_new_sync (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_POWER_CONTROL_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.PowerControl", NULL);
-  if (ret != NULL)
-    return POWER_CONTROL (ret);
-  else
-    return NULL;
-}
-
-
-/**
- * power_control_proxy_new_for_bus:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Like power_control_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call power_control_proxy_new_for_bus_finish() to get the result of the operation.
- *
- * See power_control_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
- */
-void
-power_control_proxy_new_for_bus (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data)
-{
-  g_async_initable_new_async (TYPE_POWER_CONTROL_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.PowerControl", NULL);
-}
-
-/**
- * power_control_proxy_new_for_bus_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to power_control_proxy_new_for_bus().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with power_control_proxy_new_for_bus().
- *
- * Returns: (transfer full) (type PowerControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-PowerControl *
-power_control_proxy_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return POWER_CONTROL (ret);
-  else
-    return NULL;
-}
-
-/**
- * power_control_proxy_new_for_bus_sync:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusProxyFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Like power_control_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See power_control_proxy_new_for_bus() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type PowerControlProxy): The constructed proxy object or %NULL if @error is set.
- */
-PowerControl *
-power_control_proxy_new_for_bus_sync (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_POWER_CONTROL_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.PowerControl", NULL);
-  if (ret != NULL)
-    return POWER_CONTROL (ret);
-  else
-    return NULL;
-}
-
-
-/* ------------------------------------------------------------------------ */
-
-/**
- * PowerControlSkeleton:
- *
- * The #PowerControlSkeleton structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * PowerControlSkeletonClass:
- * @parent_class: The parent class.
- *
- * Class structure for #PowerControlSkeleton.
- */
-
-struct _PowerControlSkeletonPrivate
-{
-  GValue *properties;
-  GList *changed_properties;
-  GSource *changed_properties_idle_source;
-  GMainContext *context;
-  GMutex lock;
-};
-
-static void
-_power_control_skeleton_handle_method_call (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name,
-  const gchar *method_name,
-  GVariant *parameters,
-  GDBusMethodInvocation *invocation,
-  gpointer user_data)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (user_data);
-  _ExtendedGDBusMethodInfo *info;
-  GVariantIter iter;
-  GVariant *child;
-  GValue *paramv;
-  guint num_params;
-  guint num_extra;
-  guint n;
-  guint signal_id;
-  GValue return_value = G_VALUE_INIT;
-  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
-  g_assert (info != NULL);
-  num_params = g_variant_n_children (parameters);
-  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
-  n = 0;
-  g_value_init (&paramv[n], TYPE_POWER_CONTROL);
-  g_value_set_object (&paramv[n++], skeleton);
-  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
-  g_value_set_object (&paramv[n++], invocation);
-  if (info->pass_fdlist)
-    {
-#ifdef G_OS_UNIX
-      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
-      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
-#else
-      g_assert_not_reached ();
-#endif
-    }
-  g_variant_iter_init (&iter, parameters);
-  while ((child = g_variant_iter_next_value (&iter)) != NULL)
-    {
-      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
-      if (arg_info->use_gvariant)
-        {
-          g_value_init (&paramv[n], G_TYPE_VARIANT);
-          g_value_set_variant (&paramv[n], child);
-          n++;
-        }
-      else
-        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
-      g_variant_unref (child);
-    }
-  signal_id = g_signal_lookup (info->signal_name, TYPE_POWER_CONTROL);
-  g_value_init (&return_value, G_TYPE_BOOLEAN);
-  g_signal_emitv (paramv, signal_id, 0, &return_value);
-  if (!g_value_get_boolean (&return_value))
-    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
-  g_value_unset (&return_value);
-  for (n = 0; n < num_params + num_extra; n++)
-    g_value_unset (&paramv[n]);
-  g_free (paramv);
-}
-
-static GVariant *
-_power_control_skeleton_handle_get_property (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name G_GNUC_UNUSED,
-  const gchar *property_name,
-  GError **error,
-  gpointer user_data)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (user_data);
-  GValue value = G_VALUE_INIT;
-  GParamSpec *pspec;
-  _ExtendedGDBusPropertyInfo *info;
-  GVariant *ret;
-  ret = NULL;
-  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct, property_name);
-  g_assert (info != NULL);
-  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
-  if (pspec == NULL)
-    {
-      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
-    }
-  else
-    {
-      g_value_init (&value, pspec->value_type);
-      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
-      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
-      g_value_unset (&value);
-    }
-  return ret;
-}
-
-static gboolean
-_power_control_skeleton_handle_set_property (
-  GDBusConnection *connection G_GNUC_UNUSED,
-  const gchar *sender G_GNUC_UNUSED,
-  const gchar *object_path G_GNUC_UNUSED,
-  const gchar *interface_name G_GNUC_UNUSED,
-  const gchar *property_name,
-  GVariant *variant,
-  GError **error,
-  gpointer user_data)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (user_data);
-  GValue value = G_VALUE_INIT;
-  GParamSpec *pspec;
-  _ExtendedGDBusPropertyInfo *info;
-  gboolean ret;
-  ret = FALSE;
-  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_power_control_interface_info.parent_struct, property_name);
-  g_assert (info != NULL);
-  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
-  if (pspec == NULL)
-    {
-      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
-    }
-  else
-    {
-      if (info->use_gvariant)
-        g_value_set_variant (&value, variant);
-      else
-        g_dbus_gvariant_to_gvalue (variant, &value);
-      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
-      g_value_unset (&value);
-      ret = TRUE;
-    }
-  return ret;
-}
-
-static const GDBusInterfaceVTable _power_control_skeleton_vtable =
-{
-  _power_control_skeleton_handle_method_call,
-  _power_control_skeleton_handle_get_property,
-  _power_control_skeleton_handle_set_property,
-  {NULL}
-};
-
-static GDBusInterfaceInfo *
-power_control_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
-{
-  return power_control_interface_info ();
-}
-
-static GDBusInterfaceVTable *
-power_control_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
-{
-  return (GDBusInterfaceVTable *) &_power_control_skeleton_vtable;
-}
-
-static GVariant *
-power_control_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (_skeleton);
-
-  GVariantBuilder builder;
-  guint n;
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-  if (_power_control_interface_info.parent_struct.properties == NULL)
-    goto out;
-  for (n = 0; _power_control_interface_info.parent_struct.properties[n] != NULL; n++)
-    {
-      GDBusPropertyInfo *info = _power_control_interface_info.parent_struct.properties[n];
-      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
-        {
-          GVariant *value;
-          value = _power_control_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.PowerControl", info->name, NULL, skeleton);
-          if (value != NULL)
-            {
-              g_variant_take_ref (value);
-              g_variant_builder_add (&builder, "{sv}", info->name, value);
-              g_variant_unref (value);
-            }
-        }
-    }
-out:
-  return g_variant_builder_end (&builder);
-}
-
-static gboolean _power_control_emit_changed (gpointer user_data);
-
-static void
-power_control_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (_skeleton);
-  gboolean emit_changed = FALSE;
-
-  g_mutex_lock (&skeleton->priv->lock);
-  if (skeleton->priv->changed_properties_idle_source != NULL)
-    {
-      g_source_destroy (skeleton->priv->changed_properties_idle_source);
-      skeleton->priv->changed_properties_idle_source = NULL;
-      emit_changed = TRUE;
-    }
-  g_mutex_unlock (&skeleton->priv->lock);
-
-  if (emit_changed)
-    _power_control_emit_changed (skeleton);
-}
-
-static void
-_power_control_on_signal_power_good (
-    PowerControl *object)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-
-  GList      *connections, *l;
-  GVariant   *signal_variant;
-  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
-
-  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
-  for (l = connections; l != NULL; l = l->next)
-    {
-      GDBusConnection *connection = l->data;
-      g_dbus_connection_emit_signal (connection,
-        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.PowerControl", "PowerGood",
-        signal_variant, NULL);
-    }
-  g_variant_unref (signal_variant);
-  g_list_free_full (connections, g_object_unref);
-}
-
-static void
-_power_control_on_signal_power_lost (
-    PowerControl *object)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-
-  GList      *connections, *l;
-  GVariant   *signal_variant;
-  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
-
-  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
-  for (l = connections; l != NULL; l = l->next)
-    {
-      GDBusConnection *connection = l->data;
-      g_dbus_connection_emit_signal (connection,
-        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.PowerControl", "PowerLost",
-        signal_variant, NULL);
-    }
-  g_variant_unref (signal_variant);
-  g_list_free_full (connections, g_object_unref);
-}
-
-static void power_control_skeleton_iface_init (PowerControlIface *iface);
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-G_DEFINE_TYPE_WITH_CODE (PowerControlSkeleton, power_control_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
-                         G_ADD_PRIVATE (PowerControlSkeleton)
-                         G_IMPLEMENT_INTERFACE (TYPE_POWER_CONTROL, power_control_skeleton_iface_init));
-
-#else
-G_DEFINE_TYPE_WITH_CODE (PowerControlSkeleton, power_control_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
-                         G_IMPLEMENT_INTERFACE (TYPE_POWER_CONTROL, power_control_skeleton_iface_init));
-
-#endif
-static void
-power_control_skeleton_finalize (GObject *object)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  guint n;
-  for (n = 0; n < 2; n++)
-    g_value_unset (&skeleton->priv->properties[n]);
-  g_free (skeleton->priv->properties);
-  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
-  if (skeleton->priv->changed_properties_idle_source != NULL)
-    g_source_destroy (skeleton->priv->changed_properties_idle_source);
-  g_main_context_unref (skeleton->priv->context);
-  g_mutex_clear (&skeleton->priv->lock);
-  G_OBJECT_CLASS (power_control_skeleton_parent_class)->finalize (object);
-}
-
-static void
-power_control_skeleton_get_property (GObject      *object,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec G_GNUC_UNUSED)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 2);
-  g_mutex_lock (&skeleton->priv->lock);
-  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
-  g_mutex_unlock (&skeleton->priv->lock);
-}
-
-static gboolean
-_power_control_emit_changed (gpointer user_data)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (user_data);
-  GList *l;
-  GVariantBuilder builder;
-  GVariantBuilder invalidated_builder;
-  guint num_changes;
-
-  g_mutex_lock (&skeleton->priv->lock);
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
-  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
-    {
-      ChangedProperty *cp = l->data;
-      GVariant *variant;
-      const GValue *cur_value;
-
-      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
-      if (!_g_value_equal (cur_value, &cp->orig_value))
-        {
-          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
-          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
-          g_variant_unref (variant);
-          num_changes++;
-        }
-    }
-  if (num_changes > 0)
-    {
-      GList *connections, *ll;
-      GVariant *signal_variant;
-      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.openbmc.PowerControl",
-                                           &builder, &invalidated_builder));
-      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
-      for (ll = connections; ll != NULL; ll = ll->next)
-        {
-          GDBusConnection *connection = ll->data;
-
-          g_dbus_connection_emit_signal (connection,
-                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
-                                         "org.freedesktop.DBus.Properties",
-                                         "PropertiesChanged",
-                                         signal_variant,
-                                         NULL);
-        }
-      g_variant_unref (signal_variant);
-      g_list_free_full (connections, g_object_unref);
-    }
-  else
-    {
-      g_variant_builder_clear (&builder);
-      g_variant_builder_clear (&invalidated_builder);
-    }
-  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
-  skeleton->priv->changed_properties = NULL;
-  skeleton->priv->changed_properties_idle_source = NULL;
-  g_mutex_unlock (&skeleton->priv->lock);
-  return FALSE;
-}
-
-static void
-_power_control_schedule_emit_changed (PowerControlSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
-{
-  ChangedProperty *cp;
-  GList *l;
-  cp = NULL;
-  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
-    {
-      ChangedProperty *i_cp = l->data;
-      if (i_cp->info == info)
-        {
-          cp = i_cp;
-          break;
-        }
-    }
-  if (cp == NULL)
-    {
-      cp = g_new0 (ChangedProperty, 1);
-      cp->prop_id = prop_id;
-      cp->info = info;
-      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
-      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
-      g_value_copy (orig_value, &cp->orig_value);
-    }
-}
-
-static void
-power_control_skeleton_notify (GObject      *object,
-  GParamSpec *pspec G_GNUC_UNUSED)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  g_mutex_lock (&skeleton->priv->lock);
-  if (skeleton->priv->changed_properties != NULL &&
-      skeleton->priv->changed_properties_idle_source == NULL)
-    {
-      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
-      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
-      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _power_control_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
-      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
-      g_source_unref (skeleton->priv->changed_properties_idle_source);
-    }
-  g_mutex_unlock (&skeleton->priv->lock);
-}
-
-static void
-power_control_skeleton_set_property (GObject      *object,
-  guint         prop_id,
-  const GValue *value,
-  GParamSpec   *pspec)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 2);
-  g_mutex_lock (&skeleton->priv->lock);
-  g_object_freeze_notify (object);
-  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
-    {
-      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
-        _power_control_schedule_emit_changed (skeleton, _power_control_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
-      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
-      g_object_notify_by_pspec (object, pspec);
-    }
-  g_mutex_unlock (&skeleton->priv->lock);
-  g_object_thaw_notify (object);
-}
-
-static void
-power_control_skeleton_init (PowerControlSkeleton *skeleton)
-{
-#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
-  skeleton->priv = power_control_skeleton_get_instance_private (skeleton);
-#else
-  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_POWER_CONTROL_SKELETON, PowerControlSkeletonPrivate);
-#endif
-
-  g_mutex_init (&skeleton->priv->lock);
-  skeleton->priv->context = g_main_context_ref_thread_default ();
-  skeleton->priv->properties = g_new0 (GValue, 2);
-  g_value_init (&skeleton->priv->properties[0], G_TYPE_INT);
-  g_value_init (&skeleton->priv->properties[1], G_TYPE_INT);
-}
-
-static gint 
-power_control_skeleton_get_pgood (PowerControl *object)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  gint value;
-  g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_int (&(skeleton->priv->properties[0]));
-  g_mutex_unlock (&skeleton->priv->lock);
-  return value;
-}
-
-static gint 
-power_control_skeleton_get_state (PowerControl *object)
-{
-  PowerControlSkeleton *skeleton = POWER_CONTROL_SKELETON (object);
-  gint value;
-  g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_int (&(skeleton->priv->properties[1]));
-  g_mutex_unlock (&skeleton->priv->lock);
-  return value;
-}
-
-static void
-power_control_skeleton_class_init (PowerControlSkeletonClass *klass)
-{
-  GObjectClass *gobject_class;
-  GDBusInterfaceSkeletonClass *skeleton_class;
-
-  gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize = power_control_skeleton_finalize;
-  gobject_class->get_property = power_control_skeleton_get_property;
-  gobject_class->set_property = power_control_skeleton_set_property;
-  gobject_class->notify       = power_control_skeleton_notify;
-
-
-  power_control_override_properties (gobject_class, 1);
-
-  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
-  skeleton_class->get_info = power_control_skeleton_dbus_interface_get_info;
-  skeleton_class->get_properties = power_control_skeleton_dbus_interface_get_properties;
-  skeleton_class->flush = power_control_skeleton_dbus_interface_flush;
-  skeleton_class->get_vtable = power_control_skeleton_dbus_interface_get_vtable;
-
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-  g_type_class_add_private (klass, sizeof (PowerControlSkeletonPrivate));
-#endif
-}
-
-static void
-power_control_skeleton_iface_init (PowerControlIface *iface)
-{
-  iface->power_good = _power_control_on_signal_power_good;
-  iface->power_lost = _power_control_on_signal_power_lost;
-  iface->get_pgood = power_control_skeleton_get_pgood;
-  iface->get_state = power_control_skeleton_get_state;
-}
-
-/**
- * power_control_skeleton_new:
- *
- * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>.
- *
- * Returns: (transfer full) (type PowerControlSkeleton): The skeleton object.
- */
-PowerControl *
-power_control_skeleton_new (void)
-{
-  return POWER_CONTROL (g_object_new (TYPE_POWER_CONTROL_SKELETON, NULL));
-}
-
-/* ------------------------------------------------------------------------
- * Code for Object, ObjectProxy and ObjectSkeleton
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:Object
- * @title: Object
- * @short_description: Specialized GDBusObject types
- *
- * This section contains the #Object, #ObjectProxy, and #ObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.
- */
-
-/**
- * Object:
- *
- * The #Object type is a specialized container of interfaces.
- */
-
-/**
- * ObjectIface:
- * @parent_iface: The parent interface.
- *
- * Virtual table for the #Object interface.
- */
-
-typedef ObjectIface ObjectInterface;
-G_DEFINE_INTERFACE_WITH_CODE (Object, object, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));
-
-static void
-object_default_init (ObjectIface *iface)
-{
-  /**
-   * Object:power-control:
-   *
-   * The #PowerControl instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link>, if any.
-   *
-   * Connect to the #GObject::notify signal to get informed of property changes.
-   */
-  g_object_interface_install_property (iface, g_param_spec_object ("power-control", "power-control", "power-control", TYPE_POWER_CONTROL, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
-
-}
-
-/**
- * object_get_power_control:
- * @object: A #Object.
- *
- * Gets the #PowerControl instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link> on @object, if any.
- *
- * Returns: (transfer full): A #PowerControl that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
- */
-PowerControl *object_get_power_control (Object *object)
-{
-  GDBusInterface *ret;
-  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.PowerControl");
-  if (ret == NULL)
-    return NULL;
-  return POWER_CONTROL (ret);
-}
-
-
-/**
- * object_peek_power_control: (skip)
- * @object: A #Object.
- *
- * Like object_get_power_control() but doesn't increase the reference count on the returned object.
- *
- * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
- *
- * Returns: (transfer none): A #PowerControl or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
- */
-PowerControl *object_peek_power_control (Object *object)
-{
-  GDBusInterface *ret;
-  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.PowerControl");
-  if (ret == NULL)
-    return NULL;
-  g_object_unref (ret);
-  return POWER_CONTROL (ret);
-}
-
-
-static void
-object_notify (GDBusObject *object, GDBusInterface *interface)
-{
-  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);
-  /* info can be NULL if the other end is using a D-Bus interface we don't know
-   * anything about, for example old generated code in this process talking to
-   * newer generated code in the other process. */
-  if (info != NULL)
-    g_object_notify (G_OBJECT (object), info->hyphen_name);
-}
-
-/**
- * ObjectProxy:
- *
- * The #ObjectProxy structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectProxyClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectProxy.
- */
-
-static void
-object_proxy__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
-{
-}
-
-static void
-object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)
-{
-  iface->interface_added = object_notify;
-  iface->interface_removed = object_notify;
-}
-
-
-G_DEFINE_TYPE_WITH_CODE (ObjectProxy, object_proxy, G_TYPE_DBUS_OBJECT_PROXY,
-                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_proxy__object_iface_init)
-                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_proxy__g_dbus_object_iface_init));
-
-static void
-object_proxy_init (ObjectProxy *object G_GNUC_UNUSED)
-{
-}
-
-static void
-object_proxy_set_property (GObject      *gobject,
-  guint         prop_id,
-  const GValue *value G_GNUC_UNUSED,
-  GParamSpec   *pspec)
-{
-  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-}
-
-static void
-object_proxy_get_property (GObject      *gobject,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec)
-{
-  ObjectProxy *object = OBJECT_PROXY (gobject);
-  GDBusInterface *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.PowerControl");
-      g_value_take_object (value, interface);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_proxy_class_init (ObjectProxyClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-  gobject_class->set_property = object_proxy_set_property;
-  gobject_class->get_property = object_proxy_get_property;
-
-  g_object_class_override_property (gobject_class, 1, "power-control");
-}
-
-/**
- * object_proxy_new:
- * @connection: A #GDBusConnection.
- * @object_path: An object path.
- *
- * Creates a new proxy object.
- *
- * Returns: (transfer full): The proxy object.
- */
-ObjectProxy *
-object_proxy_new (GDBusConnection *connection,
-  const gchar *object_path)
-{
-  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
-  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
-  return OBJECT_PROXY (g_object_new (TYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));
-}
-
-/**
- * ObjectSkeleton:
- *
- * The #ObjectSkeleton structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectSkeletonClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectSkeleton.
- */
-
-static void
-object_skeleton__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
-{
-}
-
-
-static void
-object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)
-{
-  iface->interface_added = object_notify;
-  iface->interface_removed = object_notify;
-}
-
-G_DEFINE_TYPE_WITH_CODE (ObjectSkeleton, object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,
-                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_skeleton__object_iface_init)
-                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_skeleton__g_dbus_object_iface_init));
-
-static void
-object_skeleton_init (ObjectSkeleton *object G_GNUC_UNUSED)
-{
-}
-
-static void
-object_skeleton_set_property (GObject      *gobject,
-  guint         prop_id,
-  const GValue *value,
-  GParamSpec   *pspec)
-{
-  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
-  GDBusInterfaceSkeleton *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_value_get_object (value);
-      if (interface != NULL)
-        {
-          g_warn_if_fail (IS_POWER_CONTROL (interface));
-          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
-        }
-      else
-        {
-          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.PowerControl");
-        }
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_skeleton_get_property (GObject      *gobject,
-  guint         prop_id,
-  GValue       *value,
-  GParamSpec   *pspec)
-{
-  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
-  GDBusInterface *interface;
-
-  switch (prop_id)
-    {
-    case 1:
-      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.PowerControl");
-      g_value_take_object (value, interface);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-object_skeleton_class_init (ObjectSkeletonClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-  gobject_class->set_property = object_skeleton_set_property;
-  gobject_class->get_property = object_skeleton_get_property;
-
-  g_object_class_override_property (gobject_class, 1, "power-control");
-}
-
-/**
- * object_skeleton_new:
- * @object_path: An object path.
- *
- * Creates a new skeleton object.
- *
- * Returns: (transfer full): The skeleton object.
- */
-ObjectSkeleton *
-object_skeleton_new (const gchar *object_path)
-{
-  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
-  return OBJECT_SKELETON (g_object_new (TYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));
-}
-
-/**
- * object_skeleton_set_power_control:
- * @object: A #ObjectSkeleton.
- * @interface_: (allow-none): A #PowerControl or %NULL to clear the interface.
- *
- * Sets the #PowerControl instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-PowerControl.top_of_page">org.openbmc.PowerControl</link> on @object.
- */
-void object_skeleton_set_power_control (ObjectSkeleton *object, PowerControl *interface_)
-{
-  g_object_set (G_OBJECT (object), "power-control", interface_, NULL);
-}
-
-
-/* ------------------------------------------------------------------------
- * Code for ObjectManager client
- * ------------------------------------------------------------------------
- */
-
-/**
- * SECTION:ObjectManagerClient
- * @title: ObjectManagerClient
- * @short_description: Generated GDBusObjectManagerClient type
- *
- * This section contains a #GDBusObjectManagerClient that uses object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.
- */
-
-/**
- * ObjectManagerClient:
- *
- * The #ObjectManagerClient structure contains only private data and should only be accessed using the provided API.
- */
-
-/**
- * ObjectManagerClientClass:
- * @parent_class: The parent class.
- *
- * Class structure for #ObjectManagerClient.
- */
-
-G_DEFINE_TYPE (ObjectManagerClient, object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);
-
-static void
-object_manager_client_init (ObjectManagerClient *manager G_GNUC_UNUSED)
-{
-}
-
-static void
-object_manager_client_class_init (ObjectManagerClientClass *klass G_GNUC_UNUSED)
-{
-}
-
-/**
- * object_manager_client_get_proxy_type:
- * @manager: A #GDBusObjectManagerClient.
- * @object_path: The object path of the remote object (unused).
- * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy #GType.
- * @user_data: User data (unused).
- *
- * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and #GDBusProxy<!-- -->-derived types.
- *
- * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for #ObjectProxy.
- */
-GType
-object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar *object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)
-{
-  static gsize once_init_value = 0;
-  static GHashTable *lookup_hash;
-  GType ret;
-
-  if (interface_name == NULL)
-    return TYPE_OBJECT_PROXY;
-  if (g_once_init_enter (&once_init_value))
-    {
-      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);
-      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.PowerControl", GSIZE_TO_POINTER (TYPE_POWER_CONTROL_PROXY));
-      g_once_init_leave (&once_init_value, 1);
-    }
-  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));
-  if (ret == (GType) 0)
-    ret = G_TYPE_DBUS_PROXY;
-  return ret;
-}
-
-/**
- * object_manager_client_new:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Asynchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call object_manager_client_new_finish() to get the result of the operation.
- *
- * See object_manager_client_new_sync() for the synchronous, blocking version of this constructor.
- */
-void
-object_manager_client_new (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data)
-{
-  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-}
-
-/**
- * object_manager_client_new_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with object_manager_client_new().
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-/**
- * object_manager_client_new_sync:
- * @connection: A #GDBusConnection.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Synchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See object_manager_client_new() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_sync (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-
-/**
- * object_manager_client_new_for_bus:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
- * @user_data: User data to pass to @callback.
- *
- * Like object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.
- *
- * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call object_manager_client_new_for_bus_finish() to get the result of the operation.
- *
- * See object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.
- */
-void
-object_manager_client_new_for_bus (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data)
-{
-  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-}
-
-/**
- * object_manager_client_new_for_bus_finish:
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new_for_bus().
- * @error: Return location for error or %NULL
- *
- * Finishes an operation started with object_manager_client_new_for_bus().
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error)
-{
-  GObject *ret;
-  GObject *source_object;
-  source_object = g_async_result_get_source_object (res);
-  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
-  g_object_unref (source_object);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-/**
- * object_manager_client_new_for_bus_sync:
- * @bus_type: A #GBusType.
- * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
- * @name: A bus name (well-known or unique).
- * @object_path: An object path.
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @error: Return location for error or %NULL
- *
- * Like object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.
- *
- * The calling thread is blocked until a reply is received.
- *
- * See object_manager_client_new_for_bus() for the asynchronous version of this constructor.
- *
- * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
- */
-GDBusObjectManager *
-object_manager_client_new_for_bus_sync (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error)
-{
-  GInitable *ret;
-  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
-  if (ret != NULL)
-    return G_DBUS_OBJECT_MANAGER (ret);
-  else
-    return NULL;
-}
-
-
+/*
+ * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "interfaces/power_control.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+#  include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+  GDBusArgInfo parent_struct;
+  gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+  GDBusMethodInfo parent_struct;
+  const gchar *signal_name;
+  gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+  GDBusSignalInfo parent_struct;
+  const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+  GDBusPropertyInfo parent_struct;
+  const gchar *hyphen_name;
+  gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+  GDBusInterfaceInfo parent_struct;
+  const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  guint prop_id;
+  GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+  g_value_unset (&data->orig_value);
+  g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+  gboolean ret = FALSE;
+  guint n;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  if (g_strv_length (a) != g_strv_length (b))
+    goto out;
+  for (n = 0; a[n] != NULL; n++)
+    if (g_strcmp0 (a[n], b[n]) != 0)
+      goto out;
+  ret = TRUE;
+out:
+  return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+  gboolean ret = FALSE;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  ret = g_variant_equal (a, b);
+out:
+  return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+  gboolean ret = FALSE;
+  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+  switch (G_VALUE_TYPE (a))
+    {
+      case G_TYPE_BOOLEAN:
+        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+        break;
+      case G_TYPE_UCHAR:
+        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+        break;
+      case G_TYPE_INT:
+        ret = (g_value_get_int (a) == g_value_get_int (b));
+        break;
+      case G_TYPE_UINT:
+        ret = (g_value_get_uint (a) == g_value_get_uint (b));
+        break;
+      case G_TYPE_INT64:
+        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+        break;
+      case G_TYPE_UINT64:
+        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+        break;
+      case G_TYPE_DOUBLE:
+        {
+          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+          gdouble da = g_value_get_double (a);
+          gdouble db = g_value_get_double (b);
+          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+        }
+        break;
+      case G_TYPE_STRING:
+        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+        break;
+      case G_TYPE_VARIANT:
+        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+        break;
+      default:
+        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+        else
+          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+        break;
+    }
+  return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.openbmc.control.Power
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:ControlPower
+ * @title: ControlPower
+ * @short_description: Generated C code for the org.openbmc.control.Power D-Bus interface
+ *
+ * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link> D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.openbmc.control.Power ---- */
+
+static const _ExtendedGDBusArgInfo _control_power_method_info_set_power_state_IN_ARG_state =
+{
+  {
+    -1,
+    (gchar *) "state",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _control_power_method_info_set_power_state_IN_ARG_pointers[] =
+{
+  &_control_power_method_info_set_power_state_IN_ARG_state,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _control_power_method_info_set_power_state =
+{
+  {
+    -1,
+    (gchar *) "setPowerState",
+    (GDBusArgInfo **) &_control_power_method_info_set_power_state_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-set-power-state",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _control_power_method_info_get_power_state_OUT_ARG_state =
+{
+  {
+    -1,
+    (gchar *) "state",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _control_power_method_info_get_power_state_OUT_ARG_pointers[] =
+{
+  &_control_power_method_info_get_power_state_OUT_ARG_state,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _control_power_method_info_get_power_state =
+{
+  {
+    -1,
+    (gchar *) "getPowerState",
+    NULL,
+    (GDBusArgInfo **) &_control_power_method_info_get_power_state_OUT_ARG_pointers,
+    NULL
+  },
+  "handle-get-power-state",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _control_power_method_info_pointers[] =
+{
+  &_control_power_method_info_set_power_state,
+  &_control_power_method_info_get_power_state,
+  NULL
+};
+
+static const _ExtendedGDBusSignalInfo _control_power_signal_info_power_good =
+{
+  {
+    -1,
+    (gchar *) "PowerGood",
+    NULL,
+    NULL
+  },
+  "power-good"
+};
+
+static const _ExtendedGDBusSignalInfo _control_power_signal_info_power_lost =
+{
+  {
+    -1,
+    (gchar *) "PowerLost",
+    NULL,
+    NULL
+  },
+  "power-lost"
+};
+
+static const _ExtendedGDBusSignalInfo * const _control_power_signal_info_pointers[] =
+{
+  &_control_power_signal_info_power_good,
+  &_control_power_signal_info_power_lost,
+  NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _control_power_property_info_pgood =
+{
+  {
+    -1,
+    (gchar *) "pgood",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "pgood",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _control_power_property_info_state =
+{
+  {
+    -1,
+    (gchar *) "state",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "state",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _control_power_property_info_pointers[] =
+{
+  &_control_power_property_info_pgood,
+  &_control_power_property_info_state,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _control_power_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.openbmc.control.Power",
+    (GDBusMethodInfo **) &_control_power_method_info_pointers,
+    (GDBusSignalInfo **) &_control_power_signal_info_pointers,
+    (GDBusPropertyInfo **) &_control_power_property_info_pointers,
+    NULL
+  },
+  "control-power",
+};
+
+
+/**
+ * control_power_interface_info:
+ *
+ * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link> D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+control_power_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct;
+}
+
+/**
+ * control_power_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #ControlPower interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+control_power_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  g_object_class_override_property (klass, property_id_begin++, "pgood");
+  g_object_class_override_property (klass, property_id_begin++, "state");
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * ControlPower:
+ *
+ * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>.
+ */
+
+/**
+ * ControlPowerIface:
+ * @parent_iface: The parent interface.
+ * @handle_get_power_state: Handler for the #ControlPower::handle-get-power-state signal.
+ * @handle_set_power_state: Handler for the #ControlPower::handle-set-power-state signal.
+ * @get_pgood: Getter for the #ControlPower:pgood property.
+ * @get_state: Getter for the #ControlPower:state property.
+ * @power_good: Handler for the #ControlPower::power-good signal.
+ * @power_lost: Handler for the #ControlPower::power-lost signal.
+ *
+ * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>.
+ */
+
+typedef ControlPowerIface ControlPowerInterface;
+G_DEFINE_INTERFACE (ControlPower, control_power, G_TYPE_OBJECT);
+
+static void
+control_power_default_init (ControlPowerIface *iface)
+{
+  /* GObject signals for incoming D-Bus method calls: */
+  /**
+   * ControlPower::handle-set-power-state:
+   * @object: A #ControlPower.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_state: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-control-Power.setPowerState">setPowerState()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call control_power_complete_set_power_state() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-set-power-state",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (ControlPowerIface, handle_set_power_state),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    2,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT);
+
+  /**
+   * ControlPower::handle-get-power-state:
+   * @object: A #ControlPower.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-control-Power.getPowerState">getPowerState()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call control_power_complete_get_power_state() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-get-power-state",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (ControlPowerIface, handle_get_power_state),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /* GObject signals for received D-Bus signals: */
+  /**
+   * ControlPower::power-good:
+   * @object: A #ControlPower.
+   *
+   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-control-Power.PowerGood">"PowerGood"</link> is received.
+   *
+   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
+   */
+  g_signal_new ("power-good",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (ControlPowerIface, power_good),
+    NULL,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_NONE,
+    0);
+
+  /**
+   * ControlPower::power-lost:
+   * @object: A #ControlPower.
+   *
+   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-control-Power.PowerLost">"PowerLost"</link> is received.
+   *
+   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
+   */
+  g_signal_new ("power-lost",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (ControlPowerIface, power_lost),
+    NULL,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_NONE,
+    0);
+
+  /* GObject properties for D-Bus properties: */
+  /**
+   * ControlPower:pgood:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-control-Power.pgood">"pgood"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("pgood", "pgood", "pgood", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * ControlPower:state:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-control-Power.state">"state"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("state", "state", "state", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * control_power_get_pgood: (skip)
+ * @object: A #ControlPower.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-control-Power.pgood">"pgood"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+control_power_get_pgood (ControlPower *object)
+{
+  return CONTROL_POWER_GET_IFACE (object)->get_pgood (object);
+}
+
+/**
+ * control_power_set_pgood: (skip)
+ * @object: A #ControlPower.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-control-Power.pgood">"pgood"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+control_power_set_pgood (ControlPower *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "pgood", value, NULL);
+}
+
+/**
+ * control_power_get_state: (skip)
+ * @object: A #ControlPower.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-control-Power.state">"state"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+control_power_get_state (ControlPower *object)
+{
+  return CONTROL_POWER_GET_IFACE (object)->get_state (object);
+}
+
+/**
+ * control_power_set_state: (skip)
+ * @object: A #ControlPower.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-control-Power.state">"state"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+control_power_set_state (ControlPower *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "state", value, NULL);
+}
+
+/**
+ * control_power_emit_power_good:
+ * @object: A #ControlPower.
+ *
+ * Emits the <link linkend="gdbus-signal-org-openbmc-control-Power.PowerGood">"PowerGood"</link> D-Bus signal.
+ */
+void
+control_power_emit_power_good (
+    ControlPower *object)
+{
+  g_signal_emit_by_name (object, "power-good");
+}
+
+/**
+ * control_power_emit_power_lost:
+ * @object: A #ControlPower.
+ *
+ * Emits the <link linkend="gdbus-signal-org-openbmc-control-Power.PowerLost">"PowerLost"</link> D-Bus signal.
+ */
+void
+control_power_emit_power_lost (
+    ControlPower *object)
+{
+  g_signal_emit_by_name (object, "power-lost");
+}
+
+/**
+ * control_power_call_set_power_state:
+ * @proxy: A #ControlPowerProxy.
+ * @arg_state: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-control-Power.setPowerState">setPowerState()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call control_power_call_set_power_state_finish() to get the result of the operation.
+ *
+ * See control_power_call_set_power_state_sync() for the synchronous, blocking version of this method.
+ */
+void
+control_power_call_set_power_state (
+    ControlPower *proxy,
+    gint arg_state,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "setPowerState",
+    g_variant_new ("(i)",
+                   arg_state),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * control_power_call_set_power_state_finish:
+ * @proxy: A #ControlPowerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to control_power_call_set_power_state().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with control_power_call_set_power_state().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+control_power_call_set_power_state_finish (
+    ControlPower *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * control_power_call_set_power_state_sync:
+ * @proxy: A #ControlPowerProxy.
+ * @arg_state: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-control-Power.setPowerState">setPowerState()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See control_power_call_set_power_state() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+control_power_call_set_power_state_sync (
+    ControlPower *proxy,
+    gint arg_state,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "setPowerState",
+    g_variant_new ("(i)",
+                   arg_state),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * control_power_call_get_power_state:
+ * @proxy: A #ControlPowerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-control-Power.getPowerState">getPowerState()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call control_power_call_get_power_state_finish() to get the result of the operation.
+ *
+ * See control_power_call_get_power_state_sync() for the synchronous, blocking version of this method.
+ */
+void
+control_power_call_get_power_state (
+    ControlPower *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "getPowerState",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * control_power_call_get_power_state_finish:
+ * @proxy: A #ControlPowerProxy.
+ * @out_state: (out): Return location for return parameter or %NULL to ignore.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to control_power_call_get_power_state().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with control_power_call_get_power_state().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+control_power_call_get_power_state_finish (
+    ControlPower *proxy,
+    gint *out_state,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(i)",
+                 out_state);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * control_power_call_get_power_state_sync:
+ * @proxy: A #ControlPowerProxy.
+ * @out_state: (out): Return location for return parameter or %NULL to ignore.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-control-Power.getPowerState">getPowerState()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See control_power_call_get_power_state() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+control_power_call_get_power_state_sync (
+    ControlPower *proxy,
+    gint *out_state,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "getPowerState",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(i)",
+                 out_state);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * control_power_complete_set_power_state:
+ * @object: A #ControlPower.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-control-Power.setPowerState">setPowerState()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+control_power_complete_set_power_state (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * control_power_complete_get_power_state:
+ * @object: A #ControlPower.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ * @state: Parameter to return.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-control-Power.getPowerState">getPowerState()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+control_power_complete_get_power_state (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation,
+    gint state)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("(i)",
+                   state));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * ControlPowerProxy:
+ *
+ * The #ControlPowerProxy structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * ControlPowerProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #ControlPowerProxy.
+ */
+
+struct _ControlPowerProxyPrivate
+{
+  GData *qdata;
+};
+
+static void control_power_proxy_iface_init (ControlPowerIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (ControlPowerProxy, control_power_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (ControlPowerProxy)
+                         G_IMPLEMENT_INTERFACE (TYPE_CONTROL_POWER, control_power_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (ControlPowerProxy, control_power_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (TYPE_CONTROL_POWER, control_power_proxy_iface_init));
+
+#endif
+static void
+control_power_proxy_finalize (GObject *object)
+{
+  ControlPowerProxy *proxy = CONTROL_POWER_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (control_power_proxy_parent_class)->finalize (object);
+}
+
+static void
+control_power_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  info = _control_power_property_info_pointers[prop_id - 1];
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+  if (info->use_gvariant)
+    {
+      g_value_set_variant (value, variant);
+    }
+  else
+    {
+      if (variant != NULL)
+        g_dbus_gvariant_to_gvalue (variant, value);
+    }
+  if (variant != NULL)
+    g_variant_unref (variant);
+}
+
+static void
+control_power_proxy_set_property_cb (GDBusProxy *proxy,
+  GAsyncResult *res,
+  gpointer      user_data)
+{
+  const _ExtendedGDBusPropertyInfo *info = user_data;
+  GError *error;
+  GVariant *_ret;
+  error = NULL;
+  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (!_ret)
+    {
+      g_warning ("Error setting property '%s' on interface org.openbmc.control.Power: %s (%s, %d)",
+                 info->parent_struct.name, 
+                 error->message, g_quark_to_string (error->domain), error->code);
+      g_error_free (error);
+    }
+  else
+    {
+      g_variant_unref (_ret);
+    }
+}
+
+static void
+control_power_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  info = _control_power_property_info_pointers[prop_id - 1];
+  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+  g_dbus_proxy_call (G_DBUS_PROXY (object),
+    "org.freedesktop.DBus.Properties.Set",
+    g_variant_new ("(ssv)", "org.openbmc.control.Power", info->parent_struct.name, variant),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    NULL, (GAsyncReadyCallback) control_power_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
+  g_variant_unref (variant);
+}
+
+static void
+control_power_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], TYPE_CONTROL_POWER);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_CONTROL_POWER);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+control_power_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  ControlPowerProxy *proxy = CONTROL_POWER_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static gint 
+control_power_proxy_get_pgood (ControlPower *object)
+{
+  ControlPowerProxy *proxy = CONTROL_POWER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "pgood");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
+control_power_proxy_get_state (ControlPower *object)
+{
+  ControlPowerProxy *proxy = CONTROL_POWER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "state");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static void
+control_power_proxy_init (ControlPowerProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = control_power_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_CONTROL_POWER_PROXY, ControlPowerProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), control_power_interface_info ());
+}
+
+static void
+control_power_proxy_class_init (ControlPowerProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = control_power_proxy_finalize;
+  gobject_class->get_property = control_power_proxy_get_property;
+  gobject_class->set_property = control_power_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = control_power_proxy_g_signal;
+  proxy_class->g_properties_changed = control_power_proxy_g_properties_changed;
+
+  control_power_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (ControlPowerProxyPrivate));
+#endif
+}
+
+static void
+control_power_proxy_iface_init (ControlPowerIface *iface)
+{
+  iface->get_pgood = control_power_proxy_get_pgood;
+  iface->get_state = control_power_proxy_get_state;
+}
+
+/**
+ * control_power_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>. See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call control_power_proxy_new_finish() to get the result of the operation.
+ *
+ * See control_power_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+control_power_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_CONTROL_POWER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.control.Power", NULL);
+}
+
+/**
+ * control_power_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to control_power_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with control_power_proxy_new().
+ *
+ * Returns: (transfer full) (type ControlPowerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+ControlPower *
+control_power_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return CONTROL_POWER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * control_power_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>. See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See control_power_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type ControlPowerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+ControlPower *
+control_power_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_CONTROL_POWER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.control.Power", NULL);
+  if (ret != NULL)
+    return CONTROL_POWER (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * control_power_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like control_power_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call control_power_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See control_power_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+control_power_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_CONTROL_POWER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.control.Power", NULL);
+}
+
+/**
+ * control_power_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to control_power_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with control_power_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type ControlPowerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+ControlPower *
+control_power_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return CONTROL_POWER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * control_power_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like control_power_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See control_power_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type ControlPowerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+ControlPower *
+control_power_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_CONTROL_POWER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.control.Power", NULL);
+  if (ret != NULL)
+    return CONTROL_POWER (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * ControlPowerSkeleton:
+ *
+ * The #ControlPowerSkeleton structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * ControlPowerSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #ControlPowerSkeleton.
+ */
+
+struct _ControlPowerSkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_control_power_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], TYPE_CONTROL_POWER);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_CONTROL_POWER);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_control_power_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_control_power_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_control_power_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _control_power_skeleton_vtable =
+{
+  _control_power_skeleton_handle_method_call,
+  _control_power_skeleton_handle_get_property,
+  _control_power_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+control_power_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return control_power_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+control_power_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_control_power_skeleton_vtable;
+}
+
+static GVariant *
+control_power_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_control_power_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _control_power_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _control_power_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _control_power_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.control.Power", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static gboolean _control_power_emit_changed (gpointer user_data);
+
+static void
+control_power_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (_skeleton);
+  gboolean emit_changed = FALSE;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    {
+      g_source_destroy (skeleton->priv->changed_properties_idle_source);
+      skeleton->priv->changed_properties_idle_source = NULL;
+      emit_changed = TRUE;
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+
+  if (emit_changed)
+    _control_power_emit_changed (skeleton);
+}
+
+static void
+_control_power_on_signal_power_good (
+    ControlPower *object)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+
+  GList      *connections, *l;
+  GVariant   *signal_variant;
+  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
+  for (l = connections; l != NULL; l = l->next)
+    {
+      GDBusConnection *connection = l->data;
+      g_dbus_connection_emit_signal (connection,
+        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.control.Power", "PowerGood",
+        signal_variant, NULL);
+    }
+  g_variant_unref (signal_variant);
+  g_list_free_full (connections, g_object_unref);
+}
+
+static void
+_control_power_on_signal_power_lost (
+    ControlPower *object)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+
+  GList      *connections, *l;
+  GVariant   *signal_variant;
+  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
+  for (l = connections; l != NULL; l = l->next)
+    {
+      GDBusConnection *connection = l->data;
+      g_dbus_connection_emit_signal (connection,
+        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.control.Power", "PowerLost",
+        signal_variant, NULL);
+    }
+  g_variant_unref (signal_variant);
+  g_list_free_full (connections, g_object_unref);
+}
+
+static void control_power_skeleton_iface_init (ControlPowerIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (ControlPowerSkeleton, control_power_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (ControlPowerSkeleton)
+                         G_IMPLEMENT_INTERFACE (TYPE_CONTROL_POWER, control_power_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (ControlPowerSkeleton, control_power_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TYPE_CONTROL_POWER, control_power_skeleton_iface_init));
+
+#endif
+static void
+control_power_skeleton_finalize (GObject *object)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  guint n;
+  for (n = 0; n < 2; n++)
+    g_value_unset (&skeleton->priv->properties[n]);
+  g_free (skeleton->priv->properties);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (control_power_skeleton_parent_class)->finalize (object);
+}
+
+static void
+control_power_skeleton_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_control_power_emit_changed (gpointer user_data)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (user_data);
+  GList *l;
+  GVariantBuilder builder;
+  GVariantBuilder invalidated_builder;
+  guint num_changes;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+    {
+      ChangedProperty *cp = l->data;
+      GVariant *variant;
+      const GValue *cur_value;
+
+      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+      if (!_g_value_equal (cur_value, &cp->orig_value))
+        {
+          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
+          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+          g_variant_unref (variant);
+          num_changes++;
+        }
+    }
+  if (num_changes > 0)
+    {
+      GList *connections, *ll;
+      GVariant *signal_variant;
+      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.openbmc.control.Power",
+                                           &builder, &invalidated_builder));
+      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+      for (ll = connections; ll != NULL; ll = ll->next)
+        {
+          GDBusConnection *connection = ll->data;
+
+          g_dbus_connection_emit_signal (connection,
+                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
+                                         "org.freedesktop.DBus.Properties",
+                                         "PropertiesChanged",
+                                         signal_variant,
+                                         NULL);
+        }
+      g_variant_unref (signal_variant);
+      g_list_free_full (connections, g_object_unref);
+    }
+  else
+    {
+      g_variant_builder_clear (&builder);
+      g_variant_builder_clear (&invalidated_builder);
+    }
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  skeleton->priv->changed_properties = NULL;
+  skeleton->priv->changed_properties_idle_source = NULL;
+  g_mutex_unlock (&skeleton->priv->lock);
+  return FALSE;
+}
+
+static void
+_control_power_schedule_emit_changed (ControlPowerSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+  ChangedProperty *cp;
+  GList *l;
+  cp = NULL;
+  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+    {
+      ChangedProperty *i_cp = l->data;
+      if (i_cp->info == info)
+        {
+          cp = i_cp;
+          break;
+        }
+    }
+  if (cp == NULL)
+    {
+      cp = g_new0 (ChangedProperty, 1);
+      cp->prop_id = prop_id;
+      cp->info = info;
+      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+      g_value_copy (orig_value, &cp->orig_value);
+    }
+}
+
+static void
+control_power_skeleton_notify (GObject      *object,
+  GParamSpec *pspec G_GNUC_UNUSED)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties != NULL &&
+      skeleton->priv->changed_properties_idle_source == NULL)
+    {
+      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _control_power_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+      g_source_unref (skeleton->priv->changed_properties_idle_source);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+control_power_skeleton_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 2);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_object_freeze_notify (object);
+  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+    {
+      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+        _control_power_schedule_emit_changed (skeleton, _control_power_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+      g_object_notify_by_pspec (object, pspec);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+  g_object_thaw_notify (object);
+}
+
+static void
+control_power_skeleton_init (ControlPowerSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = control_power_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_CONTROL_POWER_SKELETON, ControlPowerSkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+  skeleton->priv->properties = g_new0 (GValue, 2);
+  g_value_init (&skeleton->priv->properties[0], G_TYPE_INT);
+  g_value_init (&skeleton->priv->properties[1], G_TYPE_INT);
+}
+
+static gint 
+control_power_skeleton_get_pgood (ControlPower *object)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[0]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint 
+control_power_skeleton_get_state (ControlPower *object)
+{
+  ControlPowerSkeleton *skeleton = CONTROL_POWER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[1]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static void
+control_power_skeleton_class_init (ControlPowerSkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = control_power_skeleton_finalize;
+  gobject_class->get_property = control_power_skeleton_get_property;
+  gobject_class->set_property = control_power_skeleton_set_property;
+  gobject_class->notify       = control_power_skeleton_notify;
+
+
+  control_power_override_properties (gobject_class, 1);
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = control_power_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = control_power_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = control_power_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = control_power_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (ControlPowerSkeletonPrivate));
+#endif
+}
+
+static void
+control_power_skeleton_iface_init (ControlPowerIface *iface)
+{
+  iface->power_good = _control_power_on_signal_power_good;
+  iface->power_lost = _control_power_on_signal_power_lost;
+  iface->get_pgood = control_power_skeleton_get_pgood;
+  iface->get_state = control_power_skeleton_get_state;
+}
+
+/**
+ * control_power_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>.
+ *
+ * Returns: (transfer full) (type ControlPowerSkeleton): The skeleton object.
+ */
+ControlPower *
+control_power_skeleton_new (void)
+{
+  return CONTROL_POWER (g_object_new (TYPE_CONTROL_POWER_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for Object, ObjectProxy and ObjectSkeleton
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:Object
+ * @title: Object
+ * @short_description: Specialized GDBusObject types
+ *
+ * This section contains the #Object, #ObjectProxy, and #ObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.
+ */
+
+/**
+ * Object:
+ *
+ * The #Object type is a specialized container of interfaces.
+ */
+
+/**
+ * ObjectIface:
+ * @parent_iface: The parent interface.
+ *
+ * Virtual table for the #Object interface.
+ */
+
+typedef ObjectIface ObjectInterface;
+G_DEFINE_INTERFACE_WITH_CODE (Object, object, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));
+
+static void
+object_default_init (ObjectIface *iface)
+{
+  /**
+   * Object:control-power:
+   *
+   * The #ControlPower instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link>, if any.
+   *
+   * Connect to the #GObject::notify signal to get informed of property changes.
+   */
+  g_object_interface_install_property (iface, g_param_spec_object ("control-power", "control-power", "control-power", TYPE_CONTROL_POWER, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+}
+
+/**
+ * object_get_control_power:
+ * @object: A #Object.
+ *
+ * Gets the #ControlPower instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link> on @object, if any.
+ *
+ * Returns: (transfer full): A #ControlPower that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
+ */
+ControlPower *object_get_control_power (Object *object)
+{
+  GDBusInterface *ret;
+  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+  if (ret == NULL)
+    return NULL;
+  return CONTROL_POWER (ret);
+}
+
+
+/**
+ * object_peek_control_power: (skip)
+ * @object: A #Object.
+ *
+ * Like object_get_control_power() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #ControlPower or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
+ */
+ControlPower *object_peek_control_power (Object *object)
+{
+  GDBusInterface *ret;
+  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+  if (ret == NULL)
+    return NULL;
+  g_object_unref (ret);
+  return CONTROL_POWER (ret);
+}
+
+
+static void
+object_notify (GDBusObject *object, GDBusInterface *interface)
+{
+  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);
+  /* info can be NULL if the other end is using a D-Bus interface we don't know
+   * anything about, for example old generated code in this process talking to
+   * newer generated code in the other process. */
+  if (info != NULL)
+    g_object_notify (G_OBJECT (object), info->hyphen_name);
+}
+
+/**
+ * ObjectProxy:
+ *
+ * The #ObjectProxy structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * ObjectProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #ObjectProxy.
+ */
+
+static void
+object_proxy__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
+{
+}
+
+static void
+object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)
+{
+  iface->interface_added = object_notify;
+  iface->interface_removed = object_notify;
+}
+
+
+G_DEFINE_TYPE_WITH_CODE (ObjectProxy, object_proxy, G_TYPE_DBUS_OBJECT_PROXY,
+                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_proxy__object_iface_init)
+                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_proxy__g_dbus_object_iface_init));
+
+static void
+object_proxy_init (ObjectProxy *object G_GNUC_UNUSED)
+{
+}
+
+static void
+object_proxy_set_property (GObject      *gobject,
+  guint         prop_id,
+  const GValue *value G_GNUC_UNUSED,
+  GParamSpec   *pspec)
+{
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+}
+
+static void
+object_proxy_get_property (GObject      *gobject,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec)
+{
+  ObjectProxy *object = OBJECT_PROXY (gobject);
+  GDBusInterface *interface;
+
+  switch (prop_id)
+    {
+    case 1:
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+      g_value_take_object (value, interface);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+object_proxy_class_init (ObjectProxyClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = object_proxy_set_property;
+  gobject_class->get_property = object_proxy_get_property;
+
+  g_object_class_override_property (gobject_class, 1, "control-power");
+}
+
+/**
+ * object_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @object_path: An object path.
+ *
+ * Creates a new proxy object.
+ *
+ * Returns: (transfer full): The proxy object.
+ */
+ObjectProxy *
+object_proxy_new (GDBusConnection *connection,
+  const gchar *object_path)
+{
+  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
+  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
+  return OBJECT_PROXY (g_object_new (TYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));
+}
+
+/**
+ * ObjectSkeleton:
+ *
+ * The #ObjectSkeleton structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * ObjectSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #ObjectSkeleton.
+ */
+
+static void
+object_skeleton__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
+{
+}
+
+
+static void
+object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)
+{
+  iface->interface_added = object_notify;
+  iface->interface_removed = object_notify;
+}
+
+G_DEFINE_TYPE_WITH_CODE (ObjectSkeleton, object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_skeleton__object_iface_init)
+                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_skeleton__g_dbus_object_iface_init));
+
+static void
+object_skeleton_init (ObjectSkeleton *object G_GNUC_UNUSED)
+{
+}
+
+static void
+object_skeleton_set_property (GObject      *gobject,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec)
+{
+  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
+  GDBusInterfaceSkeleton *interface;
+
+  switch (prop_id)
+    {
+    case 1:
+      interface = g_value_get_object (value);
+      if (interface != NULL)
+        {
+          g_warn_if_fail (IS_CONTROL_POWER (interface));
+          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+        }
+      else
+        {
+          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.control.Power");
+        }
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+object_skeleton_get_property (GObject      *gobject,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec)
+{
+  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
+  GDBusInterface *interface;
+
+  switch (prop_id)
+    {
+    case 1:
+      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.control.Power");
+      g_value_take_object (value, interface);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+object_skeleton_class_init (ObjectSkeletonClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = object_skeleton_set_property;
+  gobject_class->get_property = object_skeleton_get_property;
+
+  g_object_class_override_property (gobject_class, 1, "control-power");
+}
+
+/**
+ * object_skeleton_new:
+ * @object_path: An object path.
+ *
+ * Creates a new skeleton object.
+ *
+ * Returns: (transfer full): The skeleton object.
+ */
+ObjectSkeleton *
+object_skeleton_new (const gchar *object_path)
+{
+  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
+  return OBJECT_SKELETON (g_object_new (TYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));
+}
+
+/**
+ * object_skeleton_set_control_power:
+ * @object: A #ObjectSkeleton.
+ * @interface_: (allow-none): A #ControlPower or %NULL to clear the interface.
+ *
+ * Sets the #ControlPower instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-control-Power.top_of_page">org.openbmc.control.Power</link> on @object.
+ */
+void object_skeleton_set_control_power (ObjectSkeleton *object, ControlPower *interface_)
+{
+  g_object_set (G_OBJECT (object), "control-power", interface_, NULL);
+}
+
+
+/* ------------------------------------------------------------------------
+ * Code for ObjectManager client
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:ObjectManagerClient
+ * @title: ObjectManagerClient
+ * @short_description: Generated GDBusObjectManagerClient type
+ *
+ * This section contains a #GDBusObjectManagerClient that uses object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.
+ */
+
+/**
+ * ObjectManagerClient:
+ *
+ * The #ObjectManagerClient structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * ObjectManagerClientClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #ObjectManagerClient.
+ */
+
+G_DEFINE_TYPE (ObjectManagerClient, object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);
+
+static void
+object_manager_client_init (ObjectManagerClient *manager G_GNUC_UNUSED)
+{
+}
+
+static void
+object_manager_client_class_init (ObjectManagerClientClass *klass G_GNUC_UNUSED)
+{
+}
+
+/**
+ * object_manager_client_get_proxy_type:
+ * @manager: A #GDBusObjectManagerClient.
+ * @object_path: The object path of the remote object (unused).
+ * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy #GType.
+ * @user_data: User data (unused).
+ *
+ * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and #GDBusProxy<!-- -->-derived types.
+ *
+ * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for #ObjectProxy.
+ */
+GType
+object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar *object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)
+{
+  static gsize once_init_value = 0;
+  static GHashTable *lookup_hash;
+  GType ret;
+
+  if (interface_name == NULL)
+    return TYPE_OBJECT_PROXY;
+  if (g_once_init_enter (&once_init_value))
+    {
+      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);
+      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.control.Power", GSIZE_TO_POINTER (TYPE_CONTROL_POWER_PROXY));
+      g_once_init_leave (&once_init_value, 1);
+    }
+  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));
+  if (ret == (GType) 0)
+    ret = G_TYPE_DBUS_PROXY;
+  return ret;
+}
+
+/**
+ * object_manager_client_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call object_manager_client_new_finish() to get the result of the operation.
+ *
+ * See object_manager_client_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+object_manager_client_new (
+    GDBusConnection        *connection,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GAsyncReadyCallback     callback,
+    gpointer                user_data)
+{
+  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
+}
+
+/**
+ * object_manager_client_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with object_manager_client_new().
+ *
+ * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
+ */
+GDBusObjectManager *
+object_manager_client_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return G_DBUS_OBJECT_MANAGER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * object_manager_client_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See object_manager_client_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
+ */
+GDBusObjectManager *
+object_manager_client_new_sync (
+    GDBusConnection        *connection,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GError                **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
+  if (ret != NULL)
+    return G_DBUS_OBJECT_MANAGER (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * object_manager_client_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call object_manager_client_new_for_bus_finish() to get the result of the operation.
+ *
+ * See object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+object_manager_client_new_for_bus (
+    GBusType                bus_type,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GAsyncReadyCallback     callback,
+    gpointer                user_data)
+{
+  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
+}
+
+/**
+ * object_manager_client_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with object_manager_client_new_for_bus().
+ *
+ * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
+ */
+GDBusObjectManager *
+object_manager_client_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return G_DBUS_OBJECT_MANAGER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * object_manager_client_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See object_manager_client_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
+ */
+GDBusObjectManager *
+object_manager_client_new_for_bus_sync (
+    GBusType                bus_type,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GError                **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
+  if (ret != NULL)
+    return G_DBUS_OBJECT_MANAGER (ret);
+  else
+    return NULL;
+}
+
+
diff --git a/interfaces/power_control.h b/interfaces/power_control.h
index 1d2f748..9d51f09 100644
--- a/interfaces/power_control.h
+++ b/interfaces/power_control.h
@@ -1,368 +1,368 @@
-/*
- * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
- *
- * The license of this code is the same as for the source it was derived from.
- */
-
-#ifndef __INTERFACES_POWER_CONTROL_H__
-#define __INTERFACES_POWER_CONTROL_H__
-
-#include <gio/gio.h>
-
-G_BEGIN_DECLS
-
-
-/* ------------------------------------------------------------------------ */
-/* Declarations for org.openbmc.PowerControl */
-
-#define TYPE_POWER_CONTROL (power_control_get_type ())
-#define POWER_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_POWER_CONTROL, PowerControl))
-#define IS_POWER_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_POWER_CONTROL))
-#define POWER_CONTROL_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_POWER_CONTROL, PowerControlIface))
-
-struct _PowerControl;
-typedef struct _PowerControl PowerControl;
-typedef struct _PowerControlIface PowerControlIface;
-
-struct _PowerControlIface
-{
-  GTypeInterface parent_iface;
-
-
-
-  gboolean (*handle_get_power_state) (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation);
-
-  gboolean (*handle_set_power_state) (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation,
-    gint arg_state);
-
-  gint  (*get_pgood) (PowerControl *object);
-
-  gint  (*get_state) (PowerControl *object);
-
-  void (*power_good) (
-    PowerControl *object);
-
-  void (*power_lost) (
-    PowerControl *object);
-
-};
-
-GType power_control_get_type (void) G_GNUC_CONST;
-
-GDBusInterfaceInfo *power_control_interface_info (void);
-guint power_control_override_properties (GObjectClass *klass, guint property_id_begin);
-
-
-/* D-Bus method call completion functions: */
-void power_control_complete_set_power_state (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation);
-
-void power_control_complete_get_power_state (
-    PowerControl *object,
-    GDBusMethodInvocation *invocation,
-    gint state);
-
-
-
-/* D-Bus signal emissions functions: */
-void power_control_emit_power_good (
-    PowerControl *object);
-
-void power_control_emit_power_lost (
-    PowerControl *object);
-
-
-
-/* D-Bus method calls: */
-void power_control_call_set_power_state (
-    PowerControl *proxy,
-    gint arg_state,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data);
-
-gboolean power_control_call_set_power_state_finish (
-    PowerControl *proxy,
-    GAsyncResult *res,
-    GError **error);
-
-gboolean power_control_call_set_power_state_sync (
-    PowerControl *proxy,
-    gint arg_state,
-    GCancellable *cancellable,
-    GError **error);
-
-void power_control_call_get_power_state (
-    PowerControl *proxy,
-    GCancellable *cancellable,
-    GAsyncReadyCallback callback,
-    gpointer user_data);
-
-gboolean power_control_call_get_power_state_finish (
-    PowerControl *proxy,
-    gint *out_state,
-    GAsyncResult *res,
-    GError **error);
-
-gboolean power_control_call_get_power_state_sync (
-    PowerControl *proxy,
-    gint *out_state,
-    GCancellable *cancellable,
-    GError **error);
-
-
-
-/* D-Bus property accessors: */
-gint power_control_get_pgood (PowerControl *object);
-void power_control_set_pgood (PowerControl *object, gint value);
-
-gint power_control_get_state (PowerControl *object);
-void power_control_set_state (PowerControl *object, gint value);
-
-
-/* ---- */
-
-#define TYPE_POWER_CONTROL_PROXY (power_control_proxy_get_type ())
-#define POWER_CONTROL_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_POWER_CONTROL_PROXY, PowerControlProxy))
-#define POWER_CONTROL_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_POWER_CONTROL_PROXY, PowerControlProxyClass))
-#define POWER_CONTROL_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_POWER_CONTROL_PROXY, PowerControlProxyClass))
-#define IS_POWER_CONTROL_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_POWER_CONTROL_PROXY))
-#define IS_POWER_CONTROL_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_POWER_CONTROL_PROXY))
-
-typedef struct _PowerControlProxy PowerControlProxy;
-typedef struct _PowerControlProxyClass PowerControlProxyClass;
-typedef struct _PowerControlProxyPrivate PowerControlProxyPrivate;
-
-struct _PowerControlProxy
-{
-  /*< private >*/
-  GDBusProxy parent_instance;
-  PowerControlProxyPrivate *priv;
-};
-
-struct _PowerControlProxyClass
-{
-  GDBusProxyClass parent_class;
-};
-
-GType power_control_proxy_get_type (void) G_GNUC_CONST;
-
-void power_control_proxy_new (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data);
-PowerControl *power_control_proxy_new_finish (
-    GAsyncResult        *res,
-    GError             **error);
-PowerControl *power_control_proxy_new_sync (
-    GDBusConnection     *connection,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error);
-
-void power_control_proxy_new_for_bus (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GAsyncReadyCallback  callback,
-    gpointer             user_data);
-PowerControl *power_control_proxy_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error);
-PowerControl *power_control_proxy_new_for_bus_sync (
-    GBusType             bus_type,
-    GDBusProxyFlags      flags,
-    const gchar         *name,
-    const gchar         *object_path,
-    GCancellable        *cancellable,
-    GError             **error);
-
-
-/* ---- */
-
-#define TYPE_POWER_CONTROL_SKELETON (power_control_skeleton_get_type ())
-#define POWER_CONTROL_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_POWER_CONTROL_SKELETON, PowerControlSkeleton))
-#define POWER_CONTROL_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_POWER_CONTROL_SKELETON, PowerControlSkeletonClass))
-#define POWER_CONTROL_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_POWER_CONTROL_SKELETON, PowerControlSkeletonClass))
-#define IS_POWER_CONTROL_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_POWER_CONTROL_SKELETON))
-#define IS_POWER_CONTROL_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_POWER_CONTROL_SKELETON))
-
-typedef struct _PowerControlSkeleton PowerControlSkeleton;
-typedef struct _PowerControlSkeletonClass PowerControlSkeletonClass;
-typedef struct _PowerControlSkeletonPrivate PowerControlSkeletonPrivate;
-
-struct _PowerControlSkeleton
-{
-  /*< private >*/
-  GDBusInterfaceSkeleton parent_instance;
-  PowerControlSkeletonPrivate *priv;
-};
-
-struct _PowerControlSkeletonClass
-{
-  GDBusInterfaceSkeletonClass parent_class;
-};
-
-GType power_control_skeleton_get_type (void) G_GNUC_CONST;
-
-PowerControl *power_control_skeleton_new (void);
-
-
-/* ---- */
-
-#define TYPE_OBJECT (object_get_type ())
-#define OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT, Object))
-#define IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT))
-#define OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_OBJECT, Object))
-
-struct _Object;
-typedef struct _Object Object;
-typedef struct _ObjectIface ObjectIface;
-
-struct _ObjectIface
-{
-  GTypeInterface parent_iface;
-};
-
-GType object_get_type (void) G_GNUC_CONST;
-
-PowerControl *object_get_power_control (Object *object);
-PowerControl *object_peek_power_control (Object *object);
-
-#define TYPE_OBJECT_PROXY (object_proxy_get_type ())
-#define OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_PROXY, ObjectProxy))
-#define OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_PROXY, ObjectProxyClass))
-#define OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_PROXY, ObjectProxyClass))
-#define IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_PROXY))
-#define IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_PROXY))
-
-typedef struct _ObjectProxy ObjectProxy;
-typedef struct _ObjectProxyClass ObjectProxyClass;
-typedef struct _ObjectProxyPrivate ObjectProxyPrivate;
-
-struct _ObjectProxy
-{
-  /*< private >*/
-  GDBusObjectProxy parent_instance;
-  ObjectProxyPrivate *priv;
-};
-
-struct _ObjectProxyClass
-{
-  GDBusObjectProxyClass parent_class;
-};
-
-GType object_proxy_get_type (void) G_GNUC_CONST;
-ObjectProxy *object_proxy_new (GDBusConnection *connection, const gchar *object_path);
-
-#define TYPE_OBJECT_SKELETON (object_skeleton_get_type ())
-#define OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_SKELETON, ObjectSkeleton))
-#define OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
-#define OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
-#define IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_SKELETON))
-#define IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_SKELETON))
-
-typedef struct _ObjectSkeleton ObjectSkeleton;
-typedef struct _ObjectSkeletonClass ObjectSkeletonClass;
-typedef struct _ObjectSkeletonPrivate ObjectSkeletonPrivate;
-
-struct _ObjectSkeleton
-{
-  /*< private >*/
-  GDBusObjectSkeleton parent_instance;
-  ObjectSkeletonPrivate *priv;
-};
-
-struct _ObjectSkeletonClass
-{
-  GDBusObjectSkeletonClass parent_class;
-};
-
-GType object_skeleton_get_type (void) G_GNUC_CONST;
-ObjectSkeleton *object_skeleton_new (const gchar *object_path);
-void object_skeleton_set_power_control (ObjectSkeleton *object, PowerControl *interface_);
-
-/* ---- */
-
-#define TYPE_OBJECT_MANAGER_CLIENT (object_manager_client_get_type ())
-#define OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClient))
-#define OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
-#define OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
-#define IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_MANAGER_CLIENT))
-#define IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_MANAGER_CLIENT))
-
-typedef struct _ObjectManagerClient ObjectManagerClient;
-typedef struct _ObjectManagerClientClass ObjectManagerClientClass;
-typedef struct _ObjectManagerClientPrivate ObjectManagerClientPrivate;
-
-struct _ObjectManagerClient
-{
-  /*< private >*/
-  GDBusObjectManagerClient parent_instance;
-  ObjectManagerClientPrivate *priv;
-};
-
-struct _ObjectManagerClientClass
-{
-  GDBusObjectManagerClientClass parent_class;
-};
-
-GType object_manager_client_get_type (void) G_GNUC_CONST;
-
-GType object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);
-
-void object_manager_client_new (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data);
-GDBusObjectManager *object_manager_client_new_finish (
-    GAsyncResult        *res,
-    GError             **error);
-GDBusObjectManager *object_manager_client_new_sync (
-    GDBusConnection        *connection,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error);
-
-void object_manager_client_new_for_bus (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GAsyncReadyCallback     callback,
-    gpointer                user_data);
-GDBusObjectManager *object_manager_client_new_for_bus_finish (
-    GAsyncResult        *res,
-    GError             **error);
-GDBusObjectManager *object_manager_client_new_for_bus_sync (
-    GBusType                bus_type,
-    GDBusObjectManagerClientFlags  flags,
-    const gchar            *name,
-    const gchar            *object_path,
-    GCancellable           *cancellable,
-    GError                **error);
-
-
-G_END_DECLS
-
-#endif /* __INTERFACES_POWER_CONTROL_H__ */
+/*
+ * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __INTERFACES_POWER_CONTROL_H__
+#define __INTERFACES_POWER_CONTROL_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.openbmc.control.Power */
+
+#define TYPE_CONTROL_POWER (control_power_get_type ())
+#define CONTROL_POWER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_CONTROL_POWER, ControlPower))
+#define IS_CONTROL_POWER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_CONTROL_POWER))
+#define CONTROL_POWER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_CONTROL_POWER, ControlPowerIface))
+
+struct _ControlPower;
+typedef struct _ControlPower ControlPower;
+typedef struct _ControlPowerIface ControlPowerIface;
+
+struct _ControlPowerIface
+{
+  GTypeInterface parent_iface;
+
+
+
+  gboolean (*handle_get_power_state) (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_set_power_state) (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation,
+    gint arg_state);
+
+  gint  (*get_pgood) (ControlPower *object);
+
+  gint  (*get_state) (ControlPower *object);
+
+  void (*power_good) (
+    ControlPower *object);
+
+  void (*power_lost) (
+    ControlPower *object);
+
+};
+
+GType control_power_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *control_power_interface_info (void);
+guint control_power_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void control_power_complete_set_power_state (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation);
+
+void control_power_complete_get_power_state (
+    ControlPower *object,
+    GDBusMethodInvocation *invocation,
+    gint state);
+
+
+
+/* D-Bus signal emissions functions: */
+void control_power_emit_power_good (
+    ControlPower *object);
+
+void control_power_emit_power_lost (
+    ControlPower *object);
+
+
+
+/* D-Bus method calls: */
+void control_power_call_set_power_state (
+    ControlPower *proxy,
+    gint arg_state,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean control_power_call_set_power_state_finish (
+    ControlPower *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean control_power_call_set_power_state_sync (
+    ControlPower *proxy,
+    gint arg_state,
+    GCancellable *cancellable,
+    GError **error);
+
+void control_power_call_get_power_state (
+    ControlPower *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean control_power_call_get_power_state_finish (
+    ControlPower *proxy,
+    gint *out_state,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean control_power_call_get_power_state_sync (
+    ControlPower *proxy,
+    gint *out_state,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+gint control_power_get_pgood (ControlPower *object);
+void control_power_set_pgood (ControlPower *object, gint value);
+
+gint control_power_get_state (ControlPower *object);
+void control_power_set_state (ControlPower *object, gint value);
+
+
+/* ---- */
+
+#define TYPE_CONTROL_POWER_PROXY (control_power_proxy_get_type ())
+#define CONTROL_POWER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_CONTROL_POWER_PROXY, ControlPowerProxy))
+#define CONTROL_POWER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_CONTROL_POWER_PROXY, ControlPowerProxyClass))
+#define CONTROL_POWER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_CONTROL_POWER_PROXY, ControlPowerProxyClass))
+#define IS_CONTROL_POWER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_CONTROL_POWER_PROXY))
+#define IS_CONTROL_POWER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_CONTROL_POWER_PROXY))
+
+typedef struct _ControlPowerProxy ControlPowerProxy;
+typedef struct _ControlPowerProxyClass ControlPowerProxyClass;
+typedef struct _ControlPowerProxyPrivate ControlPowerProxyPrivate;
+
+struct _ControlPowerProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  ControlPowerProxyPrivate *priv;
+};
+
+struct _ControlPowerProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType control_power_proxy_get_type (void) G_GNUC_CONST;
+
+void control_power_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+ControlPower *control_power_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+ControlPower *control_power_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void control_power_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+ControlPower *control_power_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+ControlPower *control_power_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_CONTROL_POWER_SKELETON (control_power_skeleton_get_type ())
+#define CONTROL_POWER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_CONTROL_POWER_SKELETON, ControlPowerSkeleton))
+#define CONTROL_POWER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_CONTROL_POWER_SKELETON, ControlPowerSkeletonClass))
+#define CONTROL_POWER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_CONTROL_POWER_SKELETON, ControlPowerSkeletonClass))
+#define IS_CONTROL_POWER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_CONTROL_POWER_SKELETON))
+#define IS_CONTROL_POWER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_CONTROL_POWER_SKELETON))
+
+typedef struct _ControlPowerSkeleton ControlPowerSkeleton;
+typedef struct _ControlPowerSkeletonClass ControlPowerSkeletonClass;
+typedef struct _ControlPowerSkeletonPrivate ControlPowerSkeletonPrivate;
+
+struct _ControlPowerSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  ControlPowerSkeletonPrivate *priv;
+};
+
+struct _ControlPowerSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType control_power_skeleton_get_type (void) G_GNUC_CONST;
+
+ControlPower *control_power_skeleton_new (void);
+
+
+/* ---- */
+
+#define TYPE_OBJECT (object_get_type ())
+#define OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT, Object))
+#define IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT))
+#define OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_OBJECT, Object))
+
+struct _Object;
+typedef struct _Object Object;
+typedef struct _ObjectIface ObjectIface;
+
+struct _ObjectIface
+{
+  GTypeInterface parent_iface;
+};
+
+GType object_get_type (void) G_GNUC_CONST;
+
+ControlPower *object_get_control_power (Object *object);
+ControlPower *object_peek_control_power (Object *object);
+
+#define TYPE_OBJECT_PROXY (object_proxy_get_type ())
+#define OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_PROXY, ObjectProxy))
+#define OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_PROXY, ObjectProxyClass))
+#define OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_PROXY, ObjectProxyClass))
+#define IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_PROXY))
+#define IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_PROXY))
+
+typedef struct _ObjectProxy ObjectProxy;
+typedef struct _ObjectProxyClass ObjectProxyClass;
+typedef struct _ObjectProxyPrivate ObjectProxyPrivate;
+
+struct _ObjectProxy
+{
+  /*< private >*/
+  GDBusObjectProxy parent_instance;
+  ObjectProxyPrivate *priv;
+};
+
+struct _ObjectProxyClass
+{
+  GDBusObjectProxyClass parent_class;
+};
+
+GType object_proxy_get_type (void) G_GNUC_CONST;
+ObjectProxy *object_proxy_new (GDBusConnection *connection, const gchar *object_path);
+
+#define TYPE_OBJECT_SKELETON (object_skeleton_get_type ())
+#define OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_SKELETON, ObjectSkeleton))
+#define OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
+#define OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
+#define IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_SKELETON))
+#define IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_SKELETON))
+
+typedef struct _ObjectSkeleton ObjectSkeleton;
+typedef struct _ObjectSkeletonClass ObjectSkeletonClass;
+typedef struct _ObjectSkeletonPrivate ObjectSkeletonPrivate;
+
+struct _ObjectSkeleton
+{
+  /*< private >*/
+  GDBusObjectSkeleton parent_instance;
+  ObjectSkeletonPrivate *priv;
+};
+
+struct _ObjectSkeletonClass
+{
+  GDBusObjectSkeletonClass parent_class;
+};
+
+GType object_skeleton_get_type (void) G_GNUC_CONST;
+ObjectSkeleton *object_skeleton_new (const gchar *object_path);
+void object_skeleton_set_control_power (ObjectSkeleton *object, ControlPower *interface_);
+
+/* ---- */
+
+#define TYPE_OBJECT_MANAGER_CLIENT (object_manager_client_get_type ())
+#define OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClient))
+#define OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
+#define OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
+#define IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_MANAGER_CLIENT))
+#define IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_MANAGER_CLIENT))
+
+typedef struct _ObjectManagerClient ObjectManagerClient;
+typedef struct _ObjectManagerClientClass ObjectManagerClientClass;
+typedef struct _ObjectManagerClientPrivate ObjectManagerClientPrivate;
+
+struct _ObjectManagerClient
+{
+  /*< private >*/
+  GDBusObjectManagerClient parent_instance;
+  ObjectManagerClientPrivate *priv;
+};
+
+struct _ObjectManagerClientClass
+{
+  GDBusObjectManagerClientClass parent_class;
+};
+
+GType object_manager_client_get_type (void) G_GNUC_CONST;
+
+GType object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);
+
+void object_manager_client_new (
+    GDBusConnection        *connection,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GAsyncReadyCallback     callback,
+    gpointer                user_data);
+GDBusObjectManager *object_manager_client_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GDBusObjectManager *object_manager_client_new_sync (
+    GDBusConnection        *connection,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GError                **error);
+
+void object_manager_client_new_for_bus (
+    GBusType                bus_type,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GAsyncReadyCallback     callback,
+    gpointer                user_data);
+GDBusObjectManager *object_manager_client_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GDBusObjectManager *object_manager_client_new_for_bus_sync (
+    GBusType                bus_type,
+    GDBusObjectManagerClientFlags  flags,
+    const gchar            *name,
+    const gchar            *object_path,
+    GCancellable           *cancellable,
+    GError                **error);
+
+
+G_END_DECLS
+
+#endif /* __INTERFACES_POWER_CONTROL_H__ */
diff --git a/interfaces/sensor.c b/interfaces/sensor.c
index c2abe2e..64aaebf 100644
--- a/interfaces/sensor.c
+++ b/interfaces/sensor.c
@@ -223,6 +223,72 @@
   FALSE
 };
 
+static const _ExtendedGDBusArgInfo _sensor_integer_method_info_set_thresholds_IN_ARG_lower_critical =
+{
+  {
+    -1,
+    (gchar *) "lower_critical",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _sensor_integer_method_info_set_thresholds_IN_ARG_lower_warning =
+{
+  {
+    -1,
+    (gchar *) "lower_warning",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _sensor_integer_method_info_set_thresholds_IN_ARG_upper_warning =
+{
+  {
+    -1,
+    (gchar *) "upper_warning",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _sensor_integer_method_info_set_thresholds_IN_ARG_upper_critical =
+{
+  {
+    -1,
+    (gchar *) "upper_critical",
+    (gchar *) "i",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _sensor_integer_method_info_set_thresholds_IN_ARG_pointers[] =
+{
+  &_sensor_integer_method_info_set_thresholds_IN_ARG_lower_critical,
+  &_sensor_integer_method_info_set_thresholds_IN_ARG_lower_warning,
+  &_sensor_integer_method_info_set_thresholds_IN_ARG_upper_warning,
+  &_sensor_integer_method_info_set_thresholds_IN_ARG_upper_critical,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _sensor_integer_method_info_set_thresholds =
+{
+  {
+    -1,
+    (gchar *) "setThresholds",
+    (GDBusArgInfo **) &_sensor_integer_method_info_set_thresholds_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-set-thresholds",
+  FALSE
+};
+
 static const _ExtendedGDBusArgInfo _sensor_integer_method_info_set_poll_interval_IN_ARG_poll_interval =
 {
   {
@@ -283,16 +349,33 @@
   FALSE
 };
 
-static const _ExtendedGDBusMethodInfo _sensor_integer_method_info_go =
+static const _ExtendedGDBusArgInfo _sensor_integer_method_info_get_threshold_state_OUT_ARG_threshold_state =
 {
   {
     -1,
-    (gchar *) "go",
-    NULL,
-    NULL,
+    (gchar *) "threshold_state",
+    (gchar *) "i",
     NULL
   },
-  "handle-go",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _sensor_integer_method_info_get_threshold_state_OUT_ARG_pointers[] =
+{
+  &_sensor_integer_method_info_get_threshold_state_OUT_ARG_threshold_state,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _sensor_integer_method_info_get_threshold_state =
+{
+  {
+    -1,
+    (gchar *) "getThresholdState",
+    NULL,
+    (GDBusArgInfo **) &_sensor_integer_method_info_get_threshold_state_OUT_ARG_pointers,
+    NULL
+  },
+  "handle-get-threshold-state",
   FALSE
 };
 
@@ -300,9 +383,10 @@
 {
   &_sensor_integer_method_info_get_value,
   &_sensor_integer_method_info_get_units,
+  &_sensor_integer_method_info_set_thresholds,
   &_sensor_integer_method_info_set_poll_interval,
   &_sensor_integer_method_info_set_config_data,
-  &_sensor_integer_method_info_go,
+  &_sensor_integer_method_info_get_threshold_state,
   NULL
 };
 
@@ -334,9 +418,33 @@
   "changed"
 };
 
+static const _ExtendedGDBusSignalInfo _sensor_integer_signal_info_warning =
+{
+  {
+    -1,
+    (gchar *) "Warning",
+    NULL,
+    NULL
+  },
+  "warning"
+};
+
+static const _ExtendedGDBusSignalInfo _sensor_integer_signal_info_critical =
+{
+  {
+    -1,
+    (gchar *) "Critical",
+    NULL,
+    NULL
+  },
+  "critical"
+};
+
 static const _ExtendedGDBusSignalInfo * const _sensor_integer_signal_info_pointers[] =
 {
   &_sensor_integer_signal_info_changed,
+  &_sensor_integer_signal_info_warning,
+  &_sensor_integer_signal_info_critical,
   NULL
 };
 
@@ -366,6 +474,71 @@
   FALSE
 };
 
+static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_threshold_lower_critical =
+{
+  {
+    -1,
+    (gchar *) "threshold_lower_critical",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "threshold-lower-critical",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_threshold_lower_warning =
+{
+  {
+    -1,
+    (gchar *) "threshold_lower_warning",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "threshold-lower-warning",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_threshold_upper_warning =
+{
+  {
+    -1,
+    (gchar *) "threshold_upper_warning",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "threshold-upper-warning",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_threshold_upper_critical =
+{
+  {
+    -1,
+    (gchar *) "threshold_upper_critical",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "threshold-upper-critical",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_threshold_state =
+{
+  {
+    -1,
+    (gchar *) "threshold_state",
+    (gchar *) "i",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "threshold-state",
+  FALSE
+};
+
 static const _ExtendedGDBusPropertyInfo _sensor_integer_property_info_poll_interval =
 {
   {
@@ -409,6 +582,11 @@
 {
   &_sensor_integer_property_info_value,
   &_sensor_integer_property_info_units,
+  &_sensor_integer_property_info_threshold_lower_critical,
+  &_sensor_integer_property_info_threshold_lower_warning,
+  &_sensor_integer_property_info_threshold_upper_warning,
+  &_sensor_integer_property_info_threshold_upper_critical,
+  &_sensor_integer_property_info_threshold_state,
   &_sensor_integer_property_info_poll_interval,
   &_sensor_integer_property_info_config_data,
   &_sensor_integer_property_info_changed_tolerance,
@@ -457,6 +635,11 @@
 {
   g_object_class_override_property (klass, property_id_begin++, "value");
   g_object_class_override_property (klass, property_id_begin++, "units");
+  g_object_class_override_property (klass, property_id_begin++, "threshold-lower-critical");
+  g_object_class_override_property (klass, property_id_begin++, "threshold-lower-warning");
+  g_object_class_override_property (klass, property_id_begin++, "threshold-upper-warning");
+  g_object_class_override_property (klass, property_id_begin++, "threshold-upper-critical");
+  g_object_class_override_property (klass, property_id_begin++, "threshold-state");
   g_object_class_override_property (klass, property_id_begin++, "poll-interval");
   g_object_class_override_property (klass, property_id_begin++, "config-data");
   g_object_class_override_property (klass, property_id_begin++, "changed-tolerance");
@@ -474,17 +657,25 @@
 /**
  * SensorIntegerIface:
  * @parent_iface: The parent interface.
+ * @handle_get_threshold_state: Handler for the #SensorInteger::handle-get-threshold-state signal.
  * @handle_get_units: Handler for the #SensorInteger::handle-get-units signal.
  * @handle_get_value: Handler for the #SensorInteger::handle-get-value signal.
- * @handle_go: Handler for the #SensorInteger::handle-go signal.
  * @handle_set_config_data: Handler for the #SensorInteger::handle-set-config-data signal.
  * @handle_set_poll_interval: Handler for the #SensorInteger::handle-set-poll-interval signal.
+ * @handle_set_thresholds: Handler for the #SensorInteger::handle-set-thresholds signal.
  * @get_changed_tolerance: Getter for the #SensorInteger:changed-tolerance property.
  * @get_config_data: Getter for the #SensorInteger:config-data property.
  * @get_poll_interval: Getter for the #SensorInteger:poll-interval property.
+ * @get_threshold_lower_critical: Getter for the #SensorInteger:threshold-lower-critical property.
+ * @get_threshold_lower_warning: Getter for the #SensorInteger:threshold-lower-warning property.
+ * @get_threshold_state: Getter for the #SensorInteger:threshold-state property.
+ * @get_threshold_upper_critical: Getter for the #SensorInteger:threshold-upper-critical property.
+ * @get_threshold_upper_warning: Getter for the #SensorInteger:threshold-upper-warning property.
  * @get_units: Getter for the #SensorInteger:units property.
  * @get_value: Getter for the #SensorInteger:value property.
  * @changed: Handler for the #SensorInteger::changed signal.
+ * @critical: Handler for the #SensorInteger::critical signal.
+ * @warning: Handler for the #SensorInteger::warning signal.
  *
  * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-SensorInteger.top_of_page">org.openbmc.SensorInteger</link>.
  */
@@ -541,6 +732,32 @@
     G_TYPE_DBUS_METHOD_INVOCATION);
 
   /**
+   * SensorInteger::handle-set-thresholds:
+   * @object: A #SensorInteger.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_lower_critical: Argument passed by remote caller.
+   * @arg_lower_warning: Argument passed by remote caller.
+   * @arg_upper_warning: Argument passed by remote caller.
+   * @arg_upper_critical: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-SensorInteger.setThresholds">setThresholds()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call sensor_integer_complete_set_thresholds() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-set-thresholds",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (SensorIntegerIface, handle_set_thresholds),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    5,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
+
+  /**
    * SensorInteger::handle-set-poll-interval:
    * @object: A #SensorInteger.
    * @invocation: A #GDBusMethodInvocation.
@@ -587,20 +804,20 @@
     G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV);
 
   /**
-   * SensorInteger::handle-go:
+   * SensorInteger::handle-get-threshold-state:
    * @object: A #SensorInteger.
    * @invocation: A #GDBusMethodInvocation.
    *
-   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-SensorInteger.go">go()</link> D-Bus method.
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-SensorInteger.getThresholdState">getThresholdState()</link> D-Bus method.
    *
-   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call sensor_integer_complete_go() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call sensor_integer_complete_get_threshold_state() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
    *
    * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
    */
-  g_signal_new ("handle-go",
+  g_signal_new ("handle-get-threshold-state",
     G_TYPE_FROM_INTERFACE (iface),
     G_SIGNAL_RUN_LAST,
-    G_STRUCT_OFFSET (SensorIntegerIface, handle_go),
+    G_STRUCT_OFFSET (SensorIntegerIface, handle_get_threshold_state),
     g_signal_accumulator_true_handled,
     NULL,
     g_cclosure_marshal_generic,
@@ -628,6 +845,42 @@
     G_TYPE_NONE,
     1, G_TYPE_INT);
 
+  /**
+   * SensorInteger::warning:
+   * @object: A #SensorInteger.
+   *
+   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-SensorInteger.Warning">"Warning"</link> is received.
+   *
+   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
+   */
+  g_signal_new ("warning",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (SensorIntegerIface, warning),
+    NULL,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_NONE,
+    0);
+
+  /**
+   * SensorInteger::critical:
+   * @object: A #SensorInteger.
+   *
+   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-SensorInteger.Critical">"Critical"</link> is received.
+   *
+   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
+   */
+  g_signal_new ("critical",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (SensorIntegerIface, critical),
+    NULL,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_NONE,
+    0);
+
   /* GObject properties for D-Bus properties: */
   /**
    * SensorInteger:value:
@@ -648,6 +901,51 @@
   g_object_interface_install_property (iface,
     g_param_spec_string ("units", "units", "units", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   /**
+   * SensorInteger:threshold-lower-critical:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_critical">"threshold_lower_critical"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("threshold-lower-critical", "threshold_lower_critical", "threshold_lower_critical", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * SensorInteger:threshold-lower-warning:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_warning">"threshold_lower_warning"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("threshold-lower-warning", "threshold_lower_warning", "threshold_lower_warning", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * SensorInteger:threshold-upper-warning:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_warning">"threshold_upper_warning"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("threshold-upper-warning", "threshold_upper_warning", "threshold_upper_warning", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * SensorInteger:threshold-upper-critical:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_critical">"threshold_upper_critical"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("threshold-upper-critical", "threshold_upper_critical", "threshold_upper_critical", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * SensorInteger:threshold-state:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_state">"threshold_state"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int ("threshold-state", "threshold_state", "threshold_state", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
    * SensorInteger:poll-interval:
    *
    * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-SensorInteger.poll_interval">"poll_interval"</link>.
@@ -759,6 +1057,161 @@
 }
 
 /**
+ * sensor_integer_get_threshold_lower_critical: (skip)
+ * @object: A #SensorInteger.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_critical">"threshold_lower_critical"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+sensor_integer_get_threshold_lower_critical (SensorInteger *object)
+{
+  return SENSOR_INTEGER_GET_IFACE (object)->get_threshold_lower_critical (object);
+}
+
+/**
+ * sensor_integer_set_threshold_lower_critical: (skip)
+ * @object: A #SensorInteger.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_critical">"threshold_lower_critical"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+sensor_integer_set_threshold_lower_critical (SensorInteger *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "threshold-lower-critical", value, NULL);
+}
+
+/**
+ * sensor_integer_get_threshold_lower_warning: (skip)
+ * @object: A #SensorInteger.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_warning">"threshold_lower_warning"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+sensor_integer_get_threshold_lower_warning (SensorInteger *object)
+{
+  return SENSOR_INTEGER_GET_IFACE (object)->get_threshold_lower_warning (object);
+}
+
+/**
+ * sensor_integer_set_threshold_lower_warning: (skip)
+ * @object: A #SensorInteger.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_lower_warning">"threshold_lower_warning"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+sensor_integer_set_threshold_lower_warning (SensorInteger *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "threshold-lower-warning", value, NULL);
+}
+
+/**
+ * sensor_integer_get_threshold_upper_warning: (skip)
+ * @object: A #SensorInteger.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_warning">"threshold_upper_warning"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+sensor_integer_get_threshold_upper_warning (SensorInteger *object)
+{
+  return SENSOR_INTEGER_GET_IFACE (object)->get_threshold_upper_warning (object);
+}
+
+/**
+ * sensor_integer_set_threshold_upper_warning: (skip)
+ * @object: A #SensorInteger.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_warning">"threshold_upper_warning"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+sensor_integer_set_threshold_upper_warning (SensorInteger *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "threshold-upper-warning", value, NULL);
+}
+
+/**
+ * sensor_integer_get_threshold_upper_critical: (skip)
+ * @object: A #SensorInteger.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_critical">"threshold_upper_critical"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+sensor_integer_get_threshold_upper_critical (SensorInteger *object)
+{
+  return SENSOR_INTEGER_GET_IFACE (object)->get_threshold_upper_critical (object);
+}
+
+/**
+ * sensor_integer_set_threshold_upper_critical: (skip)
+ * @object: A #SensorInteger.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_upper_critical">"threshold_upper_critical"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+sensor_integer_set_threshold_upper_critical (SensorInteger *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "threshold-upper-critical", value, NULL);
+}
+
+/**
+ * sensor_integer_get_threshold_state: (skip)
+ * @object: A #SensorInteger.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_state">"threshold_state"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint 
+sensor_integer_get_threshold_state (SensorInteger *object)
+{
+  return SENSOR_INTEGER_GET_IFACE (object)->get_threshold_state (object);
+}
+
+/**
+ * sensor_integer_set_threshold_state: (skip)
+ * @object: A #SensorInteger.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-openbmc-SensorInteger.threshold_state">"threshold_state"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+sensor_integer_set_threshold_state (SensorInteger *object, gint value)
+{
+  g_object_set (G_OBJECT (object), "threshold-state", value, NULL);
+}
+
+/**
  * sensor_integer_get_poll_interval: (skip)
  * @object: A #SensorInteger.
  *
@@ -887,6 +1340,32 @@
 }
 
 /**
+ * sensor_integer_emit_warning:
+ * @object: A #SensorInteger.
+ *
+ * Emits the <link linkend="gdbus-signal-org-openbmc-SensorInteger.Warning">"Warning"</link> D-Bus signal.
+ */
+void
+sensor_integer_emit_warning (
+    SensorInteger *object)
+{
+  g_signal_emit_by_name (object, "warning");
+}
+
+/**
+ * sensor_integer_emit_critical:
+ * @object: A #SensorInteger.
+ *
+ * Emits the <link linkend="gdbus-signal-org-openbmc-SensorInteger.Critical">"Critical"</link> D-Bus signal.
+ */
+void
+sensor_integer_emit_critical (
+    SensorInteger *object)
+{
+  g_signal_emit_by_name (object, "critical");
+}
+
+/**
  * sensor_integer_call_get_value:
  * @proxy: A #SensorIntegerProxy.
  * @cancellable: (allow-none): A #GCancellable or %NULL.
@@ -1083,6 +1562,122 @@
 }
 
 /**
+ * sensor_integer_call_set_thresholds:
+ * @proxy: A #SensorIntegerProxy.
+ * @arg_lower_critical: Argument to pass with the method invocation.
+ * @arg_lower_warning: Argument to pass with the method invocation.
+ * @arg_upper_warning: Argument to pass with the method invocation.
+ * @arg_upper_critical: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.setThresholds">setThresholds()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call sensor_integer_call_set_thresholds_finish() to get the result of the operation.
+ *
+ * See sensor_integer_call_set_thresholds_sync() for the synchronous, blocking version of this method.
+ */
+void
+sensor_integer_call_set_thresholds (
+    SensorInteger *proxy,
+    gint arg_lower_critical,
+    gint arg_lower_warning,
+    gint arg_upper_warning,
+    gint arg_upper_critical,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "setThresholds",
+    g_variant_new ("(iiii)",
+                   arg_lower_critical,
+                   arg_lower_warning,
+                   arg_upper_warning,
+                   arg_upper_critical),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * sensor_integer_call_set_thresholds_finish:
+ * @proxy: A #SensorIntegerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_integer_call_set_thresholds().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with sensor_integer_call_set_thresholds().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+sensor_integer_call_set_thresholds_finish (
+    SensorInteger *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * sensor_integer_call_set_thresholds_sync:
+ * @proxy: A #SensorIntegerProxy.
+ * @arg_lower_critical: Argument to pass with the method invocation.
+ * @arg_lower_warning: Argument to pass with the method invocation.
+ * @arg_upper_warning: Argument to pass with the method invocation.
+ * @arg_upper_critical: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.setThresholds">setThresholds()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See sensor_integer_call_set_thresholds() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+sensor_integer_call_set_thresholds_sync (
+    SensorInteger *proxy,
+    gint arg_lower_critical,
+    gint arg_lower_warning,
+    gint arg_upper_warning,
+    gint arg_upper_critical,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "setThresholds",
+    g_variant_new ("(iiii)",
+                   arg_lower_critical,
+                   arg_lower_warning,
+                   arg_upper_warning,
+                   arg_upper_critical),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
  * sensor_integer_call_set_poll_interval:
  * @proxy: A #SensorIntegerProxy.
  * @arg_poll_interval: Argument to pass with the method invocation.
@@ -1279,27 +1874,27 @@
 }
 
 /**
- * sensor_integer_call_go:
+ * sensor_integer_call_get_threshold_state:
  * @proxy: A #SensorIntegerProxy.
  * @cancellable: (allow-none): A #GCancellable or %NULL.
  * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
  * @user_data: User data to pass to @callback.
  *
- * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.go">go()</link> D-Bus method on @proxy.
+ * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.getThresholdState">getThresholdState()</link> D-Bus method on @proxy.
  * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
- * You can then call sensor_integer_call_go_finish() to get the result of the operation.
+ * You can then call sensor_integer_call_get_threshold_state_finish() to get the result of the operation.
  *
- * See sensor_integer_call_go_sync() for the synchronous, blocking version of this method.
+ * See sensor_integer_call_get_threshold_state_sync() for the synchronous, blocking version of this method.
  */
 void
-sensor_integer_call_go (
+sensor_integer_call_get_threshold_state (
     SensorInteger *proxy,
     GCancellable *cancellable,
     GAsyncReadyCallback callback,
     gpointer user_data)
 {
   g_dbus_proxy_call (G_DBUS_PROXY (proxy),
-    "go",
+    "getThresholdState",
     g_variant_new ("()"),
     G_DBUS_CALL_FLAGS_NONE,
     -1,
@@ -1309,18 +1904,20 @@
 }
 
 /**
- * sensor_integer_call_go_finish:
+ * sensor_integer_call_get_threshold_state_finish:
  * @proxy: A #SensorIntegerProxy.
- * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_integer_call_go().
+ * @out_threshold_state: (out): Return location for return parameter or %NULL to ignore.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to sensor_integer_call_get_threshold_state().
  * @error: Return location for error or %NULL.
  *
- * Finishes an operation started with sensor_integer_call_go().
+ * Finishes an operation started with sensor_integer_call_get_threshold_state().
  *
  * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
  */
 gboolean
-sensor_integer_call_go_finish (
+sensor_integer_call_get_threshold_state_finish (
     SensorInteger *proxy,
+    gint *out_threshold_state,
     GAsyncResult *res,
     GError **error)
 {
@@ -1329,33 +1926,36 @@
   if (_ret == NULL)
     goto _out;
   g_variant_get (_ret,
-                 "()");
+                 "(i)",
+                 out_threshold_state);
   g_variant_unref (_ret);
 _out:
   return _ret != NULL;
 }
 
 /**
- * sensor_integer_call_go_sync:
+ * sensor_integer_call_get_threshold_state_sync:
  * @proxy: A #SensorIntegerProxy.
+ * @out_threshold_state: (out): Return location for return parameter or %NULL to ignore.
  * @cancellable: (allow-none): A #GCancellable or %NULL.
  * @error: Return location for error or %NULL.
  *
- * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.go">go()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-SensorInteger.getThresholdState">getThresholdState()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
  *
- * See sensor_integer_call_go() for the asynchronous version of this method.
+ * See sensor_integer_call_get_threshold_state() for the asynchronous version of this method.
  *
  * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
  */
 gboolean
-sensor_integer_call_go_sync (
+sensor_integer_call_get_threshold_state_sync (
     SensorInteger *proxy,
+    gint *out_threshold_state,
     GCancellable *cancellable,
     GError **error)
 {
   GVariant *_ret;
   _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
-    "go",
+    "getThresholdState",
     g_variant_new ("()"),
     G_DBUS_CALL_FLAGS_NONE,
     -1,
@@ -1364,7 +1964,8 @@
   if (_ret == NULL)
     goto _out;
   g_variant_get (_ret,
-                 "()");
+                 "(i)",
+                 out_threshold_state);
   g_variant_unref (_ret);
 _out:
   return _ret != NULL;
@@ -1413,6 +2014,24 @@
 }
 
 /**
+ * sensor_integer_complete_set_thresholds:
+ * @object: A #SensorInteger.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-SensorInteger.setThresholds">setThresholds()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+sensor_integer_complete_set_thresholds (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
  * sensor_integer_complete_set_poll_interval:
  * @object: A #SensorInteger.
  * @invocation: (transfer full): A #GDBusMethodInvocation.
@@ -1449,21 +2068,24 @@
 }
 
 /**
- * sensor_integer_complete_go:
+ * sensor_integer_complete_get_threshold_state:
  * @object: A #SensorInteger.
  * @invocation: (transfer full): A #GDBusMethodInvocation.
+ * @threshold_state: Parameter to return.
  *
- * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-SensorInteger.go">go()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-SensorInteger.getThresholdState">getThresholdState()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
  *
  * This method will free @invocation, you cannot use it afterwards.
  */
 void
-sensor_integer_complete_go (
+sensor_integer_complete_get_threshold_state (
     SensorInteger *object,
-    GDBusMethodInvocation *invocation)
+    GDBusMethodInvocation *invocation,
+    gint threshold_state)
 {
   g_dbus_method_invocation_return_value (invocation,
-    g_variant_new ("()"));
+    g_variant_new ("(i)",
+                   threshold_state));
 }
 
 /* ------------------------------------------------------------------------ */
@@ -1514,7 +2136,7 @@
 {
   const _ExtendedGDBusPropertyInfo *info;
   GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 5);
+  g_assert (prop_id != 0 && prop_id - 1 < 10);
   info = _sensor_integer_property_info_pointers[prop_id - 1];
   variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
   if (info->use_gvariant)
@@ -1561,7 +2183,7 @@
 {
   const _ExtendedGDBusPropertyInfo *info;
   GVariant *variant;
-  g_assert (prop_id != 0 && prop_id - 1 < 5);
+  g_assert (prop_id != 0 && prop_id - 1 < 10);
   info = _sensor_integer_property_info_pointers[prop_id - 1];
   variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
   g_dbus_proxy_call (G_DBUS_PROXY (object),
@@ -1674,6 +2296,81 @@
 }
 
 static gint 
+sensor_integer_proxy_get_threshold_lower_critical (SensorInteger *object)
+{
+  SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "threshold_lower_critical");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
+sensor_integer_proxy_get_threshold_lower_warning (SensorInteger *object)
+{
+  SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "threshold_lower_warning");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
+sensor_integer_proxy_get_threshold_upper_warning (SensorInteger *object)
+{
+  SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "threshold_upper_warning");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
+sensor_integer_proxy_get_threshold_upper_critical (SensorInteger *object)
+{
+  SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "threshold_upper_critical");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
+sensor_integer_proxy_get_threshold_state (SensorInteger *object)
+{
+  SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
+  GVariant *variant;
+  gint value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "threshold_state");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int32 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint 
 sensor_integer_proxy_get_poll_interval (SensorInteger *object)
 {
   SensorIntegerProxy *proxy = SENSOR_INTEGER_PROXY (object);
@@ -1761,6 +2458,11 @@
 {
   iface->get_value = sensor_integer_proxy_get_value;
   iface->get_units = sensor_integer_proxy_get_units;
+  iface->get_threshold_lower_critical = sensor_integer_proxy_get_threshold_lower_critical;
+  iface->get_threshold_lower_warning = sensor_integer_proxy_get_threshold_lower_warning;
+  iface->get_threshold_upper_warning = sensor_integer_proxy_get_threshold_upper_warning;
+  iface->get_threshold_upper_critical = sensor_integer_proxy_get_threshold_upper_critical;
+  iface->get_threshold_state = sensor_integer_proxy_get_threshold_state;
   iface->get_poll_interval = sensor_integer_proxy_get_poll_interval;
   iface->get_config_data = sensor_integer_proxy_get_config_data;
   iface->get_changed_tolerance = sensor_integer_proxy_get_changed_tolerance;
@@ -2198,6 +2900,50 @@
   g_list_free_full (connections, g_object_unref);
 }
 
+static void
+_sensor_integer_on_signal_warning (
+    SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+
+  GList      *connections, *l;
+  GVariant   *signal_variant;
+  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
+  for (l = connections; l != NULL; l = l->next)
+    {
+      GDBusConnection *connection = l->data;
+      g_dbus_connection_emit_signal (connection,
+        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.SensorInteger", "Warning",
+        signal_variant, NULL);
+    }
+  g_variant_unref (signal_variant);
+  g_list_free_full (connections, g_object_unref);
+}
+
+static void
+_sensor_integer_on_signal_critical (
+    SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+
+  GList      *connections, *l;
+  GVariant   *signal_variant;
+  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
+  for (l = connections; l != NULL; l = l->next)
+    {
+      GDBusConnection *connection = l->data;
+      g_dbus_connection_emit_signal (connection,
+        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.SensorInteger", "Critical",
+        signal_variant, NULL);
+    }
+  g_variant_unref (signal_variant);
+  g_list_free_full (connections, g_object_unref);
+}
+
 static void sensor_integer_skeleton_iface_init (SensorIntegerIface *iface);
 #if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
 G_DEFINE_TYPE_WITH_CODE (SensorIntegerSkeleton, sensor_integer_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
@@ -2214,7 +2960,7 @@
 {
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
   guint n;
-  for (n = 0; n < 5; n++)
+  for (n = 0; n < 10; n++)
     g_value_unset (&skeleton->priv->properties[n]);
   g_free (skeleton->priv->properties);
   g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
@@ -2232,7 +2978,7 @@
   GParamSpec   *pspec G_GNUC_UNUSED)
 {
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 5);
+  g_assert (prop_id != 0 && prop_id - 1 < 10);
   g_mutex_lock (&skeleton->priv->lock);
   g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
   g_mutex_unlock (&skeleton->priv->lock);
@@ -2349,7 +3095,7 @@
   GParamSpec   *pspec)
 {
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
-  g_assert (prop_id != 0 && prop_id - 1 < 5);
+  g_assert (prop_id != 0 && prop_id - 1 < 10);
   g_mutex_lock (&skeleton->priv->lock);
   g_object_freeze_notify (object);
   if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
@@ -2374,12 +3120,17 @@
 
   g_mutex_init (&skeleton->priv->lock);
   skeleton->priv->context = g_main_context_ref_thread_default ();
-  skeleton->priv->properties = g_new0 (GValue, 5);
+  skeleton->priv->properties = g_new0 (GValue, 10);
   g_value_init (&skeleton->priv->properties[0], G_TYPE_INT);
   g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
   g_value_init (&skeleton->priv->properties[2], G_TYPE_INT);
-  g_value_init (&skeleton->priv->properties[3], G_TYPE_STRV);
+  g_value_init (&skeleton->priv->properties[3], G_TYPE_INT);
   g_value_init (&skeleton->priv->properties[4], G_TYPE_INT);
+  g_value_init (&skeleton->priv->properties[5], G_TYPE_INT);
+  g_value_init (&skeleton->priv->properties[6], G_TYPE_INT);
+  g_value_init (&skeleton->priv->properties[7], G_TYPE_INT);
+  g_value_init (&skeleton->priv->properties[8], G_TYPE_STRV);
+  g_value_init (&skeleton->priv->properties[9], G_TYPE_INT);
 }
 
 static gint 
@@ -2405,7 +3156,7 @@
 }
 
 static gint 
-sensor_integer_skeleton_get_poll_interval (SensorInteger *object)
+sensor_integer_skeleton_get_threshold_lower_critical (SensorInteger *object)
 {
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
   gint value;
@@ -2415,13 +3166,68 @@
   return value;
 }
 
+static gint 
+sensor_integer_skeleton_get_threshold_lower_warning (SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[3]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint 
+sensor_integer_skeleton_get_threshold_upper_warning (SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[4]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint 
+sensor_integer_skeleton_get_threshold_upper_critical (SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[5]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint 
+sensor_integer_skeleton_get_threshold_state (SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[6]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint 
+sensor_integer_skeleton_get_poll_interval (SensorInteger *object)
+{
+  SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
+  gint value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int (&(skeleton->priv->properties[7]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
 static const gchar *const *
 sensor_integer_skeleton_get_config_data (SensorInteger *object)
 {
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
   const gchar *const *value;
   g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_boxed (&(skeleton->priv->properties[3]));
+  value = g_value_get_boxed (&(skeleton->priv->properties[8]));
   g_mutex_unlock (&skeleton->priv->lock);
   return value;
 }
@@ -2432,7 +3238,7 @@
   SensorIntegerSkeleton *skeleton = SENSOR_INTEGER_SKELETON (object);
   gint value;
   g_mutex_lock (&skeleton->priv->lock);
-  value = g_value_get_int (&(skeleton->priv->properties[4]));
+  value = g_value_get_int (&(skeleton->priv->properties[9]));
   g_mutex_unlock (&skeleton->priv->lock);
   return value;
 }
@@ -2467,8 +3273,15 @@
 sensor_integer_skeleton_iface_init (SensorIntegerIface *iface)
 {
   iface->changed = _sensor_integer_on_signal_changed;
+  iface->warning = _sensor_integer_on_signal_warning;
+  iface->critical = _sensor_integer_on_signal_critical;
   iface->get_value = sensor_integer_skeleton_get_value;
   iface->get_units = sensor_integer_skeleton_get_units;
+  iface->get_threshold_lower_critical = sensor_integer_skeleton_get_threshold_lower_critical;
+  iface->get_threshold_lower_warning = sensor_integer_skeleton_get_threshold_lower_warning;
+  iface->get_threshold_upper_warning = sensor_integer_skeleton_get_threshold_upper_warning;
+  iface->get_threshold_upper_critical = sensor_integer_skeleton_get_threshold_upper_critical;
+  iface->get_threshold_state = sensor_integer_skeleton_get_threshold_state;
   iface->get_poll_interval = sensor_integer_skeleton_get_poll_interval;
   iface->get_config_data = sensor_integer_skeleton_get_config_data;
   iface->get_changed_tolerance = sensor_integer_skeleton_get_changed_tolerance;
diff --git a/interfaces/sensor.h b/interfaces/sensor.h
index cd84021..4b4be38 100644
--- a/interfaces/sensor.h
+++ b/interfaces/sensor.h
@@ -30,6 +30,10 @@
 
 
 
+  gboolean (*handle_get_threshold_state) (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation);
+
   gboolean (*handle_get_units) (
     SensorInteger *object,
     GDBusMethodInvocation *invocation);
@@ -38,10 +42,6 @@
     SensorInteger *object,
     GDBusMethodInvocation *invocation);
 
-  gboolean (*handle_go) (
-    SensorInteger *object,
-    GDBusMethodInvocation *invocation);
-
   gboolean (*handle_set_config_data) (
     SensorInteger *object,
     GDBusMethodInvocation *invocation,
@@ -52,12 +52,30 @@
     GDBusMethodInvocation *invocation,
     gint arg_poll_interval);
 
+  gboolean (*handle_set_thresholds) (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation,
+    gint arg_lower_critical,
+    gint arg_lower_warning,
+    gint arg_upper_warning,
+    gint arg_upper_critical);
+
   gint  (*get_changed_tolerance) (SensorInteger *object);
 
   const gchar *const * (*get_config_data) (SensorInteger *object);
 
   gint  (*get_poll_interval) (SensorInteger *object);
 
+  gint  (*get_threshold_lower_critical) (SensorInteger *object);
+
+  gint  (*get_threshold_lower_warning) (SensorInteger *object);
+
+  gint  (*get_threshold_state) (SensorInteger *object);
+
+  gint  (*get_threshold_upper_critical) (SensorInteger *object);
+
+  gint  (*get_threshold_upper_warning) (SensorInteger *object);
+
   const gchar * (*get_units) (SensorInteger *object);
 
   gint  (*get_value) (SensorInteger *object);
@@ -66,6 +84,12 @@
     SensorInteger *object,
     gint arg_value);
 
+  void (*critical) (
+    SensorInteger *object);
+
+  void (*warning) (
+    SensorInteger *object);
+
 };
 
 GType sensor_integer_get_type (void) G_GNUC_CONST;
@@ -85,6 +109,10 @@
     GDBusMethodInvocation *invocation,
     const gchar *units);
 
+void sensor_integer_complete_set_thresholds (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation);
+
 void sensor_integer_complete_set_poll_interval (
     SensorInteger *object,
     GDBusMethodInvocation *invocation);
@@ -93,9 +121,10 @@
     SensorInteger *object,
     GDBusMethodInvocation *invocation);
 
-void sensor_integer_complete_go (
+void sensor_integer_complete_get_threshold_state (
     SensorInteger *object,
-    GDBusMethodInvocation *invocation);
+    GDBusMethodInvocation *invocation,
+    gint threshold_state);
 
 
 
@@ -104,6 +133,12 @@
     SensorInteger *object,
     gint arg_value);
 
+void sensor_integer_emit_warning (
+    SensorInteger *object);
+
+void sensor_integer_emit_critical (
+    SensorInteger *object);
+
 
 
 /* D-Bus method calls: */
@@ -143,6 +178,30 @@
     GCancellable *cancellable,
     GError **error);
 
+void sensor_integer_call_set_thresholds (
+    SensorInteger *proxy,
+    gint arg_lower_critical,
+    gint arg_lower_warning,
+    gint arg_upper_warning,
+    gint arg_upper_critical,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_call_set_thresholds_finish (
+    SensorInteger *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_call_set_thresholds_sync (
+    SensorInteger *proxy,
+    gint arg_lower_critical,
+    gint arg_lower_warning,
+    gint arg_upper_warning,
+    gint arg_upper_critical,
+    GCancellable *cancellable,
+    GError **error);
+
 void sensor_integer_call_set_poll_interval (
     SensorInteger *proxy,
     gint arg_poll_interval,
@@ -179,19 +238,21 @@
     GCancellable *cancellable,
     GError **error);
 
-void sensor_integer_call_go (
+void sensor_integer_call_get_threshold_state (
     SensorInteger *proxy,
     GCancellable *cancellable,
     GAsyncReadyCallback callback,
     gpointer user_data);
 
-gboolean sensor_integer_call_go_finish (
+gboolean sensor_integer_call_get_threshold_state_finish (
     SensorInteger *proxy,
+    gint *out_threshold_state,
     GAsyncResult *res,
     GError **error);
 
-gboolean sensor_integer_call_go_sync (
+gboolean sensor_integer_call_get_threshold_state_sync (
     SensorInteger *proxy,
+    gint *out_threshold_state,
     GCancellable *cancellable,
     GError **error);
 
@@ -205,6 +266,21 @@
 gchar *sensor_integer_dup_units (SensorInteger *object);
 void sensor_integer_set_units (SensorInteger *object, const gchar *value);
 
+gint sensor_integer_get_threshold_lower_critical (SensorInteger *object);
+void sensor_integer_set_threshold_lower_critical (SensorInteger *object, gint value);
+
+gint sensor_integer_get_threshold_lower_warning (SensorInteger *object);
+void sensor_integer_set_threshold_lower_warning (SensorInteger *object, gint value);
+
+gint sensor_integer_get_threshold_upper_warning (SensorInteger *object);
+void sensor_integer_set_threshold_upper_warning (SensorInteger *object, gint value);
+
+gint sensor_integer_get_threshold_upper_critical (SensorInteger *object);
+void sensor_integer_set_threshold_upper_critical (SensorInteger *object, gint value);
+
+gint sensor_integer_get_threshold_state (SensorInteger *object);
+void sensor_integer_set_threshold_state (SensorInteger *object, gint value);
+
 gint sensor_integer_get_poll_interval (SensorInteger *object);
 void sensor_integer_set_poll_interval (SensorInteger *object, gint value);
 
diff --git a/objects/chassis_identify_obj.c b/objects/chassis_identify_obj.c
index 69ba7a7..53cf893 100644
--- a/objects/chassis_identify_obj.c
+++ b/objects/chassis_identify_obj.c
@@ -1,8 +1,8 @@
 #include "interfaces/led.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
-static const gchar* dbus_object_path = "/org/openbmc/control/ChassisControl";
-static const gchar* dbus_name        = "org.openbmc.control.ChassisControl";
+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;
diff --git a/objects/host_control_obj.c b/objects/host_control_obj.c
deleted file mode 100644
index 014fe92..0000000
--- a/objects/host_control_obj.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "interfaces/host_control.h"
-
-/* ---------------------------------------------------------------------------------------------------- */
-static const gchar* dbus_object_path = "/org/openbmc/control/Host";
-static const gchar* dbus_name        = "org.openbmc.control.Host";
-
-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 (dbus_object_path);
-
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  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,
-                       dbus_name,
-                       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/power_control_obj.c b/objects/power_control_obj.c
index 4dacbe9..a290653 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -7,88 +7,59 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 #include "interfaces/power_control.h"
+#include "objects/openbmc_utilities.h"
 
 /* ---------------------------------------------------------------------------------------------------- */
 static const gchar* dbus_object_path = "/org/openbmc/control/Power";
 static const gchar* dbus_name        = "org.openbmc.control.Power";
 
-// Platform specific config
-
-#define FSI_CLK		4	//GPIOA4
-#define FSI_DAT		5	//GPIOA5
-#define CRONUS_SEL	6	//GPIOA6
-#define PCIE_RST_N	13	//GPIOB5
-#define PEX_PERST_N	14	//GPIOB6
-#define POWER		33    	//GPIOE1
-#define PGOOD		23    	//GPIOC7
-#define FSI_ENABLE      24      //GPIOD0
-
-/* Where to put the firmware image if booting from memory */
-#define MEM_IMG_BASE (0x54000000)
-
-/* Start of flash memory if booting from flash */
-#define FLASH_IMG_BASE (0x30000000)
-
-/* LPC registers */
-#define LPC_BASE		0x1e789000
-#define LPC_HICR6		0x80
-#define LPC_HICR7		0x88
-#define LPC_HICR8		0x8c
-
-
-
+GPIO power_pin    = (GPIO){ "POWER_PIN" };
+GPIO pgood        = (GPIO){ "PGOOD" };
 
 static GDBusObjectManagerServer *manager = NULL;
-static PowerControl *power_control = NULL;
-
-static guint tmp_pgood = 0;
+static ControlPower *control_power = NULL;
 
 static gboolean
-on_set_power_state (PowerControl          *pwr,
+on_set_power_state (ControlPower          *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;     
-  }
+	if (state > 1)
+	{
+		g_dbus_method_invocation_return_dbus_error (invocation,
+                                                "org.openbmc.ControlPower.Error.Failed",
+                                                "Invalid power state");
+		return TRUE;
+	}
+	if (state == control_power_get_state(pwr))
+	{
+		g_dbus_method_invocation_return_dbus_error (invocation,
+                                                "org.openbmc.ControlPower.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;
+	//go ahead and return from method call
+	control_power_complete_set_power_state(pwr,invocation);
+
+	g_print("Set power state: %d\n",state);
+	gpio_open(&power_pin);
+	gpio_write(&power_pin,!state); 
+	gpio_close(&power_pin);
+
+	control_power_set_state(pwr,state);
+	return TRUE;
 }
 
 static gboolean
-on_get_power_state (PowerControl          *pwr,
+on_get_power_state (ControlPower          *pwr,
                 GDBusMethodInvocation  *invocation,
                 gpointer                user_data)
 {
-  guint pgood = power_control_get_pgood(pwr);
-  power_control_complete_get_power_state(pwr,invocation,pgood);
-  return TRUE;
+	guint pgood = control_power_get_pgood(pwr);
+	control_power_complete_get_power_state(pwr,invocation,pgood);
+	return TRUE;
 }
 
 static void 
@@ -96,39 +67,41 @@
                  const gchar     *name,
                  gpointer         user_data)
 {
-  ObjectSkeleton *object;
-  guint n;
+	ObjectSkeleton *object;
+	g_print ("Acquired a message bus connection: %s\n",name);
 
-  g_print ("Acquired a message bus connection: %s\n",name);
+	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);
 
-  manager = g_dbus_object_manager_server_new (dbus_object_path);
+	control_power = control_power_skeleton_new ();
+	object_skeleton_set_control_power (object, control_power);
+	g_object_unref (control_power);
 
-  gchar *s;
-  s = g_strdup_printf ("%s/0",dbus_object_path);
-  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,
+	//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 (power_control,
+	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);
+	/* Export all objects */
+	g_dbus_object_manager_server_set_connection (manager, connection);
+
+	// get gpio device paths
+	gpio_init(connection,&power_pin);
+	gpio_init(connection,&pgood);
+	gpio_open(&pgood);
 }
 
 static void
@@ -150,28 +123,37 @@
 static gboolean
 poll_pgood()
 {
-  guint pgood = power_control_get_pgood(power_control);
-  //TOOD:  Change to actually read gpio
-  guint gpio = tmp_pgood;
+	if (pgood.fd >= 0)
+	{
+		uint8_t gpio = gpio_read(&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;
+		//if changed, set property and emit signal
+		if (gpio != control_power_get_pgood(control_power))
+		{
+ 			control_power_set_pgood(control_power,gpio);
+ 			if (gpio==0)
+ 			{
+ 				control_power_emit_power_lost(control_power);
+ 			}
+ 			else
+ 			{
+ 				control_power_emit_power_good(control_power);
+ 			}
+		}
+	}
+	else
+	{
+		//TODO: error handling
+		printf("Unable to read pgood\n");
+	}
+	return TRUE;
 }
 
+
+
+/*----------------------------------------------------------------*/
+/* Main Event Loop                                                */
+
 gint
 main (gint argc, gchar *argv[])
 {
diff --git a/objects/sensor_temperature_ambient_obj.c b/objects/sensor_temperature_ambient_obj.c
index 1f2ed47..8a05fd2 100644
--- a/objects/sensor_temperature_ambient_obj.c
+++ b/objects/sensor_temperature_ambient_obj.c
@@ -1,15 +1,24 @@
 #include "interfaces/sensor.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 GDBusObjectManagerServer *manager = NULL;
 static SensorInteger *sensor = NULL;
 
 static gchar* i2c_bus = "";
 static gchar* i2c_address = "";
-static gboolean go = FALSE;
+static gboolean thresholds_set = FALSE;
+
+
 
 static gboolean
 on_get_units    (SensorInteger  *sen,
@@ -40,10 +49,74 @@
   g_print("I2C bus = %s\n",config[0]);
   g_print("I2C addr = %s\n",config[1]);
   sensor_integer_complete_set_config_data(sen,invocation);
-  go = TRUE;
   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,
@@ -81,7 +154,16 @@
                     "handle-set-config-data",
                     G_CALLBACK (on_set_config),
                     NULL); /* user_data */
+ 
+  g_signal_connect (sensor,
+                    "handle-set-thresholds",
+                    G_CALLBACK (on_set_thresholds),
+                    NULL); /* user_data */
 
+  g_signal_connect (sensor,
+                    "handle-get-threshold-state",
+                    G_CALLBACK (on_get_threshold_state),
+                    NULL); /* user_data */
 
 
   /* Export the object (@manager takes its own reference to @object) */
@@ -111,8 +193,6 @@
 static gboolean
 poll_sensor()
 {
-  if (go)
-  {
     guint value = sensor_integer_get_value(sensor);
     //TOOD:  Change to actually read sensor
     value = value+1;
@@ -121,11 +201,14 @@
     //if changed, set property and emit signal
     if (value != sensor_integer_get_value(sensor))
     {
-       g_print("Sensor changed");
+       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;
 }
 
diff --git a/start_services b/start_services
index 3769325..5defd56 100644
--- a/start_services
+++ b/start_services
@@ -3,5 +3,5 @@
 ./bin/sensor_ambient.exe &
 ./bin/button_power.exe &
 ./bin/sensor_host_status.exe &
-./bin/host_control.exe &
+./bin/control_host.exe &
 ./bin/flash_bios.exe &
diff --git a/stop_services b/stop_services
index 870a1bc..b215131 100644
--- a/stop_services
+++ b/stop_services
@@ -3,5 +3,5 @@
 killall -9 sensor_ambient.exe 
 killall -9 button_power.exe
 killall -9 sensor_host_status.exe
-killall -9 host_control.exe
+killall -9 control_host.exe
 killall -9 flash_bios.exe
diff --git a/xml/host_control.xml b/xml/host_control.xml
deleted file mode 100644
index d9d5b23..0000000
--- a/xml/host_control.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<node>
-	<interface name="org.openbmc.HostControl">
-		<method name="boot"/>
-		<method name="shutdown"/>
-		<method name="reboot"/>
-		<signal name="Booted"/>
-	</interface>	
-</node>
diff --git a/xml/power_control.xml b/xml/power_control.xml
index a382f11..08cbccb 100644
--- a/xml/power_control.xml
+++ b/xml/power_control.xml
@@ -1,5 +1,5 @@
 <node>
-	<interface name="org.openbmc.PowerControl">
+	<interface name="org.openbmc.control.Power">
 		<method name="setPowerState">
 			<arg name="state" type="i" direction="in"/>
 		</method>
@@ -8,7 +8,7 @@
 		</method>
 		<signal name="PowerGood">
 		</signal>
-		<signal name="PowerLost"/>
+		<signal name="PowerLost">
 		</signal>
 		<property name="pgood" type="i" access="read"/>
 		<property name="state" type="i" access="read"/>
diff --git a/xml/sensor.xml b/xml/sensor.xml
index 5ff66e7..40bf73d 100644
--- a/xml/sensor.xml
+++ b/xml/sensor.xml
@@ -7,20 +7,40 @@
 		<method name="getUnits">
 			<arg name="units" type="s" direction="out"/>
 		</method>
+		<method name="setThresholds">
+			<arg name="lower_critical" type="i" direction="in"/>
+			<arg name="lower_warning"  type="i" direction="in"/>
+			<arg name="upper_warning"  type="i" direction="in"/>
+			<arg name="upper_critical" type="i" direction="in"/>
+		</method>
 		<method name="setPollInterval">
 			<arg name="poll_interval" type="i" direction="in"/>
 		</method>
 		<method name="setConfigData">
 			<arg name="config" type="as" direction="in"/>
 		</method>
+		<method name="getThresholdState">
+			<arg name="threshold_state" type="i" direction="out"/>
+		</method>
+
                 <property name="value" type="i" access="read"/>
 		<property name="units" type="s" access="read"/>
+
+		<property name="threshold_lower_critical" type="i" access="read"/>
+		<property name="threshold_lower_warning"  type="i" access="read"/>
+		<property name="threshold_upper_warning"  type="i" access="read"/>
+		<property name="threshold_upper_critical" type="i" access="read"/>
+		<property name="threshold_state" type="i" access="read"/>
+
 		<property name="poll_interval" type="i" access="read"/>
 		<property name="config_data" type="as" access="read"/>
 		<property name="changed_tolerance" type="i" access="read"/>
+
 		<signal name="Changed">
 			<arg name="value" type="i"/>
 		</signal>
+		<signal name="Warning"/>
+		<signal name="Critical"/>
 	</interface>
         <interface name="org.openbmc.SensorString">
                 <method name="getValue">
