diff --git a/build_overrides/efr32_sdk.gni b/build_overrides/efr32_sdk.gni
index 4a7344b..fd5e7ce 100644
--- a/build_overrides/efr32_sdk.gni
+++ b/build_overrides/efr32_sdk.gni
@@ -14,5 +14,5 @@
 
 declare_args() {
   # Root directory for efr32 SDK build files.
-  efr32_sdk_build_root = "//third_party/silabs"
+  silabs_sdk_build_root = "//third_party/silabs"
 }
diff --git a/examples/air-quality-sensor-app/silabs/BUILD.gn b/examples/air-quality-sensor-app/silabs/BUILD.gn
index ed3077a..958918e 100644
--- a/examples/air-quality-sensor-app/silabs/BUILD.gn
+++ b/examples/air-quality-sensor-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/build_overrides/efr32_sdk.gni b/examples/build_overrides/efr32_sdk.gni
index d5a3544..ece2fd9 100644
--- a/examples/build_overrides/efr32_sdk.gni
+++ b/examples/build_overrides/efr32_sdk.gni
@@ -14,5 +14,5 @@
 
 declare_args() {
   # Root directory for erf32 SDK.
-  efr32_sdk_build_root = "//third_party/connectedhomeip/third_party/silabs"
+  silabs_sdk_build_root = "//third_party/connectedhomeip/third_party/silabs"
 }
diff --git a/examples/chef/silabs/BUILD.gn b/examples/chef/silabs/BUILD.gn
index f719245..34dba76 100644
--- a/examples/chef/silabs/BUILD.gn
+++ b/examples/chef/silabs/BUILD.gn
@@ -18,8 +18,8 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
diff --git a/examples/dishwasher-app/silabs/BUILD.gn b/examples/dishwasher-app/silabs/BUILD.gn
index d024a5d..c596a8a 100644
--- a/examples/dishwasher-app/silabs/BUILD.gn
+++ b/examples/dishwasher-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -39,7 +39,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/energy-management-app/silabs/BUILD.gn b/examples/energy-management-app/silabs/BUILD.gn
index 624cfff..d4a4887 100644
--- a/examples/energy-management-app/silabs/BUILD.gn
+++ b/examples/energy-management-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/light-switch-app/silabs/BUILD.gn b/examples/light-switch-app/silabs/BUILD.gn
index 2602842..cbe8a51 100644
--- a/examples/light-switch-app/silabs/BUILD.gn
+++ b/examples/light-switch-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/lighting-app/silabs/BUILD.gn b/examples/lighting-app/silabs/BUILD.gn
index 55d7d41..00aa6d9 100644
--- a/examples/lighting-app/silabs/BUILD.gn
+++ b/examples/lighting-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/lit-icd-app/silabs/BUILD.gn b/examples/lit-icd-app/silabs/BUILD.gn
index eb7fa7a..8dfa759 100644
--- a/examples/lit-icd-app/silabs/BUILD.gn
+++ b/examples/lit-icd-app/silabs/BUILD.gn
@@ -19,7 +19,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -39,7 +39,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/lock-app/silabs/BUILD.gn b/examples/lock-app/silabs/BUILD.gn
index a20a4ad..8164054 100644
--- a/examples/lock-app/silabs/BUILD.gn
+++ b/examples/lock-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/platform/silabs/FreeRTOSConfig.h b/examples/platform/silabs/FreeRTOSConfig.h
index 1c2db96..24a1408 100644
--- a/examples/platform/silabs/FreeRTOSConfig.h
+++ b/examples/platform/silabs/FreeRTOSConfig.h
@@ -103,8 +103,6 @@
 extern "C" {
 #endif
 
-#include <CHIPProjectConfig.h>
-
 #include <stdint.h>
 #include <stdio.h>
 
diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp
index 4440fcf..44c60ca 100644
--- a/examples/platform/silabs/MatterConfig.cpp
+++ b/examples/platform/silabs/MatterConfig.cpp
@@ -40,9 +40,9 @@
 #include "MemMonitoring.h"
 #endif
 
-#ifdef SLI_SI91X_MCU_INTERFACE
+#if defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1
 #include "wfx_rsi.h"
-#endif /* SLI_SI91X_MCU_INTERFACE */
+#endif // SLI_SI91X_MCU_INTERFACE
 
 #include <crypto/CHIPCryptoPAL.h>
 // If building with the EFR32-provided crypto backend, we can use the
@@ -121,7 +121,7 @@
 
 CHIP_ERROR SilabsMatterConfig::InitOpenThread(void)
 {
-    SILABS_LOG("Initializing OpenThread stack");
+    ChipLogProgress(DeviceLayer, "Initializing OpenThread stack");
     ReturnErrorOnFailure(ThreadStackMgr().InitThreadStack());
 
 #if CHIP_DEVICE_CONFIG_THREAD_FTD
@@ -138,7 +138,7 @@
 #endif // CHIP_CONFIG_ENABLE_ICD_SERVER
 #endif // CHIP_DEVICE_CONFIG_THREAD_FTD
 
-    SILABS_LOG("Starting OpenThread task");
+    ChipLogProgress(DeviceLayer, "Starting OpenThread task");
     return ThreadStackMgrImpl().StartThreadTask();
 }
 #endif // CHIP_ENABLE_OPENTHREAD
@@ -171,7 +171,7 @@
     SetDeviceAttestationCredentialsProvider(&Provision::Manager::GetInstance().GetStorage());
     chip::DeviceLayer::PlatformMgr().UnlockChipStack();
 
-    SILABS_LOG("Starting App Task");
+    ChipLogProgress(DeviceLayer, "Starting App Task");
     err = AppTask::GetAppTask().StartAppTask();
     if (err != CHIP_NO_ERROR)
         appError(err);
@@ -185,13 +185,13 @@
 {
     GetPlatform().Init();
     sMainTaskHandle = osThreadNew(ApplicationStart, nullptr, &kMainTaskAttr);
-    SILABS_LOG("Starting scheduler");
+    ChipLogProgress(DeviceLayer, "Starting scheduler");
     VerifyOrDie(sMainTaskHandle); // We can't proceed if the Main Task creation failed.
     GetPlatform().StartScheduler();
 
     // Should never get here.
     chip::Platform::MemoryShutdown();
-    SILABS_LOG("Start Scheduler Failed");
+    ChipLogProgress(DeviceLayer, "Start Scheduler Failed");
     appError(CHIP_ERROR_INTERNAL);
 }
 
@@ -204,9 +204,9 @@
     // initialization.
     mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree);
 #endif
-    SILABS_LOG("==================================================");
-    SILABS_LOG("%s starting", appName);
-    SILABS_LOG("==================================================");
+    ChipLogProgress(DeviceLayer, "==================================================");
+    ChipLogProgress(DeviceLayer, "%s starting", appName);
+    ChipLogProgress(DeviceLayer, "==================================================");
 
 #if PW_RPC_ENABLED
     chip::rpc::Init();
@@ -219,7 +219,7 @@
     //==============================================
     // Init Matter Stack
     //==============================================
-    SILABS_LOG("Init CHIP Stack");
+    ChipLogProgress(DeviceLayer, "Init CHIP Stack");
 
 #ifdef SL_WIFI
     // Init Chip memory management before the stack
@@ -309,16 +309,13 @@
     // Start wfx bus communication task.
     wfx_bus_start();
 #ifdef SL_WFX_USE_SECURE_LINK
-    wfx_securelink_task_start(); // start securelink key renegotiation task
-#endif                           // SL_WFX_USE_SECURE_LINK
-#endif                           /* WF200_WIFI */
+    // start securelink key renegotiation task
+    wfx_securelink_task_start();
+#endif // SL_WFX_USE_SECURE_LINK
+#endif // WF200_WIFI
 
-#ifdef SLI_SI91X_MCU_INTERFACE
-    sl_status_t status;
-    if ((status = wfx_wifi_rsi_init()) != SL_STATUS_OK)
-    {
-        ReturnErrorOnFailure((CHIP_ERROR) status);
-    }
+#if defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1
+    VerifyOrReturnError(sl_matter_wifi_platform_init() == SL_STATUS_OK, CHIP_ERROR_INTERNAL);
 #endif // SLI_SI91X_MCU_INTERFACE
 
     return CHIP_NO_ERROR;
diff --git a/examples/platform/silabs/MatterConfig.h b/examples/platform/silabs/MatterConfig.h
index b6abcc1..0f951c3 100644
--- a/examples/platform/silabs/MatterConfig.h
+++ b/examples/platform/silabs/MatterConfig.h
@@ -16,6 +16,7 @@
  *    See the License for the specific language governing permissions and
  *    limitations under the License.
  */
+#pragma once
 
 #include <lib/support/CHIPMem.h>
 #include <lib/support/CHIPPlatformMemory.h>
diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn
index 6756cc2..2abc3bc 100644
--- a/examples/platform/silabs/SiWx917/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/BUILD.gn
@@ -19,7 +19,7 @@
 import("${chip_root}/src/platform/device.gni")
 import("${chip_root}/src/platform/silabs/wifi_args.gni")
 import("${chip_root}/third_party/silabs/silabs_board.gni")
