[ota-requestor-app] Reference implementation for AnnounceOTAProvider command (#10434)

* implement ota-requestor command handlers and delegate class

* fix ota requestor delegate comment

* logging improvements from Tennessee's suggestions

* logging improvements/fixes and some name changes

* change AnnounceOTAProvider providerLocation field to chip::NodeID

* suggestions from Sergei

- handle default in announcementReason switch statement
- use auto & in emberAf callback

* use kUndefined values instead of Optional for FabricIndex and NodeId

* remove accidental esp32 folder

* restyling

* use DecodeableType in OTA Requestor Delegate

* regen with pep8 installed

* move emberAf handler for AnnounceOtaProvider to application code

* apply new timer argument fix

* rename providerId to providerNodeId

* remove ota-requestor directory (no longer used)

* use CHIP_ERROR_FORMAT
diff --git a/examples/ota-requestor-app/linux/ExampleSelfCommissioning.h b/examples/ota-requestor-app/linux/ExampleSelfCommissioning.h
index 99346b7..26e8b9c 100644
--- a/examples/ota-requestor-app/linux/ExampleSelfCommissioning.h
+++ b/examples/ota-requestor-app/linux/ExampleSelfCommissioning.h
@@ -42,7 +42,8 @@
     VerifyOrExit(storage != nullptr && opCredsIssuer != nullptr, err = CHIP_ERROR_INVALID_ARGUMENT);
 
     err = opCredsIssuer->Initialize(*storage);
-    VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init failure! Operational Cred Issuer: %s", chip::ErrorStr(err)));
+    VerifyOrExit(err == CHIP_NO_ERROR,
+                 ChipLogError(Controller, "Init failure! Operational Cred Issuer: %" CHIP_ERROR_FORMAT, err.Format()));
 
     VerifyOrExit(rcac.Alloc(chip::Controller::kMaxCHIPDERCertLength), err = CHIP_ERROR_NO_MEMORY);
     VerifyOrExit(noc.Alloc(chip::Controller::kMaxCHIPDERCertLength), err = CHIP_ERROR_NO_MEMORY);
@@ -74,10 +75,11 @@
         auto & factory = chip::Controller::DeviceControllerFactory::GetInstance();
 
         err = factory.Init(initParams);
-        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Controller Factory init failure! %s", chip::ErrorStr(err)));
+        VerifyOrExit(err == CHIP_NO_ERROR,
+                     ChipLogError(Controller, "Controller Factory init failure! %" CHIP_ERROR_FORMAT, err.Format()));
 
         err = factory.SetupController(setupParams, controller);
-        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Controller init failure! %s", chip::ErrorStr(err)));
+        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Controller init failure! %" CHIP_ERROR_FORMAT, err.Format()));
     }
 
 exit:
diff --git a/examples/ota-requestor-app/linux/main.cpp b/examples/ota-requestor-app/linux/main.cpp
index 857294f..8fca12c 100644
--- a/examples/ota-requestor-app/linux/main.cpp
+++ b/examples/ota-requestor-app/linux/main.cpp
@@ -16,6 +16,7 @@
  *    limitations under the License.
  */
 
+#include <app-common/zap-generated/callback.h>
 #include <app-common/zap-generated/enums.h>
 #include <app/server/Server.h>
 #include <app/util/util.h>
@@ -40,6 +41,7 @@
 #include <zap-generated/CHIPClusters.h>
 
 #include "BDXDownloader.h"
+#include "ExampleOTARequestor.h"
 #include "ExampleSelfCommissioning.h"
 #include "PersistentStorage.h"
 
@@ -70,7 +72,7 @@
                           CharSpan softwareVersionString, chip::ByteSpan updateToken, bool userConsentNeeded,
                           chip::ByteSpan metadataForRequestor)
 {
-    ChipLogDetail(SoftwareUpdate, "%s", __FUNCTION__);
+    ChipLogDetail(SoftwareUpdate, "QueryImageResponse responded with action %" PRIu8, status);
 
     TransferSession::TransferInitData initOptions;
     initOptions.TransferCtlFlags = chip::bdx::TransferControlFlags::kReceiverDrive;
@@ -132,7 +134,7 @@
     err = cluster.Associate(device, kOtaProviderEndpoint);
     if (err != CHIP_NO_ERROR)
     {
-        ChipLogError(SoftwareUpdate, "Associate() failed: %s", chip::ErrorStr(err));
+        ChipLogError(SoftwareUpdate, "Associate() failed: %" CHIP_ERROR_FORMAT, err.Format());
         return;
     }
     err = cluster.QueryImage(successCallback, failureCallback, kExampleVendorId, kExampleProductId, kExampleHWVersion,
@@ -140,13 +142,13 @@
                              metadata);
     if (err != CHIP_NO_ERROR)
     {
-        ChipLogError(SoftwareUpdate, "QueryImage() failed: %s", chip::ErrorStr(err));
+        ChipLogError(SoftwareUpdate, "QueryImage() failed: %" CHIP_ERROR_FORMAT, err.Format());
     }
 }
 
 void OnConnectFail(void * context, chip::NodeId deviceId, CHIP_ERROR error)
 {
-    ChipLogError(SoftwareUpdate, "failed to connect to 0x%" PRIX64 ": %s", deviceId, chip::ErrorStr(error));
+    ChipLogError(SoftwareUpdate, "failed to connect to 0x%" PRIX64 ": %" CHIP_ERROR_FORMAT, deviceId, error.Format());
 }
 
 Callback<OnDeviceConnected> mConnectionCallback(OnConnection, nullptr);
@@ -260,12 +262,10 @@
 
     chip::DeviceLayer::ConfigurationMgr().LogDeviceConfig();
     err = mStorage.Init();
-    VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init Storage failure: %s", chip::ErrorStr(err)));
+    VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init Storage failure: %" CHIP_ERROR_FORMAT, err.Format()));
 
     chip::Logging::SetLogFilter(mStorage.GetLoggingLevel());
 
-    VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "failed to set UDP port: %s", chip::ErrorStr(err)));
-
     err = chip::DeviceLayer::ConfigurationMgr().StoreSetupDiscriminator(setupDiscriminator);
     if (err == CHIP_NO_ERROR)
     {
@@ -273,7 +273,7 @@
     }
     else
     {
-        ChipLogError(SoftwareUpdate, "Setup discriminator setting failed with code: %s \n", chip::ErrorStr(err));
+        ChipLogError(SoftwareUpdate, "Setup discriminator setting failed with code: %" CHIP_ERROR_FORMAT "\n", err.Format());
         goto exit;
     }
 
@@ -301,10 +301,10 @@
         err = DoExampleSelfCommissioning(mController, &mOpCredsIssuer, &mStorage, mStorage.GetLocalNodeId(),
                                          mStorage.GetListenPort());
         VerifyOrExit(err == CHIP_NO_ERROR,
-                     ChipLogError(SoftwareUpdate, "example self-commissioning failed: %s", chip::ErrorStr(err)));
+                     ChipLogError(SoftwareUpdate, "example self-commissioning failed: %" CHIP_ERROR_FORMAT, err.Format()));
 
         err = chip::Controller::DeviceControllerFactory::GetInstance().ServiceEvents();
