diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml
index 6c1865e4ad227d..2a62cd12d151a7 100644
--- a/.github/workflows/examples-telink.yaml
+++ b/.github/workflows/examples-telink.yaml
@@ -160,6 +160,15 @@ jobs:
                     out/telink-tlsr9518adk80d-pump-controller/zephyr/zephyr.elf \
                     /tmp/bloat_reports/
 
+            - name: Build example Telink Temperature Measurement App
+              run: |
+                  ./scripts/run_in_build_env.sh \
+                    "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-temperature-measurement' build"
+                  .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
+                    telink tlsr9518adk80d temperature-measurement-app \
+                    out/telink-tlsr9518adk80d-temperature-measurement/zephyr/zephyr.elf \
+                    /tmp/bloat_reports/
+
             - name: Build example Telink Thermostat App
               run: |
                   ./scripts/run_in_build_env.sh \
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 5df772ddbaedbe..bd3c7821934dd5 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -645,6 +645,7 @@
                 "telink-tlsr9518adk80d-ota-requestor",
                 "telink-tlsr9518adk80d-pump-app",
                 "telink-tlsr9518adk80d-pump-controller-app",
+                "telink-tlsr9518adk80d-temperature-measurement",
                 "telink-tlsr9518adk80d-thermostat",
                 "tizen-arm-light"
             ]
diff --git a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
index 8e41f8f6b6eb35..73636f69b2a9e9 100644
--- a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
+++ b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
@@ -78,8 +78,8 @@ idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST}
                        PRIV_REQUIRES ${PRIV_REQUIRES_LIST})
 
 include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake")
-chip_app_component_codegen("${CHIP_ROOT}/examples/temperature-measurement-app/esp32/main/temperature-measurement.matter")
-chip_app_component_zapgen("${CHIP_ROOT}/examples/temperature-measurement-app/esp32/main/temperature-measurement.zap")
+chip_app_component_codegen("${CHIP_ROOT}/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter")
+chip_app_component_zapgen("${CHIP_ROOT}/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap")
 
 set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17)
 target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H")
