diff --git a/interfaces/sensor.h b/interfaces/sensor.h
new file mode 100644
index 0000000..b648409
--- /dev/null
+++ b/interfaces/sensor.h
@@ -0,0 +1,810 @@
+/*
+ * 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_SENSOR_H__
+#define __INTERFACES_SENSOR_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.openbmc.SensorInteger */
+
+#define TYPE_SENSOR_INTEGER (sensor_integer_get_type ())
+#define SENSOR_INTEGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER, SensorInteger))
+#define IS_SENSOR_INTEGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER))
+#define SENSOR_INTEGER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_INTEGER, SensorIntegerIface))
+
+struct _SensorInteger;
+typedef struct _SensorInteger SensorInteger;
+typedef struct _SensorIntegerIface SensorIntegerIface;
+
+struct _SensorIntegerIface
+{
+  GTypeInterface parent_iface;
+
+
+
+  gboolean (*handle_get_units) (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_get_value) (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation);
+
+  const gchar * (*get_units) (SensorInteger *object);
+
+  gint  (*get_value) (SensorInteger *object);
+
+  void (*changed) (
+    SensorInteger *object,
+    gint arg_value);
+
+};
+
+GType sensor_integer_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *sensor_integer_interface_info (void);
+guint sensor_integer_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void sensor_integer_complete_get_value (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation,
+    gint value);
+
+void sensor_integer_complete_get_units (
+    SensorInteger *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *units);
+
+
+
+/* D-Bus signal emissions functions: */
+void sensor_integer_emit_changed (
+    SensorInteger *object,
+    gint arg_value);
+
+
+
+/* D-Bus method calls: */
+void sensor_integer_call_get_value (
+    SensorInteger *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_call_get_value_finish (
+    SensorInteger *proxy,
+    gint *out_value,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_call_get_value_sync (
+    SensorInteger *proxy,
+    gint *out_value,
+    GCancellable *cancellable,
+    GError **error);
+
+void sensor_integer_call_get_units (
+    SensorInteger *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_call_get_units_finish (
+    SensorInteger *proxy,
+    gchar **out_units,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_call_get_units_sync (
+    SensorInteger *proxy,
+    gchar **out_units,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+gint sensor_integer_get_value (SensorInteger *object);
+void sensor_integer_set_value (SensorInteger *object, gint value);
+
+const gchar *sensor_integer_get_units (SensorInteger *object);
+gchar *sensor_integer_dup_units (SensorInteger *object);
+void sensor_integer_set_units (SensorInteger *object, const gchar *value);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_INTEGER_PROXY (sensor_integer_proxy_get_type ())
+#define SENSOR_INTEGER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxy))
+#define SENSOR_INTEGER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxyClass))
+#define SENSOR_INTEGER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxyClass))
+#define IS_SENSOR_INTEGER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_PROXY))
+#define IS_SENSOR_INTEGER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_PROXY))
+
+typedef struct _SensorIntegerProxy SensorIntegerProxy;
+typedef struct _SensorIntegerProxyClass SensorIntegerProxyClass;
+typedef struct _SensorIntegerProxyPrivate SensorIntegerProxyPrivate;
+
+struct _SensorIntegerProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  SensorIntegerProxyPrivate *priv;
+};
+
+struct _SensorIntegerProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType sensor_integer_proxy_get_type (void) G_GNUC_CONST;
+
+void sensor_integer_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorInteger *sensor_integer_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorInteger *sensor_integer_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void sensor_integer_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorInteger *sensor_integer_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorInteger *sensor_integer_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_INTEGER_SKELETON (sensor_integer_skeleton_get_type ())
+#define SENSOR_INTEGER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeleton))
+#define SENSOR_INTEGER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeletonClass))
+#define SENSOR_INTEGER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeletonClass))
+#define IS_SENSOR_INTEGER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SKELETON))
+#define IS_SENSOR_INTEGER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SKELETON))
+
+typedef struct _SensorIntegerSkeleton SensorIntegerSkeleton;
+typedef struct _SensorIntegerSkeletonClass SensorIntegerSkeletonClass;
+typedef struct _SensorIntegerSkeletonPrivate SensorIntegerSkeletonPrivate;
+
+struct _SensorIntegerSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  SensorIntegerSkeletonPrivate *priv;
+};
+
+struct _SensorIntegerSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType sensor_integer_skeleton_get_type (void) G_GNUC_CONST;
+
+SensorInteger *sensor_integer_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.openbmc.SensorString */
+
+#define TYPE_SENSOR_STRING (sensor_string_get_type ())
+#define SENSOR_STRING(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING, SensorString))
+#define IS_SENSOR_STRING(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING))
+#define SENSOR_STRING_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_STRING, SensorStringIface))
+
+struct _SensorString;
+typedef struct _SensorString SensorString;
+typedef struct _SensorStringIface SensorStringIface;
+
+struct _SensorStringIface
+{
+  GTypeInterface parent_iface;
+
+
+
+  gboolean (*handle_get_units) (
+    SensorString *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_get_value) (
+    SensorString *object,
+    GDBusMethodInvocation *invocation);
+
+  const gchar * (*get_units) (SensorString *object);
+
+  gint  (*get_value) (SensorString *object);
+
+  void (*changed) (
+    SensorString *object,
+    const gchar *arg_value);
+
+};
+
+GType sensor_string_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *sensor_string_interface_info (void);
+guint sensor_string_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void sensor_string_complete_get_value (
+    SensorString *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *value);
+
+void sensor_string_complete_get_units (
+    SensorString *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *units);
+
+
+
+/* D-Bus signal emissions functions: */
+void sensor_string_emit_changed (
+    SensorString *object,
+    const gchar *arg_value);
+
+
+
+/* D-Bus method calls: */
+void sensor_string_call_get_value (
+    SensorString *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_string_call_get_value_finish (
+    SensorString *proxy,
+    gchar **out_value,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_string_call_get_value_sync (
+    SensorString *proxy,
+    gchar **out_value,
+    GCancellable *cancellable,
+    GError **error);
+
+void sensor_string_call_get_units (
+    SensorString *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_string_call_get_units_finish (
+    SensorString *proxy,
+    gchar **out_units,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_string_call_get_units_sync (
+    SensorString *proxy,
+    gchar **out_units,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+gint sensor_string_get_value (SensorString *object);
+void sensor_string_set_value (SensorString *object, gint value);
+
+const gchar *sensor_string_get_units (SensorString *object);
+gchar *sensor_string_dup_units (SensorString *object);
+void sensor_string_set_units (SensorString *object, const gchar *value);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_STRING_PROXY (sensor_string_proxy_get_type ())
+#define SENSOR_STRING_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING_PROXY, SensorStringProxy))
+#define SENSOR_STRING_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_STRING_PROXY, SensorStringProxyClass))
+#define SENSOR_STRING_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_STRING_PROXY, SensorStringProxyClass))
+#define IS_SENSOR_STRING_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING_PROXY))
+#define IS_SENSOR_STRING_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_STRING_PROXY))
+
+typedef struct _SensorStringProxy SensorStringProxy;
+typedef struct _SensorStringProxyClass SensorStringProxyClass;
+typedef struct _SensorStringProxyPrivate SensorStringProxyPrivate;
+
+struct _SensorStringProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  SensorStringProxyPrivate *priv;
+};
+
+struct _SensorStringProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType sensor_string_proxy_get_type (void) G_GNUC_CONST;
+
+void sensor_string_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorString *sensor_string_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorString *sensor_string_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void sensor_string_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorString *sensor_string_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorString *sensor_string_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_STRING_SKELETON (sensor_string_skeleton_get_type ())
+#define SENSOR_STRING_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeleton))
+#define SENSOR_STRING_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeletonClass))
+#define SENSOR_STRING_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeletonClass))
+#define IS_SENSOR_STRING_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING_SKELETON))
+#define IS_SENSOR_STRING_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_STRING_SKELETON))
+
+typedef struct _SensorStringSkeleton SensorStringSkeleton;
+typedef struct _SensorStringSkeletonClass SensorStringSkeletonClass;
+typedef struct _SensorStringSkeletonPrivate SensorStringSkeletonPrivate;
+
+struct _SensorStringSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  SensorStringSkeletonPrivate *priv;
+};
+
+struct _SensorStringSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType sensor_string_skeleton_get_type (void) G_GNUC_CONST;
+
+SensorString *sensor_string_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.openbmc.SensorIntegerSettable */
+
+#define TYPE_SENSOR_INTEGER_SETTABLE (sensor_integer_settable_get_type ())
+#define SENSOR_INTEGER_SETTABLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE, SensorIntegerSettable))
+#define IS_SENSOR_INTEGER_SETTABLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE))
+#define SENSOR_INTEGER_SETTABLE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_INTEGER_SETTABLE, SensorIntegerSettableIface))
+
+struct _SensorIntegerSettable;
+typedef struct _SensorIntegerSettable SensorIntegerSettable;
+typedef struct _SensorIntegerSettableIface SensorIntegerSettableIface;
+
+struct _SensorIntegerSettableIface
+{
+  GTypeInterface parent_iface;
+
+
+
+  gboolean (*handle_get_units) (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_get_value) (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_set_value) (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation,
+    gint arg_value);
+
+  const gchar * (*get_units) (SensorIntegerSettable *object);
+
+  gint  (*get_value) (SensorIntegerSettable *object);
+
+  void (*changed) (
+    SensorIntegerSettable *object,
+    gint arg_value);
+
+};
+
+GType sensor_integer_settable_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *sensor_integer_settable_interface_info (void);
+guint sensor_integer_settable_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void sensor_integer_settable_complete_get_value (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation,
+    gint value);
+
+void sensor_integer_settable_complete_set_value (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation);
+
+void sensor_integer_settable_complete_get_units (
+    SensorIntegerSettable *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *units);
+
+
+
+/* D-Bus signal emissions functions: */
+void sensor_integer_settable_emit_changed (
+    SensorIntegerSettable *object,
+    gint arg_value);
+
+
+
+/* D-Bus method calls: */
+void sensor_integer_settable_call_get_value (
+    SensorIntegerSettable *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_settable_call_get_value_finish (
+    SensorIntegerSettable *proxy,
+    gint *out_value,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_settable_call_get_value_sync (
+    SensorIntegerSettable *proxy,
+    gint *out_value,
+    GCancellable *cancellable,
+    GError **error);
+
+void sensor_integer_settable_call_set_value (
+    SensorIntegerSettable *proxy,
+    gint arg_value,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_settable_call_set_value_finish (
+    SensorIntegerSettable *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_settable_call_set_value_sync (
+    SensorIntegerSettable *proxy,
+    gint arg_value,
+    GCancellable *cancellable,
+    GError **error);
+
+void sensor_integer_settable_call_get_units (
+    SensorIntegerSettable *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean sensor_integer_settable_call_get_units_finish (
+    SensorIntegerSettable *proxy,
+    gchar **out_units,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean sensor_integer_settable_call_get_units_sync (
+    SensorIntegerSettable *proxy,
+    gchar **out_units,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+gint sensor_integer_settable_get_value (SensorIntegerSettable *object);
+void sensor_integer_settable_set_value (SensorIntegerSettable *object, gint value);
+
+const gchar *sensor_integer_settable_get_units (SensorIntegerSettable *object);
+gchar *sensor_integer_settable_dup_units (SensorIntegerSettable *object);
+void sensor_integer_settable_set_units (SensorIntegerSettable *object, const gchar *value);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_INTEGER_SETTABLE_PROXY (sensor_integer_settable_proxy_get_type ())
+#define SENSOR_INTEGER_SETTABLE_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxy))
+#define SENSOR_INTEGER_SETTABLE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxyClass))
+#define SENSOR_INTEGER_SETTABLE_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxyClass))
+#define IS_SENSOR_INTEGER_SETTABLE_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY))
+#define IS_SENSOR_INTEGER_SETTABLE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SETTABLE_PROXY))
+
+typedef struct _SensorIntegerSettableProxy SensorIntegerSettableProxy;
+typedef struct _SensorIntegerSettableProxyClass SensorIntegerSettableProxyClass;
+typedef struct _SensorIntegerSettableProxyPrivate SensorIntegerSettableProxyPrivate;
+
+struct _SensorIntegerSettableProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  SensorIntegerSettableProxyPrivate *priv;
+};
+
+struct _SensorIntegerSettableProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType sensor_integer_settable_proxy_get_type (void) G_GNUC_CONST;
+
+void sensor_integer_settable_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorIntegerSettable *sensor_integer_settable_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorIntegerSettable *sensor_integer_settable_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void sensor_integer_settable_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+SensorIntegerSettable *sensor_integer_settable_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+SensorIntegerSettable *sensor_integer_settable_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_SENSOR_INTEGER_SETTABLE_SKELETON (sensor_integer_settable_skeleton_get_type ())
+#define SENSOR_INTEGER_SETTABLE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeleton))
+#define SENSOR_INTEGER_SETTABLE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeletonClass))
+#define SENSOR_INTEGER_SETTABLE_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeletonClass))
+#define IS_SENSOR_INTEGER_SETTABLE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON))
+#define IS_SENSOR_INTEGER_SETTABLE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON))
+
+typedef struct _SensorIntegerSettableSkeleton SensorIntegerSettableSkeleton;
+typedef struct _SensorIntegerSettableSkeletonClass SensorIntegerSettableSkeletonClass;
+typedef struct _SensorIntegerSettableSkeletonPrivate SensorIntegerSettableSkeletonPrivate;
+
+struct _SensorIntegerSettableSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  SensorIntegerSettableSkeletonPrivate *priv;
+};
+
+struct _SensorIntegerSettableSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType sensor_integer_settable_skeleton_get_type (void) G_GNUC_CONST;
+
+SensorIntegerSettable *sensor_integer_settable_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;
+
+SensorInteger *object_get_sensor_integer (Object *object);
+SensorString *object_get_sensor_string (Object *object);
+SensorIntegerSettable *object_get_sensor_integer_settable (Object *object);
+SensorInteger *object_peek_sensor_integer (Object *object);
+SensorString *object_peek_sensor_string (Object *object);
+SensorIntegerSettable *object_peek_sensor_integer_settable (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_sensor_integer (ObjectSkeleton *object, SensorInteger *interface_);
+void object_skeleton_set_sensor_string (ObjectSkeleton *object, SensorString *interface_);
+void object_skeleton_set_sensor_integer_settable (ObjectSkeleton *object, SensorIntegerSettable *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_SENSOR_H__ */