-import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
+import("${silabs_sdk_build_root}/SiWx917_sdk.gni")
 
 declare_args() {
   enable_heap_monitoring = false
@@ -167,18 +167,17 @@
 source_set("siwx917-common") {
   deps = [ "${silabs_common_plat_dir}/provision:storage" ]
   defines = []
-  public_deps = []
+  public_deps = [ "${lwip_root}:lwip" ]
   public_configs = [
     ":siwx917-common-config",
-    "${efr32_sdk_build_root}:silabs_config",
+    "${silabs_sdk_build_root}:silabs_config",
     ":chip_examples_project_config",
   ]
 
   include_dirs = [
-    ".",
-    "SiWx917/",
     "${silabs_plat_dir}/wifi",
     "${silabs_plat_si91x_wifi_dir}",
+    "${silabs_common_plat_dir}",
   ]
 
   #TO-DO Cleanup to be done for all the wifi files into common folder
@@ -191,10 +190,10 @@
     "${silabs_common_plat_dir}/syscalls_stubs.cpp",
     "${silabs_common_plat_dir}/wifi/wfx_notify.cpp",
     "${silabs_common_plat_dir}/wifi/wfx_rsi_host.cpp",
-    "${silabs_plat_dir}/wifi/dhcp_client.cpp",
-    "${silabs_plat_si91x_wifi_dir}/ethernetif.cpp",
-    "${silabs_plat_si91x_wifi_dir}/lwip_netif.cpp",
-    "SiWx917/sl_wifi_if.cpp",
+    "SiWxWifiInterface.cpp",
+
+    # Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed
+    "${sdk_support_root}/components/service/network_manager/src/sl_net_for_lwip.c",
   ]
 
   if (chip_enable_pw_rpc || chip_build_libshell || sl_uart_log_output) {
diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
deleted file mode 100644
index d357228..0000000
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp
+++ /dev/null
@@ -1,947 +0,0 @@
-/*
- *
- *    Copyright (c) 2023 Project CHIP Authors
- *
- *    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.
- */
-
-/*
- * This file implements the interface to the wifi sdk
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if (SL_MATTER_GN_BUILD == 0)
-#include "sl_matter_wifi_config.h"
-#endif // SL_MATTER_GN_BUILD
-
-#include "FreeRTOS.h"
-#include "ble_config.h"
-#include "dhcp_client.h"
-#include "event_groups.h"
-#include "sl_board_configuration.h"
-#include "sl_status.h"
-#include "task.h"
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include <app/icd/server/ICDServerConfig.h>
-#include <inet/IPAddress.h>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/CHIPMemString.h>
-#include <lib/support/CodeUtils.h>
-#include <lib/support/logging/CHIPLogging.h>
-
-extern "C" {
-#include "sl_net.h"
-#include "sl_si91x_driver.h"
-#include "sl_si91x_host_interface.h"
-#include "sl_si91x_types.h"
-#include "sl_wifi.h"
-#include "sl_wifi_callback_framework.h"
-#include "sl_wifi_constants.h"
-#include "sl_wifi_types.h"
-#include "sl_wlan_config.h"
-#include "wfx_host_events.h"
-#if SL_MBEDTLS_USE_TINYCRYPT
-#include "sl_si91x_constants.h"
-#include "sl_si91x_trng.h"
-#endif // SL_MBEDTLS_USE_TINYCRYPT
-}
-
-#if (EXP_BOARD)
-#include "rsi_bt_common_apis.h"
-#endif
-
-#if CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
-#include "rsi_rom_power_save.h"
-#include "sl_si91x_button_pin_config.h"
-#include "sl_si91x_power_manager.h"
-
-namespace {
-// TODO: should be removed once we are getting the press interrupt for button 0 with sleep
-#define BUTTON_PRESSED 1
-bool btn0_pressed = false;
-
-#ifdef ENABLE_CHIP_SHELL
-bool ps_requirement_added = false;
-#endif // ENABLE_CHIP_SHELL
-} // namespace
-#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
-
-#define ADV_SCAN_THRESHOLD -40
-#define ADV_RSSI_TOLERANCE_THRESHOLD 5
-#define ADV_ACTIVE_SCAN_DURATION 15
-#define ADV_PASSIVE_SCAN_DURATION 20
-#define ADV_MULTIPROBE 1
-#define ADV_SCAN_PERIODICITY 10
-
-// TODO: Confirm that this value works for size and timing
-#define WFX_QUEUE_SIZE 10
-
-// TODO: Figure out why we actually need this, we are already handling failure and retries somewhere else.
-#define WIFI_SCAN_TIMEOUT_TICK 10000
-
-WfxRsi_t wfx_rsi;
-
-bool hasNotifiedIPV6 = false;
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-bool hasNotifiedIPV4 = false;
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-bool hasNotifiedWifiConnectivity = false;
-
-volatile bool scan_results_complete    = false;
-volatile bool bg_scan_results_complete = false;
-extern osSemaphoreId_t sl_rs_ble_init_sem;
-static wfx_wifi_scan_ext_t temp_reset;
-volatile sl_status_t callback_status = SL_STATUS_OK;
-// Scan semaphore
-static osSemaphoreId_t sScanSemaphore;
-// DHCP Poll timer
-static osTimerId_t sDHCPTimer;
-static osMessageQueueId_t sWifiEventQueue = NULL;
-
-static void DHCPTimerEventHandler(void * arg)
-{
-    WfxEvent_t event;
-    event.eventType = WFX_EVT_DHCP_POLL;
-    WfxPostEvent(&event);
-}
-
-static void CancelDHCPTimer(void)
-{
-    osStatus_t status;
-
-    // Check if timer started
-    if (!osTimerIsRunning(sDHCPTimer))
-    {
-        ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running");
-        return;
-    }
-
-    status = osTimerStop(sDHCPTimer);
-    if (status != osOK)
-    {
-        ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer: %d", status);
-    }
-}
-
-static void StartDHCPTimer(uint32_t timeout)
-{
-    osStatus_t status;
-
-    // Cancel timer if already started
-    CancelDHCPTimer();
-
-    status = osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout));
-    if (status != osOK)
-    {
-        ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer: %d", status);
-    }
-}
-
-/******************************************************************
- * @fn   int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t *ap)
- * @brief
- *       Getting the AP details
- * @param[in] ap: access point
- * @return
- *        status
- *********************************************************************/
-int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap)
-{
-    sl_status_t status = SL_STATUS_OK;
-    int32_t rssi       = 0;
-    ap->ssid_length    = wfx_rsi.sec.ssid_length;
-    ap->security       = wfx_rsi.sec.security;
-    ap->chan           = wfx_rsi.ap_chan;
-    chip::Platform::CopyString(ap->ssid, ap->ssid_length, wfx_rsi.sec.ssid);
-    memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
-    sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &rssi);
-    ap->rssi = rssi;
-    return status;
-}
-
-/******************************************************************
- * @fn   int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t *extra_info)
- * @brief
- *       Getting the AP extra details
- * @param[in] extra info: access point extra information
- * @return
- *        status
- *********************************************************************/
-int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
-{
-    sl_status_t status        = SL_STATUS_OK;
-    sl_wifi_statistics_t test = { 0 };
-    status                    = sl_wifi_get_statistics(SL_WIFI_CLIENT_INTERFACE, &test);
-    VERIFY_STATUS_AND_RETURN(status);
-    extra_info->beacon_lost_count = test.beacon_lost_count - temp_reset.beacon_lost_count;
-    extra_info->beacon_rx_count   = test.beacon_rx_count - temp_reset.beacon_rx_count;
-    extra_info->mcast_rx_count    = test.mcast_rx_count - temp_reset.mcast_rx_count;
-    extra_info->mcast_tx_count    = test.mcast_tx_count - temp_reset.mcast_tx_count;
-    extra_info->ucast_rx_count    = test.ucast_rx_count - temp_reset.ucast_rx_count;
-    extra_info->ucast_tx_count    = test.ucast_tx_count - temp_reset.ucast_tx_count;
-    extra_info->overrun_count     = test.overrun_count - temp_reset.overrun_count;
-    return status;
-}
-
-/******************************************************************
- * @fn   int32_t wfx_rsi_reset_count(void)
- * @brief
- *       Getting the driver reset count
- * @param[in] None
- * @return
- *        status
- *********************************************************************/
-int32_t wfx_rsi_reset_count(void)
-{
-    sl_wifi_statistics_t test = { 0 };
-    sl_status_t status        = SL_STATUS_OK;
-    status                    = sl_wifi_get_statistics(SL_WIFI_CLIENT_INTERFACE, &test);
-    VERIFY_STATUS_AND_RETURN(status);
-    temp_reset.beacon_lost_count = test.beacon_lost_count;
-    temp_reset.beacon_rx_count   = test.beacon_rx_count;
-    temp_reset.mcast_rx_count    = test.mcast_rx_count;
-    temp_reset.mcast_tx_count    = test.mcast_tx_count;
-    temp_reset.ucast_rx_count    = test.ucast_rx_count;
-    temp_reset.ucast_tx_count    = test.ucast_tx_count;
-    temp_reset.overrun_count     = test.overrun_count;
-    return status;
-}
-
-/******************************************************************
- * @fn   wfx_rsi_disconnect(void)
- * @brief
- *       Getting the driver disconnect status
- * @param[in] None
- * @return
- *        status
- *********************************************************************/
-int32_t wfx_rsi_disconnect(void)
-{
-    return sl_wifi_disconnect(SL_WIFI_CLIENT_INTERFACE);
-}
-
-sl_status_t join_callback_handler(sl_wifi_event_t event, char * result, uint32_t result_length, void * arg)
-{
-    WfxEvent_t WfxEvent;
-
-    wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING);
-    if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
-    {
-        callback_status = *(sl_status_t *) result;
-        ChipLogError(DeviceLayer, "join_callback_handler: failed: 0x%lx", static_cast<uint32_t>(callback_status));
-        wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTED);
-        wfx_retry_connection(++wfx_rsi.join_retries);
-        return SL_STATUS_FAIL;
-    }
-    /*
-     * Join was complete - Do the DHCP
-     */
-    ChipLogDetail(DeviceLayer, "join_callback_handler: success");
-    memset(&temp_reset, 0, sizeof(temp_reset));
-    wfx_rsi.join_retries = 0;
-    callback_status      = SL_STATUS_OK;
-    WfxEvent.eventType   = WFX_EVT_STA_CONN;
-    WfxPostEvent(&WfxEvent);
-    return SL_STATUS_OK;
-}
-
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
-#if SLI_SI91X_MCU_INTERFACE
-// Required to invoke button press event during sleep as falling edge is not detected
-void sl_si91x_invoke_btn_press_event(void)
-{
-    // TODO: should be removed once we are getting the press interrupt for button 0 with sleep
-    if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed)
-    {
-        sl_button_on_change(SL_BUTTON_BTN0_NUMBER, BUTTON_PRESSED);
-        btn0_pressed = true;
-    }
-    if (RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN))
-    {
-        btn0_pressed = false;
-    }
-
-#ifdef ENABLE_CHIP_SHELL
-    // Checking the UULP PIN 1 status to reinit the UART and not allow the device to go to sleep
-    if (RSI_NPSSGPIO_GetPin(RTE_UULP_GPIO_1_PIN))
-    {
-        if (!ps_requirement_added)
-        {
-            sl_si91x_power_manager_add_ps_requirement(SL_SI91X_POWER_MANAGER_PS4);
-            ps_requirement_added = true;
-        }
-    }
-    else
-    {
-        if (ps_requirement_added)
-        {
-            sl_si91x_power_manager_remove_ps_requirement(SL_SI91X_POWER_MANAGER_PS4);
-            ps_requirement_added = false;
-        }
-    }
-#endif // ENABLE_CHIP_SHELL
-}
-#endif // SLI_SI91X_MCU_INTERFACE
-
-/******************************************************************
- * @fn   wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state)
- * @brief
- *       Setting the RS911x in DTIM sleep based mode
- *
- * @param[in] sl_si91x_ble_state : State to set for the BLE
- * @param[in] sl_si91x_wifi_state : State to set for the WiFi
- * @return
- *        None
- *********************************************************************/
-int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state)
-{
-    int32_t status;
-
-    status = rsi_bt_power_save_profile(sl_si91x_ble_state, 0);
-    if (status != RSI_SUCCESS)
-    {
-        ChipLogError(DeviceLayer, "rsi_bt_power_save_profile failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-    sl_wifi_performance_profile_t wifi_profile = { .profile = sl_si91x_wifi_state };
-    status                                     = sl_wifi_set_performance_profile(&wifi_profile);
-    if (status != RSI_SUCCESS)
-    {
-        ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-
-    return status;
-}
-#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
-
-/*************************************************************************************
- * @fn  static int32_t wfx_wifi_rsi_init(void)
- * @brief
- *      Wifi initialization called from app main
- * @param[in]  None
- * @return
- *        None
- *****************************************************************************************/
-int32_t wfx_wifi_rsi_init(void)
-{
-    ChipLogDetail(DeviceLayer, "wfx_wifi_rsi_init: started");
-    sl_status_t status;
-    status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler);
-    VerifyOrReturnError(status == SL_STATUS_OK, status);
-
-    // Create Sempaphore for scan
-    sScanSemaphore = osSemaphoreNew(1, 0, NULL);
-    VerifyOrReturnError(sScanSemaphore != NULL, SL_STATUS_ALLOCATION_FAILED);
-
-    // Create the message queue
-    sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL);
-    VerifyOrReturnError(sWifiEventQueue != NULL, SL_STATUS_ALLOCATION_FAILED);
-
-    // Create timer for DHCP polling
-    // TODO: Use LWIP timer instead of creating a new one here
-    sDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, NULL, NULL);
-    VerifyOrReturnError(sDHCPTimer != NULL, SL_STATUS_ALLOCATION_FAILED);
-
-    return status;
-}
-
-/*************************************************************************************
- * @fn  static void sl_print_firmware_version(sl_wifi_firmware_version_t*)
- * @brief
- *      To print the firmware version
- * @param[in]  sl_wifi_firmware_version_t*
- * @return
- *        None
- *****************************************************************************************/
-static void sl_print_firmware_version(sl_wifi_firmware_version_t * firmware_version)
-{
-    ChipLogDetail(DeviceLayer, "Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", firmware_version->chip_id, firmware_version->rom_id,
-                  firmware_version->major, firmware_version->minor, firmware_version->security_version, firmware_version->patch_num,
-                  firmware_version->customer_id, firmware_version->build_num);
-}
-
-/*************************************************************************************
- * @fn  static int32_t wfx_rsi_init(void)
- * @brief
- *      driver initialization
- * @param[in]  None
- * @return
- *        None
- *****************************************************************************************/
-static sl_status_t wfx_rsi_init(void)
-{
-    sl_status_t status;
-
-#ifndef SLI_SI91X_MCU_INTERFACE
-    status = wfx_wifi_rsi_init();
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogError(DeviceLayer, "wfx_rsi_init failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-#else // For SoC
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
-    uint8_t xtal_enable = 1;
-    status              = sl_si91x_m4_ta_secure_handshake(SL_SI91X_ENABLE_XTAL, 1, &xtal_enable, 0, NULL);
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogError(DeviceLayer, "sl_si91x_m4_ta_secure_handshake failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-#ifdef ENABLE_CHIP_SHELL
-    // While using the matter shell with the ICD server, the GPIO 1 is used to check the UULP PIN 1 status
-    // since UART doesn't act as a wakeup source in the UULP mode
-    /*Configuring the NPS GPIO 1*/
-    RSI_NPSSGPIO_SetPinMux(RTE_UULP_GPIO_1_PIN, 0);
-    /*Configure the NPSS GPIO direction to input */
-    RSI_NPSSGPIO_SetDir(RTE_UULP_GPIO_1_PIN, 1);
-    /*Enable the REN*/
-    RSI_NPSSGPIO_InputBufferEn(RTE_UULP_GPIO_1_PIN, 1);
-#endif // ENABLE_CHIP_SHELL
-#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
-#endif /* SLI_SI91X_MCU_INTERFACE */
-
-    sl_wifi_firmware_version_t version = { 0 };
-    status                             = sl_wifi_get_firmware_version(&version);
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogError(DeviceLayer, "sl_wifi_get_firmware_version failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-    sl_print_firmware_version(&version);
-
-    status = sl_wifi_get_mac_address(SL_WIFI_CLIENT_INTERFACE, (sl_mac_address_t *) &wfx_rsi.sta_mac.octet[0]);
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogDetail(DeviceLayer, "sl_wifi_get_mac_address failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-
-#ifdef SL_MBEDTLS_USE_TINYCRYPT
-    const uint32_t trngKey[TRNG_KEY_SIZE] = { 0x16157E2B, 0xA6D2AE28, 0x8815F7AB, 0x3C4FCF09 };
-
-    // To check the Entropy of TRNG and verify TRNG functioning.
-    status = sl_si91x_trng_entropy();
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogError(DeviceLayer, "sl_si91x_trng_entropy failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-
-    // Initiate and program the key required for TRNG hardware engine
-    status = sl_si91x_trng_program_key((uint32_t *) trngKey, TRNG_KEY_SIZE);
-    if (status != SL_STATUS_OK)
-    {
-        ChipLogError(DeviceLayer, "sl_si91x_trng_program_key failed: 0x%lx", static_cast<uint32_t>(status));
-        return status;
-    }
-#endif // SL_MBEDTLS_USE_TINYCRYPT
-
-    wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY;
-    osSemaphoreRelease(sl_rs_ble_init_sem);
-    return status;
-}
-
-/*************************************************************************************
- * @fn  void wfx_show_err(char *msg)
- * @brief
- *      driver shows error message
- * @param[in]  msg
- * @return
- *        None
- *****************************************************************************************/
-void wfx_show_err(char * msg)
-{
-    ChipLogError(DeviceLayer, "wfx_show_err: message: %s", msg);
-}
-
-sl_status_t scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * scan_result, uint32_t result_length, void * arg)
-{
-    if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
-    {
-        callback_status = *(sl_status_t *) scan_result;
-        ChipLogError(DeviceLayer, "scan_callback_handler: failed: 0x%lx", static_cast<uint32_t>(callback_status));
-        scan_results_complete = true;
-#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
-        wfx_rsi.sec.security = WFX_SEC_WPA3;
-#else
-        wfx_rsi.sec.security = WFX_SEC_WPA2;
-#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
-
-        osSemaphoreRelease(sScanSemaphore);
-        return SL_STATUS_FAIL;
-    }
-    wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
-    wfx_rsi.ap_chan      = scan_result->scan_info[0].rf_channel;
-    memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_LEN);
-    switch (scan_result->scan_info[0].security_mode)
-    {
-    case SL_WIFI_OPEN:
-        wfx_rsi.sec.security = WFX_SEC_NONE;
-        break;
-    case SL_WIFI_WPA:
-    case SL_WIFI_WPA_ENTERPRISE:
-        wfx_rsi.sec.security = WFX_SEC_WPA;
-        break;
-    case SL_WIFI_WPA_WPA2_MIXED:
-    case SL_WIFI_WPA2:
-    case SL_WIFI_WPA2_ENTERPRISE:
-        wfx_rsi.sec.security = WFX_SEC_WPA2;
-        break;
-    case SL_WIFI_WEP:
-        wfx_rsi.sec.security = WFX_SEC_WEP;
-        break;
-    case SL_WIFI_WPA3_TRANSITION:
-#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
-    case SL_WIFI_WPA3:
-        wfx_rsi.sec.security = WFX_SEC_WPA3;
-#else
-        wfx_rsi.sec.security = WFX_SEC_WPA2;
-#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
-        break;
-    default:
-        wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED;
-        break;
-    }
-    wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED;
-    scan_results_complete = true;
-
-    osSemaphoreRelease(sScanSemaphore);
-    return SL_STATUS_OK;
-}
-
-sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result)
-{
-    SL_WIFI_ARGS_CHECK_NULL_POINTER(scan_result);
-    VerifyOrReturnError(wfx_rsi.scan_cb != NULL, SL_STATUS_INVALID_HANDLE);
-
-    wfx_wifi_scan_result_t cur_scan_result;
-    for (int idx = 0; idx < (int) scan_result->scan_count; idx++)
-    {
-        memset(&cur_scan_result, 0, sizeof(cur_scan_result));
-
-        cur_scan_result.ssid_length = strnlen((char *) scan_result->scan_info[idx].ssid,
-                                              std::min<size_t>(sizeof(scan_result->scan_info[idx].ssid), WFX_MAX_SSID_LENGTH));
-        chip::Platform::CopyString(cur_scan_result.ssid, cur_scan_result.ssid_length, (char *) scan_result->scan_info[idx].ssid);
-
-        // if user has provided ssid, then check if the current scan result ssid matches the user provided ssid
-        if (wfx_rsi.scan_ssid != NULL &&
-            (strncmp(wfx_rsi.scan_ssid, cur_scan_result.ssid, std::min(strlen(wfx_rsi.scan_ssid), strlen(cur_scan_result.ssid))) ==
-             CMP_SUCCESS))
-        {
-            continue;
-        }
-        cur_scan_result.security = static_cast<wfx_sec_t>(scan_result->scan_info[idx].security_mode);
-        cur_scan_result.rssi     = (-1) * scan_result->scan_info[idx].rssi_val;
-        memcpy(cur_scan_result.bssid, scan_result->scan_info[idx].bssid, BSSID_LEN);
-        wfx_rsi.scan_cb(&cur_scan_result);
-
-        // if user has not provided the ssid, then call the callback for each scan result
-        if (wfx_rsi.scan_ssid == NULL)
-        {
-            continue;
-        }
-        break;
-    }
-
-    // cleanup and return
-    wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED;
-    wfx_rsi.scan_cb((wfx_wifi_scan_result_t *) 0);
-    wfx_rsi.scan_cb = nullptr;
-    if (wfx_rsi.scan_ssid)
-    {
-        chip::Platform::MemoryFree(wfx_rsi.scan_ssid);
-        wfx_rsi.scan_ssid = NULL;
-    }
-    return SL_STATUS_OK;
-}
-
-sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * result, uint32_t result_length, void * arg)
-{
-    callback_status          = show_scan_results(result);
-    bg_scan_results_complete = true;
-    osSemaphoreRelease(sScanSemaphore);
-    return SL_STATUS_OK;
-}
-/***************************************************************************************
- * @fn   static void wfx_rsi_save_ap_info(void)
- * @brief
- *       Saving the details of the AP
- * @param[in]  None
- * @return
- *       None
- *******************************************************************************************/
-static void wfx_rsi_save_ap_info(void) // translation
-{
-    sl_status_t status = SL_STATUS_OK;
-#ifndef EXP_BOARD
-    // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
-    sl_wifi_scan_configuration_t wifi_scan_configuration = default_wifi_scan_configuration;
-#endif
-    sl_wifi_ssid_t ssid_arg;
-    memset(&ssid_arg, 0, sizeof(ssid_arg));
-    ssid_arg.length = wfx_rsi.sec.ssid_length;
-    chip::Platform::CopyString((char *) &ssid_arg.value[0], ssid_arg.length, wfx_rsi.sec.ssid);
-    sl_wifi_set_scan_callback(scan_callback_handler, NULL);
-    scan_results_complete = false;
-#ifndef EXP_BOARD
-    // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
-    status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, &ssid_arg, &wifi_scan_configuration);
-#endif
-    if (SL_STATUS_IN_PROGRESS == status)
-    {
-        osSemaphoreAcquire(sScanSemaphore, WIFI_SCAN_TIMEOUT_TICK);
-    }
-}
-
-/********************************************************************************************
- * @fn   static void wfx_rsi_do_join(void)
- * @brief
- *        Start an async Join command
- * @return
- *        None
- **********************************************************************************************/
-static sl_status_t wfx_rsi_do_join(void)
-{
-    VerifyOrReturnError(!(wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED)), SL_STATUS_IN_PROGRESS);
-    sl_status_t status = SL_STATUS_OK;
-    sl_wifi_client_configuration_t ap;
-    memset(&ap, 0, sizeof(ap));
-
-    switch (wfx_rsi.sec.security)
-    {
-    case WFX_SEC_WEP:
-        ap.security = SL_WIFI_WEP;
-        break;
-    case WFX_SEC_WPA:
-        ap.security = SL_WIFI_WPA_WPA2_MIXED;
-        break;
-    case WFX_SEC_WPA2:
-#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
-        ap.security = SL_WIFI_WPA3_TRANSITION;
-        break;
-    case WFX_SEC_WPA3:
-        ap.security = SL_WIFI_WPA3_TRANSITION;
-#else
-        ap.security          = SL_WIFI_WPA_WPA2_MIXED;
-#endif // WIFI_ENABLE_SECURITY_WPA3_TRANSITION
-        break;
-    case WFX_SEC_NONE:
-        ap.security = SL_WIFI_OPEN;
-        break;
-    default:
-        ChipLogError(DeviceLayer, "wfx_rsi_do_join: unknown security type.");
-        return status;
-    }
-    /*
-     * Join the network
-     */
-    wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
-    status = sl_wifi_set_join_callback(join_callback_handler, NULL);
-    VerifyOrReturnError(status == SL_STATUS_OK, status);
-
-#if CHIP_CONFIG_ENABLE_ICD_SERVER
-    // Setting the listen interval to 0 which will set it to DTIM interval
-    sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
-    status                                   = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
-    VerifyOrReturnError(status == SL_STATUS_OK, status);
-
-    sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
-    status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
-    VerifyOrReturnError(status == SL_STATUS_OK, status);
-#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
-    sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID;
-    status                    = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], wfx_rsi.sec.passkey_length);
-    VerifyOrReturnError(status == SL_STATUS_OK, status);
-
-    uint32_t timeout_ms = 0;
-    ap.ssid.length      = wfx_rsi.sec.ssid_length;
-    ap.encryption       = SL_WIFI_NO_ENCRYPTION;
-    ap.credential_id    = id;
-    memcpy((char *) &ap.ssid.value[0], wfx_rsi.sec.ssid, wfx_rsi.sec.ssid_length);
-    ChipLogDetail(DeviceLayer, "wfx_rsi_do_join: SSID: %s, SECURITY: %d(%d)", ap.ssid.value, ap.security, wfx_rsi.sec.security);
-
-    status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms);
-    // sl_wifi_connect returns SL_STATUS_IN_PROGRESS if join is in progress
-    // after the initial scan is done, the scan does not check for SSID
-    VerifyOrReturnError(status != SL_STATUS_OK && status != SL_STATUS_IN_PROGRESS, status);
-
-    // failure only happens when the firmware returns an error
-    ChipLogError(DeviceLayer, "wfx_rsi_do_join: sl_wifi_connect failed: 0x%lx", static_cast<uint32_t>(status));
-    VerifyOrReturnError((wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT), status);
-
-    wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
-    ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: retry attempt %d", wfx_rsi.join_retries);
-    wfx_retry_connection(++wfx_rsi.join_retries);
-
-    WfxEvent_t event;
-    event.eventType = WFX_EVT_STA_START_JOIN;
-    WfxPostEvent(&event);
-
-    return status;
-}
-
-/// NotifyConnectivity
-/// @brief Notify the application about the connectivity status if it has not been notified yet.
-///        Helper function for HandleDHCPPolling.
-void NotifyConnectivity(void)
-{
-    VerifyOrReturn(!hasNotifiedWifiConnectivity);
-    wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac);
-    hasNotifiedWifiConnectivity = true;
-}
-
-void HandleDHCPPolling(void)
-{
-    struct netif * sta_netif;
-    WfxEvent_t event;
-
-    sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE);
-    if (sta_netif == NULL)
-    {
-        // TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state
-        ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif");
-        return;
-    }
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-    uint8_t dhcp_state = dhcpclient_poll(sta_netif);
-    if (dhcp_state == DHCP_ADDRESS_ASSIGNED && !hasNotifiedIPV4)
-    {
-        wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
-        hasNotifiedIPV4 = true;
-        event.eventType = WFX_EVT_STA_DHCP_DONE;
-        WfxPostEvent(&event);
-        NotifyConnectivity();
-    }
-    else if (dhcp_state == DHCP_OFF)
-    {
-        wfx_ip_changed_notify(IP_STATUS_FAIL);
-        hasNotifiedIPV4 = false;
-    }
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-    /* Checks if the assigned IPv6 address is preferred by evaluating
-     * the first block of IPv6 address ( block 0)
-     */
-    if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
-    {
-        char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
-        VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != NULL);
-        ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
-        wfx_ipv6_notify(GET_IPV6_SUCCESS);
-        hasNotifiedIPV6 = true;
-        event.eventType = WFX_EVT_STA_DHCP_DONE;
-        WfxPostEvent(&event);
-        NotifyConnectivity();
-    }
-}
-
-void WfxPostEvent(WfxEvent_t * event)
-{
-    sl_status_t status = osMessageQueuePut(sWifiEventQueue, event, 0, 0);
-
-    if (status != osOK)
-    {
-        ChipLogError(DeviceLayer, "WfxPostEvent: failed to post event: 0x%lx", static_cast<uint32_t>(status));
-        // TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc.
-    }
-}
-
-/// ResetDHCPNotificationFlags
-/// @brief Reset the flags that are used to notify the application about DHCP connectivity
-///        and emits a WFX_EVT_STA_DO_DHCP event to trigger DHCP polling checks. Helper function for ProcessEvent.
-void ResetDHCPNotificationFlags(void)
-{
-    WfxEvent_t outEvent;
-
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-    hasNotifiedIPV4 = false;
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
-    hasNotifiedIPV6             = false;
-    hasNotifiedWifiConnectivity = false;
-
-    outEvent.eventType = WFX_EVT_STA_DO_DHCP;
-    WfxPostEvent(&outEvent);
-}
-
-void ProcessEvent(WfxEvent_t inEvent)
-{
-    // Process event
-    switch (inEvent.eventType)
-    {
-    case WFX_EVT_STA_CONN:
-        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_CONN");
-        wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED;
-        ResetDHCPNotificationFlags();
-        wfx_lwip_set_sta_link_up();
-        /* We need to get AP Mac - TODO */
-        // Uncomment once the hook into MATTER is moved to IP connectivty instead
-        // of AP connectivity.
-        // wfx_connected_notify(0, &wfx_rsi.ap_mac); // This
-        // is independant of IP connectivity.
-        break;
-    case WFX_EVT_STA_DISCONN:
-        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DISCONN");
-        // TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something
-        wfx_rsi.dev_state &=
-            ~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE);
-        /* TODO: Implement disconnect notify */
-        ResetDHCPNotificationFlags();
-        wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) ->
-                                      // wfx_ip_changed_notify(0) for IPV4
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
-        wfx_ip_changed_notify(IP_STATUS_FAIL);
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-        wfx_ipv6_notify(GET_IPV6_FAIL);
-        break;
-    case WFX_EVT_AP_START:
-        // TODO: Currently unimplemented
-        break;
-    case WFX_EVT_AP_STOP:
-        // TODO: Currently unimplemented
-        break;
-    case WFX_EVT_SCAN:
-#ifdef SL_WFX_CONFIG_SCAN
-        if (!(wfx_rsi.dev_state & WFX_RSI_ST_SCANSTARTED))
-        {
-            ChipLogDetail(DeviceLayer, "WFX_EVT_SCAN");
-            sl_wifi_scan_configuration_t wifi_scan_configuration;
-            memset(&wifi_scan_configuration, 0, sizeof(wifi_scan_configuration));
-
-            // TODO: Add scan logic
-            sl_wifi_advanced_scan_configuration_t advanced_scan_configuration = { 0 };
-            int32_t status;
-            advanced_scan_configuration.active_channel_time  = ADV_ACTIVE_SCAN_DURATION;
-            advanced_scan_configuration.passive_channel_time = ADV_PASSIVE_SCAN_DURATION;
-            advanced_scan_configuration.trigger_level        = ADV_SCAN_THRESHOLD;
-            advanced_scan_configuration.trigger_level_change = ADV_RSSI_TOLERANCE_THRESHOLD;
-            advanced_scan_configuration.enable_multi_probe   = ADV_MULTIPROBE;
-            status = sl_wifi_set_advanced_scan_configuration(&advanced_scan_configuration);
-            if (SL_STATUS_OK != status)
-            {
-                // TODO: Seems like Chipdie should be called here, the device should be initialized here
-                ChipLogError(DeviceLayer, "sl_wifi_set_advanced_scan_configuration failed: 0x%lx", static_cast<uint32_t>(status));
-                return;
-            }
-
-            if (wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED)
-            {
-                /* Terminate with end of scan which is no ap sent back */
-                wifi_scan_configuration.type                   = SL_WIFI_SCAN_TYPE_ADV_SCAN;
-                wifi_scan_configuration.periodic_scan_interval = ADV_SCAN_PERIODICITY;
-            }
-            else
-            {
-                wifi_scan_configuration = default_wifi_scan_configuration;
-            }
-            sl_wifi_set_scan_callback(bg_scan_callback_handler, NULL);
-            scan_results_complete = false;
-            wfx_rsi.dev_state |= WFX_RSI_ST_SCANSTARTED;
-            status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, NULL, &wifi_scan_configuration);
-            if (SL_STATUS_IN_PROGRESS == status)
-            {
-                osSemaphoreAcquire(sScanSemaphore, WIFI_SCAN_TIMEOUT_TICK);
-            }
-        }
-        break;
-#endif /* SL_WFX_CONFIG_SCAN */
-    case WFX_EVT_STA_START_JOIN:
-        // saving the AP related info
-        wfx_rsi_save_ap_info();
-        // Joining to the network
-        wfx_rsi_do_join();
-        break;
-    case WFX_EVT_STA_DO_DHCP:
-        StartDHCPTimer(WFX_RSI_DHCP_POLL_INTERVAL);
-        break;
-    case WFX_EVT_STA_DHCP_DONE:
-        CancelDHCPTimer();
-        break;
-    case WFX_EVT_DHCP_POLL:
-        HandleDHCPPolling();
-    default:
-        break;
-    }
-}
-
-/*********************************************************************************
- * @fn  void wfx_rsi_task(void *arg)
- * @brief
- * The main WLAN task - started by wfx_wifi_start() that interfaces with RSI.
- * The rest of RSI stuff come in call-backs.
- * The initialization has been already done.
- * @param[in] arg:
- * @return
- *       None
- **********************************************************************************/
-/* ARGSUSED */
-void wfx_rsi_task(void * arg)
-{
-    (void) arg;
-    sl_status_t status = wfx_rsi_init();
-
-    WfxEvent_t wfxEvent;
-    if (status != RSI_SUCCESS)
-    {
-        ChipLogError(DeviceLayer, "wfx_rsi_task: wfx_rsi_init failed: 0x%lx", static_cast<uint32_t>(status));
-        return;
-    }
-    wfx_lwip_start();
-    wfx_started_notify();
-
-    ChipLogDetail(DeviceLayer, "wfx_rsi_task: starting event loop");
-    for (;;)
-    {
-        status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever);
-        if (status == osOK)
-        {
-            ProcessEvent(wfxEvent);
-        }
-        else
-        {
-            ChipLogError(DeviceLayer, "wfx_rsi_task: get event failed: 0x%lx", static_cast<uint32_t>(status));
-        }
-    }
-}
-
-#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
-/********************************************************************************************
- * @fn   void wfx_dhcp_got_ipv4(uint32_t ip)
- * @brief
- *        Acquire the new ip address
- * @param[in] ip: internet protocol
- * @return
- *        None
- **********************************************************************************************/
-void wfx_dhcp_got_ipv4(uint32_t ip)
-{
-    /*
-     * Acquire the new IP address
-     */
-    wfx_rsi.ip4_addr[0] = (ip) &HEX_VALUE_FF;
-    wfx_rsi.ip4_addr[1] = (ip >> 8) & HEX_VALUE_FF;
-    wfx_rsi.ip4_addr[2] = (ip >> 16) & HEX_VALUE_FF;
-    wfx_rsi.ip4_addr[3] = (ip >> 24) & HEX_VALUE_FF;
-    ChipLogDetail(DeviceLayer, "DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
-                  wfx_rsi.ip4_addr[3]);
-    /* Notify the Connectivity Manager - via the app */
-    wfx_rsi.dev_state |= WFX_RSI_ST_STA_DHCP_DONE;
-    wfx_ip_changed_notify(IP_STATUS_SUCCESS);
-    wfx_rsi.dev_state |= WFX_RSI_ST_STA_READY;
-}
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wlan_config.h b/examples/platform/silabs/SiWx917/SiWx917/sl_wlan_config.h
deleted file mode 100644
index 21ee4a5..0000000
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wlan_config.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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.
- */
-
-#ifndef RSI_CONFIG_H
-#define RSI_CONFIG_H
-
-#include "ble_config.h"
-#if SLI_SI91X_MCU_INTERFACE
-#include "rsi_wisemcu_hardware_setup.h"
-#endif // SLI_SI91X_MCU_INTERFACE
-#include "sl_wifi_device.h"
-
-//! Enable feature
-#define RSI_ENABLE 1
-//! Disable feature
-#define RSI_DISABLE 0
-
-// Temmporary work-around for wifi-init failure in ACX modules with WiseConnect v3.3.3. This can be removed after integrating with
-// WiseConnect v3.4.0
-#if (SL_SI91X_ACX_MODULE == 1)
-#define REGION_CODE IGNORE_REGION
-#else
-#define REGION_CODE US
-#endif
-
-static const sl_wifi_device_configuration_t config = {
-    .boot_option = LOAD_NWP_FW,
-    .mac_address = NULL,
-    .band        = SL_SI91X_WIFI_BAND_2_4GHZ,
-    .region_code = REGION_CODE,
-    .boot_config = { .oper_mode = SL_SI91X_CLIENT_MODE,
-                     .coex_mode = SL_SI91X_WLAN_BLE_MODE,
-                     .feature_bit_map =
-#ifdef SLI_SI91X_MCU_INTERFACE
-                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_WPS_DISABLE),
-#else
-                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_AGGREGATION),
-#endif
-                     .tcp_ip_feature_bit_map = (SL_SI91X_TCP_IP_FEAT_DHCPV4_CLIENT | SL_SI91X_TCP_IP_FEAT_DNS_CLIENT |
-                                                SL_SI91X_TCP_IP_FEAT_SSL | SL_SI91X_TCP_IP_FEAT_BYPASS
-#ifdef ipv6_FEATURE_REQUIRED
-                                                | SL_SI91X_TCP_IP_FEAT_DHCPV6_CLIENT | SL_SI91X_TCP_IP_FEAT_IPV6
-#endif
-                                                | SL_SI91X_TCP_IP_FEAT_ICMP | SL_SI91X_TCP_IP_FEAT_EXTENSION_VALID),
-                     .custom_feature_bit_map     = (SL_SI91X_CUSTOM_FEAT_EXTENTION_VALID | RSI_CUSTOM_FEATURE_BIT_MAP),
-                     .ext_custom_feature_bit_map = (RSI_EXT_CUSTOM_FEATURE_BIT_MAP | (SL_SI91X_EXT_FEAT_BT_CUSTOM_FEAT_ENABLE)
-#if (defined A2DP_POWER_SAVE_ENABLE)
-                                                    | SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(2)
-#endif
-                                                        ),
-                     .bt_feature_bit_map = (RSI_BT_FEATURE_BITMAP
-#if (RSI_BT_GATT_ON_CLASSIC)
-                                            | SL_SI91X_BT_ATT_OVER_CLASSIC_ACL /* to support att over classic acl link */
-#endif
-                                            ),
-#ifdef RSI_PROCESS_MAX_RX_DATA
-                     .ext_tcp_ip_feature_bit_map =
-                         (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID | SL_SI91X_EXT_TCP_MAX_RECV_LENGTH),
-#else
-                     .ext_tcp_ip_feature_bit_map = (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID),
-#endif
-                     //! ENABLE_BLE_PROTOCOL in bt_feature_bit_map
-                     .ble_feature_bit_map =
-                         ((SL_SI91X_BLE_MAX_NBR_PERIPHERALS(RSI_BLE_MAX_NBR_PERIPHERALS) |
-                           SL_SI91X_BLE_MAX_NBR_CENTRALS(RSI_BLE_MAX_NBR_CENTRALS) |
-                           SL_SI91X_BLE_MAX_NBR_ATT_SERV(RSI_BLE_MAX_NBR_ATT_SERV) |
-                           SL_SI91X_BLE_MAX_NBR_ATT_REC(RSI_BLE_MAX_NBR_ATT_REC)) |
-                          SL_SI91X_FEAT_BLE_CUSTOM_FEAT_EXTENTION_VALID | SL_SI91X_BLE_PWR_INX(RSI_BLE_PWR_INX) |
-                          SL_SI91X_BLE_PWR_SAVE_OPTIONS(RSI_BLE_PWR_SAVE_OPTIONS) | SL_SI91X_916_BLE_COMPATIBLE_FEAT_ENABLE
-#if RSI_BLE_GATT_ASYNC_ENABLE
-                          | SL_SI91X_BLE_GATT_ASYNC_ENABLE
-#endif
-                          ),
-
-                     .ble_ext_feature_bit_map = ((SL_SI91X_BLE_NUM_CONN_EVENTS(RSI_BLE_NUM_CONN_EVENTS) |
-                                                  SL_SI91X_BLE_NUM_REC_BYTES(RSI_BLE_NUM_REC_BYTES))
-#if RSI_BLE_INDICATE_CONFIRMATION_FROM_HOST
-                                                 | SL_SI91X_BLE_INDICATE_CONFIRMATION_FROM_HOST // indication response from app
-#endif
-#if RSI_BLE_MTU_EXCHANGE_FROM_HOST
-                                                 | SL_SI91X_BLE_MTU_EXCHANGE_FROM_HOST // MTU Exchange request initiation from app
-#endif
-#if RSI_BLE_SET_SCAN_RESP_DATA_FROM_HOST
-                                                 | (SL_SI91X_BLE_SET_SCAN_RESP_DATA_FROM_HOST) // Set SCAN Resp Data from app
-#endif
-#if RSI_BLE_DISABLE_CODED_PHY_FROM_HOST
-                                                 | (SL_SI91X_BLE_DISABLE_CODED_PHY_FROM_HOST) // Disable Coded PHY from app
-#endif
-#if BLE_SIMPLE_GATT
-                                                 | SL_SI91X_BLE_GATT_INIT
-#endif
-                                                 ),
-                     .config_feature_bit_map = (SL_SI91X_FEAT_SLEEP_GPIO_SEL_BITMAP | RSI_CONFIG_FEATURE_BITMAP) }
-};
-
-#endif
diff --git a/examples/platform/silabs/SiWx917/SiWxWifiInterface.cpp b/examples/platform/silabs/SiWx917/SiWxWifiInterface.cpp
new file mode 100644
index 0000000..1e573ed
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWxWifiInterface.cpp
@@ -0,0 +1,926 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *
+ *    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.
+ */
+
+/*
+ * This file implements the interface to the wifi sdk
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if (SL_MATTER_GN_BUILD == 0)
+#include "sl_matter_wifi_config.h"
+#endif // SL_MATTER_GN_BUILD
+
+#include "FreeRTOS.h"
+#include "ble_config.h"
+#include "dhcp_client.h"
+#include "event_groups.h"
+#include "sl_board_configuration.h"
+#include "sl_status.h"
+#include "sl_wifi_device.h"
+#include "task.h"
+#include "wfx_host_events.h"
+#include "wfx_rsi.h"
+#include <app/icd/server/ICDServerConfig.h>
+#include <inet/IPAddress.h>
+#include <lib/support/CHIPMem.h>
+#include <lib/support/CHIPMemString.h>
+#include <lib/support/CodeUtils.h>
+#include <lib/support/logging/CHIPLogging.h>
+
+extern "C" {
+#include "sl_net.h"
+#include "sl_si91x_driver.h"
+#include "sl_si91x_host_interface.h"
+#include "sl_si91x_types.h"
+#include "sl_wifi.h"
+#include "sl_wifi_callback_framework.h"
+#include "sl_wifi_constants.h"
+#include "sl_wifi_types.h"
+#include "wfx_host_events.h"
+#if SL_MBEDTLS_USE_TINYCRYPT
+#include "sl_si91x_constants.h"
+#include "sl_si91x_trng.h"
+#endif // SL_MBEDTLS_USE_TINYCRYPT
+
+#include <sl_net.h>
+#include <sl_net_constants.h>
+#include <sl_net_for_lwip.h>
+#include <sl_net_wifi_types.h>
+}
+
+#if SLI_SI91X_MCU_INTERFACE
+#include "rsi_wisemcu_hardware_setup.h"
+#endif // SLI_SI91X_MCU_INTERFACE
+
+#if (EXP_BOARD)
+#include "rsi_bt_common_apis.h"
+#endif
+
+#if CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
+#include "rsi_rom_power_save.h"
+#include "sl_si91x_button_pin_config.h"
+#include "sl_si91x_power_manager.h"
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
+
+// Temmporary work-around for wifi-init failure in ACX modules with WiseConnect v3.3.3. This can be removed after integrating with
+// WiseConnect v3.4.0
+#if (SL_SI91X_ACX_MODULE == 1)
+#define REGION_CODE IGNORE_REGION
+#else
+#define REGION_CODE US
+#endif
+
+WfxRsi_t wfx_rsi;
+extern osSemaphoreId_t sl_rs_ble_init_sem;
+
+namespace {
+
+#if CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
+// TODO: should be removed once we are getting the press interrupt for button 0 with sleep
+bool btn0_pressed = false;
+#ifdef ENABLE_CHIP_SHELL
+bool ps_requirement_added = false;
+#endif // ENABLE_CHIP_SHELL
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SLI_SI91X_MCU_INTERFACE
+
+bool hasNotifiedWifiConnectivity = false;
+bool hasNotifiedIPV6             = false;
+#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
+bool hasNotifiedIPV4 = false;
+#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
+
+wfx_wifi_scan_ext_t temp_reset;
+
+osSemaphoreId_t sScanCompleteSemaphore;
+osSemaphoreId_t sScanInProgressSemaphore;
+osTimerId_t sDHCPTimer;
+osMessageQueueId_t sWifiEventQueue = nullptr;
+
+sl_net_wifi_lwip_context_t wifi_client_context;
+sl_wifi_security_t security = SL_WIFI_SECURITY_UNKNOWN;
+
+const sl_wifi_device_configuration_t config = {
+    .boot_option = LOAD_NWP_FW,
+    .mac_address = NULL,
+    .band        = SL_SI91X_WIFI_BAND_2_4GHZ,
+    .region_code = REGION_CODE,
+    .boot_config = { .oper_mode = SL_SI91X_CLIENT_MODE,
+                     .coex_mode = SL_SI91X_WLAN_BLE_MODE,
+                     .feature_bit_map =
+#ifdef SLI_SI91X_MCU_INTERFACE
+                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_WPS_DISABLE),
+#else
+                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_AGGREGATION),
+#endif
+                     .tcp_ip_feature_bit_map = (SL_SI91X_TCP_IP_FEAT_DHCPV4_CLIENT | SL_SI91X_TCP_IP_FEAT_DNS_CLIENT |
+                                                SL_SI91X_TCP_IP_FEAT_SSL | SL_SI91X_TCP_IP_FEAT_BYPASS
+#ifdef ipv6_FEATURE_REQUIRED
+                                                | SL_SI91X_TCP_IP_FEAT_DHCPV6_CLIENT | SL_SI91X_TCP_IP_FEAT_IPV6
+#endif
+                                                | SL_SI91X_TCP_IP_FEAT_ICMP | SL_SI91X_TCP_IP_FEAT_EXTENSION_VALID),
+                     .custom_feature_bit_map     = (SL_SI91X_CUSTOM_FEAT_EXTENTION_VALID | RSI_CUSTOM_FEATURE_BIT_MAP),
+                     .ext_custom_feature_bit_map = (RSI_EXT_CUSTOM_FEATURE_BIT_MAP | (SL_SI91X_EXT_FEAT_BT_CUSTOM_FEAT_ENABLE)
+#if (defined A2DP_POWER_SAVE_ENABLE)
+                                                    | SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(2)
+#endif
+                                                        ),
+                     .bt_feature_bit_map = (RSI_BT_FEATURE_BITMAP
+#if (RSI_BT_GATT_ON_CLASSIC)
+                                            | SL_SI91X_BT_ATT_OVER_CLASSIC_ACL /* to support att over classic acl link */
+#endif
+                                            ),
+#ifdef RSI_PROCESS_MAX_RX_DATA
+                     .ext_tcp_ip_feature_bit_map =
+                         (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID | SL_SI91X_EXT_TCP_MAX_RECV_LENGTH),
+#else
+                     .ext_tcp_ip_feature_bit_map = (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID),
+#endif
+                     //! ENABLE_BLE_PROTOCOL in bt_feature_bit_map
+                     .ble_feature_bit_map =
+                         ((SL_SI91X_BLE_MAX_NBR_PERIPHERALS(RSI_BLE_MAX_NBR_PERIPHERALS) |
+                           SL_SI91X_BLE_MAX_NBR_CENTRALS(RSI_BLE_MAX_NBR_CENTRALS) |
+                           SL_SI91X_BLE_MAX_NBR_ATT_SERV(RSI_BLE_MAX_NBR_ATT_SERV) |
+                           SL_SI91X_BLE_MAX_NBR_ATT_REC(RSI_BLE_MAX_NBR_ATT_REC)) |
+                          SL_SI91X_FEAT_BLE_CUSTOM_FEAT_EXTENTION_VALID | SL_SI91X_BLE_PWR_INX(RSI_BLE_PWR_INX) |
+                          SL_SI91X_BLE_PWR_SAVE_OPTIONS(RSI_BLE_PWR_SAVE_OPTIONS) | SL_SI91X_916_BLE_COMPATIBLE_FEAT_ENABLE
+#if RSI_BLE_GATT_ASYNC_ENABLE
+                          | SL_SI91X_BLE_GATT_ASYNC_ENABLE
+#endif
+                          ),
+
+                     .ble_ext_feature_bit_map = ((SL_SI91X_BLE_NUM_CONN_EVENTS(RSI_BLE_NUM_CONN_EVENTS) |
+                                                  SL_SI91X_BLE_NUM_REC_BYTES(RSI_BLE_NUM_REC_BYTES))
+#if RSI_BLE_INDICATE_CONFIRMATION_FROM_HOST
+                                                 | SL_SI91X_BLE_INDICATE_CONFIRMATION_FROM_HOST // indication response from app
+#endif
+#if RSI_BLE_MTU_EXCHANGE_FROM_HOST
+                                                 | SL_SI91X_BLE_MTU_EXCHANGE_FROM_HOST // MTU Exchange request initiation from app
+#endif
+#if RSI_BLE_SET_SCAN_RESP_DATA_FROM_HOST
+                                                 | (SL_SI91X_BLE_SET_SCAN_RESP_DATA_FROM_HOST) // Set SCAN Resp Data from app
+#endif
+#if RSI_BLE_DISABLE_CODED_PHY_FROM_HOST
+                                                 | (SL_SI91X_BLE_DISABLE_CODED_PHY_FROM_HOST) // Disable Coded PHY from app
+#endif
+#if BLE_SIMPLE_GATT
+                                                 | SL_SI91X_BLE_GATT_INIT
+#endif
+                                                 ),
+                     .config_feature_bit_map = (SL_SI91X_FEAT_SLEEP_GPIO_SEL_BITMAP | RSI_CONFIG_FEATURE_BITMAP) }
+};
+
+constexpr int8_t kAdvScanThreshold           = -40;
+constexpr uint8_t kAdvRssiToleranceThreshold = 5;
+constexpr uint8_t kAdvActiveScanDuration     = 15;
+constexpr uint8_t kAdvPassiveScanDuration    = 20;
+constexpr uint8_t kAdvMultiProbe             = 1;
+constexpr uint8_t kAdvScanPeriodicity        = 10;
+
+// TODO: Confirm that this value works for size and timing
+constexpr uint8_t kWfxQueueSize = 10;
+
+// TODO: Figure out why we actually need this, we are already handling failure and retries somewhere else.
+constexpr uint16_t kWifiScanTimeoutTicks = 10000;
+
+void DHCPTimerEventHandler(void * arg)
+{
+    WfxEvent_t event = { .eventType = WFX_EVT_DHCP_POLL };
+    sl_matter_wifi_post_event(&event);
+}
+
+void CancelDHCPTimer(void)
+{
+    VerifyOrReturn(osTimerIsRunning(sDHCPTimer), ChipLogDetail(DeviceLayer, "CancelDHCPTimer: timer not running"));
+    VerifyOrReturn(osTimerStop(sDHCPTimer) == osOK, ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer"));
+}
+
+void StartDHCPTimer(uint32_t timeout)
+{
+    // Cancel timer if already started
+    CancelDHCPTimer();
+
+    VerifyOrReturn(osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout)) == osOK,
+                   ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer"));
+}
+
+sl_status_t sl_wifi_siwx917_init(void)
+{
+    sl_status_t status = SL_STATUS_OK;
+
+#ifdef SLI_SI91X_MCU_INTERFACE
+    // SoC Configurations
+    uint8_t xtal_enable = 1;
+    status              = sl_si91x_m4_ta_secure_handshake(SL_SI91X_ENABLE_XTAL, 1, &xtal_enable, 0, nullptr);
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_si91x_m4_ta_secure_handshake failed: 0x%lx", static_cast<uint32_t>(status)));
+
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+#ifdef ENABLE_CHIP_SHELL
+    // While using the matter shell with a Low Power Build, GPIO 1 is used to check the UULP PIN 1 status
+    // since UART doesn't act as a wakeup source in the UULP mode.
+
+    // Configuring the NPS GPIO 1
+    RSI_NPSSGPIO_SetPinMux(RTE_UULP_GPIO_1_PIN, 0);
+
+    // Configure the NPSS GPIO direction to input
+    RSI_NPSSGPIO_SetDir(RTE_UULP_GPIO_1_PIN, 1);
+
+    // Enable the REN
+    RSI_NPSSGPIO_InputBufferEn(RTE_UULP_GPIO_1_PIN, 1);
+#endif // ENABLE_CHIP_SHELL
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
+
+#else
+    // NCP Configurations
+    status = sl_matter_wifi_platform_init();
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_matter_wifi_platform_init failed: 0x%lx", static_cast<uint32_t>(status)));
+#endif // SLI_SI91X_MCU_INTERFACE
+
+    sl_wifi_firmware_version_t version = { 0 };
+    status                             = sl_wifi_get_firmware_version(&version);
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_wifi_get_firmware_version failed: 0x%lx", static_cast<uint32_t>(status)));
+
+    ChipLogDetail(DeviceLayer, "Firmware version is: %x%x.%d.%d.%d.%d.%d.%d", version.chip_id, version.rom_id, version.major,
+                  version.minor, version.security_version, version.patch_num, version.customer_id, version.build_num);
+
+    status = sl_wifi_get_mac_address(SL_WIFI_CLIENT_INTERFACE, (sl_mac_address_t *) &wfx_rsi.sta_mac.octet[0]);
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_wifi_get_mac_address failed: 0x%lx", static_cast<uint32_t>(status)));
+
+#ifdef SL_MBEDTLS_USE_TINYCRYPT
+    constexpr uint32_t trngKey[TRNG_KEY_SIZE] = { 0x16157E2B, 0xA6D2AE28, 0x8815F7AB, 0x3C4FCF09 };
+
+    // To check the Entropy of TRNG and verify TRNG functioning.
+    status = sl_si91x_trng_entropy();
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_si91x_trng_entropy failed: 0x%lx", static_cast<uint32_t>(status)));
+
+    // Initiate and program the key required for TRNG hardware engine
+    status = sl_si91x_trng_program_key((uint32_t *) trngKey, TRNG_KEY_SIZE);
+    VerifyOrReturnError(status == SL_STATUS_OK, status,
+                        ChipLogError(DeviceLayer, "sl_si91x_trng_program_key failed: 0x%lx", static_cast<uint32_t>(status)));
+#endif // SL_MBEDTLS_USE_TINYCRYPT
+
+    wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY;
+    osSemaphoreRelease(sl_rs_ble_init_sem);
+    return status;
+}
+
+// TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
+#ifndef EXP_BOARD
+sl_status_t ScanCallback(sl_wifi_event_t event, sl_wifi_scan_result_t * scan_result, uint32_t result_length, void * arg)
+{
+    sl_status_t status = SL_STATUS_OK;
+    if (SL_WIFI_CHECK_IF_EVENT_FAILED(event))
+    {
+        ChipLogError(DeviceLayer, "Scan Netwrok Failed: 0x%lx", *reinterpret_cast<sl_status_t *>(status));
+#if WIFI_ENABLE_SECURITY_WPA3_TRANSITION
+        security = SL_WIFI_WPA3;
+#else
+        security = SL_WIFI_WPA_WPA2_MIXED;
+#endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */
+
+        status = SL_STATUS_FAIL;
+    }
+    else
+    {
+        security        = static_cast<sl_wifi_security_t>(scan_result->scan_info[0].security_mode);
+        wfx_rsi.ap_chan = scan_result->scan_info[0].rf_channel;
+        memcpy(&wfx_rsi.ap_mac.octet, scan_result->scan_info[0].bssid, BSSID_LEN);
+    }
+
+    osSemaphoreRelease(sScanCompleteSemaphore);
+    return status;
+}
+#endif
+
+sl_status_t InitiateScan()
+{
+    sl_status_t status = SL_STATUS_OK;
+
+// TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
+#ifndef EXP_BOARD
+    sl_wifi_ssid_t ssid = { 0 };
+
+    // TODO: this changes will be reverted back after the Silabs WiFi SDK team fix the scan API
+    sl_wifi_scan_configuration_t wifi_scan_configuration = default_wifi_scan_configuration;
+
+    ssid.length = wfx_rsi.sec.ssid_length;
+
+    // TODO: workaround because the string management with the null termination is flawed
+    chip::Platform::CopyString((char *) &ssid.value[0], ssid.length + 1, wfx_rsi.sec.ssid);
+    sl_wifi_set_scan_callback(ScanCallback, NULL);
+
+    osSemaphoreAcquire(sScanInProgressSemaphore, osWaitForever);
+
+    // This is an odd success code?
+    status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, &ssid, &wifi_scan_configuration);
+    if (status == SL_STATUS_IN_PROGRESS)
+    {
+        osSemaphoreAcquire(sScanCompleteSemaphore, kWifiScanTimeoutTicks);
+        status = SL_STATUS_OK;
+    }
+
+    osSemaphoreRelease(sScanInProgressSemaphore);
+#endif
+
+    return status;
+}
+
+sl_status_t SetWifiConfigurations()
+{
+    sl_status_t status = SL_STATUS_OK;
+
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+    // Setting the listen interval to 0 which will set it to DTIM interval
+    sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 };
+    status                                   = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval);
+    VerifyOrReturnError(status == SL_STATUS_OK, status);
+
+    sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 };
+    status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config);
+    VerifyOrReturnError(status == SL_STATUS_OK, status);
+#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
+
+    status = sl_net_set_credential(SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0],
+                                   wfx_rsi.sec.passkey_length);
+    VerifyOrReturnError(status == SL_STATUS_OK, status);
+
+    sl_net_wifi_client_profile_t profile = {
+        .config = {
+            .ssid = {
+                //static cast because the types dont match
+                .length = static_cast<uint8_t>(wfx_rsi.sec.ssid_length),
+            },
+            .channel = {
+                .channel = SL_WIFI_AUTO_CHANNEL,
+                .band = SL_WIFI_AUTO_BAND,
+                .bandwidth = SL_WIFI_AUTO_BANDWIDTH
+            },
+            .bssid = {{0}},
+            .bss_type = SL_WIFI_BSS_TYPE_INFRASTRUCTURE,
+            .security = security,
+            .encryption = SL_WIFI_NO_ENCRYPTION,
+            .client_options = SL_WIFI_JOIN_WITH_SCAN,
+            .credential_id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID,
+        },
+        .ip = {
+            .mode = SL_IP_MANAGEMENT_DHCP,
+            .type = SL_IPV6,
+            .host_name = NULL,
+            .ip = {{{0}}},
+        }
+    };
+    // TODO: memcpy for now since the types dont match
+    memcpy((char *) &profile.config.ssid.value, wfx_rsi.sec.ssid, wfx_rsi.sec.ssid_length);
+
+    status = sl_net_set_profile((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE, SL_NET_DEFAULT_WIFI_CLIENT_PROFILE_ID, &profile);
+    VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_set_profile Failed"));
+
+    return status;
+}
+
+sl_status_t JoinWifiNetwork(void)
+{
+    VerifyOrReturnError(!(wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED)), SL_STATUS_IN_PROGRESS);
+    sl_status_t status = SL_STATUS_OK;
+
+    // Start Join Network
+    wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING;
+
+    status = SetWifiConfigurations();
+    VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "Failure to set the Wifi Configurations!"));
+
+    status = sl_net_up((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE, SL_NET_DEFAULT_WIFI_CLIENT_PROFILE_ID);
+
+    if (status == SL_STATUS_OK || status == SL_STATUS_IN_PROGRESS)
+    {
+        WfxEvent_t event;
+        event.eventType = WFX_EVT_STA_CONN;
+        sl_matter_wifi_post_event(&event);
+        return status;
+    }
+
+    // failure only happens when the firmware returns an error
+    ChipLogError(DeviceLayer, "sl_wifi_connect failed: 0x%lx", static_cast<uint32_t>(status));
+    VerifyOrReturnError((wfx_rsi.join_retries <= MAX_JOIN_RETRIES_COUNT), status);
+
+    wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
+    ChipLogProgress(DeviceLayer, "Connection retry attempt %d", wfx_rsi.join_retries);
+    wfx_retry_connection(++wfx_rsi.join_retries);
+
+    WfxEvent_t event;
+    event.eventType = WFX_EVT_STA_START_JOIN;
+    sl_matter_wifi_post_event(&event);
+
+    return status;
+}
+
+} // namespace
+
+/******************************************************************
+ * @fn   int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t *ap)
+ * @brief
+ *       Getting the AP details
+ * @param[in] ap: access point
+ * @return
+ *        status
+ *********************************************************************/
+int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap)
+{
+    sl_status_t status = SL_STATUS_OK;
+    int32_t rssi       = 0;
+    ap->ssid_length    = wfx_rsi.sec.ssid_length;
+    ap->security       = wfx_rsi.sec.security;
+    ap->chan           = wfx_rsi.ap_chan;
+    chip::Platform::CopyString(ap->ssid, ap->ssid_length, wfx_rsi.sec.ssid);
+    memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN);
+    sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &rssi);
+    ap->rssi = rssi;
+    return status;
+}
+
+/******************************************************************
+ * @fn   int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t *extra_info)
+ * @brief
+ *       Getting the AP extra details
+ * @param[in] extra info: access point extra information
+ * @return
+ *        status
+ *********************************************************************/
+int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
+{
+    sl_status_t status        = SL_STATUS_OK;
+    sl_wifi_statistics_t test = { 0 };
+    status                    = sl_wifi_get_statistics(SL_WIFI_CLIENT_INTERFACE, &test);
+    VERIFY_STATUS_AND_RETURN(status);
+    extra_info->beacon_lost_count = test.beacon_lost_count - temp_reset.beacon_lost_count;
+    extra_info->beacon_rx_count   = test.beacon_rx_count - temp_reset.beacon_rx_count;
+    extra_info->mcast_rx_count    = test.mcast_rx_count - temp_reset.mcast_rx_count;
+    extra_info->mcast_tx_count    = test.mcast_tx_count - temp_reset.mcast_tx_count;
+    extra_info->ucast_rx_count    = test.ucast_rx_count - temp_reset.ucast_rx_count;
+    extra_info->ucast_tx_count    = test.ucast_tx_count - temp_reset.ucast_tx_count;
+    extra_info->overrun_count     = test.overrun_count - temp_reset.overrun_count;
+    return status;
+}
+
+/******************************************************************
+ * @fn   int32_t wfx_rsi_reset_count(void)
+ * @brief
+ *       Getting the driver reset count
+ * @param[in] None
+ * @return
+ *        status
+ *********************************************************************/
+int32_t wfx_rsi_reset_count(void)
+{
+    sl_wifi_statistics_t test = { 0 };
+    sl_status_t status        = SL_STATUS_OK;
+    status                    = sl_wifi_get_statistics(SL_WIFI_CLIENT_INTERFACE, &test);
+    VERIFY_STATUS_AND_RETURN(status);
+    temp_reset.beacon_lost_count = test.beacon_lost_count;
+    temp_reset.beacon_rx_count   = test.beacon_rx_count;
+    temp_reset.mcast_rx_count    = test.mcast_rx_count;
+    temp_reset.mcast_tx_count    = test.mcast_tx_count;
+    temp_reset.ucast_rx_count    = test.ucast_rx_count;
+    temp_reset.ucast_tx_count    = test.ucast_tx_count;
+    temp_reset.overrun_count     = test.overrun_count;
+    return status;
+}
+
+/******************************************************************
+ * @fn   sl_wifi_platform_disconnect(void)
+ * @brief
+ *       Getting the driver disconnect status
+ * @param[in] None
+ * @return
+ *        status
+ *********************************************************************/
+int32_t sl_wifi_platform_disconnect(void)
+{
+    return sl_net_down((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE);
+}
+
+#if CHIP_CONFIG_ENABLE_ICD_SERVER
+#if SLI_SI91X_MCU_INTERFACE
+// Required to invoke button press event during sleep as falling edge is not detected
+void sl_si91x_invoke_btn_press_event(void)
+{
+    // TODO: should be removed once we are getting the press interrupt for button 0 with sleep
+    if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed)
+    {
+        sl_button_on_change(SL_BUTTON_BTN0_NUMBER, 1 /* Button Pressed */);
+        btn0_pressed = true;
+    }
+    if (RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN))
+    {
+        btn0_pressed = false;
+    }
+
+#ifdef ENABLE_CHIP_SHELL
+    // Checking the UULP PIN 1 status to reinit the UART and not allow the device to go to sleep
+    if (RSI_NPSSGPIO_GetPin(RTE_UULP_GPIO_1_PIN))
+    {
+        if (!ps_requirement_added)
+        {
+            sl_si91x_power_manager_add_ps_requirement(SL_SI91X_POWER_MANAGER_PS4);
+            ps_requirement_added = true;
+        }
+    }
+    else
+    {
+        if (ps_requirement_added)
+        {
+            sl_si91x_power_manager_remove_ps_requirement(SL_SI91X_POWER_MANAGER_PS4);
+            ps_requirement_added = false;
+        }
+    }
+#endif // ENABLE_CHIP_SHELL
+}
+#endif // SLI_SI91X_MCU_INTERFACE
+
+/******************************************************************
+ * @fn   wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state)
+ * @brief
+ *       Setting the RS911x in DTIM sleep based mode
+ *
+ * @param[in] sl_si91x_ble_state : State to set for the BLE
+ * @param[in] sl_si91x_wifi_state : State to set for the WiFi
+ * @return
+ *        None
+ *********************************************************************/
+int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state)
+{
+    int32_t status;
+
+    status = rsi_bt_power_save_profile(sl_si91x_ble_state, 0);
+    if (status != RSI_SUCCESS)
+    {
+        ChipLogError(DeviceLayer, "rsi_bt_power_save_profile failed: 0x%lx", static_cast<uint32_t>(status));
+        return status;
+    }
+    sl_wifi_performance_profile_t wifi_profile = { .profile = sl_si91x_wifi_state };
+    status                                     = sl_wifi_set_performance_profile(&wifi_profile);
+    if (status != RSI_SUCCESS)
+    {
+        ChipLogError(DeviceLayer, "sl_wifi_set_performance_profile failed: 0x%lx", static_cast<uint32_t>(status));
+        return status;
+    }
+
+    return status;
+}
+#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
+
+sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result)
+{
+    SL_WIFI_ARGS_CHECK_NULL_POINTER(scan_result);
+    VerifyOrReturnError(wfx_rsi.scan_cb != nullptr, SL_STATUS_INVALID_HANDLE);
+
+    wfx_wifi_scan_result_t cur_scan_result;
+    for (int idx = 0; idx < (int) scan_result->scan_count; idx++)
+    {
+        memset(&cur_scan_result, 0, sizeof(cur_scan_result));
+
+        cur_scan_result.ssid_length = strnlen((char *) scan_result->scan_info[idx].ssid,
+                                              std::min<size_t>(sizeof(scan_result->scan_info[idx].ssid), WFX_MAX_SSID_LENGTH));
+        chip::Platform::CopyString(cur_scan_result.ssid, cur_scan_result.ssid_length, (char *) scan_result->scan_info[idx].ssid);
+
+        // if user has provided ssid, then check if the current scan result ssid matches the user provided ssid
+        if (wfx_rsi.scan_ssid != nullptr &&
+            (strncmp(wfx_rsi.scan_ssid, cur_scan_result.ssid, std::min(strlen(wfx_rsi.scan_ssid), strlen(cur_scan_result.ssid))) ==
+             CMP_SUCCESS))
+        {
+            continue;
+        }
+        cur_scan_result.security = static_cast<wfx_sec_t>(scan_result->scan_info[idx].security_mode);
+        cur_scan_result.rssi     = (-1) * scan_result->scan_info[idx].rssi_val;
+        memcpy(cur_scan_result.bssid, scan_result->scan_info[idx].bssid, BSSID_LEN);
+        wfx_rsi.scan_cb(&cur_scan_result);
+
+        // if user has not provided the ssid, then call the callback for each scan result
+        if (wfx_rsi.scan_ssid == nullptr)
+        {
+            continue;
+        }
+        break;
+    }
+
+    // cleanup and return
+    wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED;
+    wfx_rsi.scan_cb((wfx_wifi_scan_result_t *) 0);
+    wfx_rsi.scan_cb = nullptr;
+    if (wfx_rsi.scan_ssid)
+    {
+        chip::Platform::MemoryFree(wfx_rsi.scan_ssid);
+        wfx_rsi.scan_ssid = nullptr;
+    }
+    return SL_STATUS_OK;
+}
+
+sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_t * result, uint32_t result_length, void * arg)
+{
+    show_scan_results(result); // To do Check error
+    osSemaphoreRelease(sScanCompleteSemaphore);
+    return SL_STATUS_OK;
+}
+
+/// NotifyConnectivity
+/// @brief Notify the application about the connectivity status if it has not been notified yet.
+///        Helper function for HandleDHCPPolling.
+void NotifyConnectivity(void)
+{
+    VerifyOrReturn(!hasNotifiedWifiConnectivity);
+    wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac);
+    hasNotifiedWifiConnectivity = true;
+}
+
+void HandleDHCPPolling(void)
+{
+    WfxEvent_t event;
+
+    // TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state
+    struct netif * sta_netif = &wifi_client_context.netif;
+    VerifyOrReturn(sta_netif != nullptr, ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif"));
+
+#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
+    uint8_t dhcp_state = dhcpclient_poll(sta_netif);
+    if (dhcp_state == DHCP_ADDRESS_ASSIGNED && !hasNotifiedIPV4)
+    {
+        wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
+        hasNotifiedIPV4 = true;
+        event.eventType = WFX_EVT_STA_DHCP_DONE;
+        sl_matter_wifi_post_event(&event);
+        NotifyConnectivity();
+    }
+    else if (dhcp_state == DHCP_OFF)
+    {
+        wfx_ip_changed_notify(IP_STATUS_FAIL);
+        hasNotifiedIPV4 = false;
+    }
+#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
+    /* Checks if the assigned IPv6 address is preferred by evaluating
+     * the first block of IPv6 address ( block 0)
+     */
+    if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
+    {
+        char addrStr[chip::Inet::IPAddress::kMaxStringLength] = { 0 };
+        VerifyOrReturn(ip6addr_ntoa_r(netif_ip6_addr(sta_netif, 0), addrStr, sizeof(addrStr)) != nullptr);
+        ChipLogProgress(DeviceLayer, "SLAAC OK: linklocal addr: %s", addrStr);
+        wfx_ipv6_notify(GET_IPV6_SUCCESS);
+        hasNotifiedIPV6 = true;
+        event.eventType = WFX_EVT_STA_DHCP_DONE;
+        sl_matter_wifi_post_event(&event);
+        NotifyConnectivity();
+    }
+}
+
+void sl_matter_wifi_post_event(WfxEvent_t * event)
+{
+    if (osMessageQueuePut(sWifiEventQueue, event, 0, 0) != osOK)
+    {
+        ChipLogError(DeviceLayer, "sl_matter_wifi_post_event: failed to post event.")
+        // TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc.
+    }
+}
+
+/// ResetDHCPNotificationFlags
+/// @brief Reset the flags that are used to notify the application about DHCP connectivity
+///        and emits a WFX_EVT_STA_DO_DHCP event to trigger DHCP polling checks. Helper function for ProcessEvent.
+void ResetDHCPNotificationFlags(void)
+{
+    WfxEvent_t outEvent;
+
+#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
+    hasNotifiedIPV4 = false;
+#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
+    hasNotifiedIPV6             = false;
+    hasNotifiedWifiConnectivity = false;
+
+    outEvent.eventType = WFX_EVT_STA_DO_DHCP;
+    sl_matter_wifi_post_event(&outEvent);
+}
+
+void ProcessEvent(WfxEvent_t inEvent)
+{
+    // Process event
+    switch (inEvent.eventType)
+    {
+    case WFX_EVT_STA_CONN:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_CONN");
+        wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED;
+        ResetDHCPNotificationFlags();
+
+        break;
+
+    case WFX_EVT_STA_DISCONN:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DISCONN");
+        // TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something
+        wfx_rsi.dev_state &=
+            ~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE);
+        /* TODO: Implement disconnect notify */
+        ResetDHCPNotificationFlags();
+#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
+        wfx_ip_changed_notify(0); // for IPV4
+        wfx_ip_changed_notify(IP_STATUS_FAIL);
+#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
+        wfx_ipv6_notify(GET_IPV6_FAIL);
+        break;
+
+    case WFX_EVT_AP_START:
+        // TODO: Currently unimplemented
+        break;
+    case WFX_EVT_AP_STOP:
+        // TODO: Currently unimplemented
+        break;
+
+    case WFX_EVT_SCAN:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_SCAN");
+
+#ifdef SL_WFX_CONFIG_SCAN
+        if (!(wfx_rsi.dev_state & WFX_RSI_ST_SCANSTARTED))
+        {
+            ChipLogDetail(DeviceLayer, "WFX_EVT_SCAN");
+            sl_wifi_scan_configuration_t wifi_scan_configuration;
+            memset(&wifi_scan_configuration, 0, sizeof(wifi_scan_configuration));
+
+            // TODO: Add scan logic
+            sl_wifi_advanced_scan_configuration_t advanced_scan_configuration = { 0 };
+            int32_t status;
+            advanced_scan_configuration.active_channel_time  = kAdvActiveScanDuration;
+            advanced_scan_configuration.passive_channel_time = kAdvPassiveScanDuration;
+            advanced_scan_configuration.trigger_level        = kAdvScanThreshold;
+            advanced_scan_configuration.trigger_level_change = kAdvRssiToleranceThreshold;
+            advanced_scan_configuration.enable_multi_probe   = kAdvMultiProbe;
+            status = sl_wifi_set_advanced_scan_configuration(&advanced_scan_configuration);
+            if (SL_STATUS_OK != status)
+            {
+                // TODO: Seems like Chipdie should be called here, the device should be initialized here
+                ChipLogError(DeviceLayer, "sl_wifi_set_advanced_scan_configuration failed: 0x%lx", static_cast<uint32_t>(status));
+                return;
+            }
+
+            if (wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED)
+            {
+                /* Terminate with end of scan which is no ap sent back */
+                wifi_scan_configuration.type                   = SL_WIFI_SCAN_TYPE_ADV_SCAN;
+                wifi_scan_configuration.periodic_scan_interval = kAdvScanPeriodicity;
+            }
+            else
+            {
+                wifi_scan_configuration = default_wifi_scan_configuration;
+            }
+            sl_wifi_set_scan_callback(bg_scan_callback_handler, nullptr);
+            wfx_rsi.dev_state |= WFX_RSI_ST_SCANSTARTED;
+
+            osSemaphoreAcquire(sScanInProgressSemaphore, osWaitForever);
+            status = sl_wifi_start_scan(SL_WIFI_CLIENT_2_4GHZ_INTERFACE, nullptr, &wifi_scan_configuration);
+            if (SL_STATUS_IN_PROGRESS == status)
+            {
+                osSemaphoreAcquire(sScanCompleteSemaphore, kWifiScanTimeoutTicks);
+            }
+
+            osSemaphoreRelease(sScanInProgressSemaphore);
+        }
+        break;
+#endif /* SL_WFX_CONFIG_SCAN */
+    case WFX_EVT_STA_START_JOIN:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_START_JOIN");
+
+        // Trigger Netwrok scan
+        InitiateScan();
+
+        // Joining to the network
+        JoinWifiNetwork();
+        break;
+
+    case WFX_EVT_STA_DO_DHCP:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DO_DHCP");
+        StartDHCPTimer(WFX_RSI_DHCP_POLL_INTERVAL);
+        break;
+    case WFX_EVT_STA_DHCP_DONE:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_STA_DHCP_DONE");
+        CancelDHCPTimer();
+        break;
+    case WFX_EVT_DHCP_POLL:
+        ChipLogDetail(DeviceLayer, "WFX_EVT_DHCP_POLL");
+        HandleDHCPPolling();
+    default:
+        break;
+    }
+}
+
+/**
+ * @brief Wifi initialization called from app main
+ *
+ * @return sl_status_t Returns underlying Wi-Fi initialization error
+ */
+sl_status_t sl_matter_wifi_platform_init(void)
+{
+    sl_status_t status = SL_STATUS_OK;
+
+    status = sl_net_init((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE, &config, &wifi_client_context, nullptr);
+    VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_init failed: %lx", status));
+
+    // Create Sempaphore for scan completion
+    sScanCompleteSemaphore = osSemaphoreNew(1, 0, nullptr);
+    VerifyOrReturnError(sScanCompleteSemaphore != nullptr, SL_STATUS_ALLOCATION_FAILED);
+
+    // Create Semaphore for scan in-progress protection
+    sScanInProgressSemaphore = osSemaphoreNew(1, 1, nullptr);
+    VerifyOrReturnError(sScanCompleteSemaphore != nullptr, SL_STATUS_ALLOCATION_FAILED);
+
+    // Create the message queue
+    sWifiEventQueue = osMessageQueueNew(kWfxQueueSize, sizeof(WfxEvent_t), nullptr);
+    VerifyOrReturnError(sWifiEventQueue != nullptr, SL_STATUS_ALLOCATION_FAILED);
+
+    // Create timer for DHCP polling
+    // TODO: Use LWIP timer instead of creating a new one here
+    sDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, nullptr, nullptr);
+    VerifyOrReturnError(sDHCPTimer != nullptr, SL_STATUS_ALLOCATION_FAILED);
+
+    return status;
+}
+
+/*********************************************************************************
+ * @fn  void sl_matter_wifi_task(void *arg)
+ * @brief
+ * The main WLAN task - started by wfx_wifi_start() that interfaces with RSI.
+ * The rest of RSI stuff come in call-backs.
+ * The initialization has been already done.
+ * @param[in] arg:
+ * @return
+ *       None
+ **********************************************************************************/
+/* ARGSUSED */
+void sl_matter_wifi_task(void * arg)
+{
+    (void) arg;
+    WfxEvent_t wfxEvent;
+    sl_status_t status = SL_STATUS_OK;
+
+    status = sl_wifi_siwx917_init();
+    VerifyOrReturn(
+        status == SL_STATUS_OK,
+        ChipLogError(DeviceLayer, "sl_matter_wifi_task: sl_wifi_siwx917_init failed: 0x%lx", static_cast<uint32_t>(status)));
+
+    sl_matter_wifi_task_started();
+
+    ChipLogDetail(DeviceLayer, "sl_matter_wifi_task: starting event loop");
+    for (;;)
+    {
+        if (osMessageQueueGet(sWifiEventQueue, &wfxEvent, nullptr, osWaitForever) == osOK)
+        {
+            ProcessEvent(wfxEvent);
+        }
+        else
+        {
+            ChipLogError(DeviceLayer, "sl_matter_wifi_task: get event failed: 0x%lx", static_cast<uint32_t>(status));
+        }
+    }
+}
+
+#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
+/********************************************************************************************
+ * @fn   void wfx_dhcp_got_ipv4(uint32_t ip)
+ * @brief
+ *        Acquire the new ip address
+ * @param[in] ip: internet protocol
+ * @return
+ *        None
+ **********************************************************************************************/
+void wfx_dhcp_got_ipv4(uint32_t ip)
+{
+    /*
+     * Acquire the new IP address
+     */
+    wfx_rsi.ip4_addr[0] = (ip) &HEX_VALUE_FF;
+    wfx_rsi.ip4_addr[1] = (ip >> 8) & HEX_VALUE_FF;
+    wfx_rsi.ip4_addr[2] = (ip >> 16) & HEX_VALUE_FF;
+    wfx_rsi.ip4_addr[3] = (ip >> 24) & HEX_VALUE_FF;
+    ChipLogDetail(DeviceLayer, "DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2],
+                  wfx_rsi.ip4_addr[3]);
+    /* Notify the Connectivity Manager - via the app */
+    wfx_rsi.dev_state |= WFX_RSI_ST_STA_DHCP_DONE;
+    wfx_ip_changed_notify(IP_STATUS_SUCCESS);
+    wfx_rsi.dev_state |= WFX_RSI_ST_STA_READY;
+}
+#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn
index 2d417c2..9e6b700 100644
--- a/examples/platform/silabs/efr32/BUILD.gn
+++ b/examples/platform/silabs/efr32/BUILD.gn
@@ -18,8 +18,8 @@
 import("${chip_root}/src/app/icd/icd.gni")
 import("${chip_root}/src/lib/lib.gni")
 import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/silabs_board.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/silabs_board.gni")
 
 declare_args() {
   enable_heap_monitoring = false
@@ -111,10 +111,10 @@
   if (chip_enable_openthread) {
     sources = [ "project_include/OpenThreadConfig.h" ]
 
-    public_deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]
+    public_deps = [ "${silabs_sdk_build_root}:silabs_sdk" ]
 
     if (use_silabs_thread_lib) {
-      public_deps += [ "${efr32_sdk_build_root}:openthread_core_config_efr32" ]
+      public_deps += [ "${silabs_sdk_build_root}:openthread_core_config_efr32" ]
     } else {
       public_deps += [ "${chip_root}/third_party/openthread/platforms/efr32:openthread_core_config_efr32" ]
     }
@@ -207,7 +207,7 @@
   public_deps = []
   public_configs = [
     ":efr32-common-config",
-    "${efr32_sdk_build_root}:silabs_config",
+    "${silabs_sdk_build_root}:silabs_config",
     ":chip_examples_project_config",
   ]
 
diff --git a/examples/platform/silabs/efr32/rs911x/rs9117.gni b/examples/platform/silabs/efr32/rs911x/rs9117.gni
index cff3e3d..1adf21a 100644
--- a/examples/platform/silabs/efr32/rs911x/rs9117.gni
+++ b/examples/platform/silabs/efr32/rs911x/rs9117.gni
@@ -1,9 +1,9 @@
 import("//build_overrides/chip.gni")
 import("//build_overrides/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 
 rs911x_src_plat = [
-  "${examples_plat_dir}/rs911x/sl_wifi_if.cpp",
+  "${chip_root}/examples/platform/silabs/SiWx917/SiWxWifiInterface.cpp",
   "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_interrupt.c",
   "${examples_plat_dir}/rs911x/hal/sl_si91x_ncp_utility.c",
   "${examples_plat_dir}/rs911x/hal/efx32_ncp_host.c",
@@ -30,6 +30,9 @@
   "${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/spi/sl_si91x_spi.c",
   "${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/sl_si91x_ncp_driver.c",
 
+  # Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed
+  "${sdk_support_root}/components/service/network_manager/src/sl_net_for_lwip.c",
+
   # wifi component
   "${wifi_sdk_root}/components/protocol/wifi/src/sl_wifi_callback_framework.c",
   "${wifi_sdk_root}/components/protocol/wifi/si91x/sl_wifi.c",
diff --git a/examples/platform/silabs/efr32/rs911x/rs911x.gni b/examples/platform/silabs/efr32/rs911x/rs911x.gni
index b25fbef..c2a2060 100644
--- a/examples/platform/silabs/efr32/rs911x/rs911x.gni
+++ b/examples/platform/silabs/efr32/rs911x/rs911x.gni
@@ -1,6 +1,6 @@
 import("//build_overrides/chip.gni")
 import("//build_overrides/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 
 rs911x_src_plat = [
   "${examples_plat_dir}/rs911x/rsi_if.cpp",
diff --git a/examples/platform/silabs/efr32/rs911x/rsi_if.cpp b/examples/platform/silabs/efr32/rs911x/rsi_if.cpp
index 78d1349..7c727e0 100644
--- a/examples/platform/silabs/efr32/rs911x/rsi_if.cpp
+++ b/examples/platform/silabs/efr32/rs911x/rsi_if.cpp
@@ -50,6 +50,7 @@
 #endif
 
 #include "dhcp_client.h"
+#include "ethernetif.h"
 #include "lwip/nd6.h"
 #include "silabs_utils.h"
 #include "wfx_rsi.h"
@@ -109,7 +110,7 @@
 {
     WfxEvent_t event;
     event.eventType = WFX_EVT_DHCP_POLL;
-    WfxPostEvent(&event);
+    sl_matter_wifi_post_event(&event);
 }
 
 static void CancelDHCPTimer(void)
@@ -226,14 +227,14 @@
 }
 
 /******************************************************************
- * @fn   wfx_rsi_disconnect(void)
+ * @fn   sl_wifi_platform_disconnect(void)
  * @brief
  *       Getting the driver disconnect status
  * @param[in] None
  * @return
  *        status
  *********************************************************************/
-int32_t wfx_rsi_disconnect(void)
+int32_t sl_wifi_platform_disconnect(void)
 {
     return rsi_wlan_disconnect();
 }
@@ -301,7 +302,7 @@
     ChipLogProgress(DeviceLayer, "wfx_rsi_join_cb: success");
     memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
     WfxEvent.eventType = WFX_EVT_STA_CONN;
-    WfxPostEvent(&WfxEvent);
+    sl_matter_wifi_post_event(&WfxEvent);
     wfx_rsi.join_retries = 0;
 }
 
@@ -322,7 +323,7 @@
     wfx_rsi.join_retries += 1;
     wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED);
     WfxEvent.eventType = WFX_EVT_STA_START_JOIN;
-    WfxPostEvent(&WfxEvent);
+    sl_matter_wifi_post_event(&WfxEvent);
 }
 /*************************************************************************************
  * @fn  wfx_rsi_wlan_pkt_cb(uint16_t status, uint8_t *buf, uint32_t len)
@@ -344,31 +345,30 @@
 }
 
 /*************************************************************************************
- * @fn  static int32_t wfx_rsi_init(void)
+ * @fn  static int32_t sl_matter_wifi_init(void)
  * @brief
  *      driver initialization
  * @param[in]  None
  * @return
  *        None
  *****************************************************************************************/
-static int32_t wfx_rsi_init(void)
+static int32_t sl_matter_wifi_init(void)
 {
     int32_t status;
     uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE];
     extern void rsi_hal_board_init(void);
 
-    ChipLogProgress(DeviceLayer, "wfx_rsi_init: starting(HEAP_SZ = %d)", SL_HEAP_SIZE);
     //! Driver initialization
     status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
     if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_driver_init failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_driver_init failed: %ld", status);
         return status;
     }
     /* ! Redpine module intialisation */
     if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_device_init failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_device_init failed: %ld", status);
         return status;
     }
     /*
@@ -377,7 +377,7 @@
     sDrvThread = osThreadNew(rsi_wireless_driver_task_wrapper, NULL, &kDrvTaskAttr);
     if (NULL == sDrvThread)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: failed to create task");
+        ChipLogError(DeviceLayer, "failed to create task");
         return RSI_ERROR_INVALID_PARAM;
     }
 
@@ -388,7 +388,7 @@
     if ((status = rsi_wireless_init(OPER_MODE_0, COEX_MODE_0)) != RSI_SUCCESS)
     {
 #endif
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wireless_init failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_wireless_init failed: %ld", status);
         return status;
     }
 
@@ -397,7 +397,7 @@
      */
     if (rsi_wlan_get(RSI_FW_VERSION, buf, sizeof(buf)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_get(RSI_FW_VERSION) failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_wlan_get(RSI_FW_VERSION) failed: %ld", status);
         return status;
     }
 
@@ -415,13 +415,12 @@
     (void) rsi_wlan_radio_init(); /* Required so we can get MAC address */
     if ((status = rsi_wlan_get(RSI_MAC_ADDRESS, &wfx_rsi.sta_mac.octet[0], RESP_BUFF_SIZE)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_get(RSI_MAC_ADDRESS) failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_wlan_get(RSI_MAC_ADDRESS) failed: %ld", status);
         return status;
     }
 
-    ChipLogDetail(DeviceLayer, "wfx_rsi_init: MAC: %02x:%02x:%02x %02x:%02x:%02x", wfx_rsi.sta_mac.octet[0],
-                  wfx_rsi.sta_mac.octet[1], wfx_rsi.sta_mac.octet[2], wfx_rsi.sta_mac.octet[3], wfx_rsi.sta_mac.octet[4],
-                  wfx_rsi.sta_mac.octet[5]);
+    ChipLogDetail(DeviceLayer, "MAC: %02x:%02x:%02x %02x:%02x:%02x", wfx_rsi.sta_mac.octet[0], wfx_rsi.sta_mac.octet[1],
+                  wfx_rsi.sta_mac.octet[2], wfx_rsi.sta_mac.octet[3], wfx_rsi.sta_mac.octet[4], wfx_rsi.sta_mac.octet[5]);
 
     // Create the message queue
     sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL);
@@ -443,12 +442,12 @@
      */
     if ((status = rsi_wlan_register_callbacks(RSI_JOIN_FAIL_CB, wfx_rsi_join_fail_cb)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_register_callbacks failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_wlan_register_callbacks failed: %ld", status);
         return status;
     }
     if ((status = rsi_wlan_register_callbacks(RSI_WLAN_DATA_RECEIVE_NOTIFY_CB, wfx_rsi_wlan_pkt_cb)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_register_callbacks failed: %ld", status);
+        ChipLogError(DeviceLayer, "rsi_wlan_register_callbacks failed: %ld", status);
         return status;
     }
 
@@ -457,7 +456,6 @@
 #endif
 
     wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY;
-    ChipLogProgress(DeviceLayer, "wfx_rsi_init: success");
     return RSI_SUCCESS;
 }
 
@@ -530,20 +528,20 @@
 }
 
 /********************************************************************************************
- * @fn   static void wfx_rsi_do_join(void)
+ * @fn   static void sl_wifi_platform_join_network(void)
  * @brief
  *        Start an async Join command
  * @return
  *        None
  **********************************************************************************************/
-static void wfx_rsi_do_join(void)
+static void sl_wifi_platform_join_network(void)
 {
-    int32_t status;
+    int32_t status = SL_STATUS_OK;
     rsi_security_mode_t connect_security_mode;
 
     if (wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED))
     {
-        ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: already in progress");
+        ChipLogProgress(DeviceLayer, "sl_wifi_platform_join_network: already in progress");
         return;
     }
 
@@ -566,11 +564,12 @@
         connect_security_mode = RSI_OPEN;
         break;
     default:
-        ChipLogError(DeviceLayer, "wfx_rsi_do_join: error: unknown security type.");
+        ChipLogError(DeviceLayer, "sl_wifi_platform_join_network: error: unknown security type.");
         return;
     }
 