diff --git a/examples/temperature-measurement-app/telink/.gitignore b/examples/temperature-measurement-app/telink/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/temperature-measurement-app/telink/CMakeLists.txt b/examples/temperature-measurement-app/telink/CMakeLists.txt
new file mode 100644
index 00000000000000..04b3803882cc95
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/CMakeLists.txt
@@ -0,0 +1,66 @@
+#
+#    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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+set(BOARD tlsr9518adk80d)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(TELINK_COMMON ${CHIP_ROOT}/examples/platform/telink REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+
+set(CONF_FILE ${CHIP_ROOT}/config/telink/app/zephyr.conf prj.conf)
+
+# Load NCS/Zephyr build system
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/telink/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+project(chip-telink-temperature-measurement-example)
+
+include(${CHIP_ROOT}/config/telink/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_compile_options(app PRIVATE -fpermissive)
+
+target_include_directories(app PRIVATE
+                           include
+                           ${GEN_DIR}/app-common
+                           ${GEN_DIR}/temperature-measurement-app
+                           ${TELINK_COMMON}/util/include
+                           ${TELINK_COMMON}/app/include
+                           )
+
+add_definitions(
+    "-DCHIP_ADDRESS_RESOLVE_IMPL_INCLUDE_HEADER=<lib/address_resolve/AddressResolve_DefaultImpl.h>"
+)
+
+target_sources(app PRIVATE
+               src/AppTask.cpp
+               src/SensorManager.cpp
+               src/main.cpp
+               ${TELINK_COMMON}/util/src/LEDWidget.cpp
+               ${TELINK_COMMON}/util/src/ButtonManager.cpp
+               ${TELINK_COMMON}/util/src/ThreadUtil.cpp
+               ${TELINK_COMMON}/util/src/PWMDevice.cpp
+               )
+
+chip_configure_data_model(app
+    INCLUDE_SERVER
+    ZAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../temperature-measurement-common/temperature-measurement.zap
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+    target_sources(app PRIVATE ${TELINK_COMMON}/util/src/OTAUtil.cpp)
+endif()
diff --git a/examples/temperature-measurement-app/telink/README.md b/examples/temperature-measurement-app/telink/README.md
new file mode 100644
index 00000000000000..68c79aabd1b2f4
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/README.md
@@ -0,0 +1,163 @@
+# Matter Telink Temperature Measurement Example Application
+
+The Telink Temperature Measurement Example demonstrates getting simulated data
+from temperature sensor. In further releases the real sensor handling will be
+implemented along. It uses buttons to test changing the device states and LEDs
+to show the state of these changes. You can use this example as a reference for
+creating your own application.
+
+![Telink B91 EVK](http://wiki.telink-semi.cn/wiki/assets/Hardware/B91_Generic_Starter_Kit_Hardware_Guide/connection_chart.png)
+
+## Build and flash
+
+1. Pull docker image from repository:
+
+    ```bash
+    $ docker pull connectedhomeip/chip-build-telink:latest
+    ```
+
+1. Run docker container:
+
+    ```bash
+    $ docker run -it --rm -v ${CHIP_BASE}:/root/chip -v /dev/bus/usb:/dev/bus/usb --device-cgroup-rule "c 189:* rmw" connectedhomeip/chip-build-telink:latest
+    ```
+
+    here `${CHIP_BASE}` is directory which contains CHIP repo files **!!!Pay
+    attention that OUTPUT_DIR should contains ABSOLUTE path to output dir**
+
+1. Activate the build environment:
+
+    ```bash
+    $ source ./scripts/activate.sh
+    ```
+
+1. In the example dir run:
+
+    ```bash
+    $ west build
+    ```
+
+1. Flash binary:
+
+    ```
+    $ west flash --erase
+    ```
+
+## Usage
+
+### UART
+
+To get output from device, connect UART to following pins:
+
+| Name | Pin                           |
+| :--: | :---------------------------- |
+|  RX  | PB3 (pin 17 of J34 connector) |
+|  TX  | PB2 (pin 16 of J34 connector) |
+| GND  | GND                           |
+
+### Buttons
+
+The following buttons are available on **tlsr9518adk80d** board:
+
+| Name     | Function               | Description                                                                                            |
+| :------- | :--------------------- | :----------------------------------------------------------------------------------------------------- |
+| Button 1 | Factory reset          | Perform factory reset to forget currently commissioned Thread network and back to uncommissioned state |
+| Button 2 | NA                     | NA                                                                                                     |
+| Button 3 | Thread start           | Commission thread with static credentials and enables the Thread on device                             |
+| Button 4 | Open commission window | The button is opening commissioning window to perform commissioning over BLE                           |
+
+### LEDs
+
+#### Indicate current state of Thread network
+
+**Red** LED indicates current state of Thread network. It is able to be in
+following states:
+
+| State                       | Description                                                                  |
+| :-------------------------- | :--------------------------------------------------------------------------- |
+| Blinks with short pulses    | Device is not commissioned to Thread, Thread is disabled                     |
+| Blinks with frequent pulses | Device is commissioned, Thread enabled. Device trying to JOIN thread network |
+| Blinks with wide pulses     | Device commissioned and joined to thread network as CHILD                    |
+
+### CHIP tool commands
+
+1. Build
+   [chip-tool cli](https://github.com/project-chip/connectedhomeip/blob/master/examples/chip-tool/README.md)
+
+2. Pair with device
+
+    ```
+    ${CHIP_TOOL_DIR}/chip-tool pairing ble-thread ${NODE_ID} hex:${DATASET} ${PIN_CODE} ${DISCRIMINATOR}
+    ```
+
+    Example:
+
+    ```
+    ./chip-tool pairing ble-thread 1234 hex:0e080000000000010000000300000f35060004001fffe0020811111111222222220708fd61f77bd3df233e051000112233445566778899aabbccddeeff030e4f70656e54687265616444656d6f010212340410445f2b5ca6f2a93a55ce570a70efeecb0c0402a0fff8 20202021 3840
+    ```
+
+### OTA with Linux OTA Provider
+
+OTA feature enabled by default only for ota-requestor-app example. To enable OTA
+feature for another Telink example:
+
+-   set CONFIG_CHIP_OTA_REQUESTOR=y in corresponding "prj.conf" configuration
+    file.
+
+After build application with enabled OTA feature, use next binary files:
+
+-   zephyr.bin - main binary to flash PCB (Use 2MB PCB).
+-   zephyr-ota.bin - binary for OTA Provider
+
+All binaries has the same SW version. To test OTA “zephyr-ota.bin” should have
+higher SW version than base SW. Set CONFIG_CHIP_DEVICE_SOFTWARE_VERSION=2 in
+corresponding “prj.conf” configuration file.
+
+Usage of OTA:
+
+-   Build the [Linux OTA Provider](../../ota-provider-app/linux)
+
+    ```
+    ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/ota-provider-app chip_config_network_layer_ble=false
+    ```
+
+-   Run the Linux OTA Provider with OTA image.
+
+    ```
+    ./chip-ota-provider-app -f zephyr-ota.bin
+    ```
+
+-   Provision the Linux OTA Provider using chip-tool
+
+    ```
+    ./chip-tool pairing onnetwork ${OTA_PROVIDER_NODE_ID} 20202021
+    ```
+
+    here:
+
+    -   \${OTA_PROVIDER_NODE_ID} is the node id of Linux OTA Provider
+
+-   Configure the ACL of the ota-provider-app to allow access
+
+    ```
+    ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": null, "targets": null}]' ${OTA_PROVIDER_NODE_ID} 0
+    ```
+
+    here:
+
+    -   \${OTA_PROVIDER_NODE_ID} is the node id of Linux OTA Provider
+
+-   Use the chip-tool to announce the ota-provider-app to start the OTA process
+
+    ```
+    ./chip-tool otasoftwareupdaterequestor announce-ota-provider ${OTA_PROVIDER_NODE_ID} 0 0 0 ${DEVICE_NODE_ID} 0
+    ```
+
+    here:
+
+    -   \${OTA_PROVIDER_NODE_ID} is the node id of Linux OTA Provider
+    -   \${DEVICE_NODE_ID} is the node id of paired device
+
+Once the transfer is complete, OTA requestor sends ApplyUpdateRequest command to
+OTA provider for applying the image. Device will restart on successful
+application of OTA image.
diff --git a/examples/temperature-measurement-app/telink/include/AppConfig.h b/examples/temperature-measurement-app/telink/include/AppConfig.h
new file mode 100644
index 00000000000000..f3daa577c44063
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/include/AppConfig.h
@@ -0,0 +1,33 @@
+/*
+ *
+ *    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
+
+// ---- Temperature measurement Example App Config ----
+
+// Buttons config
+#define BUTTON_PORT DEVICE_DT_GET(DT_NODELABEL(gpioc))
+
+#define BUTTON_PIN_1 2
+#define BUTTON_PIN_3 3
+#define BUTTON_PIN_4 1
+#define BUTTON_PIN_2 0
+
+// LEDs config
+#define LEDS_PORT DEVICE_DT_GET(DT_NODELABEL(gpiob))
+#define SYSTEM_STATE_LED 7
diff --git a/examples/temperature-measurement-app/telink/include/AppEvent.h b/examples/temperature-measurement-app/telink/include/AppEvent.h
new file mode 100644
index 00000000000000..d38fb150212a85
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/include/AppEvent.h
@@ -0,0 +1,57 @@
+/*
+ *
+ *    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 <cstdint>
+
+struct AppEvent;
+typedef void (*EventHandler)(AppEvent *);
+
+class LEDWidget;
+
+struct AppEvent
+{
+    enum AppEventTypes
+    {
+        kEventType_Button = 0,
+        kEventType_Timer,
+        kEventType_UpdateLedState,
+        kEventType_Install,
+    };
+
+    uint16_t Type;
+
+    union
+    {
+        struct
+        {
+            uint8_t Action;
+        } ButtonEvent;
+        struct
+        {
+            void * Context;
+        } TimerEvent;
+        struct
+        {
+            LEDWidget * LedWidget;
+        } UpdateLedStateEvent;
+    };
+
+    EventHandler Handler;
+};
diff --git a/examples/temperature-measurement-app/telink/include/AppTask.h b/examples/temperature-measurement-app/telink/include/AppTask.h
new file mode 100644
index 00000000000000..b67d2ee6f1944a
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/include/AppTask.h
@@ -0,0 +1,85 @@
+/*
+ *
+ *    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 "AppConfig.h"
+#include "AppEvent.h"
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+#include "LEDWidget.h"
+#endif
+#include "PWMDevice.h"
+#include <platform/CHIPDeviceLayer.h>
+
+#if CONFIG_CHIP_FACTORY_DATA
+#include <platform/telink/FactoryDataProvider.h>
+#endif
+
+#include <cstdint>
+
+struct k_timer;
+
+class AppTask
+{
+public:
+    CHIP_ERROR StartApp(void);
+
+    void SetInitiateAction(PWMDevice::Action_t aAction, int32_t aActor, uint8_t * value);
+    void PostEvent(AppEvent * aEvent);
+
+private:
+    friend AppTask & GetAppTask(void);
+    CHIP_ERROR Init(void);
+
+    void DispatchEvent(AppEvent * event);
+
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+    static void UpdateLedStateEventHandler(AppEvent * aEvent);
+    static void LEDStateUpdateHandler(LEDWidget * ledWidget);
+    static void UpdateStatusLED();
+#endif
+    static void FactoryResetButtonEventHandler(void);
+    static void StartThreadButtonEventHandler(void);
+    static void StartBleAdvButtonEventHandler(void);
+
+    static void ChipEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+
+    static void TemperatureMeasurementTimerTimeoutCallback(k_timer * timer);
+    static void TemperatureMeasurementTimerEventHandler(AppEvent * aEvent);
+
+    static void FactoryResetTimerTimeoutCallback(k_timer * timer);
+    static void FactoryResetTimerEventHandler(AppEvent * aEvent);
+    static void FactoryResetHandler(AppEvent * aEvent);
+    static void StartThreadHandler(AppEvent * aEvent);
+    static void StartBleAdvHandler(AppEvent * aEvent);
+
+    static void InitButtons(void);
+
+    static void ThreadProvisioningHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+
+    static AppTask sAppTask;
+
+#if CONFIG_CHIP_FACTORY_DATA
+    chip::DeviceLayer::FactoryDataProvider<chip::DeviceLayer::ExternalFlashFactoryData> mFactoryDataProvider;
+#endif
+};
+
+inline AppTask & GetAppTask(void)
+{
+    return AppTask::sAppTask;
+}
diff --git a/examples/temperature-measurement-app/telink/include/CHIPProjectConfig.h b/examples/temperature-measurement-app/telink/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..412932a59c3726
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/include/CHIPProjectConfig.h
@@ -0,0 +1,39 @@
+/*
+ *
+ *    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
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
+
+/**
+ * CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE
+ *
+ * Reduce packet buffer pool size to 8 (default 15) to reduce ram consumption
+ */
+#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE 8
diff --git a/examples/temperature-measurement-app/telink/include/SensorManager.h b/examples/temperature-measurement-app/telink/include/SensorManager.h
new file mode 100644
index 00000000000000..b7059808601010
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/include/SensorManager.h
@@ -0,0 +1,54 @@
+/*
+ *
+ *    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 "AppEvent.h"
+
+#include <app-common/zap-generated/attributes/Accessors.h>
+#include <lib/core/CHIPError.h>
+
+class SensorManager
+{
+public:
+    CHIP_ERROR Init();
+
+    int16_t GetMeasuredValue();
+    int16_t GetMinMeasuredValue();
+    int16_t GetMaxMeasuredValue();
+
+private:
+    friend SensorManager & SensorMgr();
+
+    // Reads new generated sensor value, stores it, and updates local temperature attribute
+    static int16_t SensorEventHandler();
+
+    int16_t mMeasuredTempCelsius;
+    int16_t mMinMeasuredTempCelsius = -40;
+    int16_t mMaxMeasuredTempCelsius = 120;
+
+    static SensorManager sSensorManager;
+};
+
+inline SensorManager & SensorMgr()
+{
+    return SensorManager::sSensorManager;
+}
diff --git a/examples/temperature-measurement-app/telink/prj.conf b/examples/temperature-measurement-app/telink/prj.conf
new file mode 100644
index 00000000000000..57d38353f586fb
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/prj.conf
@@ -0,0 +1,79 @@
+#
+#    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 sample uses sample-defaults.conf to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# enable GPIO
+CONFIG_GPIO=y
+
+# enable PWM
+CONFIG_PWM=y
+
+# OpenThread configs
+CONFIG_OPENTHREAD_MTD=y
+CONFIG_OPENTHREAD_FTD=n
+CONFIG_CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT=n
+CONFIG_CHIP_SED_IDLE_INTERVAL=200
+CONFIG_CHIP_THREAD_SSED=n
+
+# Default OpenThread network settings
+CONFIG_OPENTHREAD_PANID=4660
+CONFIG_OPENTHREAD_CHANNEL=15
+CONFIG_OPENTHREAD_NETWORK_NAME="OpenThreadDemo"
+CONFIG_OPENTHREAD_XPANID="11:11:11:11:22:22:22:22"
+
+# Disable Matter OTA DFU
+CONFIG_CHIP_OTA_REQUESTOR=n
+
+# CHIP configuration
+CONFIG_CHIP_PROJECT_CONFIG="include/CHIPProjectConfig.h"
+CONFIG_CHIP_OPENTHREAD_CONFIG="../../platform/telink/project_include/OpenThreadConfig.h"
+
+CONFIG_CHIP_DEVICE_VENDOR_ID=65521
+# 32781 == 0x800D (example temperature-measurement-app)
+CONFIG_CHIP_DEVICE_PRODUCT_ID=32781
+CONFIG_CHIP_DEVICE_TYPE=65535
+
+CONFIG_CHIP_DEVICE_SOFTWARE_VERSION=1
+CONFIG_CHIP_DEVICE_SOFTWARE_VERSION_STRING="2023"
+
+# Enable CHIP pairing automatically on application start.
+CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
+
+# CHIP shell
+CONFIG_CHIP_LIB_SHELL=n
+
+# Disable factory data support. 
+CONFIG_CHIP_FACTORY_DATA=n
+CONFIG_CHIP_FACTORY_DATA_BUILD=n
+CONFIG_CHIP_FACTORY_DATA_MERGE_WITH_FIRMWARE=n
+CONFIG_CHIP_CERTIFICATION_DECLARATION_STORAGE=n
+
+# Enable Button IRQ mode. The poling mode is used by default.
+CONFIG_CHIP_BUTTON_MANAGER_IRQ_MODE=n
+
+# Disable Status LED.
+CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED=y
+
+# Enable Power Management
+CONFIG_PM=n
+CONFIG_PM_DEVICE=n
+
+# Custom RF power values
+CONFIG_B91_BLE_CTRL_RF_POWER_P9P11DBM=y
+CONFIG_IEEE802154_B91_CUSTOM_RF_POWER=9
diff --git a/examples/temperature-measurement-app/telink/src/AppTask.cpp b/examples/temperature-measurement-app/telink/src/AppTask.cpp
new file mode 100644
index 00000000000000..9d84f94fa98d9b
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/src/AppTask.cpp
@@ -0,0 +1,481 @@
+/*
+ *
+ *    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 "AppEvent.h"
+#include "ButtonManager.h"
+#include "SensorManager.h"
+
+#include "ThreadUtil.h"
+
+#include <DeviceInfoProviderImpl.h>
+#include <app-common/zap-generated/attributes/Accessors.h>
+#include <app/server/OnboardingCodesUtil.h>
+#include <app/server/Server.h>
+#include <credentials/DeviceAttestationCredsProvider.h>
+#include <credentials/examples/DeviceAttestationCredsExample.h>
+#include <lib/support/ErrorStr.h>
+#include <system/SystemClock.h>
+
+#if CONFIG_CHIP_OTA_REQUESTOR
+#include "OTAUtil.h"
+#endif
+
+#include <zephyr/logging/log.h>
+#include <zephyr/zephyr.h>
+
+#include <algorithm>
+
+#if CONFIG_CHIP_LIB_SHELL
+#include <sys.h>
+#include <zephyr/shell/shell.h>
+
+static int cmd_telink_reboot(const struct shell * shell, size_t argc, char ** argv)
+{
+    ARG_UNUSED(argc);
+    ARG_UNUSED(argv);
+
+    shell_print(shell, "Performing board reboot...");
+    sys_reboot();
+}
+
+SHELL_STATIC_SUBCMD_SET_CREATE(sub_telink, SHELL_CMD(reboot, NULL, "Reboot board command", cmd_telink_reboot),
+                               SHELL_SUBCMD_SET_END);
+SHELL_CMD_REGISTER(telink, &sub_telink, "Telink commands", NULL);
+#endif // CONFIG_CHIP_LIB_SHELL
+
+LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+using namespace ::chip::app;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceLayer;
+
+namespace {
+constexpr int kFactoryResetCalcTimeout = 3000;
+constexpr int kFactoryResetTriggerCntr = 3;
+constexpr int kAppEventQueueSize       = 10;
+constexpr uint8_t kButtonPushEvent     = 1;
+constexpr uint8_t kButtonReleaseEvent  = 0;
+constexpr EndpointId kEndpointId       = 1;
+constexpr uint8_t kDefaultMinLevel     = 0;
+constexpr uint8_t kDefaultMaxLevel     = 254;
+
+#if CONFIG_CHIP_FACTORY_DATA
+// NOTE! This key is for test/certification only and should not be available in production devices!
+uint8_t sTestEventTriggerEnableKey[TestEventTriggerDelegate::kEnableKeyLength] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+                                                                                   0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
+#endif
+
+K_MSGQ_DEFINE(sAppEventQueue, sizeof(AppEvent), kAppEventQueueSize, alignof(AppEvent));
+k_timer sFactoryResetTimer;
+uint8_t sFactoryResetCntr = 0;
+
+k_timer sTemperatureMeasurementTimer;
+constexpr uint16_t kSensorTimerPeriodMs = 5000; // 5s timer period
+
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+LEDWidget sStatusLED;
+#endif
+
+Button sFactoryResetButton;
+Button sThreadStartButton;
+Button sBleAdvStartButton;
+
+bool sIsThreadProvisioned = false;
+bool sIsThreadEnabled     = false;
+bool sIsThreadAttached    = false;
+bool sHaveBLEConnections  = false;
+
+chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider;
+
+} // namespace
+
+AppTask AppTask::sAppTask;
+
+class AppFabricTableDelegate : public FabricTable::Delegate
+{
+    void OnFabricRemoved(const FabricTable & fabricTable, FabricIndex fabricIndex)
+    {
+        if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0)
+        {
+            chip::Server::GetInstance().ScheduleFactoryReset();
+        }
+    }
+};
+
+CHIP_ERROR AppTask::Init(void)
+{
+    LOG_INF("SW Version: %u, %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION, CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING);
+
+    // Initialize LEDs
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+    LEDWidget::InitGpio(LEDS_PORT);
+    LEDWidget::SetStateUpdateCallback(LEDStateUpdateHandler);
+
+    sStatusLED.Init(SYSTEM_STATE_LED);
+
+    UpdateStatusLED();
+#endif
+
+    InitButtons();
+
+    // Initialize function button timer
+    k_timer_init(&sFactoryResetTimer, &AppTask::FactoryResetTimerTimeoutCallback, nullptr);
+    k_timer_user_data_set(&sFactoryResetTimer, this);
+
+    // Initialize temperature measurement timer
+    k_timer_init(&sTemperatureMeasurementTimer, &AppTask::TemperatureMeasurementTimerTimeoutCallback, nullptr);
+    k_timer_user_data_set(&sTemperatureMeasurementTimer, this);
+    k_timer_start(&sTemperatureMeasurementTimer, K_MSEC(kSensorTimerPeriodMs), K_NO_WAIT);
+
+    // Initialize CHIP server
+#if CONFIG_CHIP_FACTORY_DATA
+    ReturnErrorOnFailure(mFactoryDataProvider.Init());
+    SetDeviceInstanceInfoProvider(&mFactoryDataProvider);
+    SetDeviceAttestationCredentialsProvider(&mFactoryDataProvider);
+    SetCommissionableDataProvider(&mFactoryDataProvider);
+    // Read EnableKey from the factory data.
+    MutableByteSpan enableKey(sTestEventTriggerEnableKey);
+    err = mFactoryDataProvider.GetEnableKey(enableKey);
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("GetEnableKey fail");
+        memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey));
+    }
+#else
+    SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
+#endif
+
+    static CommonCaseDeviceServerInitParams initParams;
+    (void) initParams.InitializeStaticResourcesBeforeServerInit();
+    ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams));
+
+    gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
+    chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
+
+#if CONFIG_CHIP_OTA_REQUESTOR
+    InitBasicOTARequestor();
+#endif
+
+    ConfigurationMgr().LogDeviceConfig();
+    PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
+
+    // Add CHIP event handler and start CHIP thread.
+    // Note that all the initialization code should happen prior to this point to avoid data races
+    // between the main and the CHIP threads.
+    PlatformMgr().AddEventHandler(ChipEventHandler, 0);
+
+    // Init Temperature Sensor
+    CHIP_ERROR err = SensorMgr().Init();
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("SensorMgr Init fail");
+        return err;
+    }
+
+    PlatformMgr().LockChipStack();
+    app::Clusters::TemperatureMeasurement::Attributes::MinMeasuredValue::Set(kEndpointId, SensorMgr().GetMinMeasuredValue());
+    app::Clusters::TemperatureMeasurement::Attributes::MaxMeasuredValue::Set(kEndpointId, SensorMgr().GetMaxMeasuredValue());
+    PlatformMgr().UnlockChipStack();
+
+    err = ConnectivityMgr().SetBLEDeviceName("TelinkTerm");
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("SetBLEDeviceName fail");
+        return err;
+    }
+
+    err = chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(new AppFabricTableDelegate);
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("AppFabricTableDelegate fail");
+        return err;
+    }
+
+    return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR AppTask::StartApp(void)
+{
+    CHIP_ERROR err = Init();
+
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("AppTask Init fail");
+        return err;
+    }
+
+    AppEvent event = {};
+
+    while (true)
+    {
+        k_msgq_get(&sAppEventQueue, &event, K_FOREVER);
+        DispatchEvent(&event);
+    }
+}
+
+void AppTask::FactoryResetButtonEventHandler(void)
+{
+    AppEvent event;
+
+    event.Type               = AppEvent::kEventType_Button;
+    event.ButtonEvent.Action = kButtonPushEvent;
+    event.Handler            = FactoryResetHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::FactoryResetHandler(AppEvent * aEvent)
+{
+    if (sFactoryResetCntr == 0)
+    {
+        k_timer_start(&sFactoryResetTimer, K_MSEC(kFactoryResetCalcTimeout), K_NO_WAIT);
+    }
+
+    sFactoryResetCntr++;
+    LOG_INF("Factory Reset Trigger Counter: %d/%d", sFactoryResetCntr, kFactoryResetTriggerCntr);
+
+    if (sFactoryResetCntr == kFactoryResetTriggerCntr)
+    {
+        k_timer_stop(&sFactoryResetTimer);
+        sFactoryResetCntr = 0;
+
+        chip::Server::GetInstance().ScheduleFactoryReset();
+    }
+}
+
+void AppTask::StartThreadButtonEventHandler(void)
+{
+    AppEvent event;
+
+    event.Type               = AppEvent::kEventType_Button;
+    event.ButtonEvent.Action = kButtonPushEvent;
+    event.Handler            = StartThreadHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::StartThreadHandler(AppEvent * aEvent)
+{
+    LOG_INF("StartThreadHandler");
+    if (!chip::DeviceLayer::ConnectivityMgr().IsThreadProvisioned())
+    {
+        // Switch context from BLE to Thread
+        Internal::BLEManagerImpl sInstance;
+        sInstance.SwitchToIeee802154();
+        StartDefaultThreadNetwork();
+    }
+    else
+    {
+        LOG_INF("Device already commissioned");
+    }
+}
+
+void AppTask::StartBleAdvButtonEventHandler(void)
+{
+    AppEvent event;
+
+    event.Type               = AppEvent::kEventType_Button;
+    event.ButtonEvent.Action = kButtonPushEvent;
+    event.Handler            = StartBleAdvHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::StartBleAdvHandler(AppEvent * aEvent)
+{
+    LOG_INF("StartBleAdvHandler");
+
+    // Don't allow on starting Matter service BLE advertising after Thread provisioning.
+    if (ConnectivityMgr().IsThreadProvisioned())
+    {
+        LOG_INF("Device already commissioned");
+        return;
+    }
+
+    if (ConnectivityMgr().IsBLEAdvertisingEnabled())
+    {
+        LOG_INF("BLE adv already enabled");
+        return;
+    }
+
+    if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR)
+    {
+        LOG_ERR("OpenBasicCommissioningWindow fail");
+    }
+}
+
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+void AppTask::UpdateLedStateEventHandler(AppEvent * aEvent)
+{
+    if (aEvent->Type == AppEvent::kEventType_UpdateLedState)
+    {
+        aEvent->UpdateLedStateEvent.LedWidget->UpdateState();
+    }
+}
+
+void AppTask::LEDStateUpdateHandler(LEDWidget * ledWidget)
+{
+    AppEvent event;
+    event.Type                          = AppEvent::kEventType_UpdateLedState;
+    event.Handler                       = UpdateLedStateEventHandler;
+    event.UpdateLedStateEvent.LedWidget = ledWidget;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::UpdateStatusLED(void)
+{
+    if (sIsThreadProvisioned && sIsThreadEnabled)
+    {
+        if (sIsThreadAttached)
+        {
+            sStatusLED.Blink(950, 50);
+        }
+        else
+        {
+            sStatusLED.Blink(100, 100);
+        }
+    }
+    else
+    {
+        sStatusLED.Blink(50, 950);
+    }
+}
+#endif
+
+void AppTask::ChipEventHandler(const ChipDeviceEvent * event, intptr_t /* arg */)
+{
+    switch (event->Type)
+    {
+    case DeviceEventType::kCHIPoBLEAdvertisingChange:
+        sHaveBLEConnections = ConnectivityMgr().NumBLEConnections() != 0;
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+        UpdateStatusLED();
+#endif
+        break;
+    case DeviceEventType::kThreadStateChange:
+        sIsThreadProvisioned = ConnectivityMgr().IsThreadProvisioned();
+        sIsThreadEnabled     = ConnectivityMgr().IsThreadEnabled();
+        sIsThreadAttached    = ConnectivityMgr().IsThreadAttached();
+#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
+        UpdateStatusLED();
+#endif
+        break;
+    case DeviceEventType::kThreadConnectivityChange:
+#if CONFIG_CHIP_OTA_REQUESTOR
+        if (event->ThreadConnectivityChange.Result == kConnectivity_Established)
+        {
+            InitBasicOTARequestor();
+        }
+#endif
+        break;
+    default:
+        break;
+    }
+}
+
+void AppTask::PostEvent(AppEvent * aEvent)
+{
+    if (k_msgq_put(&sAppEventQueue, aEvent, K_NO_WAIT) != 0)
+    {
+        LOG_INF("PostEvent fail");
+    }
+}
+
+void AppTask::DispatchEvent(AppEvent * aEvent)
+{
+    if (aEvent->Handler)
+    {
+        aEvent->Handler(aEvent);
+    }
+    else
+    {
+        LOG_INF("Dropping event without handler");
+    }
+}
+
+void AppTask::TemperatureMeasurementTimerTimeoutCallback(k_timer * timer)
+{
+    if (!timer)
+    {
+        return;
+    }
+
+    AppEvent event;
+    event.Type    = AppEvent::kEventType_Timer;
+    event.Handler = TemperatureMeasurementTimerEventHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::TemperatureMeasurementTimerEventHandler(AppEvent * aEvent)
+{
+    if (aEvent->Type != AppEvent::kEventType_Timer)
+    {
+        return;
+    }
+
+    PlatformMgr().LockChipStack();
+    app::Clusters::TemperatureMeasurement::Attributes::MeasuredValue::Set(kEndpointId, SensorMgr().GetMeasuredValue());
+    PlatformMgr().UnlockChipStack();
+
+    LOG_INF("Current temperature is (%d*0.01)°C", SensorMgr().GetMeasuredValue());
+
+    // Start next timer to handle temp sensor.
+    k_timer_start(&sTemperatureMeasurementTimer, K_MSEC(kSensorTimerPeriodMs), K_NO_WAIT);
+}
+
+void AppTask::FactoryResetTimerTimeoutCallback(k_timer * timer)
+{
+    if (!timer)
+    {
+        return;
+    }
+
+    AppEvent event;
+    event.Type    = AppEvent::kEventType_Timer;
+    event.Handler = FactoryResetTimerEventHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::FactoryResetTimerEventHandler(AppEvent * aEvent)
+{
+    if (aEvent->Type != AppEvent::kEventType_Timer)
+    {
+        return;
+    }
+
+    sFactoryResetCntr = 0;
+    LOG_INF("Factory Reset Trigger Counter is cleared");
+}
+
+void AppTask::InitButtons(void)
+{
+#if CONFIG_CHIP_BUTTON_MANAGER_IRQ_MODE
+    sFactoryResetButton.Configure(BUTTON_PORT, BUTTON_PIN_1, FactoryResetButtonEventHandler);
+    sThreadStartButton.Configure(BUTTON_PORT, BUTTON_PIN_3, StartThreadButtonEventHandler);
+    sBleAdvStartButton.Configure(BUTTON_PORT, BUTTON_PIN_4, StartBleAdvButtonEventHandler);
+#else
+    sFactoryResetButton.Configure(BUTTON_PORT, BUTTON_PIN_3, BUTTON_PIN_1, FactoryResetButtonEventHandler);
+    sThreadStartButton.Configure(BUTTON_PORT, BUTTON_PIN_3, BUTTON_PIN_2, StartThreadButtonEventHandler);
+    sBleAdvStartButton.Configure(BUTTON_PORT, BUTTON_PIN_4, BUTTON_PIN_2, StartBleAdvButtonEventHandler);
+#endif
+
+    ButtonManagerInst().AddButton(sFactoryResetButton);
+    ButtonManagerInst().AddButton(sThreadStartButton);
+    ButtonManagerInst().AddButton(sBleAdvStartButton);
+}
diff --git a/examples/temperature-measurement-app/telink/src/SensorManager.cpp b/examples/temperature-measurement-app/telink/src/SensorManager.cpp
new file mode 100644
index 00000000000000..b108c59fab83a1
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/src/SensorManager.cpp
@@ -0,0 +1,93 @@
+/*
+ *
+ *    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 "SensorManager.h"
+#include "AppConfig.h"
+#include "AppEvent.h"
+#include "AppTask.h"
+
+#define TEMPERATURE_SIMULATION_IS_USED
+
+LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace chip;
+using namespace ::chip::DeviceLayer;
+
+constexpr float kMinTemperatureDelta          = 0.5; // 0.5 degree Celsius
+constexpr uint16_t kSimulatedReadingFrequency = 5;   // Change Simulated number
+static float mSimulatedTemp[]                 = { 23.01, 24.02, 28.03, 25.50, 22.05, 21.25, 21.07, 26.08, 18.09, 27.11 };
+
+k_timer sSensorTimer;
+
+SensorManager SensorManager::sSensorManager;
+
+CHIP_ERROR SensorManager::Init()
+{
+    // TODO: Initialize temp sensor
+    return CHIP_NO_ERROR;
+}
+
+int16_t SensorManager::SensorEventHandler()
+{
+    float temperature            = 0.0;
+    static float lastTemperature = 0.0;
+
+#ifdef TEMPERATURE_SIMULATION_IS_USED
+    static uint8_t nbOfRepetition = 0;
+    static uint8_t simulatedIndex = 0;
+    if (simulatedIndex >= sizeof(mSimulatedTemp) - 1)
+    {
+        simulatedIndex = 0;
+    }
+    temperature = mSimulatedTemp[simulatedIndex];
+
+    nbOfRepetition++;
+
+    if (nbOfRepetition >= kSimulatedReadingFrequency)
+    {
+        simulatedIndex++;
+        nbOfRepetition = 0;
+    }
+
+    if ((temperature >= (lastTemperature + kMinTemperatureDelta)) || temperature <= (lastTemperature - kMinTemperatureDelta))
+    {
+        lastTemperature = temperature;
+        // Per spec Application Clusters 2.3.4.1. : MeasuredValue = 100 x temperature [°C]
+        sSensorManager.mMeasuredTempCelsius = (int16_t) 100 * temperature;
+    }
+#else
+    // TODO: provide REAL sensor implementation
+    sSensorManager.mMeasuredTempCelsius = (int16_t) 100 * GetRealSensorTemperature();
+#endif // TEMPERATURE_SIMULATION_IS_USED
+    return sSensorManager.mMeasuredTempCelsius;
+}
+
+int16_t SensorManager::GetMeasuredValue()
+{
+    return SensorEventHandler();
+}
+
+int16_t SensorManager::GetMinMeasuredValue()
+{
+    return mMinMeasuredTempCelsius;
+}
+
+int16_t SensorManager::GetMaxMeasuredValue()
+{
+    return mMaxMeasuredTempCelsius;
+}
diff --git a/examples/temperature-measurement-app/telink/src/main.cpp b/examples/temperature-measurement-app/telink/src/main.cpp
new file mode 100644
index 00000000000000..71aa52f9d91901
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/src/main.cpp
@@ -0,0 +1,82 @@
+/*
+ *
+ *    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 <lib/support/CHIPMem.h>
+#include <platform/CHIPDeviceLayer.h>
+
+#include <zephyr/kernel.h>
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+
+int main(void)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+
+    err = chip::Platform::MemoryInit();
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("MemoryInit fail");
+        goto exit;
+    }
+
+    err = PlatformMgr().InitChipStack();
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("InitChipStack fail");
+        goto exit;
+    }
+
+    err = PlatformMgr().StartEventLoopTask();
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("StartEventLoopTask fail");
+        goto exit;
+    }
+
+    err = ThreadStackMgr().InitThreadStack();
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("InitThreadStack fail");
+        goto exit;
+    }
+
+#ifdef CONFIG_OPENTHREAD_MTD_SED
+    err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice);
+#elif CONFIG_OPENTHREAD_MTD
+    err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice);
+#else
+    err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router);
+#endif
+    if (err != CHIP_NO_ERROR)
+    {
+        LOG_ERR("SetThreadDeviceType fail");
+        goto exit;
+    }
+
+    err = GetAppTask().StartApp();
+
+exit:
+    LOG_ERR("Exit err %" CHIP_ERROR_FORMAT, err.Format());
+    return (err == CHIP_NO_ERROR) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/temperature-measurement-app/telink/third_party/connectedhomeip b/examples/temperature-measurement-app/telink/third_party/connectedhomeip
new file mode 120000
index 00000000000000..c866b86874994d
--- /dev/null
+++ b/examples/temperature-measurement-app/telink/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../..
\ No newline at end of file
diff --git a/examples/temperature-measurement-app/temperature-measurement-common/BUILD.gn b/examples/temperature-measurement-app/temperature-measurement-common/BUILD.gn
new file mode 100644
index 00000000000000..0430c288a90354
--- /dev/null
+++ b/examples/temperature-measurement-app/temperature-measurement-common/BUILD.gn
@@ -0,0 +1,25 @@
+# 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("${chip_root}/src/app/chip_data_model.gni")
+
+chip_data_model("temperature-measurement-common") {
+  zap_file = "temperature-measurement.zap"
+
+  zap_pregenerated_dir =
+      "${chip_root}/zzz_generated/temperature-measurement/zap-generated"
+  is_server = true
+}
diff --git a/examples/temperature-measurement-app/esp32/main/temperature-measurement.matter b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter
similarity index 100%
rename from examples/temperature-measurement-app/esp32/main/temperature-measurement.matter
rename to examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter
diff --git a/examples/temperature-measurement-app/esp32/main/temperature-measurement.zap b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap
similarity index 99%
rename from examples/temperature-measurement-app/esp32/main/temperature-measurement.zap
rename to examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap
index 2b857dd62065a0..f389822f276167 100644
--- a/examples/temperature-measurement-app/esp32/main/temperature-measurement.zap
+++ b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap
@@ -18,7 +18,7 @@
   "package": [
     {
       "pathRelativity": "relativeToZap",
-      "path": "../../../../src/app/zap-templates/zcl/zcl.json",
+      "path": "../../../src/app/zap-templates/zcl/zcl.json",
       "type": "zcl-properties",
       "category": "matter",
       "version": 1,
@@ -26,7 +26,7 @@
     },
     {
       "pathRelativity": "relativeToZap",
-      "path": "../../../../src/app/zap-templates/app-templates.json",
+      "path": "../../../src/app/zap-templates/app-templates.json",
       "type": "gen-templates-json",
       "version": "chip-v1"
     }
diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py
index 97dc96bf08fc5f..b7edc6d13dcc68 100755
--- a/scripts/build/build/targets.py
+++ b/scripts/build/build/targets.py
@@ -552,6 +552,7 @@ def BuildTelinkTarget():
         TargetPart('ota-requestor', app=TelinkApp.OTA_REQUESTOR),
         TargetPart('pump', app=TelinkApp.PUMP),
         TargetPart('pump-controller', app=TelinkApp.PUMP_CONTROLLER),
+        TargetPart('temperature-measurement', app=TelinkApp.TEMPERATURE_MEASUREMENT),
         TargetPart('thermostat', app=TelinkApp.THERMOSTAT),
     ])
 
diff --git a/scripts/build/builders/telink.py b/scripts/build/builders/telink.py
index d4434019874ef5..348233d331baf9 100644
--- a/scripts/build/builders/telink.py
+++ b/scripts/build/builders/telink.py
@@ -30,6 +30,7 @@ class TelinkApp(Enum):
     OTA_REQUESTOR = auto()
     PUMP = auto()
     PUMP_CONTROLLER = auto()
+    TEMPERATURE_MEASUREMENT = auto()
     THERMOSTAT = auto()
 
     def ExampleName(self):
@@ -51,6 +52,8 @@ def ExampleName(self):
             return 'pump-app'
         elif self == TelinkApp.PUMP_CONTROLLER:
             return 'pump-controller-app'
+        elif self == TelinkApp.TEMPERATURE_MEASUREMENT:
+            return 'temperature-measurement-app'
         elif self == TelinkApp.THERMOSTAT:
             return 'thermostat'
         else:
@@ -75,6 +78,8 @@ def AppNamePrefix(self):
             return 'chip-telink-pump-example'
         elif self == TelinkApp.PUMP_CONTROLLER:
             return 'chip-telink-pump-controller-example'
+        elif self == TelinkApp.TEMPERATURE_MEASUREMENT:
+            return 'chip-telink-temperature-measurement-example'
         elif self == TelinkApp.THERMOSTAT:
             return 'chip-telink-thermostat-example'
         else:
diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt
index e0d4909974106e..f22e7d1820d549 100644
--- a/scripts/build/testdata/all_targets_linux_x64.txt
+++ b/scripts/build/testdata/all_targets_linux_x64.txt
@@ -19,5 +19,5 @@ nrf-{nrf5340dk,nrf52840dk,nrf52840dongle}-{all-clusters,all-clusters-minimal,loc
 nrf-native-posix-64-tests
 qpg-qpg6105-{lock,light,shell,persistent-storage}
 tizen-arm-{all-clusters,all-clusters-minimal,chip-tool,light,tests}[-no-ble][-no-wifi][-asan][-ubsan]
-telink-tlsr9518adk80d-{all-clusters,all-clusters-minimal,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,thermostat}[-rpc]
+telink-tlsr9518adk80d-{all-clusters,all-clusters-minimal,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,temperature-measurement,thermostat}[-rpc]
 openiotsdk-{shell,lock}