diff --git a/examples/dishwasher-app/asr/.gn b/examples/dishwasher-app/asr/.gn
new file mode 100755
index 0000000..8d75f1e
--- /dev/null
+++ b/examples/dishwasher-app/asr/.gn
@@ -0,0 +1,29 @@
+# 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.
+
+import("//build_overrides/build.gni")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+  target_cpu = "arm"
+
+  target_os = "freertos"
+
+  import("//args.gni")
+}
diff --git a/examples/dishwasher-app/asr/BUILD.gn b/examples/dishwasher-app/asr/BUILD.gn
new file mode 100755
index 0000000..2b0cc1e
--- /dev/null
+++ b/examples/dishwasher-app/asr/BUILD.gn
@@ -0,0 +1,131 @@
+# 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.
+
+import("//build_overrides/asr.gni")
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+import("${asr_sdk_build_root}/asr_sdk.gni")
+import("${build_root}/config/defaults.gni")
+import("${chip_root}/src/lib/lib.gni")
+import("${chip_root}/src/platform/device.gni")
+import("${chip_root}/third_party/asr/asr_executable.gni")
+
+import("cfg.gni")
+
+assert(current_os == "freertos")
+
+asr_project_dir = "${chip_root}/examples/dishwasher-app/asr"
+examples_plat_dir = "${chip_root}/examples/platform/asr"
+
+declare_args() {
+  # Dump memory usage at link time.
+  chip_print_memory_usage = false
+}
+
+asr_sdk_sources("dishwasher_app_sdk_sources") {
+  include_dirs = [
+    "${chip_root}/src/platform/ASR",
+    "${asr_project_dir}/include",
+    "${examples_plat_dir}",
+  ]
+
+  defines = [
+    "ASR_LOG_ENABLED=1",
+    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setupPinCode}",
+    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR=${setupDiscriminator}",
+  ]
+
+  if (chip_enable_factory_data) {
+    defines += [
+      "CONFIG_ENABLE_ASR_FACTORY_DATA_PROVIDER=1",
+      "CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER=1",
+    ]
+  }
+
+  if (chip_lwip_ip6_hook) {
+    defines += [
+      "CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT",
+      "CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT",
+    ]
+  }
+
+  sources = [ "${asr_project_dir}/include/CHIPProjectConfig.h" ]
+
+  public_configs = [ "${asr_sdk_build_root}:asr_sdk_config" ]
+}
+
+asr_executable("dishwasher_app") {
+  include_dirs = []
+  defines = []
+  output_name = "chip-asr-dishwasher-example.out"
+
+  sources = [
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/src/operational-state-delegate-impl.cpp",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/src/operational-state-delegates.cpp",
+    "${examples_plat_dir}/CHIPDeviceManager.cpp",
+    "${examples_plat_dir}/LEDWidget.cpp",
+    "${examples_plat_dir}/init_Matter.cpp",
+    "${examples_plat_dir}/init_asrPlatform.cpp",
+    "${examples_plat_dir}/shell/matter_shell.cpp",
+    "src/AppTask.cpp",
+    "src/DeviceCallbacks.cpp",
+    "src/main.cpp",
+  ]
+
+  if (chip_enable_ota_requestor) {
+    sources += [ "${examples_plat_dir}/init_OTARequestor.cpp" ]
+  }
+
+  deps = [
+    ":dishwasher_app_sdk_sources",
+    "${chip_root}/examples/common/QRCode",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common",
+    "${chip_root}/examples/providers:device_info_provider",
+    "${chip_root}/src/lib",
+    "${chip_root}/src/setup_payload",
+  ]
+
+  include_dirs += [
+    "include",
+    "${examples_plat_dir}",
+    "${asr_project_dir}/include",
+    "${chip_root}/src/lib",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/include",
+  ]
+
+  defines = [ "ASR_NETWORK_LAYER_BLE=${chip_config_network_layer_ble}" ]
+
+  if (chip_build_libshell) {
+    defines += [ "CONFIG_ENABLE_CHIP_SHELL=1" ]
+    sources += [ "${examples_plat_dir}/shell/launch_shell.cpp" ]
+    include_dirs += [ "${examples_plat_dir}/shell" ]
+  }
+
+  if (chip_print_memory_usage) {
+    ldflags += [
+      "-Wl,--print-memory-usage",
+      "-fstack-usage",
+    ]
+  }
+
+  output_dir = root_out_dir
+}
+
+group("asr") {
+  deps = [ ":dishwasher_app" ]
+}
+
+group("default") {
+  deps = [ ":asr" ]
+}
diff --git a/examples/dishwasher-app/asr/args.gni b/examples/dishwasher-app/asr/args.gni
new file mode 100755
index 0000000..b7599ea
--- /dev/null
+++ b/examples/dishwasher-app/asr/args.gni
@@ -0,0 +1,27 @@
+# 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.
+
+import("//build_overrides/chip.gni")
+import("//build_overrides/pigweed.gni")
+import("//cfg.gni")
+import("${chip_root}/src/platform/ASR/args.gni")
+
+asr_target_project =
+    get_label_info(":dishwasher_app_sdk_sources", "label_no_toolchain")
+
+declare_args() {
+  # Disable lock tracking, since our FreeRTOS configuration does not set
+  # INCLUDE_xSemaphoreGetMutexHolder
+  chip_stack_lock_tracking = "none"
+}
diff --git a/examples/dishwasher-app/asr/build_overrides b/examples/dishwasher-app/asr/build_overrides
new file mode 120000
index 0000000..194ee0b
--- /dev/null
+++ b/examples/dishwasher-app/asr/build_overrides
@@ -0,0 +1 @@
+../../build_overrides/
\ No newline at end of file
diff --git a/examples/dishwasher-app/asr/cfg.gni b/examples/dishwasher-app/asr/cfg.gni
new file mode 100755
index 0000000..15fe50e
--- /dev/null
+++ b/examples/dishwasher-app/asr/cfg.gni
@@ -0,0 +1,23 @@
+# 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.
+
+declare_args() {
+  chip_enable_factory_data = false
+
+  chip_lwip_ip6_hook = false
+
+  setupPinCode = 20202021
+
+  setupDiscriminator = 3840
+}
diff --git a/examples/dishwasher-app/asr/include/AppConfig.h b/examples/dishwasher-app/asr/include/AppConfig.h
new file mode 100644
index 0000000..d475e4c
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/AppConfig.h
@@ -0,0 +1,45 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+// ---- Dishwasher Example App Config ----
+
+#if (CFG_EASY_LOG_ENABLE == 1)
+#include "elog.h"
+#endif
+
+#define APP_TASK_NAME "APP"
+
+#define APP_TASK_STACK_SIZE (1024 * 4)
+
+#define MATTER_DEVICE_NAME "Dishwasher"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void appError(int err);
+void ASR_LOG(const char * aFormat, ...);
+
+#ifdef __cplusplus
+}
+
+#include <lib/core/CHIPError.h>
+void appError(CHIP_ERROR error);
+#endif
diff --git a/examples/dishwasher-app/asr/include/AppTask.h b/examples/dishwasher-app/asr/include/AppTask.h
new file mode 100644
index 0000000..138c1b7
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/AppTask.h
@@ -0,0 +1,43 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <lega_rtos_api.h>
+#include <platform/CHIPDeviceLayer.h>
+
+class AppTask
+{
+
+public:
+    CHIP_ERROR StartAppTask();
+    static void AppTaskMain(void * pvParameter);
+
+private:
+    friend AppTask & GetAppTask(void);
+
+    static AppTask sAppTask;
+};
+
+inline AppTask & GetAppTask(void)
+{
+    return AppTask::sAppTask;
+}
diff --git a/examples/dishwasher-app/asr/include/CHIPProjectConfig.h b/examples/dishwasher-app/asr/include/CHIPProjectConfig.h
new file mode 100755
index 0000000..38ba84f
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/CHIPProjectConfig.h
@@ -0,0 +1,111 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ *    @file
+ *          Example project configuration file for CHIP.
+ *
+ *          This is a place to put application or project-specific overrides
+ *          to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY
+ *
+ * Enables the use of a hard-coded default Chip device id and credentials if no device id
+ * is found in Chip NV storage.
+ *
+ * This option is for testing only and should be disabled in production releases.
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY 34
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
+#endif
+
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
+#endif
+
+// define Device type based on the application
+#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 117 // 0x0075 Dishwasher
+
+// For convenience, Chip Security Test Mode can be enabled and the
+// requirement for authentication in various protocols can be disabled.
+//
+//    WARNING: These options make it possible to circumvent basic Chip security functionality,
+//    including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS.
+//
+#define CHIP_CONFIG_SECURITY_TEST_MODE 0
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION
+ *
+ * The hardware version number assigned to device or product by the device vendor.  This
+ * number is scoped to the device product id, and typically corresponds to a revision of the
+ * physical device, a change to its packaging, and/or a change to its marketing presentation.
+ * This value is generally *not* incremented for device software versions.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+ *
+ * A string identifying the software version running on the device.
+ * CHIP service currently expects the software version to be in the format
+ * {MAJOR_VERSION}.0d{MINOR_VERSION}
+ */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "1.0"
+#endif
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION
+ *
+ * A uint32_t identifying the software version running on the device.
+ */
+/* The SoftwareVersion attribute of the Basic cluster. */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION
+#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION 1
+#endif
+
+/**
+ * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER
+ *
+ * Enables the use of a hard-coded default serial number if none
+ * is found in Chip NV storage.
+ */
+#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN"
+
+/**
+ * CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS
+ *
+ * Enable recording UTC timestamps.
+ */
+#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1
+
+/**
+ * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE
+ *
+ * A size, in bytes, of the individual debug event logging buffer.
+ */
+#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512)
diff --git a/examples/dishwasher-app/asr/include/DeviceCallbacks.h b/examples/dishwasher-app/asr/include/DeviceCallbacks.h
new file mode 100644
index 0000000..dcd7180
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/DeviceCallbacks.h
@@ -0,0 +1,40 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ * @file DeviceCallbacks.h
+ *
+ * Implementations for the DeviceManager callbacks for this application
+ *
+ **/
+
+#pragma once
+
+#include "CHIPDeviceManager.h"
+#include <app/util/af-types.h>
+#include <app/util/basic-types.h>
+#include <platform/CHIPDeviceLayer.h>
+
+class DeviceCallbacks : public chip::DeviceManager::CHIPDeviceManagerCallbacks
+{
+public:
+    virtual void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) override;
+
+private:
+    void OnInternetConnectivityChange(const chip::DeviceLayer::ChipDeviceEvent * event);
+};
diff --git a/examples/dishwasher-app/asr/src/AppTask.cpp b/examples/dishwasher-app/asr/src/AppTask.cpp
new file mode 100644
index 0000000..d2d8d0c
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/AppTask.cpp
@@ -0,0 +1,112 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "AppTask.h"
+#include "AppConfig.h"
+#include "CHIPDeviceManager.h"
+#include "DeviceCallbacks.h"
+#include "operational-state-delegates.h"
+#include "qrcodegen.h"
+#include <app/server/OnboardingCodesUtil.h>
+#include <app/util/attribute-storage.h>
+#include <assert.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <setup_payload/QRCodeSetupPayloadGenerator.h>
+#include <setup_payload/SetupPayload.h>
+
+#include <app/clusters/network-commissioning/network-commissioning.h>
+#include <platform/ASR/NetworkCommissioningDriver.h>
+
+#include "init_Matter.h"
+#if CONFIG_ENABLE_CHIP_SHELL
+#include "matter_shell.h"
+#endif
+#include <app-common/zap-generated/attributes/Accessors.h>
+
+namespace {
+lega_thread_t sAppTaskHandle;
+} // namespace
+
+using namespace ::chip;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::System;
+
+AppTask AppTask::sAppTask;
+
+namespace {
+constexpr EndpointId kNetworkCommissioningEndpointMain      = 0;
+constexpr EndpointId kNetworkCommissioningEndpointSecondary = 0xFFFE;
+
+app::Clusters::NetworkCommissioning::Instance
+    sWiFiNetworkCommissioningInstance(kNetworkCommissioningEndpointMain /* Endpoint Id */,
+                                      &(NetworkCommissioning::ASRWiFiDriver::GetInstance()));
+} // namespace
+
+void NetWorkCommissioningInstInit()
+{
+    sWiFiNetworkCommissioningInstance.Init();
+
+    // We only have network commissioning on endpoint 0.
+    emberAfEndpointEnableDisable(kNetworkCommissioningEndpointSecondary, false);
+}
+
+static DeviceCallbacks EchoCallbacks;
+
+CHIP_ERROR AppTask::StartAppTask()
+{
+    // Start App task.
+    OSStatus result = lega_rtos_create_thread(&sAppTaskHandle, 2, APP_TASK_NAME, (lega_thread_function_t) AppTaskMain,
+                                              APP_TASK_STACK_SIZE, (lega_thread_arg_t) this);
+    return (result == kNoErr) ? CHIP_NO_ERROR : CHIP_APPLICATION_ERROR(0x02);
+}
+
+void AppTask::AppTaskMain(void * pvParameter)
+{
+    ASR_LOG("App Task started");
+
+    if (MatterInitializer::Init_Matter_Stack(MATTER_DEVICE_NAME) != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance();
+
+    if (deviceMgr.Init(&EchoCallbacks) != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    if (MatterInitializer::Init_Matter_Server() != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    NetWorkCommissioningInstInit();
+
+    ASR_LOG("Current Firmware Version: %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING);
+
+    ConfigurationMgr().LogDeviceConfig();
+
+    // Print setup info
+#if CONFIG_NETWORK_LAYER_BLE
+    PrintOnboardingCodes(RendezvousInformationFlag(RendezvousInformationFlag::kBLE));
+#else
+    PrintOnboardingCodes(RendezvousInformationFlag(RendezvousInformationFlag::kOnNetwork));
+#endif /* CONFIG_NETWORK_LAYER_BLE */
+
+    /*Operational State Server Init*/
+    MatterOperationalStateServerInit();
+    /* Delete task */
+    lega_rtos_delete_thread(NULL);
+}
diff --git a/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp b/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp
new file mode 100644
index 0000000..23e6de9
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp
@@ -0,0 +1,122 @@
+/*
+ *
+ *    Copyright (c) 2020 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ * @file DeviceCallbacks.cpp
+ *
+ * Implements all the callbacks to the application from the CHIP Stack
+ *
+ **/
+#include "DeviceCallbacks.h"
+#include "AppConfig.h"
+#include "CHIPDeviceManager.h"
+#include "init_OTARequestor.h"
+#include <app-common/zap-generated/attributes/Accessors.h>
+#include <app-common/zap-generated/ids/Attributes.h>
+#include <app-common/zap-generated/ids/Clusters.h>
+#include <app/CommandHandler.h>
+#include <app/server/Dnssd.h>
+#include <app/util/af.h>
+#include <app/util/basic-types.h>
+#include <app/util/util.h>
+#include <lib/dnssd/Advertiser.h>
+#include <support/CodeUtils.h>
+#include <support/logging/CHIPLogging.h>
+#include <support/logging/Constants.h>
+#if defined CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT || defined CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT
+#include "route_hook/asr_route_hook.h"
+#endif
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::System;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::Logging;
+
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+constexpr uint32_t kInitOTARequestorDelaySec = 3;
+
+void InitOTARequestorHandler(System::Layer * systemLayer, void * appState)
+{
+    OTAInitializer::Instance().InitOTARequestor();
+}
+#endif
+void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg)
+{
+    switch (event->Type)
+    {
+    case DeviceEventType::kInternetConnectivityChange:
+        OnInternetConnectivityChange(event);
+        break;
+
+    case DeviceEventType::kInterfaceIpAddressChanged:
+        if ((event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV4_Assigned) ||
+            (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned))
+        {
+            // MDNS server restart on any ip assignment: if link local ipv6 is configured, that
+            // will not trigger a 'internet connectivity change' as there is no internet
+            // connectivity. MDNS still wants to refresh its listening interfaces to include the
+            // newly selected address.
+            app::DnssdServer::Instance().StartServer();
+
+            if (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned)
+            {
+#if defined CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT || defined CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT
+                ChipLogProgress(NotSpecified, "Initializing route hook...");
+                asr_route_hook_init();
+#endif
+            }
+        }
+        break;
+    }
+}
+
+void DeviceCallbacks::OnInternetConnectivityChange(const ChipDeviceEvent * event)
+{
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+    static bool isOTAInitialized = false;
+#endif
+    if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established)
+    {
+        ASR_LOG("IPv4 Server ready...");
+        app::DnssdServer::Instance().StartServer();
+    }
+    else if (event->InternetConnectivityChange.IPv4 == kConnectivity_Lost)
+    {
+        ASR_LOG("Lost IPv4 connectivity...");
+    }
+    if (event->InternetConnectivityChange.IPv6 == kConnectivity_Established)
+    {
+        ASR_LOG("IPv6 Server ready...");
+        app::DnssdServer::Instance().StartServer();
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+        // Init OTA requestor only when we have gotten IPv6 address
+        if (!isOTAInitialized)
+        {
+            DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(kInitOTARequestorDelaySec), InitOTARequestorHandler,
+                                                  nullptr);
+            isOTAInitialized = true;
+        }
+#endif
+    }
+    else if (event->InternetConnectivityChange.IPv6 == kConnectivity_Lost)
+    {
+        ASR_LOG("Lost IPv6 connectivity...");
+    }
+}
diff --git a/examples/dishwasher-app/asr/src/main.cpp b/examples/dishwasher-app/asr/src/main.cpp
new file mode 100644
index 0000000..31c3543
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/main.cpp
@@ -0,0 +1,92 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <FreeRTOS.h>
+#include <lib/support/CHIPMem.h>
+#include <lib/support/CHIPPlatformMemory.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/KeyValueStoreManager.h>
+#include <task.h>
+
+#include <AppTask.h>
+
+#include "AppConfig.h"
+#include "init_asrPlatform.h"
+#include <app/server/Server.h>
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+
+volatile int apperror_cnt;
+// ================================================================================
+// App Error
+//=================================================================================
+void appError(int err)
+{
+    ASR_LOG("!!!!!!!!!!!! App Critical Error: %d !!!!!!!!!!!", err);
+    lega_rtos_declare_critical();
+    lega_rtos_enter_critical();
+    while (1)
+        ;
+}
+
+void appError(CHIP_ERROR error)
+{
+    appError(static_cast<int>(error.AsInteger()));
+}
+
+// ================================================================================
+// FreeRTOS Callbacks
+// ================================================================================
+extern "C" void vApplicationIdleHook(void)
+{
+    // FreeRTOS Idle callback
+}
+
+// ================================================================================
+// Main Code
+// ================================================================================
+int main(void)
+{
+    init_asrPlatform();
+
+    CHIP_ERROR ret = GetAppTask().StartAppTask();
+    if (ret != CHIP_NO_ERROR)
+    {
+        ASR_LOG("GetAppTask().Init() failed");
+        appError(ret);
+    }
+    /* Start the FreeRTOS scheduler */
+    vTaskStartScheduler();
+
+    chip::Platform::MemoryShutdown();
+    PlatformMgr().StopEventLoopTask();
+    PlatformMgr().Shutdown();
+
+    // Should never get here.
+    ASR_LOG("vTaskStartScheduler() failed");
+    appError(ret);
+}
diff --git a/examples/dishwasher-app/asr/third_party/connectedhomeip b/examples/dishwasher-app/asr/third_party/connectedhomeip
new file mode 120000
index 0000000..11a54ed
--- /dev/null
+++ b/examples/dishwasher-app/asr/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py
index 6be42b1..b6bb80b 100755
--- a/scripts/build/build/targets.py
+++ b/scripts/build/build/targets.py
@@ -433,6 +433,7 @@
         TargetPart('temperature-measurement', app=ASRApp.TEMPERATURE_MEASUREMENT),
         TargetPart('thermostat', app=ASRApp.THERMOSTAT),
         TargetPart('ota-requestor', app=ASRApp.OTA_REQUESTOR),
+        TargetPart('dishwasher', app=ASRApp.DISHWASHER),
     ])
 
     # modifiers