-    ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: connecting to %s, sec=%d", &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security);
+    ChipLogProgress(DeviceLayer, "sl_wifi_platform_join_network: connecting to %s, sec=%d", &wfx_rsi.sec.ssid[0],
+                    wfx_rsi.sec.security);
 
     /*
      * Join the network
@@ -582,7 +581,7 @@
 
     if ((status = rsi_wlan_register_callbacks(RSI_JOIN_FAIL_CB, wfx_rsi_join_fail_cb)) != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_do_join: rsi_wlan_register_callbacks failed: %ld", status);
+        ChipLogError(DeviceLayer, "sl_wifi_platform_join_network: rsi_wlan_register_callbacks failed: %ld", status);
     }
 
     /* Try to connect Wifi with given Credentials
@@ -592,7 +591,8 @@
                                          wfx_rsi_join_cb)) != RSI_SUCCESS)
     {
         wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING;
-        ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: rsi_wlan_connect_async failed: %ld on try %d", status, wfx_rsi.join_retries);
+        ChipLogProgress(DeviceLayer, "sl_wifi_platform_join_network: rsi_wlan_connect_async failed: %ld on try %d", status,
+                        wfx_rsi.join_retries);
         wfx_retry_connection(++wfx_rsi.join_retries);
     }
 }
@@ -645,7 +645,7 @@
         wfx_ipv6_notify(GET_IPV6_SUCCESS);
         hasNotifiedIPV6 = true;
         event.eventType = WFX_EVT_STA_DHCP_DONE;
-        WfxPostEvent(&event);
+        sl_matter_wifi_post_event(&event);
         NotifyConnectivity();
     }
 }
@@ -665,19 +665,16 @@
     hasNotifiedWifiConnectivity = false;
 
     outEvent.eventType = WFX_EVT_STA_DO_DHCP;
-    WfxPostEvent(&outEvent);
+    sl_matter_wifi_post_event(&outEvent);
 }
 
-/**
- * @brief Post the WfxEvent to tue WiFiEventQueue to be process by the wfx_rsi_task
- */
-void WfxPostEvent(WfxEvent_t * event)
+void sl_matter_wifi_post_event(WfxEvent_t * event)
 {
     sl_status_t status = osMessageQueuePut(sWifiEventQueue, event, 0, 0);
 
     if (status != osOK)
     {
-        ChipLogError(DeviceLayer, "WfxPostEvent: failed to post event with status: %ld", status);
+        ChipLogError(DeviceLayer, "sl_matter_wifi_post_event: failed to post event with status: %ld", status);
         // TODO: Handle error, requeue event depending on queue size or notify relevant task,
         // Chipdie, etc.
     }
@@ -798,7 +795,7 @@
         // saving the AP related info
         wfx_rsi_save_ap_info();
         // Joining to the network
-        wfx_rsi_do_join();
+        sl_wifi_platform_join_network();
     }
     break;
     case WFX_EVT_STA_DO_DHCP: {
@@ -819,7 +816,7 @@
 }
 
 /*********************************************************************************
- * @fn  void wfx_rsi_task(void *arg)
+ * @fn  void sl_matter_wifi_task(void *arg)
  * @brief
  * The main WLAN task - started by wfx_wifi_start () that interfaces with RSI.
  * The rest of RSI stuff come in call-backs.
@@ -829,20 +826,20 @@
  *       None
  **********************************************************************************/
 /* ARGSUSED */