-        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "ServiceEvents() failed: %s", chip::ErrorStr(err)));
+        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "ServiceEvents() failed: %" CHIP_ERROR_FORMAT, err.Format()));
 
         ChipLogProgress(SoftwareUpdate, "Attempting to connect to device 0x%" PRIX64, providerNodeId);
 
@@ -312,7 +312,7 @@
         // Currently, that pairing action will persist the CASE session in persistent memory, which will then be read by the
         // following call.
         err = mController.GetDevice(providerNodeId, &providerDevice);
-        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "No device found: %s", chip::ErrorStr(err)));
+        VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "No device found: %" CHIP_ERROR_FORMAT, err.Format()));
 
         err = providerDevice->EstablishConnectivity(&mConnectionCallback, &mConnectFailCallback);
     }
@@ -320,6 +320,6 @@
     chip::DeviceLayer::PlatformMgr().RunEventLoop();
 
 exit:
-    ChipLogDetail(SoftwareUpdate, "%s", ErrorStr(err));
+    ChipLogDetail(SoftwareUpdate, "%" CHIP_ERROR_FORMAT, err.Format());
     return 0;
 }
diff --git a/examples/ota-requestor-app/ota-requestor-common/BDXDownloader.cpp b/examples/ota-requestor-app/ota-requestor-common/BDXDownloader.cpp
index 5a93ed7..025dcab 100644
--- a/examples/ota-requestor-app/ota-requestor-common/BDXDownloader.cpp
+++ b/examples/ota-requestor-app/ota-requestor-common/BDXDownloader.cpp
@@ -55,7 +55,7 @@
         break;
     case TransferSession::OutputEventType::kMsgToSend: {
         chip::Messaging::SendFlags sendFlags;
-        VerifyOrReturn(mExchangeCtx != nullptr, ChipLogError(BDX, "%s: mExchangeContext is null", __FUNCTION__));
+        VerifyOrReturn(mExchangeCtx != nullptr, ChipLogError(BDX, "mExchangeContext is null, cannot proceed"));
         if (event.msgTypeData.MessageType == static_cast<uint8_t>(MessageType::ReceiveInit))
         {
             sendFlags.Set(chip::Messaging::SendMessageFlags::kFromInitiator);
@@ -66,12 +66,11 @@
         }
         err = mExchangeCtx->SendMessage(event.msgTypeData.ProtocolId, event.msgTypeData.MessageType, std::move(event.MsgData),
                                         sendFlags);
-        VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(BDX, "%s: SendMessage failed: %s", __FUNCTION__, chip::ErrorStr(err)));
+        VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(BDX, "SendMessage failed: %" CHIP_ERROR_FORMAT, err.Format()));
         break;
     }
     case TransferSession::OutputEventType::kAcceptReceived:
-        VerifyOrReturn(CHIP_NO_ERROR == mTransfer.PrepareBlockQuery(),
-                       ChipLogError(BDX, "%s: PrepareBlockQuery failed", __FUNCTION__));
+        VerifyOrReturn(CHIP_NO_ERROR == mTransfer.PrepareBlockQuery(), ChipLogError(BDX, "PrepareBlockQuery failed"));
         break;
     case TransferSession::OutputEventType::kBlockReceived: {
         ChipLogDetail(BDX, "Got block length %zu", event.blockdata.Length);
@@ -84,15 +83,13 @@
         if (event.blockdata.IsEof)
         {
             err = mTransfer.PrepareBlockAck();
-            VerifyOrReturn(err == CHIP_NO_ERROR,
-                           ChipLogError(BDX, "%s: PrepareBlockAck failed: %s", __FUNCTION__, chip::ErrorStr(err)));
+            VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(BDX, "PrepareBlockAck failed: %" CHIP_ERROR_FORMAT, err.Format()));
             mIsTransferComplete = true;
         }
         else
         {
             err = mTransfer.PrepareBlockQuery();
-            VerifyOrReturn(err == CHIP_NO_ERROR,
-                           ChipLogError(BDX, "%s: PrepareBlockQuery failed: %s", __FUNCTION__, chip::ErrorStr(err)));
+            VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(BDX, "PrepareBlockQuery failed: %" CHIP_ERROR_FORMAT, err.Format()));
         }
         break;
     }
@@ -116,6 +113,6 @@
     case TransferSession::OutputEventType::kQueryReceived:
     case TransferSession::OutputEventType::kAckEOFReceived:
     default:
-        ChipLogError(BDX, "%s: unexpected event type", __FUNCTION__);
+        ChipLogError(BDX, "Unexpected BDX event type: %" PRIu16, static_cast<uint16_t>(event.EventType));
     }
 }
diff --git a/examples/ota-requestor-app/ota-requestor-common/BUILD.gn b/examples/ota-requestor-app/ota-requestor-common/BUILD.gn
index 600fc00..a48a989 100644
--- a/examples/ota-requestor-app/ota-requestor-common/BUILD.gn
+++ b/examples/ota-requestor-app/ota-requestor-common/BUILD.gn
@@ -33,9 +33,13 @@
   sources = [
     "BDXDownloader.cpp",
     "BDXDownloader.h",
+    "ExampleOTARequestor.cpp",
+    "ExampleOTARequestor.h",
   ]
 
   is_server = true
 
   public_configs = [ ":config" ]
+
+  is_server = true
 }
