--- /dev/null
+diff --git a/hw/battery_mgmt.c b/hw/battery_mgmt.c
+index 3ddeb09..1c83b80 100644
+--- a/hw/battery_mgmt.c
++++ b/hw/battery_mgmt.c
+@@ -29,7 +29,6 @@
+ #include "hw.h"
+ #include "pc.h"
+ #include "qemu-xen.h"
+-#include "qemu-log.h"
+ #include "isa.h" //register_ioport_read declaration
+ #include "battery_mgmt.h"
+
+@@ -59,6 +58,7 @@
+
+ static enum POWER_MGMT_MODE power_mgmt_mode = PM_MODE_NONE;
+ static battery_state_info battery_info;
++extern FILE *logfile;
+
+ int is_battery_pt_feasible(void)
+ {
+@@ -229,15 +229,21 @@ static uint32_t battery_port_2_readb(void *opaque, uint32_t addr)
+
+ static uint32_t battery_port_3_readb(void *opaque, uint32_t addr)
+ {
+- if ( power_mgmt_mode == PM_MODE_PT || power_mgmt_mode == PM_MODE_NON_PT ) {
+- if ( (power_mgmt_mode == PM_MODE_PT) && (is_battery_pt_feasible() == 0) )
+- return 0x0F;
+- return 0x1F;
+- }
++ uint32_t system_state;
+
+- return 0x0F;
+-}
++ if ( power_mgmt_mode != PM_MODE_PT && power_mgmt_mode != PM_MODE_NON_PT )
++ return 0x0;
++
++ if ( (power_mgmt_mode == PM_MODE_PT) && (is_battery_pt_feasible() == 0) )
++ return 0x0;
+
++ system_state = xenstore_read_ac_adapter_state();
++ if ( xenstore_read_lid_state() == 1 )
++ system_state |= 0x4;
++
++ system_state |= 0x2;
++ return system_state;
++}
+
+ void battery_mgmt_non_pt_mode_init(PCIDevice *device)
+ {
+@@ -290,6 +296,7 @@ void battery_mgmt_init(PCIDevice *device)
+ }
+
+ register_ioport_read(BATTERY_PORT_3, 1, 1, battery_port_3_readb, device);
++ xenstore_register_for_pm_events();
+
+ #ifdef BATTERY_MGMT_DEBUG
+ fprintf(logfile, "Power management mode set to - %d\n", power_mgmt_mode);
+diff --git a/hw/battery_mgmt.h b/hw/battery_mgmt.h
+index 4a4ac8e..19129b8 100644
+--- a/hw/battery_mgmt.h
++++ b/hw/battery_mgmt.h
+@@ -42,4 +42,12 @@ typedef struct battery_state_info {
+
+ void battery_mgmt_init(PCIDevice *device);
+
++#ifndef CONFIG_NO_BATTERY_MGMT
++int is_battery_pt_feasible(void);
++void battery_mgmt_pt_mode_init(void);
++void get_battery_data_from_xenstore(void);
++void write_battery_data_to_port(void);
++void battery_mgmt_non_pt_mode_init(PCIDevice *device);
++#endif
++
+ #endif
+diff --git a/hw/pc.h b/hw/pc.h
+index 8b71d48..a261c8a 100644
+--- a/hw/pc.h
++++ b/hw/pc.h
+@@ -106,6 +106,10 @@ int acpi_table_add(const char *table_desc);
+
+ void acpi_php_add(int);
+ void acpi_php_del(int);
++void acpi_ac_adapter_state_changed(void);
++void acpi_power_button_pressed(void);
++void acpi_sleep_button_pressed(void);
++void acpi_lid_state_changed(void);
+
+ /* hpet.c */
+ extern int no_hpet;
+diff --git a/hw/piix4acpi.c b/hw/piix4acpi.c
+index 7844cb8..c218782 100644
+--- a/hw/piix4acpi.c
++++ b/hw/piix4acpi.c
+@@ -53,6 +53,11 @@
+
+ /* The bit in GPE0_STS/EN to notify the pci hotplug event */
+ #define ACPI_PHP_GPE_BIT 3
++#define ACPI_PHP_SLOT_NUM NR_PCI_DEV
++#define ACPI_AC_POWER_STATE_BIT 0x1c
++#define ACPI_POWER_BUTTON_BIT 0x1
++#define ACPI_SLEEP_BUTTON_BIT 0x0
++#define ACPI_LID_STATE_BIT 0x17
+
+ typedef struct AcpiDeviceState AcpiDeviceState;
+ AcpiDeviceState *acpi_device_table;
+@@ -192,8 +197,6 @@ static void acpi_map(PCIDevice *pci_dev, int region_num,
+ battery_mgmt_init(pci_dev);
+ }
+
+-#ifdef CONFIG_PASSTHROUGH
+-
+ static inline int test_bit(uint8_t *map, int bit)
+ {
+ return ( map[bit / 8] & (1 << (bit % 8)) );
+@@ -210,6 +213,56 @@ static inline void clear_bit(uint8_t *map, int bit)
+ }
+
+ extern FILE *logfile;
++
++void acpi_ac_adapter_state_changed(void)
++{
++ GPEState *s = &gpe_state;
++
++ if ( !test_bit(&s->gpe0_sts[0], ACPI_AC_POWER_STATE_BIT) &&
++ test_bit(&s->gpe0_en[0], ACPI_AC_POWER_STATE_BIT) ) {
++ set_bit(&s->gpe0_sts[0], ACPI_AC_POWER_STATE_BIT);
++ s->sci_asserted = 1;
++ qemu_irq_raise(sci_irq);
++ }
++}
++
++void acpi_power_button_pressed(void)
++{
++ GPEState *s = &gpe_state;
++ if ( !test_bit(&s->gpe0_sts[0], ACPI_POWER_BUTTON_BIT) &&
++ test_bit(&s->gpe0_en[0], ACPI_POWER_BUTTON_BIT) ) {
++ set_bit(&s->gpe0_sts[0], ACPI_POWER_BUTTON_BIT);
++ s->sci_asserted = 1;
++ qemu_irq_raise(sci_irq);
++ }
++}
++
++void acpi_sleep_button_pressed(void)
++{
++ GPEState *s = &gpe_state;
++
++ if ( !test_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT) &&
++ test_bit(&s->gpe0_en[0], ACPI_SLEEP_BUTTON_BIT) ) {
++ set_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT);
++ s->sci_asserted = 1;
++ qemu_irq_raise(sci_irq);
++ }
++}
++
++void acpi_lid_state_changed(void)
++{
++ GPEState *s = &gpe_state;
++
++ if ( !test_bit(&s->gpe0_sts[0], ACPI_LID_STATE_BIT) &&
++ test_bit(&s->gpe0_en[0], ACPI_LID_STATE_BIT) ) {
++ set_bit(&s->gpe0_sts[0], ACPI_LID_STATE_BIT);
++ s->sci_asserted = 1;
++ qemu_irq_raise(sci_irq);
++ }
++}
++
++#ifdef CONFIG_PASSTHROUGH
++
+ static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
+ {
+ #if defined(DEBUG)
+diff --git a/qemu-xen.h b/qemu-xen.h
+index c45bf9f..8c1debd 100644
+--- a/qemu-xen.h
++++ b/qemu-xen.h
+@@ -122,8 +122,12 @@ void xenstore_dm_finished_startup(void);
+ int xenstore_vm_write(int domid, const char *key, const char *val);
+ char *xenstore_vm_read(int domid, const char *key, unsigned int *len);
+ char *xenstore_device_model_read(int domid, const char *key, unsigned int *len);
++int xenstore_extended_power_mgmt_read_int(const char *key, int default_value);
+ char *xenstore_read_battery_data(int battery_status);
+ int xenstore_refresh_battery_status(void);
++void xenstore_register_for_pm_events(void);
++int xenstore_read_ac_adapter_state(void);
++int xenstore_read_lid_state(void);
+ int xenstore_pv_driver_build_blacklisted(uint16_t product_number,
+ uint32_t build_nr);
+
+diff --git a/xenstore.c b/xenstore.c
+index 99b31fd..6f5b073 100644
+--- a/xenstore.c
++++ b/xenstore.c
+@@ -27,6 +27,7 @@
+
+ #include "hw.h"
+ #include "pci.h"
++#include "pc.h"
+ #include "qemu-timer.h"
+ #include "qemu-xen.h"
+
+@@ -991,6 +992,25 @@ void xenstore_process_event(void *opaque)
+ goto out;
+ }
+
++ if (!strcmp(vec[XS_WATCH_TOKEN], "acadapterstatechangeevt")) {
++ acpi_ac_adapter_state_changed();
++ goto out;
++ }
++
++ if (!strcmp(vec[XS_WATCH_TOKEN], "pwrbuttonpressedevt")) {
++ acpi_power_button_pressed();
++ goto out;
++ }
++
++ if (!strcmp(vec[XS_WATCH_TOKEN], "slpbuttonpressedevt")) {
++ acpi_sleep_button_pressed();
++ }
++
++ if (!strcmp(vec[XS_WATCH_TOKEN], "lidstatechangeevt")) {
++ acpi_lid_state_changed();
++ goto out;
++ }
++
+ if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) ||
+ strlen(vec[XS_WATCH_TOKEN]) != 3)
+ goto out;
+@@ -1373,6 +1393,20 @@ static char *xenstore_extended_power_mgmt_read(const char *key, unsigned int *le
+ return value;
+ }
+
++int xenstore_extended_power_mgmt_read_int(const char *key, int default_value)
++{
++ int value = default_value;
++ char *buffer;
++
++ buffer = xenstore_extended_power_mgmt_read(key, NULL);
++ if ( buffer == NULL )
++ return value;
++
++ value = strtoull(buffer, NULL, 10);
++ free(buffer);
++ return value;
++}
++
+ static int xenstore_extended_power_mgmt_write(const char *key, const char *value)
+ {
+ int ret;
+@@ -1425,6 +1459,24 @@ int xenstore_refresh_battery_status(void)
+ return xenstore_extended_power_mgmt_event_trigger("refreshbatterystatus", "1");
+ }
+
++void xenstore_register_for_pm_events(void)
++{
++ xs_watch(xsh, "/pm/events/acadapterstatechanged", "acadapterstatechangeevt");
++ xs_watch(xsh, "/pm/events/lidstatechanged", "lidstatechangeevt");
++ xs_watch(xsh, "/pm/events/powerbuttonpressed", "pwrbuttonpressedevt");
++ xs_watch(xsh, "/pm/events/sleepbuttonpressed", "slpbuttonpressedevt");
++}
++
++int xenstore_read_ac_adapter_state(void)
++{
++ return xenstore_extended_power_mgmt_read_int("ac_adapter", 1);
++}
++
++int xenstore_read_lid_state(void)
++{
++ return xenstore_extended_power_mgmt_read_int("lid_state", 1);
++}
++
+ /*
+ * Create a store entry for a device (e.g., monitor, serial/parallel lines).
+ * The entry is <domain-path><storeString>/tty and the value is the name