-void wfx_rsi_task(void * arg)
+void sl_matter_wifi_task(void * arg)
 {
     (void) arg;
-    uint32_t rsi_status = wfx_rsi_init();
+    uint32_t rsi_status = sl_matter_wifi_init();
     if (rsi_status != RSI_SUCCESS)
     {
-        ChipLogError(DeviceLayer, "wfx_rsi_task: wfx_rsi_init failed: %ld", rsi_status);
+        ChipLogError(DeviceLayer, "sl_matter_wifi_task: sl_matter_wifi_init failed: %ld", rsi_status);
         return;
     }
     WfxEvent_t wfxEvent;
-    wfx_lwip_start();
-    wfx_started_notify();
+    sl_matter_lwip_start();
+    sl_matter_wifi_task_started();
 
-    ChipLogProgress(DeviceLayer, "wfx_rsi_task: starting event loop");
+    ChipLogProgress(DeviceLayer, "sl_matter_wifi_task: starting event loop");
     for (;;)
     {
         osStatus_t status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever);
@@ -852,7 +849,7 @@
         }
         else
         {
-            ChipLogProgress(DeviceLayer, "wfx_rsi_task: get event failed: %x", status);
+            ChipLogProgress(DeviceLayer, "sl_matter_wifi_task: get event failed: %x", status);
         }
     }
 }
