Index: /trunk/include/VBox/pdmifs.h
===================================================================
--- /trunk/include/VBox/pdmifs.h	(revision 6155)
+++ /trunk/include/VBox/pdmifs.h	(revision 6156)
@@ -1769,4 +1769,12 @@
      */
     DECLR3CALLBACKMEMBER(int, pfnPowerButtonPress,(PPDMIACPIPORT pInterface));
+
+    /**
+     * Send an ACPI sleep button event.
+     *
+     * @returns VBox status code
+     * @param   pInterface      Pointer to the interface structure containing the called function pointer.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnSleepButtonPress,(PPDMIACPIPORT pInterface));
 } PDMIACPIPORT;
 
Index: /trunk/src/VBox/Devices/PC/DevACPI.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 6155)
+++ /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 6156)
@@ -542,6 +542,7 @@
     fadt.u16IAPCBOOTARCH      = RT_H2LE_U16(IAPC_BOOT_ARCH_LEGACY_DEV | IAPC_BOOT_ARCH_8042);
     /** @note WBINVD is required for ACPI versions newer than 1.0 */
-    fadt.u32Flags             = RT_H2LE_U32(  FADT_FL_WBINVD | FADT_FL_SLP_BUTTON
-                                            | FADT_FL_FIX_RTC | FADT_FL_TMR_VAL_EXT);
+    fadt.u32Flags             = RT_H2LE_U32(  FADT_FL_WBINVD
+                                            | FADT_FL_FIX_RTC
+                                            | FADT_FL_TMR_VAL_EXT);
     acpiWriteGenericAddr(&fadt.ResetReg,     1,  8, 0, 1, ACPI_RESET_BLK);
     fadt.u8ResetVal           = ACPI_RESET_REG_VAL;
@@ -741,4 +742,17 @@
     ACPIState *s = IACPIPORT_2_ACPISTATE(pInterface);
     update_pm1a (s, s->pm1a_sts | PWRBTN_STS, s->pm1a_en);
+    return VINF_SUCCESS;
+}
+
+/**
+ * Send an ACPI sleep button event.
+ *
+ * @returns VBox status code
+ * @param   pInterface      Pointer to the interface structure containing the called function pointer.
+ */
+static DECLCALLBACK(int) acpiSleepButtonPress(PPDMIACPIPORT pInterface)
+{
+    ACPIState *s = IACPIPORT_2_ACPISTATE(pInterface);
+    update_pm1a (s, s->pm1a_sts | SLPBTN_STS, s->pm1a_en);
     return VINF_SUCCESS;
 }
@@ -1664,4 +1678,5 @@
     s->IBase.pfnQueryInterface         = acpiQueryInterface;
     /* IACPIPort */
+    s->IACPIPort.pfnSleepButtonPress   = acpiSleepButtonPress;
     s->IACPIPort.pfnPowerButtonPress   = acpiPowerButtonPress;
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 6155)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 6156)
@@ -404,5 +404,5 @@
         RTPrintf("VBoxManage controlvm        <uuid>|<name>\n"
                  "                            pause|resume|reset|poweroff|savestate|\n"
-                 "                            acpipowerbutton |\n"
+                 "                            acpipowerbutton|acpisleepbutton|\n"
                  "                            setlinkstate<1-4> on|off |\n"
                  "                            usbattach <uuid>|<address> |\n"
@@ -5326,4 +5326,8 @@
             CHECK_ERROR_BREAK (console, PowerButton());
         }
+        else if (strcmp(argv[1], "acpisleepbutton") == 0)
+        {
+            CHECK_ERROR_BREAK (console, SleepButton());
+        }
         else if (strncmp(argv[1], "setlinkstate", 12) == 0)
         {
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 6155)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 6156)
@@ -1540,4 +1540,41 @@
         setError (E_FAIL,
             tr ("Controlled power off failed (%Vrc)"), vrc);
+
+    LogFlowThisFunc (("rc=%08X\n", rc));
+    LogFlowThisFuncLeave();
+    return rc;
+}
+
+STDMETHODIMP Console::SleepButton()
+{
+    LogFlowThisFuncEnter();
+
+    AutoCaller autoCaller (this);
+    CheckComRCReturnRC (autoCaller.rc());
+
+    AutoLock lock (this);
+
+    if (mMachineState != MachineState_Running)
+        return setError (E_FAIL, tr ("Cannot send the sleep button event as it is "
+                                     "not running (machine state: %d)"),
+                         mMachineState);
+
+    /* protect mpVM */
+    AutoVMCaller autoVMCaller (this);
+    CheckComRCReturnRC (autoVMCaller.rc());
+
+    PPDMIBASE pBase;
+    int vrc = PDMR3QueryDeviceLun (mpVM, "acpi", 0, 0, &pBase);
+    if (VBOX_SUCCESS (vrc))
+    {
+        Assert (pBase);
+        PPDMIACPIPORT pPort =
+            (PPDMIACPIPORT) pBase->pfnQueryInterface(pBase, PDMINTERFACE_ACPI_PORT);
+        vrc = pPort ? pPort->pfnSleepButtonPress(pPort) : VERR_INVALID_POINTER;
+    }
+
+    HRESULT rc = VBOX_SUCCESS (vrc) ? S_OK :
+        setError (E_FAIL,
+            tr ("Sending sleep button event failed (%Vrc)"), vrc);
 
     LogFlowThisFunc (("rc=%08X\n", rc));
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 6155)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 6156)
@@ -3758,4 +3758,8 @@
     </method>
 
+    <method name="sleepButton">
+      <desc>Send the ACPI sleep button event to the guest.</desc>
+    </method>
+
     <method name="saveState">
       <desc>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 6155)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 6156)
@@ -126,4 +126,5 @@
     STDMETHOD(Resume)();
     STDMETHOD(PowerButton)();
+    STDMETHOD(SleepButton)();
     STDMETHOD(SaveState) (IProgress **aProgress);
     STDMETHOD(AdoptSavedState) (INPTR BSTR aSavedStateFile);