diff --git a/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.cpp b/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.cpp
new file mode 100644
index 0000000..0937852
--- /dev/null
+++ b/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.cpp
@@ -0,0 +1,142 @@
+/*
+ *
+ *    Copyright (c) 2021 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 <ExampleOTARequestor.h>
+
+#include <app-common/zap-generated/enums.h>
+#include <app/util/af-enums.h>
+#include <app/util/util.h>
+#include <controller/CHIPDevice.h>
+#include <lib/core/NodeId.h>
+#include <lib/support/BufferReader.h>
+#include <lib/support/Span.h>
+#include <lib/support/logging/CHIPLogging.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <system/SystemClock.h>
+#include <transport/FabricTable.h>
+
+using chip::FabricInfo;
+
+ExampleOTARequestor ExampleOTARequestor::sInstance;
+
+constexpr uint32_t kImmediateStartDelayMs = 1; // Start the timer with this value when starting OTA "immediately"
+
+// OTA Software Update Requestor Cluster AnnounceOtaProvider Command callback (from client)
+bool emberAfOtaSoftwareUpdateRequestorClusterAnnounceOtaProviderCallback(
+    chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
+    const chip::app::Clusters::OtaSoftwareUpdateRequestor::Commands::AnnounceOtaProvider::DecodableType & commandData)
+{
+    EmberAfStatus status = ExampleOTARequestor::GetInstance().HandleAnnounceOTAProvider(commandObj, commandPath, commandData);
+    emberAfSendImmediateDefaultResponse(status);
+    return true;
+}
+
+ExampleOTARequestor::ExampleOTARequestor()
+{
+    mOtaStartDelayMs     = 0;
+    mProviderNodeId      = chip::kUndefinedNodeId;
+    mProviderFabricIndex = chip::kUndefinedFabricIndex;
+}
+
+void ExampleOTARequestor::Init(chip::Controller::ControllerDeviceInitParams connectParams, uint32_t startDelayMs)
+{
+    mConnectParams   = connectParams;
+    mOtaStartDelayMs = startDelayMs;
+}
+
+void ExampleOTARequestor::ConnectToProvider()
+{
+    FabricInfo * providerFabric = GetProviderFabricInfo();
+    VerifyOrReturn(providerFabric != nullptr,
+                   ChipLogError(SoftwareUpdate, "No Fabric found for index %" PRIu8, mProviderFabricIndex));
+
+    ChipLogProgress(SoftwareUpdate,
+                    "Once #7976 is fixed, this would attempt to connect to 0x" ChipLogFormatX64 " on FabricIndex 0x%" PRIu8
+                    " (" ChipLogFormatX64 ")",
+                    ChipLogValueX64(mProviderNodeId), mProviderFabricIndex, ChipLogValueX64(providerFabric->GetFabricId()));
+
+    // TODO: uncomment and fill in after #7976 is fixed
+    // mProviderDevice.Init(mConnectParams, mProviderNodeId, address, mProviderFabricIndex);
+    // mProviderDevice.EstablishConnectivity();
+}
+
+EmberAfStatus ExampleOTARequestor::HandleAnnounceOTAProvider(
+    chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
+    const chip::app::Clusters::OtaSoftwareUpdateRequestor::Commands::AnnounceOtaProvider::DecodableType & commandData)
+{
+    auto & providerLocation   = commandData.providerLocation;
+    auto & announcementReason = commandData.announcementReason;
+
+    if (commandObj == nullptr || commandObj->GetExchangeContext() == nullptr)
+    {
+        ChipLogError(SoftwareUpdate, "Cannot access ExchangeContext for FabricIndex");
+        return EMBER_ZCL_STATUS_INVALID_ARGUMENT;
+    }
+
+    mProviderNodeId      = providerLocation;
+    mProviderFabricIndex = commandObj->GetExchangeContext()->GetSecureSession().GetFabricIndex();
+
+    FabricInfo * providerFabric = GetProviderFabricInfo();
+    if (providerFabric == nullptr)
+    {
+        ChipLogError(SoftwareUpdate, "No Fabric found for index %" PRIu8, mProviderFabricIndex);
+        return EMBER_ZCL_STATUS_SUCCESS;
+    }
+
+    ChipLogProgress(SoftwareUpdate,
+                    "Notified of Provider at NodeID: 0x" ChipLogFormatX64 "on FabricIndex 0x%" PRIu8 " (" ChipLogFormatX64 ")",
+                    ChipLogValueX64(mProviderNodeId), mProviderFabricIndex, ChipLogValueX64(providerFabric->GetFabricId()));
+
+    // If reason is URGENT_UPDATE_AVAILABLE, we start OTA immediately. Otherwise, respect the timer value set in mOtaStartDelayMs.
+    // This is done to exemplify what a real-world OTA Requestor might do while also being configurable enough to use as a test app.
+    uint32_t msToStart = 0;
+    switch (announcementReason)
+    {
+    case static_cast<uint8_t>(EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT):
+    case static_cast<uint8_t>(EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE):
+        msToStart = mOtaStartDelayMs;
+        break;
+    case static_cast<uint8_t>(EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_URGENT_UPDATE_AVAILABLE):
+        msToStart = kImmediateStartDelayMs;
+        break;
+    default:
+        ChipLogError(SoftwareUpdate, "Unexpected announcementReason: %" PRIu8, static_cast<uint8_t>(announcementReason));
+        return EMBER_ZCL_STATUS_INVALID_ARGUMENT;
+    }
+
+    chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Milliseconds32(msToStart), StartDelayTimerHandler, this);
+
+    return EMBER_ZCL_STATUS_SUCCESS;
+}
+
+void ExampleOTARequestor::StartDelayTimerHandler(chip::System::Layer * systemLayer, void * appState)
+{
+    VerifyOrReturn(appState != nullptr);
+    static_cast<ExampleOTARequestor *>(appState)->ConnectToProvider();
+}
+
+chip::FabricInfo * ExampleOTARequestor::GetProviderFabricInfo()
+{
+    if (mConnectParams.fabricsTable == nullptr)
+    {
+        ChipLogError(SoftwareUpdate, "FabricTable is null!");
+        return nullptr;
+    }
+
+    return mConnectParams.fabricsTable->FindFabricWithIndex(mProviderFabricIndex);
+}
diff --git a/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.h b/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.h
new file mode 100644
index 0000000..5cec185
--- /dev/null
+++ b/examples/ota-requestor-app/ota-requestor-common/ExampleOTARequestor.h
@@ -0,0 +1,56 @@
+/*
+ *
+ *    Copyright (c) 2021 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <app-common/zap-generated/cluster-objects.h>
+#include <app/Command.h>
+#include <app/util/basic-types.h>
+#include <controller/CHIPDevice.h>
+#include <lib/core/NodeId.h>
+#include <lib/core/Optional.h>
+
+// An example implementation for how an application might handle receiving an AnnounceOTAProvider command. In this case, the
+// AnnounceOTAProvider command will be used as a trigger to send a QueryImage command and begin the OTA process. This class also
+// contains other application-specific logic related to OTA Software Update.
+class ExampleOTARequestor
+{
+public:
+    static ExampleOTARequestor & GetInstance() { return sInstance; }
+
+    void Init(chip::Controller::ControllerDeviceInitParams connectParams, uint32_t startDelayMs);
+
+    EmberAfStatus HandleAnnounceOTAProvider(
+        chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
+        const chip::app::Clusters::OtaSoftwareUpdateRequestor::Commands::AnnounceOtaProvider::DecodableType & commandData);
+
+private:
+    ExampleOTARequestor();
+
+    static void StartDelayTimerHandler(chip::System::Layer * systemLayer, void * appState);
+    void ConnectToProvider();
+    chip::FabricInfo * GetProviderFabricInfo();
+
+    static ExampleOTARequestor sInstance;
+
+    chip::Controller::Device mProviderDevice;
+    chip::Controller::ControllerDeviceInitParams mConnectParams;
+    chip::NodeId mProviderNodeId;
+    chip::FabricIndex mProviderFabricIndex;
+    uint32_t mOtaStartDelayMs;
+};
diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
index ffde58b..74b5760 100644
--- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
+++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap
@@ -1,5 +1,5 @@
 {
-  "featureLevel": 54,
+  "featureLevel": 62,
   "creator": "zap",
   "keyValuePairs": [
     {
@@ -1081,6 +1081,403 @@
           ]
         },
         {
+          "name": "OTA Software Update Requestor",
+          "code": 42,
+          "mfgCode": null,
+          "define": "OTA_REQUESTOR_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "AnnounceOtaProvider",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": [
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "OTA Software Update Requestor",
+          "code": 42,
+          "mfgCode": null,
+          "define": "OTA_REQUESTOR_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [],
+          "attributes": [
+            {
+              "name": "default ota provider",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "update possible",
+              "code": 2,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "General Commissioning",
+          "code": 48,
+          "mfgCode": null,
+          "define": "GENERAL_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ArmFailSafe",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetRegulatoryConfig",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "CommissioningComplete",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "General Commissioning",
+          "code": 48,
+          "mfgCode": null,
+          "define": "GENERAL_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "ArmFailSafeResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetRegulatoryConfigResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "CommissioningCompleteResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "Breadcrumb",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000000000000000",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            },
+            {
+              "name": "BasicCommissioningInfoList",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            },
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "EnableNetwork",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "DisableNetwork",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": []
+        },
+        {
+          "name": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "ScanNetworksResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveNetworkResponse",
+              "code": 11,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetworkResponse",
+              "code": 13,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetworkResponse",
+              "code": 15,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "ClusterRevision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "1",
+              "reportable": 0,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
           "name": "Operational Credentials",
           "code": 62,
           "mfgCode": null,
@@ -1180,328 +1577,6 @@
           ]
         },
         {
-           "name": "General Commissioning",
-           "code": 48,
-           "mfgCode": null,
-           "define": "GENERAL_COMMISSIONING_CLUSTER",
-           "side": "client",
-           "enabled": 0,
-           "commands": [
-             {
-               "name": "ArmFailSafe",
-               "code": 0,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "SetRegulatoryConfig",
-               "code": 2,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 0
-             },
-             {
-               "name": "CommissioningComplete",
-               "code": 4,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             }
-           ],
-           "attributes": [
-             {
-               "name": "ClusterRevision",
-               "code": 65533,
-               "mfgCode": null,
-               "side": "client",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "0x0001",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             }
-           ]
-         },
-         {
-           "name": "General Commissioning",
-           "code": 48,
-           "mfgCode": null,
-           "define": "GENERAL_COMMISSIONING_CLUSTER",
-           "side": "server",
-           "enabled": 1,
-           "commands": [
-             {
-               "name": "ArmFailSafeResponse",
-               "code": 1,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "SetRegulatoryConfigResponse",
-               "code": 3,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 0,
-               "outgoing": 1
-             },
-             {
-               "name": "CommissioningCompleteResponse",
-               "code": 5,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             }
-           ],
-           "attributes": [
-             {
-               "name": "Breadcrumb",
-               "code": 0,
-               "mfgCode": null,
-               "side": "server",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "0x0000000000000000",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             },
-             {
-               "name": "BasicCommissioningInfoList",
-               "code": 1,
-               "mfgCode": null,
-               "side": "server",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             },
-             {
-               "name": "ClusterRevision",
-               "code": 65533,
-               "mfgCode": null,
-               "side": "server",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "0x0001",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             }
-           ]
-         },
-         {
-           "name": "Network Commissioning",
-           "code": 49,
-           "mfgCode": null,
-           "define": "NETWORK_COMMISSIONING_CLUSTER",
-           "side": "client",
-           "enabled": 0,
-           "commands": [
-             {
-               "name": "ScanNetworks",
-               "code": 0,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "AddWiFiNetwork",
-               "code": 2,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 0
-             },
-             {
-               "name": "UpdateWiFiNetwork",
-               "code": 4,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 0
-             },
-             {
-               "name": "AddThreadNetwork",
-               "code": 6,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 0
-             },
-             {
-               "name": "UpdateThreadNetwork",
-               "code": 8,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 0
-             },
-             {
-               "name": "RemoveNetwork",
-               "code": 10,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "EnableNetwork",
-               "code": 12,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "DisableNetwork",
-               "code": 14,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "GetLastNetworkCommissioningResult",
-               "code": 16,
-               "mfgCode": null,
-               "source": "client",
-               "incoming": 1,
-               "outgoing": 1
-             }
-           ],
-           "attributes": [
-             {
-               "name": "ClusterRevision",
-               "code": 65533,
-               "mfgCode": null,
-               "side": "client",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "0x0001",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             }
-           ]
-         },
-         {
-           "name": "Network Commissioning",
-           "code": 49,
-           "mfgCode": null,
-           "define": "NETWORK_COMMISSIONING_CLUSTER",
-           "side": "server",
-           "enabled": 1,
-           "commands": [
-             {
-               "name": "ScanNetworksResponse",
-               "code": 1,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "AddWiFiNetworkResponse",
-               "code": 3,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 0,
-               "outgoing": 1
-             },
-             {
-               "name": "UpdateWiFiNetworkResponse",
-               "code": 5,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 0,
-               "outgoing": 1
-             },
-             {
-               "name": "AddThreadNetworkResponse",
-               "code": 7,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 0,
-               "outgoing": 1
-             },
-             {
-               "name": "UpdateThreadNetworkResponse",
-               "code": 9,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 0,
-               "outgoing": 1
-             },
-             {
-               "name": "RemoveNetworkResponse",
-               "code": 11,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "EnableNetworkResponse",
-               "code": 13,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             },
-             {
-               "name": "DisableNetworkResponse",
-               "code": 15,
-               "mfgCode": null,
-               "source": "server",
-               "incoming": 1,
-               "outgoing": 1
-             }
-           ],
-           "attributes": [
-             {
-               "name": "ClusterRevision",
-               "code": 65533,
-               "mfgCode": null,
-               "side": "server",
-               "included": 1,
-               "storageOption": "RAM",
-               "singleton": 0,
-               "bounded": 0,
-               "defaultValue": "0x0001",
-               "reportable": 0,
-               "minInterval": 0,
-               "maxInterval": 65344,
-               "reportableChange": 0
-             }
-           ]
-         },
-        {
           "name": "Operational Credentials",
           "code": 62,
           "mfgCode": null,
@@ -3586,5 +3661,6 @@
       "endpointVersion": 1,
       "deviceIdentifier": 0
     }
-  ]
-}
+  ],
+  "log": []
+}
\ No newline at end of file
diff --git a/src/app/zap-templates/zcl/data-model/chip/chip-ota.xml b/src/app/zap-templates/zcl/data-model/chip/chip-ota.xml
index c2009f6..cc35fc6 100644
--- a/src/app/zap-templates/zcl/data-model/chip/chip-ota.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/chip-ota.xml
@@ -99,8 +99,8 @@
         <attribute side="server" code="0x0002" define="UPDATE_POSSIBLE"      type="BOOLEAN"                  writable="false" optional="false">update possible</attribute>
         <command source="client" code="0" name="AnnounceOtaProvider" optional="true" cli="chip ota announceotaprovider">
             <description>Notify OTA Provider that an update was applied</description>
-            <arg name="providerLocation" type="OCTET_STRING" length="16"/>
-            <arg name="vendorId" type="INT16U"/>
+            <arg name="providerLocation" type="NODE_ID"/>
+            <arg name="vendorId" type="VENDOR_ID"/>
             <arg name="announcementReason" type="OTAAnnouncementReason"/>
             <arg name="metadataForNode" type="OCTET_STRING" length="512" optional="true"/>
         </command>
diff --git a/src/controller/java/zap-generated/CHIPClusters-JNI.cpp b/src/controller/java/zap-generated/CHIPClusters-JNI.cpp
index 1cad863..6af16bb 100644
--- a/src/controller/java/zap-generated/CHIPClusters-JNI.cpp
+++ b/src/controller/java/zap-generated/CHIPClusters-JNI.cpp
@@ -20675,14 +20675,13 @@
 }
 
 JNI_METHOD(void, OtaSoftwareUpdateRequestorCluster, announceOtaProvider)
-(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback, jbyteArray providerLocation, jint vendorId,
- jint announcementReason, jbyteArray metadataForNode)
+(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback, jlong providerLocation, jint vendorId, jint announcementReason,
+ jbyteArray metadataForNode)
 {
     chip::DeviceLayer::StackLock lock;
     CHIP_ERROR err = CHIP_NO_ERROR;
     OtaSoftwareUpdateRequestorCluster * cppCluster;
 
-    JniByteArray providerLocationArr(env, providerLocation);
     JniByteArray metadataForNodeArr(env, metadataForNode);
 
     std::unique_ptr<CHIPDefaultSuccessCallback, void (*)(CHIPDefaultSuccessCallback *)> onSuccess(
@@ -20695,9 +20694,8 @@
     cppCluster = reinterpret_cast<OtaSoftwareUpdateRequestorCluster *>(clusterPtr);
     VerifyOrExit(cppCluster != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
 
-    err = cppCluster->AnnounceOtaProvider(onSuccess->Cancel(), onFailure->Cancel(),
-                                          chip::ByteSpan((const uint8_t *) providerLocationArr.data(), providerLocationArr.size()),
-                                          vendorId, static_cast<uint8_t>(announcementReason),
+    err = cppCluster->AnnounceOtaProvider(onSuccess->Cancel(), onFailure->Cancel(), providerLocation,
+                                          static_cast<chip::VendorId>(vendorId), static_cast<uint8_t>(announcementReason),
                                           chip::ByteSpan((const uint8_t *) metadataForNodeArr.data(), metadataForNodeArr.size()));
     SuccessOrExit(err);
 
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
index 8593dad..00aa981 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
@@ -4280,7 +4280,7 @@
 
     public void announceOtaProvider(
         DefaultClusterCallback callback,
-        byte[] providerLocation,
+        long providerLocation,
         int vendorId,
         int announcementReason,
         byte[] metadataForNode) {
@@ -4296,7 +4296,7 @@
     private native void announceOtaProvider(
         long chipClusterPtr,
         DefaultClusterCallback callback,
-        byte[] providerLocation,
+        long providerLocation,
         int vendorId,
         int announcementReason,
         byte[] metadataForNode);
diff --git a/src/controller/python/chip/clusters/CHIPClusters.cpp b/src/controller/python/chip/clusters/CHIPClusters.cpp
index 64dc915..f40fecc 100644
--- a/src/controller/python/chip/clusters/CHIPClusters.cpp
+++ b/src/controller/python/chip/clusters/CHIPClusters.cpp
@@ -5183,15 +5183,14 @@
 // Cluster OtaSoftwareUpdateRequestor
 
 chip::ChipError::StorageType chip_ime_AppendCommand_OtaSoftwareUpdateRequestor_AnnounceOtaProvider(
-    chip::Controller::Device * device, chip::EndpointId ZCLendpointId, chip::GroupId, const uint8_t * providerLocation,
-    uint32_t providerLocation_Len, uint16_t vendorId, uint8_t announcementReason, const uint8_t * metadataForNode,
-    uint32_t metadataForNode_Len)
+    chip::Controller::Device * device, chip::EndpointId ZCLendpointId, chip::GroupId, chip::NodeId providerLocation,
+    chip::VendorId vendorId, uint8_t announcementReason, const uint8_t * metadataForNode, uint32_t metadataForNode_Len)
 {
     VerifyOrReturnError(device != nullptr, CHIP_ERROR_INVALID_ARGUMENT.AsInteger());
     chip::Controller::OtaSoftwareUpdateRequestorCluster cluster;
     cluster.Associate(device, ZCLendpointId);
     return cluster
-        .AnnounceOtaProvider(nullptr, nullptr, chip::ByteSpan(providerLocation, providerLocation_Len), vendorId, announcementReason,
+        .AnnounceOtaProvider(nullptr, nullptr, providerLocation, vendorId, announcementReason,
                              chip::ByteSpan(metadataForNode, metadataForNode_Len))
         .AsInteger();
 }
diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py
index ced51e6..992fd07 100644
--- a/src/controller/python/chip/clusters/CHIPClusters.py
+++ b/src/controller/python/chip/clusters/CHIPClusters.py
@@ -2305,7 +2305,7 @@
                 "commandId": 0x00000000,
                 "commandName": "AnnounceOtaProvider",
                 "args": {
-                    "providerLocation": "bytes",
+                    "providerLocation": "int",
                     "vendorId": "int",
                     "announcementReason": "int",
                     "metadataForNode": "bytes",
@@ -4856,10 +4856,10 @@
                 location), requestorCanConsent, metadataForProvider, len(metadataForProvider)
         )
 
-    def ClusterOtaSoftwareUpdateRequestor_CommandAnnounceOtaProvider(self, device: ctypes.c_void_p, ZCLendpoint: int, ZCLgroupid: int, providerLocation: bytes, vendorId: int, announcementReason: int, metadataForNode: bytes):
+    def ClusterOtaSoftwareUpdateRequestor_CommandAnnounceOtaProvider(self, device: ctypes.c_void_p, ZCLendpoint: int, ZCLgroupid: int, providerLocation: int, vendorId: int, announcementReason: int, metadataForNode: bytes):
         return self._chipLib.chip_ime_AppendCommand_OtaSoftwareUpdateRequestor_AnnounceOtaProvider(
-            device, ZCLendpoint, ZCLgroupid, providerLocation, len(
-                providerLocation), vendorId, announcementReason, metadataForNode, len(metadataForNode)
+            device, ZCLendpoint, ZCLgroupid, providerLocation, vendorId, announcementReason, metadataForNode, len(
+                metadataForNode)
         )
 
     def ClusterOnOff_CommandOff(self, device: ctypes.c_void_p, ZCLendpoint: int, ZCLgroupid: int):
@@ -8251,7 +8251,7 @@
         # Cluster OtaSoftwareUpdateRequestor
         # Cluster OtaSoftwareUpdateRequestor Command AnnounceOtaProvider
         self._chipLib.chip_ime_AppendCommand_OtaSoftwareUpdateRequestor_AnnounceOtaProvider.argtypes = [
-            ctypes.c_void_p, ctypes.c_uint8, ctypes.c_uint16, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_uint16, ctypes.c_uint8, ctypes.c_char_p, ctypes.c_uint32]
+            ctypes.c_void_p, ctypes.c_uint8, ctypes.c_uint16, ctypes.c_uint64, ctypes.c_uint16, ctypes.c_uint8, ctypes.c_char_p, ctypes.c_uint32]
         self._chipLib.chip_ime_AppendCommand_OtaSoftwareUpdateRequestor_AnnounceOtaProvider.restype = ctypes.c_uint32
         # Cluster OtaSoftwareUpdateRequestor ReadAttribute DefaultOtaProvider
         self._chipLib.chip_ime_ReadAttribute_OtaSoftwareUpdateRequestor_DefaultOtaProvider.argtypes = [
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index a8592bf..39c4299 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -4646,7 +4646,7 @@
                 return ClusterObjectDescriptor(
                     Fields=[
                         ClusterObjectFieldDescriptor(
-                            Label="ProviderLocation", Tag=0, Type=bytes),
+                            Label="ProviderLocation", Tag=0, Type=uint),
                         ClusterObjectFieldDescriptor(
                             Label="VendorId", Tag=1, Type=uint),
                         ClusterObjectFieldDescriptor(
@@ -4655,7 +4655,7 @@
                             Label="MetadataForNode", Tag=3, Type=bytes),
                     ])
 
-            ProviderLocation: 'bytes' = None
+            ProviderLocation: 'uint' = None
             VendorId: 'uint' = None
             AnnouncementReason: 'OtaSoftwareUpdateRequestor.Enums.OTAAnnouncementReason' = None
             MetadataForNode: 'bytes' = None
diff --git a/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.h b/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.h
index 283557b..1c0593b 100644
--- a/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.h
@@ -1119,7 +1119,7 @@
  */
 @interface CHIPOtaSoftwareUpdateRequestor : CHIPCluster
 