diff --git a/examples/platform/silabs/efr32/rs911x/sl_wifi_if.cpp b/examples/platform/silabs/efr32/rs911x/sl_wifi_if.cpp
deleted file mode 120000
index 2f233cc..0000000
--- a/examples/platform/silabs/efr32/rs911x/sl_wifi_if.cpp
+++ /dev/null
@@ -1 +0,0 @@
-../../SiWx917/SiWx917/sl_wifi_if.cpp
\ No newline at end of file
diff --git a/examples/platform/silabs/efr32/rs911x/sl_wlan_config.h b/examples/platform/silabs/efr32/rs911x/sl_wlan_config.h
deleted file mode 100644
index 2ce2060..0000000
--- a/examples/platform/silabs/efr32/rs911x/sl_wlan_config.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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.
- */
-
-#ifndef RSI_CONFIG_H
-#define RSI_CONFIG_H
-
-#include "ble_config.h"
-#include "sl_wifi_device.h"
-
-//! Enable feature
-#define RSI_ENABLE 1
-//! Disable feature
-#define RSI_DISABLE 0
-
-static const sl_wifi_device_configuration_t config = {
-    .boot_option = LOAD_NWP_FW,
-    .mac_address = NULL,
-    .band        = SL_SI91X_WIFI_BAND_2_4GHZ,
-    .region_code = US,
-    .boot_config = { .oper_mode = SL_SI91X_CLIENT_MODE,
-                     .coex_mode = SL_SI91X_WLAN_BLE_MODE,
-                     .feature_bit_map =
-#ifdef SLI_SI91X_MCU_INTERFACE
-                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_WPS_DISABLE),
-#else
-                         (SL_SI91X_FEAT_SECURITY_OPEN | SL_SI91X_FEAT_AGGREGATION),
-#endif
-                     .tcp_ip_feature_bit_map = (SL_SI91X_TCP_IP_FEAT_DHCPV4_CLIENT | SL_SI91X_TCP_IP_FEAT_DNS_CLIENT |
-                                                SL_SI91X_TCP_IP_FEAT_SSL | SL_SI91X_TCP_IP_FEAT_BYPASS
-#ifdef ipv6_FEATURE_REQUIRED
-                                                | SL_SI91X_TCP_IP_FEAT_DHCPV6_CLIENT | SL_SI91X_TCP_IP_FEAT_IPV6
-#endif
-                                                | SL_SI91X_TCP_IP_FEAT_ICMP | SL_SI91X_TCP_IP_FEAT_EXTENSION_VALID),
-                     .custom_feature_bit_map     = (SL_SI91X_CUSTOM_FEAT_EXTENTION_VALID | RSI_CUSTOM_FEATURE_BIT_MAP),
-                     .ext_custom_feature_bit_map = (
-#ifdef SLI_SI917
-                         (RSI_EXT_CUSTOM_FEATURE_BIT_MAP)
-#else // defaults
-#ifdef SLI_SI91X_MCU_INTERFACE
-                         (SL_SI91X_EXT_FEAT_256K_MODE | RSI_EXT_CUSTOM_FEATURE_BIT_MAP)
-#else
-                         (SL_SI91X_EXT_FEAT_384K_MODE | RSI_EXT_CUSTOM_FEATURE_BIT_MAP)
-#endif
-#endif
-                         | (SL_SI91X_EXT_FEAT_BT_CUSTOM_FEAT_ENABLE)
-#if (defined A2DP_POWER_SAVE_ENABLE)
-                         | SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(2)
-#endif
-                             ),
-                     .bt_feature_bit_map = (RSI_BT_FEATURE_BITMAP
-#if (RSI_BT_GATT_ON_CLASSIC)
-                                            | SL_SI91X_BT_ATT_OVER_CLASSIC_ACL /* to support att over classic acl link */
-#endif
-                                            ),
-#ifdef RSI_PROCESS_MAX_RX_DATA
-                     .ext_tcp_ip_feature_bit_map =
-                         (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID | SL_SI91X_EXT_TCP_MAX_RECV_LENGTH),
-#else
-                     .ext_tcp_ip_feature_bit_map = (RSI_EXT_TCPIP_FEATURE_BITMAP | SL_SI91X_CONFIG_FEAT_EXTENTION_VALID),
-#endif
-                     //! ENABLE_BLE_PROTOCOL in bt_feature_bit_map
-                     .ble_feature_bit_map =
-                         ((SL_SI91X_BLE_MAX_NBR_PERIPHERALS(RSI_BLE_MAX_NBR_PERIPHERALS) |
-                           SL_SI91X_BLE_MAX_NBR_CENTRALS(RSI_BLE_MAX_NBR_CENTRALS) |
-                           SL_SI91X_BLE_MAX_NBR_ATT_SERV(RSI_BLE_MAX_NBR_ATT_SERV) |
-                           SL_SI91X_BLE_MAX_NBR_ATT_REC(RSI_BLE_MAX_NBR_ATT_REC)) |
-                          SL_SI91X_FEAT_BLE_CUSTOM_FEAT_EXTENTION_VALID | SL_SI91X_BLE_PWR_INX(RSI_BLE_PWR_INX) |
-                          SL_SI91X_BLE_PWR_SAVE_OPTIONS(RSI_BLE_PWR_SAVE_OPTIONS) | SL_SI91X_916_BLE_COMPATIBLE_FEAT_ENABLE
-#if RSI_BLE_GATT_ASYNC_ENABLE
-                          | SL_SI91X_BLE_GATT_ASYNC_ENABLE
-#endif
-                          ),
-
-                     .ble_ext_feature_bit_map = ((SL_SI91X_BLE_NUM_CONN_EVENTS(RSI_BLE_NUM_CONN_EVENTS) |
-                                                  SL_SI91X_BLE_NUM_REC_BYTES(RSI_BLE_NUM_REC_BYTES))
-#if RSI_BLE_INDICATE_CONFIRMATION_FROM_HOST
-                                                 | SL_SI91X_BLE_INDICATE_CONFIRMATION_FROM_HOST // indication response from app
-#endif
-#if RSI_BLE_MTU_EXCHANGE_FROM_HOST
-                                                 | SL_SI91X_BLE_MTU_EXCHANGE_FROM_HOST // MTU Exchange request initiation from app
-#endif
-#if RSI_BLE_SET_SCAN_RESP_DATA_FROM_HOST
-                                                 | (SL_SI91X_BLE_SET_SCAN_RESP_DATA_FROM_HOST) // Set SCAN Resp Data from app
-#endif
-#if RSI_BLE_DISABLE_CODED_PHY_FROM_HOST
-                                                 | (SL_SI91X_BLE_DISABLE_CODED_PHY_FROM_HOST) // Disable Coded PHY from app
-#endif
-#if BLE_SIMPLE_GATT
-                                                 | SL_SI91X_BLE_GATT_INIT
-#endif
-                                                 ),
-                     .config_feature_bit_map = (SL_SI91X_FEAT_SLEEP_GPIO_SEL_BITMAP | RSI_CONFIG_FEATURE_BITMAP) }
-};
-
-#endif
diff --git a/examples/platform/silabs/efr32/wf200/host_if.cpp b/examples/platform/silabs/efr32/wf200/host_if.cpp
index 516abca..e38f4c4 100644
--- a/examples/platform/silabs/efr32/wf200/host_if.cpp
+++ b/examples/platform/silabs/efr32/wf200/host_if.cpp
@@ -28,8 +28,6 @@
 #include "em_usart.h"
 #include "gpiointerrupt.h"
 