diff --git a/scripts/build/builders/asr.py b/scripts/build/builders/asr.py
index bf85686..98062b3 100644
--- a/scripts/build/builders/asr.py
+++ b/scripts/build/builders/asr.py
@@ -28,6 +28,7 @@
     TEMPERATURE_MEASUREMENT = auto()
     THERMOSTAT = auto()
     OTA_REQUESTOR = auto()
+    DISHWASHER = auto()
 
     def ExampleName(self):
         if self == ASRApp.ALL_CLUSTERS:
@@ -48,6 +49,8 @@
             return 'thermostat'
         elif self == ASRApp.OTA_REQUESTOR:
             return 'ota-requestor-app'
+        elif self == ASRApp.DISHWASHER:
+            return 'dishwasher-app'
         else:
             raise Exception('Unknown app type: %r' % self)
 
@@ -70,6 +73,8 @@
             return 'chip-asr-thermostat-example'
         elif self == ASRApp.OTA_REQUESTOR:
             return 'chip-asr-ota-requestor-example'
+        elif self == ASRApp.DISHWASHER:
+            return 'chip-asr-dishwasher-example'
         else:
             raise Exception('Unknown app type: %r' % self)
 
diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt
index 61daa46..db0d31e 100644
--- a/scripts/build/testdata/all_targets_linux_x64.txt
+++ b/scripts/build/testdata/all_targets_linux_x64.txt
@@ -1,5 +1,5 @@
 ameba-amebad-{all-clusters,all-clusters-minimal,light,light-switch,pigweed}
-asr-{asr582x,asr595x,asr550x}-{all-clusters,all-clusters-minimal,lighting,light-switch,lock,bridge,temperature-measurement,thermostat,ota-requestor}[-ota][-shell][-no_logging][-factory][-rotating_id][-rio]
+asr-{asr582x,asr595x,asr550x}-{all-clusters,all-clusters-minimal,lighting,light-switch,lock,bridge,temperature-measurement,thermostat,ota-requestor,dishwasher}[-ota][-shell][-no_logging][-factory][-rotating_id][-rio]
 android-{arm,arm64,x86,x64,androidstudio-arm,androidstudio-arm64,androidstudio-x86,androidstudio-x64}-{chip-tool,chip-test,tv-server,tv-casting-app,java-matter-controller,virtual-device-app}[-no-debug]
 bouffalolab-{bl602-iot-matter-v1,bl602-night-light,xt-zb6-devkit,bl706-night-light,bl706-eth,bl704l-dvk}-light[-shell][-115200][-rpc][-cdc][-resetcnt][-rotating_device_id]
 cc32xx-lock