-- (void)announceOtaProvider:(NSData *)providerLocation
+- (void)announceOtaProvider:(uint64_t)providerLocation
                    vendorId:(uint16_t)vendorId
          announcementReason:(uint8_t)announcementReason
             metadataForNode:(NSData *)metadataForNode
diff --git a/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.mm b/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.mm
index a5dda26..9b8ac4c 100644
--- a/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/CHIPClustersObjc.mm
@@ -3268,14 +3268,14 @@
     return &_cppCluster;
 }
 
-- (void)announceOtaProvider:(NSData *)providerLocation
+- (void)announceOtaProvider:(uint64_t)providerLocation
                    vendorId:(uint16_t)vendorId
          announcementReason:(uint8_t)announcementReason
             metadataForNode:(NSData *)metadataForNode
             responseHandler:(ResponseHandler)responseHandler
 {
     new CHIPDefaultSuccessCallbackBridge(self.callbackQueue, responseHandler, ^(Cancelable * success, Cancelable * failure) {
-        return self.cppCluster.AnnounceOtaProvider(success, failure, [self asByteSpan:providerLocation], vendorId,
+        return self.cppCluster.AnnounceOtaProvider(success, failure, providerLocation, static_cast<chip::VendorId>(vendorId),
             static_cast<uint8_t>(announcementReason), [self asByteSpan:metadataForNode]);
     });
 }
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
index be41987..7b27f3a 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
@@ -5556,8 +5556,8 @@
     static constexpr CommandId GetCommandId() { return AnnounceOtaProvider::Id; }
     static constexpr ClusterId GetClusterId() { return OtaSoftwareUpdateRequestor::Id; }
 
-    chip::ByteSpan providerLocation;
-    uint16_t vendorId;
+    chip::NodeId providerLocation;
+    chip::VendorId vendorId;
     OTAAnnouncementReason announcementReason;
     chip::ByteSpan metadataForNode;
 
@@ -5570,8 +5570,8 @@
     static constexpr CommandId GetCommandId() { return AnnounceOtaProvider::Id; }
     static constexpr ClusterId GetClusterId() { return OtaSoftwareUpdateRequestor::Id; }
 
-    chip::ByteSpan providerLocation;
-    uint16_t vendorId;
+    chip::NodeId providerLocation;
+    chip::VendorId vendorId;
     OTAAnnouncementReason announcementReason;
     chip::ByteSpan metadataForNode;
     CHIP_ERROR Decode(TLV::TLVReader & reader);
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index 6a0f4ec..c543381 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -13951,7 +13951,7 @@
 public:
     OtaSoftwareUpdateRequestorAnnounceOtaProvider() : ModelCommand("announce-ota-provider")
     {
-        AddArgument("ProviderLocation", &mRequest.providerLocation);
+        AddArgument("ProviderLocation", 0, UINT64_MAX, &mRequest.providerLocation);
         AddArgument("VendorId", 0, UINT16_MAX, &mRequest.vendorId);
         AddArgument(
             "AnnouncementReason", 0, UINT8_MAX,
diff --git a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.cpp b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.cpp
index 0612631..2d65282 100644
--- a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.cpp
+++ b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.cpp
@@ -8700,7 +8700,7 @@
 // OtaSoftwareUpdateRequestor Cluster Commands
 CHIP_ERROR OtaSoftwareUpdateRequestorCluster::AnnounceOtaProvider(Callback::Cancelable * onSuccessCallback,
                                                                   Callback::Cancelable * onFailureCallback,
-                                                                  chip::ByteSpan providerLocation, uint16_t vendorId,
+                                                                  chip::NodeId providerLocation, chip::VendorId vendorId,
                                                                   uint8_t announcementReason, chip::ByteSpan metadataForNode)
 {
     CHIP_ERROR err          = CHIP_NO_ERROR;
@@ -8725,9 +8725,9 @@
     SuccessOrExit(err = sender->PrepareCommand(cmdParams));
 
     VerifyOrExit((writer = sender->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
-    // providerLocation: octetString
+    // providerLocation: nodeId
     SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), providerLocation));
-    // vendorId: int16u
+    // vendorId: vendorId
     SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), vendorId));
     // announcementReason: OTAAnnouncementReason
     SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), announcementReason));