-#include "wifi_config.h"
-
 #include "AppConfig.h"
 #include "sl_wfx_board.h"
 #include "sl_wfx_host.h"
@@ -715,8 +713,8 @@
     {
         /* Initialize the LwIP stack */
         ChipLogDetail(DeviceLayer, "WF200:Start LWIP");
-        wfx_lwip_start();
-        wfx_started_notify();
+        sl_matter_lwip_start();
+        sl_matter_wifi_task_started();
         wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */
         ChipLogDetail(DeviceLayer, "WF200:ready..");
     }
@@ -1071,7 +1069,7 @@
  * @returns Returns SL_STATUS_OK if successful,
  *             SL_STATUS_FAIL otherwise
  *****************************************************************************/
-sl_status_t wfx_sta_discon(void)
+sl_status_t sl_matter_wifi_disconnect(void)
 {
     ChipLogProgress(DeviceLayer, "STA-Disconnecting");
     int32_t status = sl_wfx_send_disconnect_command();
diff --git a/examples/platform/silabs/efr32/wf200/wf200.gni b/examples/platform/silabs/efr32/wf200/wf200.gni
index 307b681..f904f74 100644
--- a/examples/platform/silabs/efr32/wf200/wf200.gni
+++ b/examples/platform/silabs/efr32/wf200/wf200.gni
@@ -1,6 +1,6 @@
 import("//build_overrides/chip.gni")
 import("//build_overrides/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 
 wf200_plat_incs = [ "${examples_plat_dir}/wf200" ]
 wf200_plat_src = [
diff --git a/examples/platform/silabs/provision/BUILD.gn b/examples/platform/silabs/provision/BUILD.gn
index f9e056f..517dd33 100644
--- a/examples/platform/silabs/provision/BUILD.gn
+++ b/examples/platform/silabs/provision/BUILD.gn
@@ -14,12 +14,12 @@
 
 import("//build_overrides/chip.gni")
 import("//build_overrides/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/silabs_board.gni")
+import("${silabs_sdk_build_root}/silabs_board.gni")
 
 if (wifi_soc) {
-  import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
+  import("${silabs_sdk_build_root}/SiWx917_sdk.gni")
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
 }
 
 source_set("storage") {
diff --git a/examples/platform/silabs/wfx_rsi.h b/examples/platform/silabs/wfx_rsi.h
index 0e62cb7..4ef6bd2 100644
--- a/examples/platform/silabs/wfx_rsi.h
+++ b/examples/platform/silabs/wfx_rsi.h
@@ -91,19 +91,24 @@
 
 extern WfxRsi_t wfx_rsi;
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-void wfx_rsidev_init(void);
-void wfx_rsi_task(void * arg);
+void sl_matter_wifi_task(void * arg);
+
 #if CHIP_DEVICE_CONFIG_ENABLE_IPV4
 void wfx_ip_changed_notify(int got_ip);
 #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
+
 int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap);
 int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
 int32_t wfx_rsi_reset_count();
-int32_t wfx_rsi_disconnect();
-int32_t wfx_wifi_rsi_init(void);
+int32_t sl_wifi_platform_disconnect();
+
+// TODO : this needs to be extern otherwise we get a linking error. We need to figure out why in the header clean up
+// NCP files are including this while being c files
+#ifdef __cplusplus
+extern "C" {
+#endif
+sl_status_t sl_matter_wifi_platform_init(void);
+
 #if CHIP_CONFIG_ENABLE_ICD_SERVER
 #if SLI_SI91X_MCU_INTERFACE
 void sl_si91x_invoke_btn_press_event();
@@ -114,11 +119,14 @@
 int32_t wfx_rsi_power_save();
 #endif /* SLI_SI917 */
 #endif /* SL_ICD_ENABLED */
-
-/// WfxPostEvent
-/// @brief Allows to allocate an event to the WFX task event queue from outside of sl_wifi_if.c
-/// @param event The event that will be allocated to the event queue
-void WfxPostEvent(WfxEvent_t * event);
 #ifdef __cplusplus
 }
 #endif
+
+/**
+ * @brief Posts an event to the Wi-Fi task
+ *
+ * @param[in] event Event to process. Must be valid ptr
+ */
+// TODO: Can't be a const & since the ncp builds are still using c files
+void sl_matter_wifi_post_event(WfxEvent_t * event);
diff --git a/examples/platform/silabs/wifi/wfx_notify.cpp b/examples/platform/silabs/wifi/wfx_notify.cpp
index de1beca..fe097a6 100644
--- a/examples/platform/silabs/wifi/wfx_notify.cpp
+++ b/examples/platform/silabs/wifi/wfx_notify.cpp
@@ -60,13 +60,13 @@
     }
 }
 /***********************************************************************************
- * @fn  wfx_started_notify(void)
+ * @fn  sl_matter_wifi_task_started(void)
  * @brief
  *       Wifi device started notification
  * @param[in]: None
  * @return None
  *************************************************************************************/
-void wfx_started_notify(void)
+void sl_matter_wifi_task_started(void)
 {
     sl_wfx_startup_ind_t evt;
     sl_wfx_mac_address_t mac;
diff --git a/examples/platform/silabs/wifi/wfx_rsi_host.cpp b/examples/platform/silabs/wifi/wfx_rsi_host.cpp
index d76bc9c..3263d88 100644
--- a/examples/platform/silabs/wifi/wfx_rsi_host.cpp
+++ b/examples/platform/silabs/wifi/wfx_rsi_host.cpp
@@ -15,6 +15,8 @@
  *    limitations under the License.
  */
 
+// SL MATTER WI-FI INTERFACE
+
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -62,11 +64,11 @@
     wfx_rsi.dev_state |= WFX_RSI_ST_STARTED;
 
     // Creating a Wi-Fi driver thread
-    sWlanThread = osThreadNew(wfx_rsi_task, NULL, &kWlanTaskAttr);
+    sWlanThread = osThreadNew(sl_matter_wifi_task, NULL, &kWlanTaskAttr);
 
     VerifyOrReturnError(sWlanThread != NULL, SL_STATUS_FAIL);
 
-    ChipLogProgress(DeviceLayer, "wfx_rsi_task created successfully");
+    ChipLogProgress(DeviceLayer, "sl_matter_wifi_task created successfully");
     return SL_STATUS_OK;
 }
 
@@ -175,7 +177,7 @@
     ChipLogProgress(DeviceLayer, "connect to access point: %s", wfx_rsi.sec.ssid);
     WfxEvent_t event;
     event.eventType = WFX_EVT_STA_START_JOIN;
-    WfxPostEvent(&event);
+    sl_matter_wifi_post_event(&event);
     return SL_STATUS_OK;
 }
 
@@ -221,7 +223,7 @@
 void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif)
 {
     /*
-     * TODO: Implement IPV6 setup, currently in wfx_rsi_task()
+     * TODO: Implement IPV6 setup, currently in sl_matter_wifi_task()
      * This is hooked with MATTER code.
      */
 }
@@ -256,17 +258,17 @@
 }
 
 /*********************************************************************
- * @fn  sl_status_t wfx_sta_discon(void)
+ * @fn  sl_status_t sl_matter_wifi_disconnect(void)
  * @brief
  *      called fuction when STA disconnected
  * @param[in]  None
  * @return  return SL_STATUS_OK if successful,
  *          SL_STATUS_FAIL otherwise
  ***********************************************************************/
