diff --git a/app/Kconfig b/app/Kconfig
index a45f2dc2..675fca06 100644
--- a/app/Kconfig
+++ b/app/Kconfig
@@ -163,8 +163,7 @@ config ZMK_BLE_EXPERIMENTAL_CONN
     bool "Experimental BLE connection changes"
     help
       Enables a combination of settings that are planned to be default in future versions of ZMK
-      to improve connection stability. This includes changes to timing on BLE pairing initiation,
-      restores use of the updated/new LLCP implementation, and disables 2M PHY support.
+      to improve connection stability. 
 
 config ZMK_BLE_EXPERIMENTAL_SEC
     bool "Experimental BLE security changes"
@@ -430,6 +429,10 @@ config ZMK_EXT_POWER
     bool "Enable support to control external power output"
     default y
 
+config ZMK_EXT_POWER_IDLE_OFF
+    bool "Turn off external power while idle"
+    depends on ZMK_EXT_POWER
+
 config ZMK_PM
     bool
 
diff --git a/app/src/activity.c b/app/src/activity.c
index 454e91e5..25198beb 100644
--- a/app/src/activity.c
+++ b/app/src/activity.c
@@ -19,6 +19,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
 #include <zmk/events/sensor_event.h>
 
 #include <zmk/pm.h>
+#include <drivers/ext_power.h>
 
 #include <zmk/activity.h>
 
@@ -60,8 +61,19 @@ int set_state(enum zmk_activity_state state) {
 enum zmk_activity_state zmk_activity_get_state(void) { return activity_state; }
 
 int activity_event_listener(const zmk_event_t *eh) {
+#if IS_ENABLED(CONFIG_ZMK_EXT_POWER_IDLE_OFF)
     activity_last_uptime = k_uptime_get();
-
+    if (activity_state == ZMK_ACTIVITY_IDLE) {
+        const struct device *ext_power = device_get_binding("EXT_POWER");
+        if (ext_power == NULL) {
+            LOG_ERR("Unable to retrieve ext_power device on idle wake.");
+        } else {
+            ext_power_enable(ext_power);
+        }
+    }
+#else
+    activity_last_uptime = k_uptime_get();
+#endif /* IS_ENABLED(CONFIG_ZMK_EXT_POWER_IDLE_OFF) */
     return set_state(ZMK_ACTIVITY_ACTIVE);
 }
 
@@ -83,6 +95,15 @@ void activity_work_handler(struct k_work *work) {
     } else
 #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */
         if (inactive_time > MAX_IDLE_MS) {
+#if IS_ENABLED(CONFIG_ZMK_EXT_POWER_IDLE_OFF)
+            const struct device *ext_power = device_get_binding("EXT_POWER");
+            if (ext_power == NULL) {
+                LOG_ERR("Unable to retrieve ext_power device on entering idle.");
+                return;
+            }
+
+            ext_power_disable(ext_power);
+#endif /* IS_ENABLED(CONFIG_ZMK_EXT_POWER_IDLE_OFF) */
             set_state(ZMK_ACTIVITY_IDLE);
         }
 }
diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md
index 1a142eb2..c3b3a0ec 100644
--- a/docs/docs/config/power.md
+++ b/docs/docs/config/power.md
@@ -21,6 +21,7 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/
 | Config                          | Type | Description                                           | Default |
 | ------------------------------- | ---- | ----------------------------------------------------- | ------- |
 | `CONFIG_ZMK_IDLE_TIMEOUT`       | int  | Milliseconds of inactivity before entering idle state | 30000   |
+| `CONFIG_ZMK_EXT_POWER_IDLE_OFF` | bool | Turn off external power while idle                    | n       |
 | `CONFIG_ZMK_SLEEP`              | bool | Enable deep sleep support                             | n       |
 | `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int  | Milliseconds of inactivity before entering deep sleep | 900000  |