[Silabs] Add SIT ICD configurations to silabs lock example (#28474)

* rename SED for ICD

* Delete ICD subscription callback since default behavior is merged

* Enable ICD default configuration for DL
Update configs to support ICDs

* Add ICDM attributes for SIT ICD config

* generated files

* update wordlist

* update readme

* update default config comments

* add define block for ICD configs

* fix esp

* try to fix esp again

* try to fix esp again
diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt
index 2a1ead4..0b195ba 100644
--- a/.github/.wordlist.txt
+++ b/.github/.wordlist.txt
@@ -632,6 +632,7 @@
 hciattach
 hciconfig
 hdlc
+HEPA
 HKDF
 HMAC
 hoc
@@ -641,7 +642,6 @@
 hostapd
 hostname
 href
-HEPA
 HTTPS
 HW
 hwadr
@@ -652,6 +652,7 @@
 iaszone
 ibb
 ICA
+ICD
 iCloud
 ICMP
 IDF
diff --git a/examples/light-switch-app/silabs/README.md b/examples/light-switch-app/silabs/README.md
index 9ca79a8..197a2ae 100644
--- a/examples/light-switch-app/silabs/README.md
+++ b/examples/light-switch-app/silabs/README.md
@@ -131,9 +131,9 @@
 
           ./scripts/examples/gn_silabs_example.sh examples/light-switch-app/silabs/efr32/ out/light-switch-app BRD4187C chip_build_libshell=true
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/light-switch-app/silabs/efr32/ ./out/light-switch-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/light-switch-app/silabs/efr32/ ./out/light-switch-app_ICD BRD4187C --icd
 
     or use gn as previously mentioned but adding the following arguments:
 
diff --git a/examples/lighting-app/silabs/README.md b/examples/lighting-app/silabs/README.md
index 4d7c873..4834ef5 100644
--- a/examples/lighting-app/silabs/README.md
+++ b/examples/lighting-app/silabs/README.md
@@ -123,9 +123,9 @@
           $ cd ~/connectedhomeip/examples/lighting-app/silabs/efr32
           $ rm -rf out/
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/lighting-app/silabs/efr32/ ./out/lighting-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/lighting-app/silabs/efr32/ ./out/lighting-app_ICD BRD4187C --icd
 
     or use gn as previously mentioned but adding the following arguments:
 
diff --git a/examples/lock-app/esp32/main/CMakeLists.txt b/examples/lock-app/esp32/main/CMakeLists.txt
index dc5fa50..a6aded6 100644
--- a/examples/lock-app/esp32/main/CMakeLists.txt
+++ b/examples/lock-app/esp32/main/CMakeLists.txt
@@ -50,6 +50,7 @@
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/server"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/util"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/reporting"
+                     "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/icd"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/access-control-server"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/administrator-commissioning-server"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/basic-information"
@@ -74,6 +75,7 @@
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/door-lock-server"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/identify-server"
                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server"
+                     "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server"
                      PRIV_REQUIRES bt chip QRCode nvs_flash driver)
 add_dependencies(${COMPONENT_LIB} app-codegen)
 
@@ -162,6 +164,7 @@
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/server"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/util"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/reporting"
+                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/icd"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/access-control-server"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/administrator-commissioning-server"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/basic-information"
@@ -189,7 +192,8 @@
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/door-lock-server"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/identify-server"
                       "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server"
-                     "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/lock"
+                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server"
+                      "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/lock"
                       PRIV_REQUIRES chip QRCode bt nvs_flash driver)
 
 add_dependencies(${COMPONENT_LIB} app-codegen)
diff --git a/examples/lock-app/lock-common/lock-app.matter b/examples/lock-app/lock-common/lock-app.matter
index 1fda092..61dbeb1 100644
--- a/examples/lock-app/lock-common/lock-app.matter
+++ b/examples/lock-app/lock-common/lock-app.matter
@@ -1662,6 +1662,30 @@
   readonly attribute int16u clusterRevision = 65533;
 }
 