-sl_status_t wfx_sta_discon(void)
+sl_status_t sl_matter_wifi_disconnect(void)
 {
     sl_status_t status;
-    status = wfx_rsi_disconnect();
+    status = sl_wifi_platform_disconnect();
     wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTED;
     return status;
 }
@@ -376,7 +378,7 @@
 
     WfxEvent_t event;
     event.eventType = WFX_EVT_SCAN;
-    WfxPostEvent(&event);
+    sl_matter_wifi_post_event(&event);
 
     return true;
 }
diff --git a/examples/pump-app/silabs/BUILD.gn b/examples/pump-app/silabs/BUILD.gn
index 8321ba6..e8acd15 100644
--- a/examples/pump-app/silabs/BUILD.gn
+++ b/examples/pump-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/smoke-co-alarm-app/silabs/BUILD.gn b/examples/smoke-co-alarm-app/silabs/BUILD.gn
index c6fe096..ad2db01 100644
--- a/examples/smoke-co-alarm-app/silabs/BUILD.gn
+++ b/examples/smoke-co-alarm-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/thermostat/silabs/BUILD.gn b/examples/thermostat/silabs/BUILD.gn
index f51ee14..623d87c 100644
--- a/examples/thermostat/silabs/BUILD.gn
+++ b/examples/thermostat/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -38,7 +38,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/examples/window-app/silabs/BUILD.gn b/examples/window-app/silabs/BUILD.gn
index c45dbda..f55d630 100644
--- a/examples/window-app/silabs/BUILD.gn
+++ b/examples/window-app/silabs/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/silabs_executable.gni")
+import("${silabs_sdk_build_root}/silabs_executable.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
@@ -39,7 +39,7 @@
   import("${chip_root}/third_party/silabs/SiWx917_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
   examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
 }
 
diff --git a/src/lwip/BUILD.gn b/src/lwip/BUILD.gn
index ca08a8c..78657a6 100644
--- a/src/lwip/BUILD.gn
+++ b/src/lwip/BUILD.gn
@@ -219,7 +219,7 @@
     } else if (lwip_platform == "cc32xx") {
       public_deps += [ "${ti_simplelink_sdk_build_root}:ti_simplelink_sdk" ]
     } else if (lwip_platform == "silabs") {
-      public_deps += [ "${efr32_sdk_build_root}:efr32_sdk" ]
+      public_deps += [ "${silabs_sdk_build_root}:silabs_sdk" ]
 
       sources += [
         "${lwip_platform}/lwipopts-rs911x.h",
diff --git a/src/platform/silabs/ConfigurationManagerImpl.cpp b/src/platform/silabs/ConfigurationManagerImpl.cpp
index b4dd5c9..0219852 100644
--- a/src/platform/silabs/ConfigurationManagerImpl.cpp
+++ b/src/platform/silabs/ConfigurationManagerImpl.cpp
@@ -290,10 +290,10 @@
     PersistedStorage::KeyValueStoreMgrImpl().ErasePartition();
 
 #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-    sl_status_t status = wfx_sta_discon();
+    sl_status_t status = sl_matter_wifi_disconnect();
     if (status != SL_STATUS_OK)
     {
-        ChipLogError(DeviceLayer, "wfx_sta_discon() failed: %lx", status);
+        ChipLogError(DeviceLayer, "sl_matter_wifi_disconnect() failed: %lx", status);
     }
     ChipLogProgress(DeviceLayer, "Clearing WiFi provision");
     wfx_clear_wifi_provision();
diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
index 6e5470f..2dd946f 100644
--- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
+++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
@@ -277,7 +277,7 @@
             (mWiFiStationMode != kWiFiStationMode_Enabled && !IsWiFiStationProvisioned()))
         {
             ChipLogProgress(DeviceLayer, "Disconnecting WiFi station interface");
-            serr = wfx_sta_discon();
+            serr = sl_matter_wifi_disconnect();
             if (serr != SL_STATUS_OK)
             {
                 ChipLogError(DeviceLayer, "wfx_wifi_disconnect() failed: %lx", serr);
diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
index 7f6240c..ba80a94 100644
--- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp
@@ -140,7 +140,7 @@
     if (ConnectivityMgr().IsWiFiStationProvisioned())
     {
         ChipLogProgress(DeviceLayer, "Disconecting for current wifi");
-        status = wfx_sta_discon();
+        status = sl_matter_wifi_disconnect();
         if (status != SL_STATUS_OK)
         {
             return CHIP_ERROR_INTERNAL;
diff --git a/src/platform/silabs/PlatformManagerImpl.cpp b/src/platform/silabs/PlatformManagerImpl.cpp
index dccb5db..20d7b94 100644
--- a/src/platform/silabs/PlatformManagerImpl.cpp
+++ b/src/platform/silabs/PlatformManagerImpl.cpp
@@ -84,10 +84,10 @@
     err = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init();
     SuccessOrExit(err);
 
-#if CHIP_SYSTEM_CONFIG_USE_LWIP
+#if CHIP_SYSTEM_CONFIG_USE_LWIP && !defined(SLI_SI91X_MCU_INTERFACE)
     // Initialize LwIP.
     tcpip_init(NULL, NULL);
-#endif // CHIP_SYSTEM_CONFIG_USE_LWIP
+#endif // CHIP_SYSTEM_CONFIG_USE_LWIP && !defined(SLI_SI91X_MCU_INTERFACE)
 
     ReturnErrorOnFailure(System::Clock::InitClock_RealTime());
 
diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn
index 188f1f3..0c2f903 100644
--- a/src/platform/silabs/SiWx917/BUILD.gn
+++ b/src/platform/silabs/SiWx917/BUILD.gn
@@ -103,7 +103,6 @@
     "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h",
     "${silabs_platform_dir}/wifi/wfx_host_events.h",
     "wifi/wfx_msgs.h",
-    "wifi/wifi_config.h",
   ]
   public_configs = [ ":siwx917-platform-wifi-config" ]
 }
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
deleted file mode 100644
index 2860b89..0000000
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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.
- */
-
-/* Includes */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "wfx_host_events.h"
-#include "wifi_config.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "cmsis_os2.h"
-#include "sl_board_configuration.h"
-#include "sl_net.h"
-#include "sl_si91x_driver.h"
-#include "sl_si91x_host_interface.h"
-#include "sl_si91x_types.h"
-#include "sl_wifi.h"
-#include "sl_wifi_callback_framework.h"
-#include "sl_wifi_constants.h"
-#include "sl_wifi_types.h"
-#ifdef __cplusplus
-}
-#endif
-/* LwIP includes. */
-#include "ethernetif.h"
-#include "lwip/ethip6.h"
-#include "lwip/timeouts.h"
-#include "netif/etharp.h"
-#include <lib/support/logging/CHIPLogging.h>
-
-StaticSemaphore_t xEthernetIfSemaBuffer;
-
-/*****************************************************************************
- * Defines
- ******************************************************************************/
-#define STATION_NETIF0 's'
-#define STATION_NETIF1 't'
-
-#define LWIP_FRAME_ALIGNMENT 60
-
-uint32_t gOverrunCount = 0;
-
-/*****************************************************************************
- * Variables
- ******************************************************************************/
-
-/*****************************************************************************
- * @fn static void low_level_init(struct netif *netif)
- * @brief
- *    Initializes the hardware parameters. Called from ethernetif_init().
- *
- * @param[in] netif: the already initialized lwip network interface structure
- *
- * @return
- *    None
- ******************************************************************************/
-static void low_level_init(struct netif * netif)
-{
-    /* set netif MAC hardware address length */
-    netif->hwaddr_len = ETH_HWADDR_LEN;
-
-    /* Set netif MAC hardware address */
-    sl_wfx_mac_address_t mac_addr;
-
-    wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &mac_addr);
-
-    netif->hwaddr[0] = mac_addr.octet[0];
-    netif->hwaddr[1] = mac_addr.octet[1];
-    netif->hwaddr[2] = mac_addr.octet[2];
-    netif->hwaddr[3] = mac_addr.octet[3];
-    netif->hwaddr[4] = mac_addr.octet[4];
-    netif->hwaddr[5] = mac_addr.octet[5];
-
-    /* Set netif maximum transfer unit */
-    netif->mtu = 1500;
-
-    /* Accept broadcast address and ARP traffic */
-    netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
-
-#if LWIP_IPV6_MLD
-    netif->flags |= NETIF_FLAG_MLD6;
-#endif /* LWIP_IPV6_MLD */
-}
-
-/********************************************************************************
- * @fn  static void low_level_input(struct netif *netif, uint8_t *b, uint16_t len)
- * @brief
- * Make PBUF out of a linear buffer - that can be fed into lwip
- * @param[in]  netif: the already initialized lwip network interface structure
- * @param[in]  len: length
- * @return
- *     None
- ************************************************************************************/
-static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len)
-{
-    struct pbuf *p, *q;
-    uint32_t bufferoffset;
-
-    if (len <= 0)
-    {
-        return;
-    }
-    if (len < LWIP_FRAME_ALIGNMENT)
-    { /* 60 : LWIP frame alignment */
-        len = LWIP_FRAME_ALIGNMENT;
-    }
-
-    /* Drop packets originated from the same interface and is not destined for the said interface */
-    const uint8_t * src_mac = b + netif->hwaddr_len;
-    const uint8_t * dst_mac = b;
-
-    if (!(ip6_addr_ispreferred(netif_ip6_addr_state(netif, 0))) && (memcmp(netif->hwaddr, src_mac, netif->hwaddr_len) == 0) &&
-        (memcmp(netif->hwaddr, dst_mac, netif->hwaddr_len) != 0))
-    {
-#ifdef WIFI_DEBUG_ENABLED
-        ChipLogDetail(DeviceLayer, "DROP: [%02x:%02x:%02x:%02x:%02x:%02x]->[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x",
-
-                      src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
-
-                      dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
-
-                      b[12], b[13]);
-#endif
-        return;
-    }
-
-    /* We allocate a pbuf chain of pbufs from the Lwip buffer pool
-     * and copy the data to the pbuf chain
-     */
-    if ((p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL)) != STRUCT_PBUF)
-    {
-        for (q = p, bufferoffset = 0; q != NULL; q = q->next)
-        {
-            memcpy((uint8_t *) q->payload, (uint8_t *) b + bufferoffset, q->len);
-            bufferoffset += q->len;
-        }
-#ifdef WIFI_DEBUG_ENABLED
-        ChipLogDetail(DeviceLayer, "ACCEPT(%d): [%02x:%02x:%02x:%02x:%02x:%02x]->[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x",
-                      bufferoffset,
-
-                      src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5],
-
-                      dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5],
-
-                      b[12], b[13]);
-#endif
-
-        if (netif->input(p, netif) != ERR_OK)
-        {
-            gOverrunCount++;
-            pbuf_free(p);
-        }
-    }
-    else
-    {
-        gOverrunCount++;
-    }
-}
-
-static SemaphoreHandle_t ethout_sem;
-/*****************************************************************************
- *  @fn  static err_t low_level_output(struct netif *netif, struct pbuf *p)
- *  @brief
- *    This function is called from LWIP task when LWIP stack
- *    has some data to be forwarded over WiFi Network
- *
- * @param[in] netif: lwip network interface
- *
- * @param[in] p: the packet to send
- *
- * @return
- *    ERR_OK if successful
- ******************************************************************************/
-static err_t low_level_output(struct netif * netif, struct pbuf * p)
-{
-    UNUSED_PARAMETER(netif);
-    sl_status_t status;
-    status = sl_wifi_send_raw_data_frame(SL_WIFI_CLIENT_INTERFACE, (uint8_t *) p->payload, p->len);
-    if (status != SL_STATUS_OK)
-    {
-        return ERR_IF;
-    }
-    return ERR_OK;
-}
-
-/*****************************************************************************
- *  @fn  void sl_si91x_host_process_data_frame(uint8_t *buf, int len)
- *  @brief
- *    host received frame cb
- *
- * @param[in] buf: buffer
- *
- * @param[in] len: length
- *
- * @return
- *    None
- ******************************************************************************/
-sl_status_t sl_si91x_host_process_data_frame(sl_wifi_interface_t interface, sl_wifi_buffer_t * buffer)
-{
-    struct pbuf * pbuf_packet;
-    void * packet;
-    struct netif * ifp;
-    sl_si91x_packet_t * rsi_pkt;
-    packet  = sl_si91x_host_get_buffer_data(buffer, 0, NULL);
-    rsi_pkt = (sl_si91x_packet_t *) packet;
-
-    /* get the network interface for STATION interface,
-     * and forward the received frame buffer to LWIP
-     */
-    if ((ifp = wfx_get_netif(SL_WFX_STA_INTERFACE)) != (struct netif *) 0)
-    {
-        low_level_input(ifp, rsi_pkt->data, rsi_pkt->length);
-    }
-    return SL_STATUS_OK;
-}
-
-/*****************************************************************************
- *  @fn  err_t sta_ethernetif_init(struct netif *netif)
- *  @brief
- *    sta ethernet if initialization
- *
- * @param[in] netif: the lwip network interface structure
- *
- * @return
- *    ERR_OK if successful
- ******************************************************************************/
-err_t sta_ethernetif_init(struct netif * netif)
-{
-    LWIP_ASSERT("netif != NULL", (netif != NULL));
-
-    /* Set the netif name to identify the interface */
-    netif->name[0] = STATION_NETIF0;
-    netif->name[1] = STATION_NETIF1;
-
-#if LWIP_IPV4 && LWIP_ARP
-    netif->output = etharp_output;
-#endif /* #if LWIP_IPV4 && LWIP_ARP */
-#if LWIP_IPV6 && LWIP_ETHERNET
-    netif->output_ip6 = ethip6_output;
-#endif /* LWIP_IPV6 && LWIP_ETHERNET */
-    netif->linkoutput = low_level_output;
-
-    /* initialize the hardware */
-    low_level_init(netif);
-
-    /* Need single output only */
-    ethout_sem = xSemaphoreCreateBinaryStatic(&xEthernetIfSemaBuffer);
-    xSemaphoreGive(ethout_sem);
-
-    return ERR_OK;
-}
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.h b/src/platform/silabs/SiWx917/wifi/ethernetif.h
deleted file mode 100644
index bac51b9..0000000
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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 "lwip/err.h"
-#include "lwip/netif.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-/***************************************************************************
- * @fn  err_t sta_ethernetif_init(struct netif *netif)
- * @brief
- * Sets up the station network interface.
- *
- * @param netif the lwip network interface structure
- * @returns ERR_OK if successful
- ******************************************************************************/
-err_t sta_ethernetif_init(struct netif * netif);
-
-/***************************************************************************
- * @fn err_t ap_ethernetif_init(struct netif *netif
- * @brief
- * Sets up the AP network interface.
- *
- * @param netif the lwip network interface structure
- * @returns ERR_OK if successful
- ******************************************************************************/
-err_t ap_ethernetif_init(struct netif * netif);
-
-void wfx_host_received_sta_frame_cb(uint8_t * buf, int len);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp b/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
deleted file mode 100644
index d4bcbe4..0000000
--- a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "wfx_host_events.h"
-#include "wifi_config.h"
-
-#include "dhcp_client.h"
-#include "ethernetif.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include <platform/CHIPDeviceLayer.h>
-using namespace ::chip;
-using namespace ::chip::DeviceLayer;
-static struct netif sta_netif;
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-static struct netif ap_netif;
-#endif
-
-/****************************************************************************
- * @fn   static void netif_config(struct netif *sta_if, struct netif *ap_if)
- * @brief
- *      netif configuration
- * @param[in]  sta_if:
- * @param[in]  ap_if:
- * @return None
- *****************************************************************************/
-static void netif_config(struct netif * sta_if, struct netif * ap_if)
-{
-    if (sta_if != NULL)
-    {
-#if LWIP_IPV4
-        ip_addr_t sta_ipaddr;
-        ip_addr_t sta_netmask;
-        ip_addr_t sta_gw;
-
-        /* Initialize the Station information */
-        ip_addr_set_zero_ip4(&sta_ipaddr);
-        ip_addr_set_zero_ip4(&sta_netmask);
-        ip_addr_set_zero_ip4(&sta_gw);
-#endif /* LWIP_IPV4 */
-
-        /* Add station interfaces */
-        netif_add(sta_if,
-#if LWIP_IPV4
-                  (const ip4_addr_t *) &sta_ipaddr, (const ip4_addr_t *) &sta_netmask, (const ip4_addr_t *) &sta_gw,
-#endif /* LWIP_IPV4 */
-                  NULL, &sta_ethernetif_init, &tcpip_input);
-
-        /* Registers the default network interface */
-        netif_set_default(sta_if);
-    }
-}
-
-/****************************************************************************
- * @fn  void wfx_lwip_set_sta_link_up(void)
- * @brief
- * Set station link status to up.
- * @param[in]  None
- * @return None
- *****************************************************************************/
-void wfx_lwip_set_sta_link_up(void)
-{
-    netifapi_netif_set_up(&sta_netif);
-    netifapi_netif_set_link_up(&sta_netif);
-#if LWIP_IPV4 && LWIP_DHCP
-    dhcpclient_set_link_state(LINK_UP);
-#endif /* LWIP_IPV4 && LWIP_DHCP */
-    /*
-     * Enable IPV6
-     */
-
-#if LWIP_IPV6_AUTOCONFIG
-    sta_netif.ip6_autoconfig_enabled = 1;
-#endif /* LWIP_IPV6_AUTOCONFIG */
-    netif_create_ip6_linklocal_address(&sta_netif, MAC_48_BIT_SET);
-}
-
-/***************************************************************************
- * @fn  void wfx_lwip_set_sta_link_down(void)
- * @brief
- * Set station link status to down.
- * @param[in] None
- * @return None
- *****************************************************************************/
-void wfx_lwip_set_sta_link_down(void)
-{
-#if LWIP_IPV4 && LWIP_DHCP
-    dhcpclient_set_link_state(LINK_DOWN);
-#endif /* LWIP_IPV4 && LWIP_DHCP */
-    netifapi_netif_set_link_down(&sta_netif);
-    netifapi_netif_set_down(&sta_netif);
-}
-
-/***************************************************************************
- * @fn  void wfx_lwip_start(void)
- * @brief
- * Initialize the LwIP stack
- * @param[in] None
- * @return None
- *****************************************************************************/
-void wfx_lwip_start(void)
-{
-    /* Initialize the LwIP stack */
-    netif_config(&sta_netif, NULL);
-}
-
-/***************************************************************************
- * @fn   struct netif *wfx_get_netif(sl_wfx_interface_t interface)
- * @brief
- * get the netif
- * @param[in] interface:
- * @return None
- *****************************************************************************/
-struct netif * wfx_get_netif(sl_wfx_interface_t interface)
-{
-    if (interface == SL_WFX_STA_INTERFACE)
-    {
-        return &sta_netif;
-    }
-#ifdef SL_WFX_CONFIG_SOFTAP
-    else if (interface == SL_WFX_SOFTAP_INTERFACE)
-    {
-        return &ap_netif;
-    }
-#endif
-    return (struct netif *) 0;
-}
diff --git a/src/platform/silabs/SiWx917/wifi/wifi_config.h b/src/platform/silabs/SiWx917/wifi/wifi_config.h
deleted file mode 100644
index f2f3b7f..0000000
--- a/src/platform/silabs/SiWx917/wifi/wifi_config.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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.
- */
-
-#ifndef DEMO_CONFIG_H
-#define DEMO_CONFIG_H
-
-#define USE_DHCP_CLIENT_DEFAULT (1) ///< If defined, DHCP is enabled, otherwise static address below is used
-
-/************************** Station Static Default ****************************/
-#define STA_IP_ADDR0_DEFAULT ((uint8_t) 192) ///< Static IP: IP address value 0
-#define STA_IP_ADDR1_DEFAULT ((uint8_t) 168) ///< Static IP: IP address value 1
-#define STA_IP_ADDR2_DEFAULT ((uint8_t) 0)   ///< Static IP: IP address value 2
-#define STA_IP_ADDR3_DEFAULT ((uint8_t) 1)   ///< Static IP: IP address value 3
-
-/*NETMASK*/
-#define STA_NETMASK_ADDR0_DEFAULT ((uint8_t) 255) ///< Static IP: Netmask value 0
-#define STA_NETMASK_ADDR1_DEFAULT ((uint8_t) 255) ///< Static IP: Netmask value 1
-#define STA_NETMASK_ADDR2_DEFAULT ((uint8_t) 255) ///< Static IP: Netmask value 2
-#define STA_NETMASK_ADDR3_DEFAULT ((uint8_t) 0)   ///< Static IP: Netmask value 3
-
-/*Gateway Address*/
-#define STA_GW_ADDR0_DEFAULT ((uint8_t) 0) ///< Static IP: Gateway value 0
-#define STA_GW_ADDR1_DEFAULT ((uint8_t) 0) ///< Static IP: Gateway value 1
-#define STA_GW_ADDR2_DEFAULT ((uint8_t) 0) ///< Static IP: Gateway value 2
-#define STA_GW_ADDR3_DEFAULT ((uint8_t) 0) ///< Static IP: Gateway value 3
-
-/************************** Access Point Static Default ****************************/
-// #define AP_IP_ADDR0_DEFAULT (uint8_t) 10 ///< Static IP: IP address value 0
-// #define AP_IP_ADDR1_DEFAULT (uint8_t) 10 ///< Static IP: IP address value 1
-// #define AP_IP_ADDR2_DEFAULT (uint8_t) 0  ///< Static IP: IP address value 2
-// #define AP_IP_ADDR3_DEFAULT (uint8_t) 1  ///< Static IP: IP address value 3
-
-/*NETMASK*/
-// #define AP_NETMASK_ADDR0_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 0
-// #define AP_NETMASK_ADDR1_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 1
-// #define AP_NETMASK_ADDR2_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 2
-// #define AP_NETMASK_ADDR3_DEFAULT (uint8_t) 0   ///< Static IP: Netmask value 3
-
-/*Gateway Address*/
-// #define AP_GW_ADDR0_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 0
-// #define AP_GW_ADDR1_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 1
-// #define AP_GW_ADDR2_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 2
-// #define AP_GW_ADDR3_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 3
-
-#define WLAN_SSID_DEFAULT "AP_name"                      ///< wifi ssid for client mode
-#define WLAN_PASSKEY_DEFAULT "passkey"                   ///< wifi password for client mode
-#define WLAN_SECURITY_DEFAULT WFM_SECURITY_MODE_WPA2_PSK ///< wifi security mode for client mode:
-///< WFM_SECURITY_MODE_OPEN/WFM_SECURITY_MODE_WEP/WFM_SECURITY_MODE_WPA2_WPA1_PSK
-
-#define SOFTAP_SSID_DEFAULT "silabs_softap"                ///< wifi ssid for soft ap mode
-#define SOFTAP_PASSKEY_DEFAULT "changeme"                  ///< wifi password for soft ap mode
-#define SOFTAP_SECURITY_DEFAULT WFM_SECURITY_MODE_WPA2_PSK ///< wifi security for soft ap mode:
-///< WFM_SECURITY_MODE_OPEN/WFM_SECURITY_MODE_WEP/WFM_SECURITY_MODE_WPA2_WPA1_PSK
-
-#define SOFTAP_CHANNEL_DEFAULT (6) ///< wifi channel for soft ap
-
-#endif // DEMO_CONFIG_H
diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn
index 4bc881f..b1e50fa 100644
--- a/src/platform/silabs/efr32/BUILD.gn
+++ b/src/platform/silabs/efr32/BUILD.gn
@@ -161,10 +161,9 @@
       "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h",
       "${silabs_platform_dir}/wifi/wfx_host_events.h",
       "wifi/wfx_msgs.h",
