diff --git a/src/platform/ESP32/ConfigurationManagerImpl.cpp b/src/platform/ESP32/ConfigurationManagerImpl.cpp
index 37995f4d185a33..d138644d4aab8b 100644
--- a/src/platform/ESP32/ConfigurationManagerImpl.cpp
+++ b/src/platform/ESP32/ConfigurationManagerImpl.cpp
@@ -45,14 +45,26 @@ namespace DeviceLayer {
 
 using namespace ::chip::DeviceLayer::Internal;
 
-// TODO: Define a Singleton instance of CHIP Group Key Store here (#1266)
-
 ConfigurationManagerImpl & ConfigurationManagerImpl::GetDefaultInstance()
 {
     static ConfigurationManagerImpl sInstance;
     return sInstance;
 }
 
+uint32_t ConfigurationManagerImpl::mTotalOperationalHours = 0;
+
+void ConfigurationManagerImpl::TotalOperationalHoursTimerCallback(TimerHandle_t timer)
+{
+    mTotalOperationalHours++;
+
+    CHIP_ERROR err = ConfigurationMgrImpl().StoreTotalOperationalHours(mTotalOperationalHours);
+
+    if (err != CHIP_NO_ERROR)
+    {
+        ChipLogError(DeviceLayer, "Failed to store total operational hours: %" CHIP_ERROR_FORMAT, err.Format());
+    }
+}
+
 CHIP_ERROR ConfigurationManagerImpl::Init()
 {
     CHIP_ERROR err;
@@ -161,18 +173,34 @@ CHIP_ERROR ConfigurationManagerImpl::Init()
         SuccessOrExit(err);
     }
 
-    if (!ESP32Config::ConfigValueExists(ESP32Config::kCounterKey_TotalOperationalHours))
+    if (CHIP_NO_ERROR != GetTotalOperationalHours(mTotalOperationalHours))
     {
-        err = StoreTotalOperationalHours(0);
+        err = StoreTotalOperationalHours(mTotalOperationalHours);
         SuccessOrExit(err);
     }
 
+    {
+        // Start a timer which reloads every one hour and bumps the total operational hours
+        TickType_t reloadPeriod   = (1000 * 60 * 60) / portTICK_PERIOD_MS;
+        TimerHandle_t timerHandle = xTimerCreate("tOpHrs", reloadPeriod, pdPASS, nullptr, TotalOperationalHoursTimerCallback);
+        if (timerHandle == nullptr)
+        {
+            err = CHIP_ERROR_NO_MEMORY;
+            ExitNow(ChipLogError(DeviceLayer, "total operational hours Timer creation failed"));
+        }
+
+        BaseType_t timerStartStatus = xTimerStart(timerHandle, 0);
+        if (timerStartStatus == pdFAIL)
+        {
+            err = CHIP_ERROR_INTERNAL;
+            ExitNow(ChipLogError(DeviceLayer, "total operational hours Timer start failed"));
+        }
+    }
+
     // Initialize the generic implementation base class.
     err = Internal::GenericConfigurationManagerImpl<ESP32Config>::Init();
     SuccessOrExit(err);
 
-    // TODO: Initialize the global GroupKeyStore object here (#1266)
-
     err = CHIP_NO_ERROR;
 
 exit:
diff --git a/src/platform/ESP32/ConfigurationManagerImpl.h b/src/platform/ESP32/ConfigurationManagerImpl.h
index 3779ac816dc463..391040fc93e789 100644
--- a/src/platform/ESP32/ConfigurationManagerImpl.h
+++ b/src/platform/ESP32/ConfigurationManagerImpl.h
@@ -35,6 +35,9 @@
 
 #include <platform/ESP32/ESP32Config.h>
 
+#include <freertos/FreeRTOS.h>
+#include <freertos/timers.h>
+
 namespace chip {
 namespace DeviceLayer {
 
@@ -96,6 +99,9 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp
     // ===== Private members reserved for use by this class only.
 
     static void DoFactoryReset(intptr_t arg);
+
+    static uint32_t mTotalOperationalHours;
+    static void TotalOperationalHoursTimerCallback(TimerHandle_t timer);
 };
 
 /**
diff --git a/src/test_driver/esp32/sdkconfig.defaults b/src/test_driver/esp32/sdkconfig.defaults
index 2770877a587298..9e31d3b9166e20 100644
--- a/src/test_driver/esp32/sdkconfig.defaults
+++ b/src/test_driver/esp32/sdkconfig.defaults
@@ -31,6 +31,7 @@ CONFIG_ESP_MAIN_TASK_STACK_SIZE=32768
 
 #enable BT
 CONFIG_BT_ENABLED=y
+CONFIG_BT_NIMBLE_ENABLED=y
 
 #enable HKDF in mbedtls
 CONFIG_MBEDTLS_HKDF_C=y