+/** Allows servers to ensure that listed clients are notified when a server is available for communication. */
+server cluster IcdManagement = 70 {
+  bitmap Feature : BITMAP32 {
+    kCheckInProtocolSupport = 0x1;
+  }
+
+  fabric_scoped struct MonitoringRegistrationStruct {
+    fabric_sensitive node_id checkInNodeID = 1;
+    fabric_sensitive int64u monitoredSubject = 2;
+    fabric_sensitive octet_string<16> key = 3;
+    fabric_idx fabricIndex = 254;
+  }
+
+  readonly attribute int32u idleModeInterval = 0;
+  readonly attribute int32u activeModeInterval = 1;
+  readonly attribute int16u activeModeThreshold = 2;
+  readonly attribute command_id generatedCommandList[] = 65528;
+  readonly attribute command_id acceptedCommandList[] = 65529;
+  readonly attribute event_id eventList[] = 65530;
+  readonly attribute attrib_id attributeList[] = 65531;
+  readonly attribute bitmap32 featureMap = 65532;
+  readonly attribute int16u clusterRevision = 65533;
+}
+
 /** An interface to a generic way to secure a door */
 server cluster DoorLock = 257 {
   enum AlarmCodeEnum : ENUM8 {
@@ -2541,6 +2565,14 @@
     ram      attribute featureMap default = 0;
     ram      attribute clusterRevision default = 1;
   }
+
+  server cluster IcdManagement {
+    callback attribute idleModeInterval default = 500;
+    callback attribute activeModeInterval default = 300;
+    callback attribute activeModeThreshold default = 300;
+    ram      attribute featureMap default = 0x0000;
+    ram      attribute clusterRevision default = 1;
+  }
 }
 endpoint 1 {
   device type doorlock = 10, version 1;
diff --git a/examples/lock-app/lock-common/lock-app.zap b/examples/lock-app/lock-common/lock-app.zap
index 3537aa2..c097b1b 100644
--- a/examples/lock-app/lock-common/lock-app.zap
+++ b/examples/lock-app/lock-common/lock-app.zap
@@ -5323,6 +5323,260 @@
           ]
         },
         {
+          "name": "ICD Management",
+          "code": 70,
+          "mfgCode": null,
+          "define": "ICD_MANAGEMENT_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "attributes": [
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "client",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "ICD Management",
+          "code": 70,
+          "mfgCode": null,
+          "define": "ICD_MANAGEMENT_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "RegisterClientResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": [
+            {
+              "name": "IdleModeInterval",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int32u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "500",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ActiveModeInterval",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int32u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "300",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ActiveModeThreshold",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "300",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RegisteredClients",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ICDCounter",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int32u",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClientsSupportedPerFabric",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "GeneratedCommandList",
+              "code": 65528,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AcceptedCommandList",
+              "code": 65529,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "EventList",
+              "code": 65530,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 0,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "AttributeList",
+              "code": 65531,
+              "mfgCode": null,
+              "side": "server",
+              "type": "array",
+              "included": 0,
+              "storageOption": "External",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "FeatureMap",
+              "code": 65532,
+              "mfgCode": null,
+              "side": "server",
+              "type": "bitmap32",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
           "name": "Occupancy Sensing",
           "code": 1030,
           "mfgCode": null,
diff --git a/examples/lock-app/silabs/README.md b/examples/lock-app/silabs/README.md
index 2d6cb87..67fb889 100644
--- a/examples/lock-app/silabs/README.md
+++ b/examples/lock-app/silabs/README.md
@@ -130,10 +130,10 @@
           $ rm -rf out/
           ```
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
           ```
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/lock-app/silabs/efr32/ ./out/lock-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/lock-app/silabs/efr32/ ./out/lock-app_ICD BRD4187C --icd
           ```
 
     or use gn as previously mentioned but adding the following arguments:
diff --git a/examples/lock-app/silabs/openthread.gn b/examples/lock-app/silabs/openthread.gn
index b05216f..27aa6c7 100644
--- a/examples/lock-app/silabs/openthread.gn
+++ b/examples/lock-app/silabs/openthread.gn
@@ -23,7 +23,7 @@
 default_args = {
   target_cpu = "arm"
   target_os = "freertos"
-  chip_openthread_ftd = true
+  chip_openthread_ftd = false
 
   import("//openthread.gni")
 }
diff --git a/examples/lock-app/silabs/openthread.gni b/examples/lock-app/silabs/openthread.gni
index 9d7fbf2..570d5e8 100644
--- a/examples/lock-app/silabs/openthread.gni
+++ b/examples/lock-app/silabs/openthread.gni
@@ -24,3 +24,17 @@
 
 openthread_external_platform =
     "${chip_root}/third_party/openthread/platforms/efr32:libopenthread-efr32"
+
+# ICD Default configurations
+chip_enable_icd_server = true
+chip_subscription_timeout_resumption = false
+sl_use_subscription_synching = true
+
+# Openthread Configuration flags
+sl_ot_idle_interval_ms = 5000  # 5s Idle Intervals
+sl_ot_active_interval_ms = 500  # 500ms Active Intervals
+
+# ICD Matter Configuration flags
+sl_idle_mode_interval_ms = 600000  # 10min Idle Mode Interval
+sl_active_mode_interval_ms = 10000  # 10s Active Mode Interval
+sl_active_mode_threshold_ms = 1000  # 1s Active Mode Threshold
diff --git a/examples/platform/silabs/ICDSubscriptionCallback.cpp b/examples/platform/silabs/ICDSubscriptionCallback.cpp
deleted file mode 100644
index eba2896..0000000
--- a/examples/platform/silabs/ICDSubscriptionCallback.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *
- *    Copyright (c) 2023 Project CHIP Authors
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-
-#include "ICDSubscriptionCallback.h"
-#include <platform/CHIPDeviceConfig.h>
-
-CHIP_ERROR ICDSubscriptionCallback::OnSubscriptionRequested(chip::app::ReadHandler & aReadHandler,
-                                                            chip::Transport::SecureSession & aSecureSession)
-{
-    using namespace chip::System::Clock;
-
-    Seconds32 interval_s32 = std::chrono::duration_cast<Seconds32>(CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL);
-
-    if (interval_s32 > Seconds16::max())
-    {
-        interval_s32 = Seconds16::max();
-    }
-    uint32_t decidedMaxInterval = interval_s32.count();
-
-    uint16_t requestedMinInterval = 0;
-    uint16_t requestedMaxInterval = 0;
-    aReadHandler.GetReportingIntervals(requestedMinInterval, requestedMaxInterval);
-
-    // If requestedMinInterval is greater than IdleTimeInterval, select next wake up time as max interval
-    if (requestedMinInterval > decidedMaxInterval)
-    {
-        uint16_t ratio = requestedMinInterval / decidedMaxInterval;
-        if (requestedMinInterval % decidedMaxInterval)
-        {
-            ratio++;
-        }
-
-        decidedMaxInterval *= ratio;
-    }
-
-    // Verify that decidedMaxInterval is an acceptable value
-    if (decidedMaxInterval > Seconds16::max().count())
-    {
-        decidedMaxInterval = Seconds16::max().count();
-    }
-
-    // Verify that the decidedMaxInterval respects MAX(SUBSCRIPTION_MAX_INTERVAL_PUBLISHER_LIMIT, MaxIntervalCeiling)
-    uint16_t maximumMaxInterval = std::max(kSubscriptionMaxIntervalPublisherLimit, requestedMaxInterval);
-    if (decidedMaxInterval > maximumMaxInterval)
-    {
-        decidedMaxInterval = maximumMaxInterval;
-    }
-
-    return aReadHandler.SetMaxReportingInterval(decidedMaxInterval);
-}
diff --git a/examples/platform/silabs/ICDSubscriptionCallback.h b/examples/platform/silabs/ICDSubscriptionCallback.h
deleted file mode 100644
index c9f77e6..0000000
--- a/examples/platform/silabs/ICDSubscriptionCallback.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *
- *    Copyright (c) 2023 Project CHIP Authors
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-#pragma once
-
-#include <app/ReadHandler.h>
-
-/**
- * @brief The goal of the ICDSubscriptionCallback class is to negotiate the max interval subscription to match the idle interval of
- * the IC device. When a subscription is requested, the device will change the requested max interval to match its idle time
- * interval through the OnSubscriptionRequested function.
- */
-class ICDSubscriptionCallback : public chip::app::ReadHandler::ApplicationCallback
-{
-    /**
-     * @brief Function called when a subscription is requested.
-     *        An ICD will use this function to negotiate the subscription max interval to match its idle time interval
-     */
-    CHIP_ERROR OnSubscriptionRequested(chip::app::ReadHandler & aReadHandler,
-                                       chip::Transport::SecureSession & aSecureSession) override;
-};
diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp
index 9c22532..836e2a7 100644
--- a/examples/platform/silabs/MatterConfig.cpp
+++ b/examples/platform/silabs/MatterConfig.cpp
@@ -58,10 +58,6 @@
 #include <app/InteractionModelEngine.h>
 #include <lib/support/BytesToHex.h>
 
-#ifdef CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-ICDSubscriptionCallback SilabsMatterConfig::mICDSubscriptionHandler;
-#endif // CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-
 #if CHIP_ENABLE_OPENTHREAD
 #include <inet/EndPointStateOpenThread.h>
 #include <openthread/cli.h>
@@ -222,11 +218,6 @@
     // Init Matter Server and Start Event Loop
     err = chip::Server::GetInstance().Init(initParams);
 
-#ifdef CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-    // Register ICD subscription callback to match subscription max intervals to its idle time interval
-    chip::app::InteractionModelEngine::GetInstance()->RegisterReadHandlerAppCallback(&mICDSubscriptionHandler);
-#endif // CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-
     chip::DeviceLayer::PlatformMgr().UnlockChipStack();
 
     ReturnErrorOnFailure(err);
diff --git a/examples/platform/silabs/MatterConfig.h b/examples/platform/silabs/MatterConfig.h
index 4983aba..2c565f7 100644
--- a/examples/platform/silabs/MatterConfig.h
+++ b/examples/platform/silabs/MatterConfig.h
@@ -22,10 +22,6 @@
 #include <platform/CHIPDeviceLayer.h>
 #include <platform/KeyValueStoreManager.h>
 
-#ifdef CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-#include "ICDSubscriptionCallback.h"
-#endif // CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-
 class SilabsMatterConfig
 {
 public:
@@ -36,8 +32,4 @@
     static void InitWiFi(void);
     static void ConnectivityEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
     static void InitOTARequestorHandler(chip::System::Layer * systemLayer, void * appState);
-
-#ifdef CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
-    static ICDSubscriptionCallback mICDSubscriptionHandler;
-#endif // CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS
 };
diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn
index 3a965cb..5bb628a 100644
--- a/examples/platform/silabs/efr32/BUILD.gn
+++ b/examples/platform/silabs/efr32/BUILD.gn
@@ -40,9 +40,6 @@
   #default Wifi Password
   chip_default_wifi_psk = ""
 
-  # Use default handler to negotiate subscription max interval
-  chip_config_use_icd_subscription_callbacks = chip_enable_icd_server
-
   # Enable TestEventTrigger in GeneralDiagnostics cluster
   silabs_test_event_trigger_enabled = false
 
@@ -197,21 +194,6 @@
   ]
 }
 
-config("ICD-subscription-callback-config") {
-  defines = [ "CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS=1" ]
-}
-
-source_set("efr32-ICD-subscription-callback") {
-  sources = [
-    "${silabs_common_plat_dir}/ICDSubscriptionCallback.cpp",
-    "${silabs_common_plat_dir}/ICDSubscriptionCallback.h",
-  ]
-
-  public_deps = [ "${chip_root}/src/app:app" ]
-
-  public_configs = [ ":ICD-subscription-callback-config" ]
-}
-
 config("efr32-common-config") {
   defines = [ "OTA_PERIODIC_TIMEOUT=${ota_periodic_query_timeout_sec}" ]
 
@@ -356,10 +338,6 @@
     public_deps += [ ":silabs-factory-data-provider" ]
   }
 
-  if (chip_config_use_icd_subscription_callbacks) {
-    public_deps += [ ":efr32-ICD-subscription-callback" ]
-  }
-
   if (silabs_test_event_trigger_enabled) {
     sources +=
         [ "${silabs_common_plat_dir}/SilabsTestEventTriggerDelegate.cpp" ]
diff --git a/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h b/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
index 90ecfcb..3391428 100644
--- a/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
+++ b/examples/platform/silabs/efr32/project_include/OpenThreadConfig.h
@@ -36,8 +36,7 @@
 // Enable use of external heap allocator (calloc/free) for OpenThread.
 #define OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE 1
 
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
-
+#ifdef SL_ICD_ENABLED
 #define OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE 0
 
 // In seconds
@@ -46,7 +45,7 @@
 // Timeout after 2 missed checkin or 4 mins if sleep interval is too short.
 #define OPENTHREAD_CONFIG_MLE_CHILD_TIMEOUT_DEFAULT ((SL_MLE_TIMEOUT_s < 120) ? 240 : ((SL_MLE_TIMEOUT_s * 2) + 1))
 
-#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
+#endif // SL_ICD_ENABLED
 
 /****Uncomment below section for OpenThread Debug logs*/
 // #define OPENTHREAD_CONFIG_LOG_LEVEL OT_LOG_LEVEL_DEBG
diff --git a/examples/pump-app/silabs/README.md b/examples/pump-app/silabs/README.md
index 51306b7..f2fc518 100644
--- a/examples/pump-app/silabs/README.md
+++ b/examples/pump-app/silabs/README.md
@@ -122,9 +122,9 @@
           $ cd ~/connectedhomeip/examples/pump-app/silabs/efr32
           $ rm -rf out/
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/pump-app/silabs/efr32/ ./out/pump-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/pump-app/silabs/efr32/ ./out/pump-app_ICD BRD4187C --icd
 
     or use gn as previously mentioned but adding the following arguments:
 
diff --git a/examples/smoke-co-alarm-app/silabs/README.md b/examples/smoke-co-alarm-app/silabs/README.md
index 2aec36e..fc85897 100644
--- a/examples/smoke-co-alarm-app/silabs/README.md
+++ b/examples/smoke-co-alarm-app/silabs/README.md
@@ -126,10 +126,10 @@
           $ rm -rf out/
           ```
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
           ```
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/smoke-co-alarm-app/silabs ./out/smoke-co-alarm-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/smoke-co-alarm-app/silabs ./out/smoke-co-alarm-app_ICD BRD4187C --icd
           ```
 
     or use gn as previously mentioned but adding the following arguments:
diff --git a/examples/thermostat/silabs/README.md b/examples/thermostat/silabs/README.md
index 6dc53dc..cc76d71 100644
--- a/examples/thermostat/silabs/README.md
+++ b/examples/thermostat/silabs/README.md
@@ -131,9 +131,9 @@
 
           ./scripts/examples/gn_silabs_example.sh examples/thermostat/silabs/efr32/ out/thermostat-app BRD4187C chip_build_libshell=true
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/thermostat/silabs/efr32/ ./out/thermostat-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/thermostat/silabs/efr32/ ./out/thermostat-app_ICD BRD4187C --icd
 
     or use gn as previously mentioned but adding the following arguments:
 
diff --git a/examples/window-app/silabs/README.md b/examples/window-app/silabs/README.md
index 6152acb..a755500 100644
--- a/examples/window-app/silabs/README.md
+++ b/examples/window-app/silabs/README.md
@@ -120,9 +120,9 @@
           $ cd ~/connectedhomeip/examples/window-app/silabs/efr32
           $ rm -rf out/
 
-*   Build the example as Sleepy End Device (SED)
+*   Build the example as Intermittently Connected Device (ICD)
 
-          $ ./scripts/examples/gn_silabs_example.sh ./examples/window-app/silabs/efr32/ ./out/window-app_SED BRD4187C --sed
+          $ ./scripts/examples/gn_silabs_example.sh ./examples/window-app/silabs/efr32/ ./out/window-app_ICD BRD4187C --icd
 
     or use gn as previously mentioned but adding the following arguments:
 
diff --git a/scripts/examples/gn_silabs_example.sh b/scripts/examples/gn_silabs_example.sh
index f966ceb..90adc9f 100755
--- a/scripts/examples/gn_silabs_example.sh
+++ b/scripts/examples/gn_silabs_example.sh
@@ -114,12 +114,12 @@
         siwx917_commissionable_data
             Build with the commissionable data given in DeviceConfig.h (only for SiWx917)
         Presets
-        --sed
-            enable sleepy end device, set thread mtd
+        --icd
+            enable ICD features, set thread mtd
             For minimum consumption, add --low-power
         --low-power
             disables all power consuming features for the most power efficient build
-            This flag is to be used with --sed
+            This flag is to be used with --icd
         --wifi <wf200 | rs9116>
             build wifi example variant for given exansion board
         --additional_data_advertising
@@ -181,7 +181,7 @@
                 shift
                 shift
                 ;;
-            --sed)
+            --icd)
                 optArgs+="chip_enable_icd_server=true chip_openthread_ftd=false "
                 shift
                 ;;