diff --git a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h
index 656c9e6..0e73803 100644
--- a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h
+++ b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h
@@ -939,7 +939,7 @@
 
     // Cluster Commands
     CHIP_ERROR AnnounceOtaProvider(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
-                                   chip::ByteSpan providerLocation, uint16_t vendorId, uint8_t announcementReason,
+                                   chip::NodeId providerLocation, chip::VendorId vendorId, uint8_t announcementReason,
                                    chip::ByteSpan metadataForNode);
 
     // Cluster Attributes
diff --git a/zzz_generated/ota-requestor-app/zap-generated/IMClusterCommandHandler.cpp b/zzz_generated/ota-requestor-app/zap-generated/IMClusterCommandHandler.cpp
index 8c9caab..add2e45 100644
--- a/zzz_generated/ota-requestor-app/zap-generated/IMClusterCommandHandler.cpp
+++ b/zzz_generated/ota-requestor-app/zap-generated/IMClusterCommandHandler.cpp
@@ -411,6 +411,46 @@
 
 } // namespace OtaSoftwareUpdateProvider
 
+namespace OtaSoftwareUpdateRequestor {
+
+void DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, TLV::TLVReader & aDataTlv)
+{
+    // We are using TLVUnpackError and TLVError here since both of them can be CHIP_END_OF_TLV
+    // When TLVError is CHIP_END_OF_TLV, it means we have iterated all of the items, which is not a real error.
+    // Any error value TLVUnpackError means we have received an illegal value.
+    // The following variables are used for all commands to save code size.
+    CHIP_ERROR TLVError = CHIP_NO_ERROR;
+    bool wasHandled     = false;
+    {
+        switch (aCommandPath.mCommandId)
+        {
+        case Commands::AnnounceOtaProvider::Id: {
+            Commands::AnnounceOtaProvider::DecodableType commandData;
+            TLVError = DataModel::Decode(aDataTlv, commandData);
+            if (TLVError == CHIP_NO_ERROR)
+            {
+                wasHandled =
+                    emberAfOtaSoftwareUpdateRequestorClusterAnnounceOtaProviderCallback(apCommandObj, aCommandPath, commandData);
+            }
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            ReportCommandUnsupported(apCommandObj, aCommandPath);
+            return;
+        }
+        }
+    }
+
+    if (CHIP_NO_ERROR != TLVError || !wasHandled)
+    {
+        apCommandObj->AddStatus(aCommandPath, Protocols::InteractionModel::Status::InvalidCommand);
+        ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format());
+    }
+}
+
+} // namespace OtaSoftwareUpdateRequestor
+
 namespace OperationalCredentials {
 
 void DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, TLV::TLVReader & aDataTlv)