-      "wifi/wifi_config.h",
     ]
 
-    if (use_wf200 || use_rs9116 || use_SiWx917) {
+    if (use_wf200 || use_rs9116) {
       sources += [
         "${silabs_platform_dir}/wifi/dhcp_client.cpp",
         "wifi/ethernetif.cpp",
diff --git a/src/platform/silabs/efr32/args.gni b/src/platform/silabs/efr32/args.gni
index 394e4bb..5016618 100644
--- a/src/platform/silabs/efr32/args.gni
+++ b/src/platform/silabs/efr32/args.gni
@@ -20,9 +20,9 @@
 import("${chip_root}/src/crypto/crypto.gni")
 
 # ARM architecture flags will be set based on silabs_family.
-arm_platform_config = "${efr32_sdk_build_root}/silabs_arm.gni"
+arm_platform_config = "${silabs_sdk_build_root}/silabs_arm.gni"
 
-mbedtls_target = "${efr32_sdk_build_root}:efr32_sdk"
+mbedtls_target = "${silabs_sdk_build_root}:silabs_sdk"
 
 openthread_external_mbedtls = mbedtls_target
 
diff --git a/src/platform/silabs/efr32/wifi/ethernetif.cpp b/src/platform/silabs/efr32/wifi/ethernetif.cpp
index d0f0ec6..5993cf9 100644
--- a/src/platform/silabs/efr32/wifi/ethernetif.cpp
+++ b/src/platform/silabs/efr32/wifi/ethernetif.cpp
@@ -51,7 +51,6 @@
 #endif // WF200_WIFI
 
 #include "wfx_host_events.h"
-#include "wifi_config.h"
 #ifdef WF200_WIFI
 #include "sl_wfx.h"
 #endif
diff --git a/src/platform/silabs/efr32/wifi/lwip_netif.cpp b/src/platform/silabs/efr32/wifi/lwip_netif.cpp
index 3a0d104..f8d719b 100644
--- a/src/platform/silabs/efr32/wifi/lwip_netif.cpp
+++ b/src/platform/silabs/efr32/wifi/lwip_netif.cpp
@@ -26,7 +26,6 @@
 #include "em_usart.h"
 
 #include "wfx_host_events.h"
-#include "wifi_config.h"
 
 #include "dhcp_client.h"
 #include "ethernetif.h"
@@ -121,13 +120,13 @@
 }
 
 /***************************************************************************
- * @fn  void wfx_lwip_start(void)
+ * @fn  void sl_matter_lwip_start(void)
  * @brief
  * Initialize the LwIP stack
  * @param[in] None
  * @return None
  *****************************************************************************/
-void wfx_lwip_start(void)
+void sl_matter_lwip_start(void)
 {
     /* Initialize the LwIP stack */
     netif_config(&sta_netif, NULL);
diff --git a/src/platform/silabs/efr32/wifi/wifi_config.h b/src/platform/silabs/efr32/wifi/wifi_config.h
deleted file mode 100644
index 8e00201..0000000
--- a/src/platform/silabs/efr32/wifi/wifi_config.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- *    Copyright (c) 2022 Project CHIP Authors
- *
- *    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.
- */
-
-#ifndef WIFI_CONFIG_H
-#define WIFI_CONFIG_H
-
-#define USE_DHCP_CLIENT_DEFAULT 1 ///< If defined, DHCP is enabled, otherwise static address below is used
-
-/************************** Station Static Default ****************************/
-#define STA_IP_ADDR0_DEFAULT (uint8_t) 192 ///< Static IP: IP address value 0
-#define STA_IP_ADDR1_DEFAULT (uint8_t) 168 ///< Static IP: IP address value 1
-#define STA_IP_ADDR2_DEFAULT (uint8_t) 0   ///< Static IP: IP address value 2
-#define STA_IP_ADDR3_DEFAULT (uint8_t) 1   ///< Static IP: IP address value 3
-
-/*NETMASK*/
-#define STA_NETMASK_ADDR0_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 0
-#define STA_NETMASK_ADDR1_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 1
-#define STA_NETMASK_ADDR2_DEFAULT (uint8_t) 255 ///< Static IP: Netmask value 2
-#define STA_NETMASK_ADDR3_DEFAULT (uint8_t) 0   ///< Static IP: Netmask value 3
-
-/*Gateway Address*/
-#define STA_GW_ADDR0_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 0
-#define STA_GW_ADDR1_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 1
-#define STA_GW_ADDR2_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 2
-#define STA_GW_ADDR3_DEFAULT (uint8_t) 0 ///< Static IP: Gateway value 3
-
-#define WLAN_SSID_DEFAULT "AP_name"                      ///< wifi ssid for client mode
-#define WLAN_PASSKEY_DEFAULT "passkey"                   ///< wifi password for client mode
-#define WLAN_SECURITY_DEFAULT WFM_SECURITY_MODE_WPA2_PSK ///< wifi security mode for client mode:
-///< WFM_SECURITY_MODE_OPEN/WFM_SECURITY_MODE_WEP/WFM_SECURITY_MODE_WPA2_WPA1_PSK
-
-#define SOFTAP_SSID_DEFAULT "silabs_softap"                ///< wifi ssid for soft ap mode
-#define SOFTAP_PASSKEY_DEFAULT "changeme"                  ///< wifi password for soft ap mode
-#define SOFTAP_SECURITY_DEFAULT WFM_SECURITY_MODE_WPA2_PSK ///< wifi security for soft ap mode:
-///< WFM_SECURITY_MODE_OPEN/WFM_SECURITY_MODE_WEP/WFM_SECURITY_MODE_WPA2_WPA1_PSK
-
-#define SOFTAP_CHANNEL_DEFAULT 6 ///< wifi channel for soft ap
-
-#endif // WIFI_CONFIG_H
diff --git a/src/platform/silabs/provision/BUILD.gn b/src/platform/silabs/provision/BUILD.gn
index ea5d4b0..7ae41c0 100644
--- a/src/platform/silabs/provision/BUILD.gn
+++ b/src/platform/silabs/provision/BUILD.gn
@@ -14,7 +14,7 @@
 
 import("//build_overrides/chip.gni")
 import("//build_overrides/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/silabs_board.gni")
+import("${silabs_sdk_build_root}/silabs_board.gni")
 
 config("provision-config") {
   include_dirs = [ "." ]
diff --git a/src/platform/silabs/wifi/dhcp_client.cpp b/src/platform/silabs/wifi/dhcp_client.cpp
index c8b47a9..a219430 100644
--- a/src/platform/silabs/wifi/dhcp_client.cpp
+++ b/src/platform/silabs/wifi/dhcp_client.cpp
@@ -24,7 +24,6 @@
 #include "dhcp_client.h"
 #include "lwip/dhcp.h"
 #include "wfx_host_events.h"
-#include "wifi_config.h"
 
 #include "FreeRTOS.h"
 #include "event_groups.h"
diff --git a/src/platform/silabs/wifi/wfx_host_events.h b/src/platform/silabs/wifi/wfx_host_events.h
index 3bd9734..d3d8de6 100644
--- a/src/platform/silabs/wifi/wfx_host_events.h
+++ b/src/platform/silabs/wifi/wfx_host_events.h
@@ -316,7 +316,7 @@
 sl_status_t wfx_connect_to_ap(void);
 void wfx_setup_ip6_link_local(sl_wfx_interface_t);
 bool wfx_is_sta_connected(void);
-sl_status_t wfx_sta_discon(void);
+sl_status_t sl_matter_wifi_disconnect(void);
 #if CHIP_DEVICE_CONFIG_ENABLE_IPV4
 bool wfx_have_ipv4_addr(sl_wfx_interface_t);
 #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
@@ -328,14 +328,14 @@
 /*
  * Call backs into the Matter Platform code
  */
-void wfx_started_notify(void);
+void sl_matter_wifi_task_started(void);
 void wfx_connected_notify(int32_t status, sl_wfx_mac_address_t * ap);
 void wfx_disconnected_notify(int32_t status);
+
 /* Implemented for LWIP */
-void wfx_host_received_sta_frame_cb(uint8_t * buf, int len);
 void wfx_lwip_set_sta_link_up(void);
 void wfx_lwip_set_sta_link_down(void);
-void wfx_lwip_start(void);
+void sl_matter_lwip_start(void);
 struct netif * wfx_get_netif(sl_wfx_interface_t interface);
 
 bool wfx_hw_ready(void);
diff --git a/src/platform/silabs/wifi_args.gni b/src/platform/silabs/wifi_args.gni
index 5d523bd..7b4da17 100644
--- a/src/platform/silabs/wifi_args.gni
+++ b/src/platform/silabs/wifi_args.gni
@@ -21,9 +21,9 @@
 import("${chip_root}/src/crypto/crypto.gni")
 
 # ARM architecture flags will be set based on silabs_family.
-arm_platform_config = "${efr32_sdk_build_root}/silabs_arm.gni"
+arm_platform_config = "${silabs_sdk_build_root}/silabs_arm.gni"
 
-mbedtls_target = "${efr32_sdk_build_root}:efr32_sdk"
+mbedtls_target = "${silabs_sdk_build_root}:silabs_sdk"
 
 # default to platform crypto implementation but allow commandline override
 if (chip_crypto == "") {
@@ -35,7 +35,7 @@
 chip_use_transitional_commissionable_data_provider = false
 
 # Use GSDK lwip instead of CHIP
-lwip_root = "${efr32_sdk_build_root}/silabs_lwip"
+lwip_root = "${silabs_sdk_build_root}/silabs_lwip"
 
 #lwip_platform = "external"
 lwip_platform = "silabs"
diff --git a/src/system/BUILD.gn b/src/system/BUILD.gn
index 40ae99a..a8d15cf 100644
--- a/src/system/BUILD.gn
+++ b/src/system/BUILD.gn
@@ -177,7 +177,7 @@
       public_deps += [ "${lwip_root}:lwip" ]
     } else {
       if (chip_device_platform == "efr32") {
-        public_deps += [ "${efr32_sdk_build_root}:efr32_sdk" ]
+        public_deps += [ "${silabs_sdk_build_root}:silabs_sdk" ]
       }
       if (chip_device_platform == "qpg") {
         public_deps += [ "${qpg_sdk_build_root}:qpg_sdk" ]
diff --git a/src/test_driver/efr32/BUILD.gn b/src/test_driver/efr32/BUILD.gn
index 51fe907..9df7e47 100644
--- a/src/test_driver/efr32/BUILD.gn
+++ b/src/test_driver/efr32/BUILD.gn
@@ -18,7 +18,7 @@
 import("//build_overrides/pigweed.gni")
 
 import("${build_root}/config/defaults.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 
 import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
 import("${chip_root}/src/platform/device.gni")
diff --git a/src/test_driver/efr32/args.gni b/src/test_driver/efr32/args.gni
index 35be5dd..c4bc72c 100644
--- a/src/test_driver/efr32/args.gni
+++ b/src/test_driver/efr32/args.gni
@@ -38,7 +38,7 @@
 # Override the executable type and the test main's target.
 pw_unit_test_EXECUTABLE_TARGET_TYPE = "silabs_executable"
 pw_unit_test_EXECUTABLE_TARGET_TYPE_FILE =
-    "${efr32_sdk_build_root}/silabs_executable.gni"
+    "${silabs_sdk_build_root}/silabs_executable.gni"
 pw_unit_test_MAIN = "//:efr32_test_main"
 
 # Additional variables needed by silabs_executable that must be passed in to pw_test.
diff --git a/third_party/openthread/platforms/efr32/BUILD.gn b/third_party/openthread/platforms/efr32/BUILD.gn
index e270db2..88f8f44 100644
--- a/third_party/openthread/platforms/efr32/BUILD.gn
+++ b/third_party/openthread/platforms/efr32/BUILD.gn
@@ -18,8 +18,8 @@
 
 import("//build_overrides/openthread.gni")
 
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
-import("${efr32_sdk_build_root}/silabs_board.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/silabs_board.gni")
 
 config("openthread_efr32_config") {
   defines = [
@@ -48,7 +48,7 @@
     "${sl_ot_efr32_root}/openthread-core-efr32-config.h",
   ]
 
-  public_deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]
+  public_deps = [ "${silabs_sdk_build_root}:silabs_sdk" ]
 
   public_configs = [ ":openthread_efr32_config" ]
 }
diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn
index 16e0ba6..16d823d 100644
--- a/third_party/silabs/BUILD.gn
+++ b/third_party/silabs/BUILD.gn
@@ -18,12 +18,12 @@
 import("//build_overrides/openthread.gni")
 import("${chip_root}/src/lwip/lwip.gni")
 import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/silabs_board.gni")
+import("${silabs_sdk_build_root}/silabs_board.gni")
 
 if (wifi_soc == true) {  # CCP board
-  import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
+  import("${silabs_sdk_build_root}/SiWx917_sdk.gni")
 } else {
-  import("${efr32_sdk_build_root}/efr32_sdk.gni")
+  import("${silabs_sdk_build_root}/efr32_sdk.gni")
 }
 
 declare_args() {
@@ -49,7 +49,7 @@
 }
 
 assert(silabs_sdk_target != "", "silabs_sdk_target must be specified")
-group("efr32_sdk") {
+group("silabs_sdk") {
   public_deps = [ silabs_sdk_target ]
   public_configs = [ ":silabs_config" ]
 }
@@ -117,7 +117,7 @@
 
       public_deps = [
         ":libopenthread-platform",
-        "${efr32_sdk_build_root}:efr32_sdk",
+        "${silabs_sdk_build_root}:silabs_sdk",
       ]
 
       public_configs = [ ":openthread_efr32_config" ]
@@ -190,7 +190,7 @@
         "${segger_rtt_root}:segger_rtt",
       ]
 
-      deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]
+      deps = [ "${silabs_sdk_build_root}:silabs_sdk" ]
 
       # selected thread device type FTD or MTD
       XTD = "ftd"
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index 3accbed..ab94c63 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -16,12 +16,11 @@
 import("//build_overrides/efr32_sdk.gni")
 import("//build_overrides/jlink.gni")
 import("//build_overrides/mbedtls.gni")
-
 import("${chip_root}/src/app/icd/icd.gni")
 import("${chip_root}/src/crypto/crypto.gni")
 import("${chip_root}/src/lib/lib.gni")
 import("${chip_root}/src/platform/silabs/wifi_args.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 import("silabs_board.gni")
 
 examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
@@ -682,7 +681,6 @@
       "${wifi_sdk_root}/components/device/silabs/si91x/wireless/src/sl_si91x_callback_framework.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c",
       "${wifi_sdk_root}/components/device/silabs/si91x/wireless/threading/sli_si91x_multithreaded.c",
-      "${wifi_sdk_root}/components/service/network_manager/si91x/sl_net_si91x.c",
 
       # modified hal
       "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_default_common_linker.c",
@@ -829,7 +827,7 @@
         "${_mbedtls_root}/library/ssl_srv.c",
         "${_mbedtls_root}/library/ssl_tls.c",
         "${_mbedtls_root}/library/x509.c",
-        "${efr32_sdk_build_root}/mqtt/stack/mqtt.c",
+        "${silabs_sdk_build_root}/mqtt/stack/mqtt.c",
       ]
     }
 
diff --git a/third_party/silabs/lwip.gni b/third_party/silabs/lwip.gni
index 9a35e7c..db19c08 100644
--- a/third_party/silabs/lwip.gni
+++ b/third_party/silabs/lwip.gni
@@ -13,7 +13,7 @@
 # limitations under the License.
 import("//build_overrides/efr32_sdk.gni")
 import("//build_overrides/lwip.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${silabs_sdk_build_root}/efr32_sdk.gni")
 
 # Defines a lwIP build target.
 #
diff --git a/third_party/silabs/matter_support b/third_party/silabs/matter_support
index fddcd73..eab695e 160000
--- a/third_party/silabs/matter_support
+++ b/third_party/silabs/matter_support
@@ -1 +1 @@
-Subproject commit fddcd73de5d30e41036993dc575f78835fba6e7c
+Subproject commit eab695e438ada903a18956eb916696678227cb0d
diff --git a/third_party/silabs/silabs_lwip/BUILD.gn b/third_party/silabs/silabs_lwip/BUILD.gn
index e148763..4d0bcb2 100644
--- a/third_party/silabs/silabs_lwip/BUILD.gn
+++ b/third_party/silabs/silabs_lwip/BUILD.gn
@@ -41,7 +41,7 @@
 
   public_deps = [
     "${chip_root}/src/lwip:lwip_buildconfig",
-    "${efr32_sdk_build_root}:efr32_sdk",
+    "${silabs_sdk_build_root}:silabs_sdk",
   ]
 
   public_configs = [
