diff --git a/core/power.cc b/core/power.cc
index 857ae705037cb5884d8728a3890f76b6e0652902..dd110761374990dddcdc05a5c41037900252dd89 100644
--- a/core/power.cc
+++ b/core/power.cc
@@ -30,19 +30,7 @@ void halt(void)
 
 void poweroff(void)
 {
-    ACPI_STATUS status;
-    status = AcpiInitializeSubsystem();
-    if (ACPI_FAILURE(status)) {
-        debug("AcpiInitializeSubsystem failed: %s\n", AcpiFormatException(status));
-        halt();
-    }
-    status = AcpiLoadTables();
-    if (ACPI_FAILURE(status)) {
-        debug("AcpiLoadTables failed: %s\n", AcpiFormatException(status));
-        halt();
-    }
-
-    status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
+    ACPI_STATUS status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
     if (ACPI_FAILURE(status)) {
         debug("AcpiEnterSleepStatePrep failed: %s\n", AcpiFormatException(status));
         halt();
diff --git a/drivers/acpi.cc b/drivers/acpi.cc
index 3d65893c271625b89168908a6c79d729bd323d36..be7703489cacaf3cec330f71080b93d6c91dd6c9 100644
--- a/drivers/acpi.cc
+++ b/drivers/acpi.cc
@@ -21,6 +21,7 @@ extern "C" {
 #include "align.hh"
 #include "xen.hh"
 
+#include <osv/debug.h>
 #include <osv/mutex.h>
 #include <osv/semaphore.hh>
 
@@ -480,7 +481,58 @@ void AcpiOsVprintf(const char *Format, va_list Args)
     vprintf(Format, Args);
 }
 
-void __attribute__((constructor(ACPI_INIT_PRIO))) acpi_init()
+void __attribute__((constructor(ACPI_INIT_PRIO))) acpi_init_early()
 {
      XENPV_ALTERNATIVE({auto st = AcpiInitializeTables(NULL, 0, false); assert(st == AE_OK);}, {});
 }
+
+namespace acpi {
+
+// must be called after the scheduler, apic and smp where started to run
+// The following function comes from the documentation example page 262
+void init()
+{
+    bool allow_resize = false;
+    static int max_acpi_tables = 16;
+
+    // Initialize ACPICA subsystem
+    ACPI_STATUS status = AcpiInitializeSubsystem();
+    if (ACPI_FAILURE(status)) {
+        debug("AcpiInitializeSubsystem() failed: %s\n",
+              AcpiFormatException(status));
+        return;
+    }
+
+    // Initialize the ACPICA Table Manager and get all ACPI tables
+    // nothing is preallocated so pass a nullptr so the code will allocate and
+    // fill up to max_acpi_tables
+    status = AcpiInitializeTables(nullptr, max_acpi_tables, allow_resize);
+    if (ACPI_FAILURE(status)) {
+        debug("AcpiInitializeTables failed: %s\n", AcpiFormatException(status));
+        return;
+    }
+
+    // Create the ACPI namespace from ACPI tables
+    status = AcpiLoadTables();
+    if (ACPI_FAILURE(status)) {
+        debug("AcpiLoadTables failed: %s\n", AcpiFormatException(status));
+        return;
+    }
+
+    // TODO: Installation of Local handlers
+
+    // Initialize the ACPI hardware
+    status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
+    if (ACPI_FAILURE(status)) {
+        debug("AcpiEnableSubsystem failed: %s\n", AcpiFormatException(status));
+        return;
+    }
+
+    // Complete the ACPI namespace object initialization
+    status = AcpiInitializeObjects(ACPI_FULL_INITIALIZATION);
+    if (ACPI_FAILURE(status)) {
+        debug("AcpiInitializeObjects failed: %s\n", AcpiFormatException(status));
+    }
+}
+
+}
diff --git a/drivers/acpi.hh b/drivers/acpi.hh
new file mode 100644
index 0000000000000000000000000000000000000000..8373745b8d0aca5e7afad6c9feb078e2bf185530
--- /dev/null
+++ b/drivers/acpi.hh
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2013 Nodalink, SARL.
+ *
+ * This work is open source software, licensed under the terms of the
+ * BSD license as described in the LICENSE file in the top-level directory.
+ */
+#ifndef _OSV_DRIVER_ACPI_HH_
+#define _OSV_DRIVER_ACPI_HH_
+
+#include "acpi.h"
+
+namespace acpi {
+
+void init();
+
+}
+
+#endif //!_OSV_DRIVER_ACPI_HH_
diff --git a/loader.cc b/loader.cc
index e9a2589f4738e9f4e3ec2b4b073b6193f3069b0d..4f042848c0da70fb1eb2b8eb719d49d75a81885f 100644
--- a/loader.cc
+++ b/loader.cc
@@ -22,6 +22,7 @@
 #include "xen.hh"
 #include "ioapic.hh"
 
+#include "drivers/acpi.hh"
 #include "drivers/driver.hh"
 #include "drivers/virtio-net.hh"
 #include "drivers/virtio-blk.hh"
@@ -256,6 +257,7 @@ void main_cont(int ac, char** av)
     std::tie(ac, av) = parse_options(ac, av);
     ioapic::init();
     smp_launch();
+    acpi::init();
     sched::preempt_enable();
     console::console_init();
     memory::enable_debug_allocator();