@@ -540,6 +580,9 @@
     case Clusters::NetworkCommissioning::Id:
         Clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
         break;
+    case Clusters::OtaSoftwareUpdateRequestor::Id:
+        Clusters::OtaSoftwareUpdateRequestor::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
+        break;
     case Clusters::OperationalCredentials::Id:
         Clusters::OperationalCredentials::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
         break;
diff --git a/zzz_generated/ota-requestor-app/zap-generated/PluginApplicationCallbacks.h b/zzz_generated/ota-requestor-app/zap-generated/PluginApplicationCallbacks.h
index e2d4bd9..759ae64 100644
--- a/zzz_generated/ota-requestor-app/zap-generated/PluginApplicationCallbacks.h
+++ b/zzz_generated/ota-requestor-app/zap-generated/PluginApplicationCallbacks.h
@@ -25,4 +25,5 @@
     MatterGeneralCommissioningPluginServerInitCallback();                                                                          \
     MatterNetworkCommissioningPluginServerInitCallback();                                                                          \
     MatterOtaSoftwareUpdateProviderPluginClientInitCallback();                                                                     \
+    MatterOtaSoftwareUpdateRequestorPluginServerInitCallback();                                                                    \
     MatterOperationalCredentialsPluginServerInitCallback();
diff --git a/zzz_generated/ota-requestor-app/zap-generated/callback-stub.cpp b/zzz_generated/ota-requestor-app/zap-generated/callback-stub.cpp
index 98a0eda..864ec4f 100644
--- a/zzz_generated/ota-requestor-app/zap-generated/callback-stub.cpp
+++ b/zzz_generated/ota-requestor-app/zap-generated/callback-stub.cpp
@@ -38,6 +38,9 @@
     case ZCL_OTA_PROVIDER_CLUSTER_ID:
         emberAfOtaSoftwareUpdateProviderClusterInitCallback(endpoint);
         break;
