+
diff --git a/tools/xenpmd/xenpmd-dbus-server.c b/tools/xenpmd/xenpmd-dbus-server.c
new file mode 100644
-index 0000000..c9b80cd
+index 0000000..46fecc7
--- /dev/null
+++ b/tools/xenpmd/xenpmd-dbus-server.c
-@@ -0,0 +1,206 @@
+@@ -0,0 +1,213 @@
+/*
+ * xenpmd-dbus-server.c
+ *
+
+static char *xenpmd_dbus_signal_names[E_XENPMD_EVENTS_COUNT] =
+{
++ "battery_level_notification",
+ "ac_adapter_state_changed",
+ "lid_state_changed",
+ "power_button_pressed",
+ return TRUE;
+}
+
++static gboolean xenpmd_object_get_current_battery_level(XenpmdObject * this, guint *battery_level)
++{
++ *battery_level = xenstore_read_uint(XS_CURRENT_BATTERY_LEVEL);
++ return TRUE;
++}
++
+static gboolean xenpmd_object_get_lid_state(XenpmdObject * this, guint *lid_ret)
+{
+ *lid_ret = xenstore_read_uint(XS_LID_STATE_PATH);
+}
+
diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
-index 28de744..58abdfa 100644
+index 28de744..87e38de 100644
--- a/tools/xenpmd/xenpmd.c
+++ b/tools/xenpmd/xenpmd.c
@@ -33,68 +33,13 @@
void write_battery_status_to_xenstore(struct battery_status *status)
{
-@@ -426,56 +409,86 @@ void write_battery_status_to_xenstore(struct battery_status *status)
+@@ -426,56 +409,87 @@ void write_battery_status_to_xenstore(struct battery_status *status)
write_ulong_lsb_first(val+18, status->remaining_capacity);
write_ulong_lsb_first(val+26, status->present_voltage);
+ if ( current_battery_level != NORMAL )
+ {
+ sprintf(val, "%d", current_battery_level);
-+ xs_write(xs, XBT_NULL, XS_BATTERY_LEVEL_NOTIFICATION, val, strlen(val));
++ xs_write(xs, XBT_NULL, XS_CURRENT_BATTERY_LEVEL, val, strlen(val));
++ xenpmd_dbus_signal_event(E_BATTERY_LEVEL_NOTIFICATION);
+ xenpmd_log(LOG_ALERT, "Battery level below normal - %d!\n", current_battery_level);
+ }
+#ifdef XENPMD_DEBUG
if ( pid != 0 )
exit(0);
-@@ -483,34 +496,75 @@ static void daemonize(void)
+@@ -483,34 +497,75 @@ static void daemonize(void)
setsid();
if ( (pid = fork()) < 0 )
+}
diff --git a/tools/xenpmd/xenpmd.h b/tools/xenpmd/xenpmd.h
new file mode 100644
-index 0000000..3cda66d
+index 0000000..1c673bd
--- /dev/null
+++ b/tools/xenpmd/xenpmd.h
-@@ -0,0 +1,140 @@
+@@ -0,0 +1,141 @@
+/*
+ * xenpmd.h
+ *
+
+enum xenpmd_dbus_event_numbers
+{
++ E_BATTERY_LEVEL_NOTIFICATION,
+ E_AC_ADAPTER_STATE_CHANGED,
+ E_LID_STATE_CHANGED,
+ E_POWER_BUTTON_PRESSED,
+
+#define XS_BIF "/pm/bif"
+#define XS_BST "/pm/bst"
++#define XS_CURRENT_BATTERY_LEVEL "/pm/currentbatterylevel"
+#define XS_AC_ADAPTER_STATE_PATH "/pm/ac_adapter"
+#define XS_LID_STATE_PATH "/pm/lid_state"
+
-+#define XS_BATTERY_LEVEL_NOTIFICATION "/pm/events/batterylevelnotification"
+#define XS_AC_ADAPTER_EVENT_PATH "/pm/events/acadapterstatechanged"
+#define XS_LID_EVENT_PATH "/pm/events/lidstatechanged"
+#define XS_PBTN_EVENT_PATH "/pm/events/powerbuttonpressed"
+
diff --git a/tools/xenpmd/xenpmd.xml b/tools/xenpmd/xenpmd.xml
new file mode 100644
-index 0000000..23328f4
+index 0000000..230f5f8
--- /dev/null
+++ b/tools/xenpmd/xenpmd.xml
-@@ -0,0 +1,127 @@
+@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<node name="/com/citrix/xenclient/xenpmd">
+ </doc:doc>
+ </method>
+
++ <method name="get_current_battery_level">
++ <arg type="u" name="battery_level" direction="out" />
++ <doc:doc>
++ <doc:summary>
++ <doc:para>
++ Returns current battery level. 0 when normal, 1 for warning,
++ 2 for low and 3 for critical.
++ </doc:para>
++ </doc:summary>
++ </doc:doc>
++ </method>
++
+ <method name="get_lid_state">
+ <arg type="u" name="lid_ret" direction="out" />
+ <doc:doc>
+ </doc:doc>
+ </signal>
+
++ <signal name="battery_level_notification">
++ <doc:doc>
++ <doc:summary>
++ <doc:para>
++ Signals when battery level changes from normal.
++ </doc:para>
++ </doc:summary>
++ </doc:doc>
++ </signal>
++
+ </interface>
+
+</node>