diff --git a/src/platform/silabs/CHIPDevicePlatformConfig.h b/src/platform/silabs/CHIPDevicePlatformConfig.h
index 7ea977b..c51a923 100644
--- a/src/platform/silabs/CHIPDevicePlatformConfig.h
+++ b/src/platform/silabs/CHIPDevicePlatformConfig.h
@@ -138,18 +138,6 @@
 #define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE (6 * 1024)
 #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE
 
-#ifndef CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL
-#define CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL chip::System::Clock::Milliseconds32(SL_OT_IDLE_INTERVAL)
-#endif // CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL
-
-#ifndef CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL
-#define CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL chip::System::Clock::Milliseconds32(SL_OT_ACTIVE_INTERVAL)
-#endif // CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL
-
-#ifndef CHIP_DEVICE_CONFIG_SED_ACTIVE_THRESHOLD
-#define CHIP_DEVICE_CONFIG_SED_ACTIVE_THRESHOLD chip::System::Clock::Milliseconds32(SL_ACTIVE_MODE_THRESHOLD)
-#endif // CHIP_DEVICE_CONFIG_SED_ACTIVE_THRESHOLD
-
 #ifndef CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE
 #if defined(EFR32MG21)
 #define CHIP_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE (2 * 1024)
@@ -167,3 +155,15 @@
 #endif // CHIP_DEVICE_CONFIG_BLE_APP_TASK_NAME
 
 #define CHIP_DEVICE_CONFIG_MAX_EVENT_QUEUE_SIZE 25