+    case ZCL_OTA_REQUESTOR_CLUSTER_ID:
+        emberAfOtaSoftwareUpdateRequestorClusterInitCallback(endpoint);
+        break;
     case ZCL_OPERATIONAL_CREDENTIALS_CLUSTER_ID:
         emberAfOperationalCredentialsClusterInitCallback(endpoint);
         break;
@@ -62,6 +65,11 @@
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfOtaSoftwareUpdateRequestorClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfOperationalCredentialsClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
diff --git a/zzz_generated/ota-requestor-app/zap-generated/endpoint_config.h b/zzz_generated/ota-requestor-app/zap-generated/endpoint_config.h
index 71e568a..524d0ab 100644
--- a/zzz_generated/ota-requestor-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/ota-requestor-app/zap-generated/endpoint_config.h
@@ -27,12 +27,17 @@
 #define GENERATED_DEFAULTS                                                                                                         \
     {                                                                                                                              \
                                                                                                                                    \
-        /* Endpoint: 0, Cluster: General Commissioning (server), big-endian */                                                     \
+        /* Endpoint: 0, Cluster: OTA Software Update Requestor (server), big-endian */                                             \
                                                                                                                                    \
-        /* 0 - Breadcrumb, */                                                                                                      \
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                                                                            \
+        /* 0 - default ota provider, */                                                                                            \
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                      \
                                                                                                                                    \
-            /* 8 - BasicCommissioningInfoList, */                                                                                  \
+            /* Endpoint: 0, Cluster: General Commissioning (server), big-endian */                                                 \
+                                                                                                                                   \
+            /* 17 - Breadcrumb, */                                                                                                 \
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                                                                        \
+                                                                                                                                   \
+            /* 25 - BasicCommissioningInfoList, */                                                                                 \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
@@ -50,7 +55,7 @@
                                                                                                                                    \
             /* Endpoint: 0, Cluster: Operational Credentials (server), big-endian */                                               \
                                                                                                                                    \
-            /* 262 - fabrics list, */                                                                                              \
+            /* 279 - fabrics list, */                                                                                              \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
@@ -74,12 +79,17 @@
 #define GENERATED_DEFAULTS                                                                                                         \
     {                                                                                                                              \
                                                                                                                                    \
-        /* Endpoint: 0, Cluster: General Commissioning (server), little-endian */                                                  \
+        /* Endpoint: 0, Cluster: OTA Software Update Requestor (server), little-endian */                                          \
                                                                                                                                    \
-        /* 0 - Breadcrumb, */                                                                                                      \
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                                                                            \
+        /* 0 - default ota provider, */                                                                                            \
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                      \
                                                                                                                                    \
-            /* 8 - BasicCommissioningInfoList, */                                                                                  \
+            /* Endpoint: 0, Cluster: General Commissioning (server), little-endian */                                              \
+                                                                                                                                   \
+            /* 17 - Breadcrumb, */                                                                                                 \
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                                                                        \
+                                                                                                                                   \
+            /* 25 - BasicCommissioningInfoList, */                                                                                 \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
@@ -97,7 +107,7 @@
                                                                                                                                    \
             /* Endpoint: 0, Cluster: Operational Credentials (server), little-endian */                                            \
                                                                                                                                    \
-            /* 262 - fabrics list, */                                                                                              \
+            /* 279 - fabrics list, */                                                                                              \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      \
@@ -119,7 +129,7 @@
 
 #endif // BIGENDIAN_CPU
 
-#define GENERATED_DEFAULTS_COUNT (3)
+#define GENERATED_DEFAULTS_COUNT (4)
 
 #define ZAP_TYPE(type) ZCL_##type##_ATTRIBUTE_TYPE
 #define ZAP_LONG_DEFAULTS_INDEX(index)                                                                                             \
@@ -147,23 +157,29 @@
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 9
+#define GENERATED_ATTRIBUTE_COUNT 12
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
                                                                                                                                    \
         /* Endpoint: 0, Cluster: OTA Software Update Provider (client) */                                                          \
         { 0xFFFD, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(CLIENT), ZAP_SIMPLE_DEFAULT(1) }, /* ClusterRevision */                  \
                                                                                                                                    \
+            /* Endpoint: 0, Cluster: OTA Software Update Requestor (server) */                                                     \
+            { 0x0001, ZAP_TYPE(OCTET_STRING), 17, ZAP_ATTRIBUTE_MASK(WRITABLE),                                                    \
+              ZAP_LONG_DEFAULTS_INDEX(0) },                            /* default ota provider */                                  \
+            { 0x0002, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_EMPTY_DEFAULT() },  /* update possible */                                       \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) }, /* ClusterRevision */                                       \
+                                                                                                                                   \
             /* Endpoint: 0, Cluster: General Commissioning (server) */                                                             \
-            { 0x0000, ZAP_TYPE(INT64U), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), ZAP_LONG_DEFAULTS_INDEX(0) }, /* Breadcrumb */            \
-            { 0x0001, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(8) }, /* BasicCommissioningInfoList */                      \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) },  /* ClusterRevision */                                 \
+            { 0x0000, ZAP_TYPE(INT64U), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), ZAP_LONG_DEFAULTS_INDEX(17) }, /* Breadcrumb */           \
+            { 0x0001, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(25) }, /* BasicCommissioningInfoList */                     \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) },   /* ClusterRevision */                                \
                                                                                                                                    \
             /* Endpoint: 0, Cluster: Network Commissioning (server) */                                                             \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* ClusterRevision */                                  \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) }, /* ClusterRevision */                                       \
                                                                                                                                    \
             /* Endpoint: 0, Cluster: Operational Credentials (server) */                                                           \
-            { 0x0001, ZAP_TYPE(ARRAY), 320, 0, ZAP_LONG_DEFAULTS_INDEX(262) }, /* fabrics list */                                  \
+            { 0x0001, ZAP_TYPE(ARRAY), 320, 0, ZAP_LONG_DEFAULTS_INDEX(279) }, /* fabrics list */                                  \
             { 0x0002, ZAP_TYPE(INT8U), 1, 0, ZAP_EMPTY_DEFAULT() },            /* SupportedFabrics */                              \
             { 0x0003, ZAP_TYPE(INT8U), 1, 0, ZAP_EMPTY_DEFAULT() },            /* CommissionedFabrics */                           \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(1) },         /* ClusterRevision */                               \
@@ -176,20 +192,23 @@
 #define GENERATED_FUNCTION_ARRAYS
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 4
+#define GENERATED_CLUSTER_COUNT 5
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         {                                                                                                                          \
             0x0029, ZAP_ATTRIBUTE_INDEX(0), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                                   \
         }, /* Endpoint: 0, Cluster: OTA Software Update Provider (client) */                                                       \
             {                                                                                                                      \
-                0x0030, ZAP_ATTRIBUTE_INDEX(1), 3, 264, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0x002A, ZAP_ATTRIBUTE_INDEX(1), 3, 20, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+            }, /* Endpoint: 0, Cluster: OTA Software Update Requestor (server) */                                                  \
+            {                                                                                                                      \
+                0x0030, ZAP_ATTRIBUTE_INDEX(4), 3, 264, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 0, Cluster: General Commissioning (server) */                                                          \
             {                                                                                                                      \
-                0x0031, ZAP_ATTRIBUTE_INDEX(4), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                               \
+                0x0031, ZAP_ATTRIBUTE_INDEX(7), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                               \
             }, /* Endpoint: 0, Cluster: Network Commissioning (server) */                                                          \
             {                                                                                                                      \
-                0x003E, ZAP_ATTRIBUTE_INDEX(5), 4, 324, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0x003E, ZAP_ATTRIBUTE_INDEX(8), 4, 324, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 0, Cluster: Operational Credentials (server) */                                                        \
     }
 
@@ -198,7 +217,7 @@
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 4, 592 },                                                                                          \
+        { ZAP_CLUSTER_INDEX(0), 5, 612 },                                                                                          \
     }
 
 // Largest attribute size is needed for various buffers
@@ -208,7 +227,7 @@
 #define ATTRIBUTE_SINGLETONS_SIZE (0)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (592)
+#define ATTRIBUTE_MAX_SIZE (612)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (1)
diff --git a/zzz_generated/ota-requestor-app/zap-generated/gen_config.h b/zzz_generated/ota-requestor-app/zap-generated/gen_config.h
index b31a8aa..63e61e4 100644
--- a/zzz_generated/ota-requestor-app/zap-generated/gen_config.h
+++ b/zzz_generated/ota-requestor-app/zap-generated/gen_config.h
@@ -32,6 +32,7 @@
 #define EMBER_AF_GENERAL_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_OTA_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (1)
+#define EMBER_AF_OTA_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_OPERATIONAL_CREDENTIALS_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 
 /**** Cluster Plugins ****/
@@ -50,6 +51,11 @@
 #define ZCL_USING_OTA_PROVIDER_CLUSTER_CLIENT
 #define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_PROVIDER_CLIENT
 
+// Use this macro to check if the server side of the OTA Software Update Requestor cluster is included
+#define ZCL_USING_OTA_REQUESTOR_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_REQUESTOR_SERVER
+#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_REQUESTOR
+
 // Use this macro to check if the server side of the Operational Credentials cluster is included
 #define ZCL_USING_OPERATIONAL_CREDENTIALS_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_OPERATIONAL_CREDENTIALS_SERVER