+
+/*
+    ICD Configuration Defines
+*/
+
+#ifndef CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL
+#define CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL chip::System::Clock::Milliseconds32(SL_OT_IDLE_INTERVAL)
+#endif // CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL
+
+#ifndef CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL
+#define CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL chip::System::Clock::Milliseconds32(SL_OT_ACTIVE_INTERVAL)
+#endif // CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL
diff --git a/src/platform/silabs/CHIPPlatformConfig.h b/src/platform/silabs/CHIPPlatformConfig.h
index ec36bc8..710cb7c 100644
--- a/src/platform/silabs/CHIPPlatformConfig.h
+++ b/src/platform/silabs/CHIPPlatformConfig.h
@@ -84,6 +84,26 @@
 #define CHIP_CONFIG_MAX_FABRICS 5 // 4 fabrics + 1 for rotation slack
 #endif
 
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+
+#ifndef CHIP_CONFIG_ICD_IDLE_MODE_INTERVAL
+#define CHIP_CONFIG_ICD_IDLE_MODE_INTERVAL SL_IDLE_MODE_INTERVAL
+#endif // CHIP_CONFIG_ICD_IDLE_MODE_INTERVAL
+
+#ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_INTERVAL
+#define CHIP_CONFIG_ICD_ACTIVE_MODE_INTERVAL SL_ACTIVE_MODE_INTERVAL
+#endif // CHIP_CONFIG_ICD_ACTIVE_MODE_INTERVAL
+
+#ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD
+#define CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD SL_ACTIVE_MODE_THRESHOLD
+#endif // CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD
+
+#ifndef CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC
+#define CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC SL_ICD_SUPPORTED_CLIENTS_PER_FABRIC
+#endif // CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC
+
+#endif
+
 // ==================== FreeRTOS Configuration Overrides ====================
 #ifndef CHIP_CONFIG_FREERTOS_USE_STATIC_TASK
 #define CHIP_CONFIG_FREERTOS_USE_STATIC_TASK 1
diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni
index 579cc1d..9c64cd9 100644
--- a/third_party/silabs/efr32_sdk.gni
+++ b/third_party/silabs/efr32_sdk.gni
@@ -46,10 +46,16 @@
   # Enable Segger System View
   use_system_view = false
 
-  # ICD Configuration flags
-  sl_ot_idle_interval_ms = 30000  # 30s Idle Intervals
-  sl_ot_active_interval_ms = 200  # 500ms Active Intervals
-  sl_active_mode_threshold = 1000  # 1s Active mode threshold
+  # ICD Openthread Configuration flags
+  sl_ot_idle_interval_ms = 15000  # 15s Idle Intervals
+  sl_ot_active_interval_ms = 200  # 200ms Active Intervals
+
+  # ICD Matter Configuration flags
+  sl_idle_mode_interval_ms = 600000  # 10min Idle Mode Interval
+  sl_active_mode_interval_ms = 1000  # 1s Active Mode Interval
+  sl_active_mode_threshold_ms = 500  # 500ms Active Mode Threshold
+  sl_icd_supported_clients_per_fabric = 2  # 2 registration slots per fabric
+  sl_use_subscription_synching = false
 
   silabs_log_enabled = true
 
@@ -329,11 +335,21 @@
 
     if (chip_enable_icd_server) {
       defines += [
-        "SL_OT_IDLE_INTERVAL=${sl_ot_idle_interval_ms}",
-        "SL_OT_ACTIVE_INTERVAL=${sl_ot_active_interval_ms}",
-        "SL_ACTIVE_MODE_THRESHOLD=${sl_active_mode_threshold}",
+        "SL_ICD_ENABLED=1",
+        "SL_ACTIVE_MODE_THRESHOLD=${sl_active_mode_threshold_ms}",
+        "SL_ACTIVE_MODE_INTERVAL=${sl_active_mode_interval_ms}",
+        "SL_IDLE_MODE_INTERVAL=${sl_idle_mode_interval_ms}",
+        "SL_ICD_SUPPORTED_CLIENTS_PER_FABRIC=${sl_icd_supported_clients_per_fabric}",
       ]
 
+      if (defined(invoker.chip_enable_openthread) &&
+          invoker.chip_enable_openthread) {
+        defines += [
+          "SL_OT_IDLE_INTERVAL=${sl_ot_idle_interval_ms}",
+          "SL_OT_ACTIVE_INTERVAL=${sl_ot_active_interval_ms}",
+        ]
+      }
+
       if (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) {
         defines += [
           # Used for wifi devices to get packet details
@@ -374,9 +390,15 @@
         "${efr32_sdk_root}/hardware/driver/memlcd/inc/memlcd_usart",
       ]
     }
+
     if (invoker.enable_dic) {
       _include_dirs += [ "${chip_root}/third_party/silabs/mqtt/stack" ]
     }
+
+    if (sl_use_subscription_synching) {
+      defines += [ "CHIP_CONFIG_SYNCHRONOUS_REPORTS_ENABLED=1" ]
+    }
+
     if (silabs_family == "efr32mg12") {
       _include_dirs += [
         "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Include",