Refactored yaml tests for Test_TC_S_2_1..4 (#26459)

* Resolving conflicts to rebase onto master

* Reverted files creating problems

* Added manual configuration options for AC and now getting the capacity from the maximum number of scenes on DUT.

* Reverted or condition on StoreScene test allowing INSUFFICIENT SPACE, not currently allowing it. Added check on RecallScene return where expected, updated 2_3 and 2_4 to hybrid between automated and manual per app tests

* Restyled by whitespace

* Restyled by prettier-yaml

* Added anyOf to check wether 0x00 or 0x89 was returned for store scenes commands where it was accepted

* Restyled by whitespace

* Restyled by prettier-yaml

* Reverted runIf, anyOf and UnsignedNumberEquals commands for now until the new test backend is implemented.

* Resolved conflicts for : Modified AttribueValue in Scenes::AttributeValuePair to now be a uint32_t according to upcoming spec change

* Restyled by prettier-yaml

* Refactored tests and SceneTable default handlers to the uint32_t type for the AttributePairValue

* Regenerated zap files for all-cluster apps

* Regenerated zap files for chip-tool

* Applied corrections to 2_4 to follo test plan

* Restyled by whitespace

* Restyled by prettier-yaml

* Apply suggestions from code review

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Added missing checks, modified wrong description to match test plan

* Restyled by whitespace

* Restyled by prettier-yaml

* Regenerated after rebase

* Added variable for G1 in Test_TC_s_2_3, changed GroupKeySecurityPolocy to 0 in 2.2 and 2.3 and removed Scene 0x03 from firt scene membership response in 2.3

* Applied restyler

* Restyled by prettier-yaml

---------

Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index 0cd7708..913d86d 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -138,7 +138,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
@@ -151,6 +151,9 @@
   readonly attribute group_id currentGroup = 2;
   readonly attribute boolean sceneValid = 3;
   readonly attribute bitmap8 nameSupport = 4;
+  readonly attribute nullable node_id lastConfiguredBy = 5;
+  readonly attribute int16u sceneTableSize = 6;
+  readonly attribute int8u remainingCapacity = 7;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
   readonly attribute event_id eventList[] = 65530;
@@ -5048,6 +5051,9 @@
     ram      attribute currentGroup default = 0x0000;
     ram      attribute sceneValid default = 0x00;
     ram      attribute nameSupport;
+    ram      attribute lastConfiguredBy;
+    ram      attribute sceneTableSize;
+    ram      attribute remainingCapacity;
     ram      attribute featureMap default = 0;
     ram      attribute clusterRevision default = 4;
   }
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index 310a5e6..a0b8b9b 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
@@ -9533,6 +9533,54 @@
               "reportableChange": 0
             },
             {
+              "name": "LastConfiguredBy",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "node_id",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SceneTableSize",
+              "code": 6,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RemainingCapacity",
+              "code": 7,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
               "name": "FeatureMap",
               "code": 65532,
               "mfgCode": null,
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
index 02bd957..07f74cd 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
@@ -132,7 +132,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
@@ -145,6 +145,9 @@
   readonly attribute group_id currentGroup = 2;
   readonly attribute boolean sceneValid = 3;
   readonly attribute bitmap8 nameSupport = 4;
+  readonly attribute nullable node_id lastConfiguredBy = 5;
+  readonly attribute int16u sceneTableSize = 6;
+  readonly attribute int8u remainingCapacity = 7;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
   readonly attribute event_id eventList[] = 65530;
@@ -4171,6 +4174,9 @@
     ram      attribute currentGroup default = 0x0000;
     ram      attribute sceneValid default = 0x00;
     ram      attribute nameSupport;
+    ram      attribute lastConfiguredBy;
+    ram      attribute sceneTableSize;
+    ram      attribute remainingCapacity;
     ram      attribute featureMap default = 0;
     ram      attribute clusterRevision default = 4;
   }
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
index ad57bb3..b02e910 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
@@ -9004,6 +9004,54 @@
               "reportableChange": 0
             },
             {
+              "name": "LastConfiguredBy",
+              "code": 5,
+              "mfgCode": null,
+              "side": "server",
+              "type": "node_id",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "SceneTableSize",
+              "code": 6,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int16u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
+              "name": "RemainingCapacity",
+              "code": 7,
+              "mfgCode": null,
+              "side": "server",
+              "type": "int8u",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 1,
+              "minInterval": 1,
+              "maxInterval": 65534,
+              "reportableChange": 0
+            },
+            {
               "name": "FeatureMap",
               "code": 65532,
               "mfgCode": null,
diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.matter b/examples/light-switch-app/light-switch-common/light-switch-app.matter
index 83f7339..5159a1b 100644
--- a/examples/light-switch-app/light-switch-common/light-switch-app.matter
+++ b/examples/light-switch-app/light-switch-common/light-switch-app.matter
@@ -186,7 +186,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
@@ -200,6 +200,8 @@
   readonly attribute boolean sceneValid = 3;
   readonly attribute bitmap8 nameSupport = 4;
   readonly attribute optional nullable node_id lastConfiguredBy = 5;
+  readonly attribute int16u sceneTableSize = 6;
+  readonly attribute int8u remainingCapacity = 7;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
   readonly attribute event_id eventList[] = 65530;
diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter
index b7b0c5f..bffde23 100644
--- a/examples/placeholder/linux/apps/app1/config.matter
+++ b/examples/placeholder/linux/apps/app1/config.matter
@@ -138,7 +138,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter
index 0f3d9c4..3043fa3 100644
--- a/examples/placeholder/linux/apps/app2/config.matter
+++ b/examples/placeholder/linux/apps/app2/config.matter
@@ -138,7 +138,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
diff --git a/examples/thermostat/thermostat-common/thermostat.matter b/examples/thermostat/thermostat-common/thermostat.matter
index a314a02..e8dd4cb 100644
--- a/examples/thermostat/thermostat-common/thermostat.matter
+++ b/examples/thermostat/thermostat-common/thermostat.matter
@@ -186,7 +186,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
diff --git a/examples/window-app/common/window-app.matter b/examples/window-app/common/window-app.matter
index 9b19d19..a2bffdc 100644
--- a/examples/window-app/common/window-app.matter
+++ b/examples/window-app/common/window-app.matter
@@ -138,7 +138,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
diff --git a/src/app/clusters/scenes/SceneTableImpl.h b/src/app/clusters/scenes/SceneTableImpl.h
index c0453b5..d601e60 100644
--- a/src/app/clusters/scenes/SceneTableImpl.h
+++ b/src/app/clusters/scenes/SceneTableImpl.h
@@ -64,24 +64,9 @@
         auto pair_iterator = extensionFieldSet.attributeValueList.begin();
         while (pair_iterator.Next())
         {
-            aVPair                          = pair_iterator.GetValue();
-            mAVPairs[pairCount].attributeID = aVPair.attributeID;
-            size_t valueBytesTotal          = 0;
-            uint8_t valueBytesCount         = 0;
-
-            ReturnErrorOnFailure(aVPair.attributeValue.ComputeSize(&valueBytesTotal));
-            VerifyOrReturnError(valueBytesTotal <= ArraySize(mValueBuffer[0]), CHIP_ERROR_BUFFER_TOO_SMALL);
-
-            auto value_iterator = aVPair.attributeValue.begin();
-            while (value_iterator.Next())
-            {
-                mValueBuffer[pairCount][valueBytesCount] = value_iterator.GetValue();
-                valueBytesCount++;
-            }
-            ReturnErrorOnFailure(value_iterator.GetStatus());
-
-            mAVPairs[pairCount].attributeValue = mValueBuffer[pairCount];
-            mAVPairs[pairCount].attributeValue.reduce_size(valueBytesCount);
+            aVPair                             = pair_iterator.GetValue();
+            mAVPairs[pairCount].attributeID    = aVPair.attributeID;
+            mAVPairs[pairCount].attributeValue = aVPair.attributeValue;
             pairCount++;
         }
         ReturnErrorOnFailure(pair_iterator.GetStatus());
@@ -132,25 +117,9 @@
         auto pair_iterator = attributeValueList.begin();
         while (pair_iterator.Next())
         {
-            decodePair                      = pair_iterator.GetValue();
-            mAVPairs[pairCount].attributeID = decodePair.attributeID;
-            size_t valueBytesTotal          = 0;
-            uint8_t valueBytesCount         = 0;
-
-            // Verify size of attribute value
-            ReturnErrorOnFailure(decodePair.attributeValue.ComputeSize(&valueBytesTotal));
-            VerifyOrReturnError(valueBytesTotal <= ArraySize(mValueBuffer[0]), CHIP_ERROR_BUFFER_TOO_SMALL);
-
-            auto value_iterator = decodePair.attributeValue.begin();
-            while (value_iterator.Next())
-            {
-                mValueBuffer[pairCount][valueBytesCount] = value_iterator.GetValue();
-                valueBytesCount++;
-            }
-            ReturnErrorOnFailure(value_iterator.GetStatus());
-
-            mAVPairs[pairCount].attributeValue = mValueBuffer[pairCount];
-            mAVPairs[pairCount].attributeValue.reduce_size(valueBytesCount);
+            decodePair                         = pair_iterator.GetValue();
+            mAVPairs[pairCount].attributeID    = decodePair.attributeID;
+            mAVPairs[pairCount].attributeValue = decodePair.attributeValue;
             pairCount++;
         };
         ReturnErrorOnFailure(pair_iterator.GetStatus());
@@ -164,7 +133,6 @@
 
 private:
     app::Clusters::Scenes::Structs::AttributeValuePair::Type mAVPairs[kMaxAvPair];
-    uint8_t mValueBuffer[kMaxAvPair][kMaxValueSize];
 };
 
 /**
diff --git a/src/app/tests/TestSceneTable.cpp b/src/app/tests/TestSceneTable.cpp
index c4e09b2..82f11ed 100644
--- a/src/app/tests/TestSceneTable.cpp
+++ b/src/app/tests/TestSceneTable.cpp
@@ -466,23 +466,20 @@
     TLV::TLVType outer;
     TLV::TLVType outerRead;
 
-    static const uint8_t OO_av_payload[1]    = { 0x01 };
-    static const uint8_t LC_av_payload[2][2] = { { 0x40, 0x00 }, { 0x01, 0xF0 } };
-    static const uint8_t CC_av_payload[8][2] = { { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 },
-                                                 { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 }, { 0x00, 0x00 } };
+    static const uint8_t OO_av_payload     = 0x01;
+    static const uint16_t LC_av_payload[2] = { 0x64, 0x01F0 };
+    static const uint16_t CC_av_payload[8] = { 0 };
 
     OOPairs[0].attributeID.SetValue(kOnOffAttId);
     OOPairs[0].attributeValue = OO_av_payload;
 
     LCPairs[0].attributeID.SetValue(kCurrentLevelId);
     LCPairs[0].attributeValue = LC_av_payload[0];
-    LCPairs[0].attributeValue.reduce_size(1);
     LCPairs[1].attributeID.SetValue(kCurrentFrequencyId);
     LCPairs[1].attributeValue = LC_av_payload[1];
 
     CCPairs[0].attributeID.SetValue(kCurrentSaturationId);
     CCPairs[0].attributeValue = CC_av_payload[0];
-    CCPairs[0].attributeValue.reduce_size(1);
     CCPairs[1].attributeID.SetValue(kCurrentXId);
     CCPairs[1].attributeValue = CC_av_payload[1];
     CCPairs[2].attributeID.SetValue(kCurrentYId);
@@ -493,10 +490,8 @@
     CCPairs[4].attributeValue = CC_av_payload[4];
     CCPairs[5].attributeID.SetValue(kColorLoopActiveId);
     CCPairs[5].attributeValue = CC_av_payload[5];
-    CCPairs[5].attributeValue.reduce_size(1);
     CCPairs[6].attributeID.SetValue(kColorLoopDirectionId);
     CCPairs[6].attributeValue = CC_av_payload[6];
-    CCPairs[6].attributeValue.reduce_size(1);
     CCPairs[7].attributeID.SetValue(kColorLoopTimeId);
     CCPairs[7].attributeValue = CC_av_payload[7];
 
@@ -658,21 +653,17 @@
     app::Clusters::Scenes::Structs::ExtensionFieldSet::Type extensionFieldFailTestOut;
     app::Clusters::Scenes::Structs::ExtensionFieldSet::DecodableType extensionFieldFailTestIn;
     app::Clusters::Scenes::Structs::AttributeValuePair::Type TooManyPairs[16];
-    app::Clusters::Scenes::Structs::AttributeValuePair::Type TooManyBytesPairs[1];
 
     TLV::TLVType failWrite;
     TLV::TLVType failRead;
 
-    uint8_t payloadOk[1]     = { 0 };
-    uint8_t payloadTooBig[5] = { 0 };
+    uint8_t payloadOk = 0;
 
     for (uint8_t i = 0; i < 16; i++)
     {
         TooManyPairs[i].attributeValue = payloadOk;
     }
 
-    TooManyBytesPairs[0].attributeValue = payloadTooBig;
-
     extensionFieldFailTestOut.clusterID          = kColorControlClusterId;
     extensionFieldFailTestOut.attributeValueList = TooManyPairs;
 
@@ -708,39 +699,6 @@
 
     memset(failBuffer, 0, fail_list.size());
     memset(buffer, 0, buff_span.size());
-
-    extensionFieldFailTestOut.clusterID          = kColorControlClusterId;
-    extensionFieldFailTestOut.attributeValueList = TooManyBytesPairs;
-
-    // Serialize Extension Field sets as if they were recovered from memory
-    writer.Init(failBuffer);
-    writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, failWrite);
-    NL_TEST_ASSERT(aSuite,
-                   CHIP_NO_ERROR ==
-                       app::DataModel::Encode(writer,
-                                              TLV::ContextTag(to_underlying(
-                                                  app::Clusters::Scenes::Structs::ExtensionFieldSet::Fields::kAttributeValueList)),
-                                              extensionFieldFailTestOut.attributeValueList));
-    writer.EndContainer(failWrite);
-
-    // Setup the On Off Extension field set in the expected state from a command
-    reader.Init(fail_list);
-    extensionFieldFailTestIn.clusterID = kColorControlClusterId;
-    NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.Next());
-    NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.EnterContainer(failRead));
-    NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.Next());
-    NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == extensionFieldFailTestIn.attributeValueList.Decode(reader));
-    NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == reader.ExitContainer(failRead));
-
-    // Verify failure on both serialize and deserialize
-    NL_TEST_ASSERT(aSuite,
-                   CHIP_ERROR_BUFFER_TOO_SMALL == sHandler.SerializeAdd(kTestEndpoint1, extensionFieldFailTestIn, buff_span));
-    NL_TEST_ASSERT(aSuite,
-                   CHIP_ERROR_BUFFER_TOO_SMALL ==
-                       sHandler.Deserialize(kTestEndpoint1, kColorControlClusterId, fail_list, extensionFieldFailTestOut));
-
-    memset(failBuffer, 0, fail_list.size());
-    memset(buffer, 0, buff_span.size());
 };
 
 void TestStoreScenes(nlTestSuite * aSuite, void * aContext)
diff --git a/src/app/tests/suites/certification/PICS.yaml b/src/app/tests/suites/certification/PICS.yaml
index 56aea7c..9804953 100644
--- a/src/app/tests/suites/certification/PICS.yaml
+++ b/src/app/tests/suites/certification/PICS.yaml
@@ -5585,6 +5585,12 @@
     - label: "Does the device implement the LastConfiguredBy attribute?"
       id: S.S.A0005
 
+    - label: "Does the device implement the SceneTableSize attribute?"
+      id: S.S.A0006
+
+    - label: "Does the device implement the RemainingCapacity attribute?"
+      id: S.S.A0007
+
     #
     # server / commandsReceived
     #
diff --git a/src/app/tests/suites/certification/Test_TC_S_2_1.yaml b/src/app/tests/suites/certification/Test_TC_S_2_1.yaml
index 950ccb3..31d1618 100644
--- a/src/app/tests/suites/certification/Test_TC_S_2_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_S_2_1.yaml
@@ -22,45 +22,88 @@
 
 config:
     nodeId: 0x12344321
-    cluster: "Basic Information"
-    endpoint: 0
+    cluster: "Scenes"
+    endpoint: 1
 
 tests:
-    - label: "Commission DUT to TH"
-      verification: |
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
 
-      disabled: true
+    - label: "TH reads from the DUT the (0x0000) SceneCount attribute"
+      PICS: S.S.A0000
+      command: "readAttribute"
+      attribute: "SceneCount"
+      response:
+          constraints:
+              type: int8u
 
-    - label: "TH reads all mandatory attributes from DUT one at a time."
-      verification: |
-          The data type in each command must match the value listed in the specification(s). The data value in each command for the attribute must fall within the valid range described in the specification(s).
-      disabled: true
+    - label: "TH reads from the DUT the (0x0001) CurrentScene attribute"
+      PICS: S.S.A0001
+      command: "readAttribute"
+      attribute: "CurrentScene"
+      response:
+          constraints:
+              type: int8u
 
-    - label:
-          "TH writes the respective default value to all mandatory attributes to
-          DUT one at a time."
-      verification: |
-          If the access control of DUT is set to READ, the DUT response will indicate that the attribute write command was not a SUCCESS. If the access control of DUT is set to READ/WRITE, the DUT response will indicate that the write command was a SUCCESS.
-      disabled: true
+    - label: "TH reads from the DUT the (0x0002) CurrentGroup attribute"
+      PICS: S.S.A0002
+      command: "readAttribute"
+      attribute: "CurrentGroup"
+      response:
+          constraints:
+              type: groupid
 
-    - label: "TH reads back all attributes written in step 3a."
-      verification: |
-          If the Status field of the write attributes response command frame was equal to SUCCESS, the updated value is read back. If the Status field of the write attributes response command frame was not equal to SUCCESS the value is not updated when read back.
-      disabled: true
+    - label: "TH reads from the DUT the (0x0003) SceneValid attribute"
+      PICS: S.S.A0003
+      command: "readAttribute"
+      attribute: "SceneValid"
+      response:
+          constraints:
+              type: uint8
 
-    - label: "TH reads each optional attributes from DUT one at a time."
-      verification: |
-          If the DUT implements the attribute, the Status field will be equal to SUCCESS and the command will contain the requested attribute. If the DUT does not implement the attribute, the Status field will not be equal to SUCCESS. The data type in each command must match the value listed in the specification(s). The data value in each command for the attribute must fall within the valid range described in the specification(s).
-      disabled: true
+    - label: "TH reads from the DUT the (0x0004) NameSupport attribute"
+      PICS: S.S.A0003 && S.S.F00
+      command: "readAttribute"
+      attribute: "NameSupport"
+      response:
+          value: 0x80
+          constraints:
+              type: uint8
 
-    - label:
-          "TH writes the respective default value to each optional attributes to
-          DUT one at a time."
-      verification: |
-          If the attribute is not implemented or the access control of DUT is set to READ, the DUT response will indicate that the attribute write command was not a SUCCESS. If the attribute is implemented and the access control of DUT is set to READ/WRITE, the DUT response will indicate that the write command was a SUCCESS.
-      disabled: true
+    - label: "TH reads from the DUT the (0x0004) NameSupport attribute"
+      PICS: S.S.A0004 && (!S.S.F00)
+      command: "readAttribute"
+      attribute: "NameSupport"
+      response:
+          value: 0x00
+          constraints:
+              type: uint8
 
-    - label: "TH reads back all attributes written in step 5a."
-      verification: |
-          If the Status field of the write attributes response command frame was equal to SUCCESS, the updated value is read back. If the Status field of the write attributes response command frame was not equal to SUCCESS the value is not updated when read back.
-      disabled: true
+    - label: "TH reads from the DUT the (0x0005) LastConfiguredBy attribute"
+      PICS: S.S.A0005
+      command: "readAttribute"
+      attribute: "LastConfiguredBy"
+      response:
+          constraints:
+              type: nodeId
+
+    - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute"
+      PICS: S.S.A0006
+      command: "readAttribute"
+      attribute: "SceneTableSize"
+      response:
+          constraints:
+              type: uint16
+
+    - label: "TH reads from the DUT the (0x0007) RemainingCapacity attribute"
+      PICS: S.S.A0007
+      command: "readAttribute"
+      attribute: "RemainingCapacity"
+      response:
+          constraints:
+              type: uint8
diff --git a/src/app/tests/suites/certification/Test_TC_S_2_2.yaml b/src/app/tests/suites/certification/Test_TC_S_2_2.yaml
index 651a61c..52143ae 100644
--- a/src/app/tests/suites/certification/Test_TC_S_2_2.yaml
+++ b/src/app/tests/suites/certification/Test_TC_S_2_2.yaml
@@ -20,273 +20,980 @@
 
 config:
     nodeId: 0x12344321
-    cluster: "Basic Information"
-    endpoint: 0
+    cluster: "Scenes"
+    endpoint: 1
 
 tests:
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
+
     - label: "TH sends a RemoveAllGroups command to DUT."
       PICS: G.S.C04.Rsp
-      verification: |
-          If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS).
-      disabled: true
+      cluster: "Groups"
+      endpoint: "1"
+      command: "RemoveAllGroups"
+
+    - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute"
+      PICS: S.S.A0006
+      command: "readAttribute"
+      attribute: "SceneTableSize"
+      response:
+          values:
+              - name: "SceneTableSize"
+                saveAs: maxScenes
+          constraints:
+              type: uint16
 
     - label:
-          "preparation step for using commands from Groups cluster: TH generates
-          fabric-unique GroupID, GroupName, random key, EpochKey0 and
-          GroupKeySetID. TH sets GroupKeySecurityPolicy = TrustFirst (1)
-          GroupKeyMulticastPolicy = PerGroupID (0) EpochStartTime0 = 0"
-      verification: |
+          "preparation step for using commands from Groups cluster: Add KeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: "GroupKeySet"
+                value:
+                    {
+                        GroupKeySetID: 0x01a1,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
+                        EpochStartTime0: 0,
+                        EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
+                        EpochStartTime1: 0,
+                        EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
+                        EpochStartTime2: 0,
+                    }
 
-      disabled: true
+    - label:
+          "Preparation step for using commands from Groups cluster: Write Group
+          Keys"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "GroupKeyMap"
+      arguments:
+          value:
+              [
+                  { FabricIndex: 1, GroupId: 0x0001, GroupKeySetID: 0x01a1 },
+                  { FabricIndex: 1, GroupId: 0x0002, GroupKeySetID: 0x01a1 },
+              ]
 
     - label:
           "TH sends a AddGroup command to DUT with the GroupID field set to
           0x0001."
       PICS: G.S.C00.Rsp
-      verification: |
-          DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) and the GroupID field set to 0x0001.
-      disabled: true
+      cluster: "Groups"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "GroupName"
+                value: "Group1"
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0001
 
     - label:
           "TH sends a RemoveAllScenes command to DUT with the GroupID field set
           to 0x0001."
       PICS: S.S.C03.Rsp
-      verification: |
-          DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0001.
-      disabled: true
+      command: "RemoveAllScenes"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0001
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC0, the GroupID field set to 0x0001 and the SceneCount field set to 0x00.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2)
+              - name: "GroupID"
+                value: 0x0001
+
+    - label:
+          "TH configures AC1 on DUT for all implemented application clusters
+          supporting scenes."
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 100
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC1 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC1.
-      disabled: true
+          Is DUT configured with AC1?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC1 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a StoreScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C04.Rsp
-      verification: |
-          DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01.
-      disabled: true
+      command: "StoreScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC2 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC2 which is different from AC1.
-      disabled: true
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a RecallScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C05.Rsp
-      verification: |
-          If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS). DUT returns to AC1.
-      disabled: true
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
 
-    - label:
-          "TH reads attributes SceneCount, CurrentScene, CurrentGroup and
-          SceneValid from DUT."
+    - label: "TH reads the SceneCount attribute from DUT."
       PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003
-      verification: |
-          DUT provides these attribute values: SceneCount attribute has the value (PIXIT.S.SceneTableEntriesOnFactoryNew + 1) CurrentScene attribute has the value 0x01 CurrentGroup attribute has the value G1 SceneValid attribute has the value TRUE.
-      disabled: true
+      command: "readAttribute"
+      attribute: "SceneCount"
+      response:
+          value: 1
+          constraints:
+              type: int8u
 
-    - label: "By application specific means, remove the power source from DUT."
-      verification: |
-          DUT is powered off.
-      disabled: true
+    - label: "TH reads the CurrentScene attribute from DUT."
+      PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003
+      command: "readAttribute"
+      attribute: "CurrentScene"
+      response:
+          value: 0x01
+          constraints:
+              type: int8u
 
-    - label: "By application specific means, return the power source to DUT."
+    - label: "TH reads the CurrentGroup attribute from DUT."
+      PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003
+      command: "readAttribute"
+      attribute: "CurrentGroup"
+      response:
+          value: 0x0001
+          constraints:
+              type: groupid
+
+    - label: "TH reads the SceneValid attribute from DUT."
+      PICS: S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003
+      command: "readAttribute"
+      attribute: "SceneValid"
+      response:
+          value: true
+          constraints:
+              type: uint8
+
+    - label: "Reboot target device"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "SystemCommands"
+      endpoint: 0
+      command: "Reboot"
+
+    - label: "Reboot target device(DUT)"
       verification: |
-          DUT is powered on.
-      disabled: true
+          Did the DUT successfully reboot?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value: "Please reboot the DUT and enter 'y' after DUT starts"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC2 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC2 which is different from AC1.
-      disabled: true
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a RecallScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C05.Rsp
-      verification: |
-          If a status response is expected, DUT sends a response to TH with the Status field equal to 0x00 (SUCCESS). DUT returns to AC1.
-      disabled: true
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
 
     - label:
           "TH sends a ViewScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
-      PICS: S.S.C01.Rsp
-      verification: |
-          DUT sends a ViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001, the SceneID field set to 0x01, the TransitionTime field set to 0x0000 and a set of extension fields appropriate to AC1.
-      disabled: true
+      PICS: S.S.C01.Rsp && PICS_SDK_CI_ONLY
+      command: "ViewScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: 0x0000
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
+
+    - label:
+          "TH sends a ViewScene command to DUT with the GroupID field set to
+          0x0001 and the SceneID field set to 0x01."
+      PICS: S.S.C01.Rsp && PICS_SKIP_SAMPLE_APP
+      command: "ViewScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: 0x0000
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 1
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneList"
+                value: [0x01]
 
     - label:
           "TH sends a RemoveAllScenes command to DUT with the GroupID field set
           to 0x0001."
       PICS: S.S.C03.Rsp
-      verification: |
-          DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0001.
-      disabled: true
+      command: "RemoveAllScenes"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0001
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values SC0, 0xfe or null, the GroupID field set to 0x0001 and the SceneCount field set to 0x00.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2)
+              - name: "GroupID"
+                value: 0x0001
+                # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI
+                #  constraints:
+                #      anyOf: [(maxScenes/2), 0xfe ,0x89]
 
     - label:
           "TH sends a AddScene command to DUT with the GroupID field set to
           0x0001, the SceneID field set to 0x01, the TransitionTime field set to
           0x0001 and a set of extension fields appropriate to AC1."
-      PICS: S.S.C00.Rsp
+      PICS: S.S.C00.Rsp && && PICS_SDK_CI_ONLY
+      command: "AddScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x0001
+              - name: "TransitionTime"
+                value: 0x0001
+              - name: "SceneName"
+                value: "Scene1"
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH sends a AddScene command to DUT with the GroupID field set to
+          0x0001, the SceneID field set to 0x01, the TransitionTime field set to
+          0x0001 and a set of extension fields appropriate to AC1."
       verification: |
-          DUT sends a AddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01.
-      disabled: true
+          Execute the following command in TH to generate the pre-condition to execute this test case:
+
+          ./chip-tool scenes add-scene 0x0001 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId
+
+          Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application
+
+          Verify the "status is success" on the TH(Chip-tool)  Log  and below is the sample log provided for the raspi platform:
+          [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage =
+          [1670970505.887118][5742:5744] CHIP:DMG: {
+          [1670970505.887172][5742:5744] CHIP:DMG: 	suppressResponse = false,
+          [1670970505.887231][5742:5744] CHIP:DMG: 	InvokeResponseIBs =
+          [1670970505.887307][5742:5744] CHIP:DMG: 	[
+          [1670970505.887366][5742:5744] CHIP:DMG: 		InvokeResponseIB =
+          [1670970505.887444][5742:5744] CHIP:DMG: 		{
+          [1670970505.887507][5742:5744] CHIP:DMG: 			CommandDataIB =
+          [1670970505.887576][5742:5744] CHIP:DMG: 			{
+          [1670970505.887713][5742:5744] CHIP:DMG: 				CommandPathIB =
+          [1670970505.887804][5742:5744] CHIP:DMG: 				{
+          [1670970505.887940][5742:5744] CHIP:DMG: 					EndpointId = 0x1,
+          [1670970505.888093][5742:5744] CHIP:DMG: 					ClusterId = 0x5,
+          [1670970505.888242][5742:5744] CHIP:DMG: 					CommandId = 0x0,
+          [1670970505.888385][5742:5744] CHIP:DMG: 				},
+          [1670970505.888692][5742:5744] CHIP:DMG:
+          [1670970505.888769][5742:5744] CHIP:DMG: 				CommandFields =
+          [1670970505.888852][5742:5744] CHIP:DMG: 				{
+          [1670970505.889030][5742:5744] CHIP:DMG: 					0x0 = 0,
+          [1670970505.889183][5742:5744] CHIP:DMG: 					0x1 = 1,
+          [1670970505.889406][5742:5744] CHIP:DMG: 					0x2 = 1,
+          [1670970505.889515][5742:5744] CHIP:DMG: 				},
+          [1670970505.889603][5742:5744] CHIP:DMG: 			},
+          [1670970505.889684][5742:5744] CHIP:DMG:
+          [1670970505.889745][5742:5744] CHIP:DMG: 		},
+          [1670970505.889821][5742:5744] CHIP:DMG:
+          [1670970505.889878][5742:5744] CHIP:DMG: 	],
+          [1670970505.889953][5742:5744] CHIP:DMG:
+          [1670970505.890009][5742:5744] CHIP:DMG: 	InteractionModelRevision = 1
+          [1670970505.890066][5742:5744] CHIP:DMG: },
+          [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0000
+          [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0000
+          [1670970505.890458][5742:5744] CHIP:TOO:   AddSceneResponse: {
+          [1670970505.890551][5742:5744] CHIP:TOO:     status: 0
+          [1670970505.890608][5742:5744] CHIP:TOO:     groupId: 1
+          [1670970505.890717][5742:5744] CHIP:TOO:     sceneId: 1
+          [1670970505.890774][5742:5744] CHIP:TOO:    }
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please execute the add scene command with
+                    extensionfieldsets in accordance with AC1 on DUT and enter
+                    'y' if the command is successful"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 1
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneList"
+                value: [0x01]
+                # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI
+                #  constraints:
+                #      anyOf: [(maxScenes/2), 0xfe ,0x89]
 
     - label:
           "TH sends a RemoveScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C02.Rsp
-      verification: |
-          DUT sends a RemoveSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01.
-      disabled: true
+      command: "RemoveScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values SC0, 0xfe or null, the GroupID field set to 0x0001 and the SceneCount field set to 0x00.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2)
+              - name: "GroupID"
+                value: 0x0001
+                # TODO : For Capacity, replace "value: (maxScenes/2)" by following lines when new backend for test is used in CI
+                #  constraints:
+                #      anyOf: [(maxScenes/2), 0xfe ,0x89]
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC2 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC2 which is different from AC1.
-      disabled: true
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a RecallScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C05.Rsp
-      verification: |
-          If a status response is expected, DUT sends a response to TH with the Status field equal to 0x8b (NOT_FOUND).
-      disabled: true
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          error: NOT_FOUND
+
+    - label:
+          "TH configures AC1 on DUT for all implemented application clusters
+          supporting scenes."
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 100
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC1 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC1.
-      disabled: true
+          Is DUT configured with AC1?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC1 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a StoreScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x01."
       PICS: S.S.C04.Rsp
-      verification: |
-          DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 0x0001 and the SceneID field set to 0x01.
-      disabled: true
+      command: "StoreScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
 
     - label:
           "TH configures AC2 on DUT for all implemented application clusters
           supporting scenes."
       verification: |
-          DUT is configured with AC2 which is different to AC1.
-      disabled: true
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a StoreScene command to DUT with the GroupID field set to
           0x0001 and the SceneID field set to 0x02."
       PICS: S.S.C04.Rsp
-      verification: |
-          DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x89 (INSUFFICIENT_SPACE). If SUCCESS, with the GroupID field set to 0x0001 and the SceneID field set to 0x02. If INSUFFICIENT_SPACE, the following steps SHALL NOT be executed.
-      disabled: true
+      command: "StoreScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x02
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x02
+              # TODO: For status, replace "- value: 0x00" by following lines when new backend for test is used in CI
+              #  saveAs: StoreStatus
+              #  constraints:
+              #      anyOf: [0x00, 0x89]
+
+    # TODO: Uncomment once the new backend is implemented, allowing the use of EqualityCommands pseudo cluster
+    #- label:
+    #      "Verify that the status of previous command was either 0x00 (SUCCESS)
+    #      or 0x89 (INSUFFICIENT_SPACE)"
+    #  cluster: "EqualityCommands"
+    #  command: "UnsignedNumberEquals"
+    #  arguments:
+    #      values:
+    #          - name: "Value1"
+    #            value: 0x00
+    #          - name: "Value2"
+    #            value: StoreStatus
+    #  response:
+    #      - values:
+    #            - name: "Equals"
+    #              value: true
+    #              saveAs: ContinueTest
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0001."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 2), 0xfe or null, the GroupID field set to 0x0001, the SceneCount field set to 0x02 and the SceneList field containing the scene IDs 0x01 and 0x02.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 2
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneList"
+                value: [0x01, 0x02]
 
     - label:
           "If capacity allows, TH sends a AddGroup command to DUT with the
           GroupID field set to 0x0002."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       PICS: G.S.C00.Rsp
-      verification: |
-          DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) and the GroupID field set to 0x0002.
-      disabled: true
+      cluster: "Groups"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0002
+              - name: "GroupName"
+                value: "Group2"
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0002
 
     - label:
           "TH sends a RemoveAllScenes command to DUT with the GroupID field set
           to 0x0002."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       PICS: S.S.C03.Rsp
-      verification: |
-          DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to 0x0002.
-      disabled: true
+      command: "RemoveAllScenes"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0002
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0002
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0002."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC1, the GroupID field set to 0x0002 and the SceneCount field set to 0x00.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0002
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 2
+              - name: "GroupID"
+                value: 0x0002
 
     - label:
           "TH configures AC3 on DUT for all implemented application clusters
           supporting scenes."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 1
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label:
+          "TH configures AC3 on DUT for all implemented application clusters
+          supporting scenes."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       verification: |
-          DUT is configured with AC3 which is different to both AC1 and AC2.
-      disabled: true
+          Is DUT configured with AC3?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC3 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a StoreScene command to DUT with the GroupID field set to
           0x0002 and the SceneID field set to 0x03."
+      # TODO : Uncomment runIf statement once new test backend is implemented
+      #runIf: ContinueTest
       PICS: S.S.C04.Rsp
-      verification: |
-          DUT sends a StoreSceneResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x89 (INSUFFICIENT_SPACE). If SUCCESS, with the GroupID field set to 0x0002 and the SceneID field set to 0x03. IF INSUFFICIENT_SPACE, the following steps SHALL NOT be executed.
-      disabled: true
+      command: "StoreScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0002
+              - name: "SceneID"
+                value: 0x03
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0002
+              - name: "SceneID"
+                value: 0x03
+              # TODO: For Status, replace "- value: 0x00"by following lines when new backend for test is used in CI
+              #  saveAs: StoreStatus
+              #  constraints:
+              #      anyOf: [0x00, 0x89]
+
+    # TODO: Uncomment once the new backend is implemented, allowing the use of EqualityCommands pseudo cluster
+    #- label:
+    #      "Verify that the status of previous command was either 0x00 (SUCCESS)
+    #      or 0x89 (INSUFFICIENT_SPACE)"
+    #  runIf: ContinueTest
+    #  cluster: "EqualityCommands"
+    #  command: "UnsignedNumberEquals"
+    #  arguments:
+    #      values:
+    #          - name: "Value1"
+    #            value: 0x00
+    #          - name: "Value2"
+    #            value: StoreStatus
+    #  response:
+    #      - values:
+    #            - name: "Equals"
+    #              value: true
+    #              saveAs: ContinueTest
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to 0x0002."
+      #runIf: ContinueTest
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC1 - 3), 0xfe or null, the GroupID field set to 0x0002, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x03.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0002
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 3
+              - name: "GroupID"
+                value: 0x0002
+              - name: "SceneList"
+                value: [0x03]
diff --git a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml
index 6abe854..b0fcf20 100644
--- a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml
+++ b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml
@@ -20,99 +20,580 @@
 
 config:
     nodeId: 0x12344321
-    cluster: "Basic Information"
-    endpoint: 0
+    cluster: "Scenes"
+    endpoint: 1
+    G1:
+        type: int16u
+        defaultValue: 0x0001
 
 tests:
-    - label:
-          "preparation step for using commands from Groups cluster: TH generates
-          fabric-unique GroupID, GroupName, random key, EpochKey0 and
-          GroupKeySetID. TH sets GroupKeySecurityPolicy = TrustFirst (1)
-          GroupKeyMulticastPolicy = PerGroupID (0) EpochStartTime0 = 0"
-      verification: |
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
 
-      disabled: true
+    - label: "TH reads from the DUT the (0x0006) SceneTableSize attribute"
+      PICS: S.S.A0006
+      command: "readAttribute"
+      attribute: "SceneTableSize"
+      response:
+          values:
+              - name: "SceneTableSize"
+                saveAs: maxScenes
+          constraints:
+              type: uint16
+
+    - label:
+          "preparation step for using commands from Groups cluster: Add KeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: "GroupKeySet"
+                value:
+                    {
+                        GroupKeySetID: 0x01a1,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
+                        EpochStartTime0: 0,
+                        EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
+                        EpochStartTime1: 0,
+                        EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
+                        EpochStartTime2: 0,
+                    }
+
+    - label:
+          "Preparation step for using commands from Groups cluster: Write Group
+          Keys"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "GroupKeyMap"
+      arguments:
+          value: [{ FabricIndex: 1, GroupId: G1, GroupKeySetID: 0x01a1 }]
 
     - label:
           "TH sends a AddGroup command to DUT with the GroupID field set to G1."
       PICS: G.S.C00.Rsp
-      verification: |
-          DUT sends a AddGroupResponse command to TH with the Status field set to 0x00 (SUCCESS) or 0x8a (DUPLICATE_EXISTS) and the GroupID field set to G1.
-      disabled: true
+      cluster: "Groups"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "GroupName"
+                value: "Group1"
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: G1
 
     - label:
           "TH sends a RemoveAllScenes command to DUT with the GroupID field set
           to G1."
       PICS: S.S.C03.Rsp
-      verification: |
-          DUT sends a RemoveAllScenesResponse command to TH with the Status field set to 0x00 (SUCCESS) and GroupID field set to G1.
-      disabled: true
+      command: "RemoveAllScenes"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: G1
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to G1."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to the value SC0, the GroupID field set to G1 and the SceneCount field set to 0x00.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2)
+              - name: "GroupID"
+                value: G1
+              - name: "SceneList"
+                value: []
 
     - label:
           "TH sends a EnhancedAddScene command to DUT with the GroupID field set
           to G1, the SceneID field set to 0x01, the TransitionTime field set to
           0x000a (1s) and a set of extension fields appropriate to AC1."
-      PICS: S.S.C40.Rsp
-      verification: |
-          DUT sends a EnhancedAddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01.
-      disabled: true
+      PICS: S.S.C40.Rsp && PICS_SDK_CI_ONLY
+      command: "EnhancedAddScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x0001
+              - name: "TransitionTime"
+                value: 0x000a
+              - name: "SceneName"
+                value: "Scene1"
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
 
     - label:
           "TH sends a AddScene command to DUT with the GroupID field set to G1,
           the SceneID field set to 0x01, the TransitionTime field set to 0x0001
           (1s) and a set of extension fields appropriate to AC1."
-      PICS: S.S.C40.Rsp
+      PICS: (!S.S.C40.Rsp) && PICS_SDK_CI_ONLY
+      command: "AddScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x0001
+              - name: "TransitionTime"
+                value: 0x0001
+              - name: "SceneName"
+                value: "Scene1"
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH sends a EnhancedAddScene command to DUT with the GroupID field set
+          to G1, the SceneID field set to 0x01, the TransitionTime field set to
+          0x000a and a set of extension fields appropriate to AC1."
       verification: |
-          DUT sends a AddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01.
-      disabled: true
+          Execute the following command in TH to generate the pre-condition to execute this test case:
+
+          ./chip-tool scenes enhanced-add-scene 0x000a 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId
+
+          Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application
+
+          Verify the "status is success" on the TH(Chip-tool)  Log  and below is the sample log provided for the raspi platform:
+          [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage =
+          [1670970505.887118][5742:5744] CHIP:DMG: {
+          [1670970505.887172][5742:5744] CHIP:DMG: 	suppressResponse = false,
+          [1670970505.887231][5742:5744] CHIP:DMG: 	InvokeResponseIBs =
+          [1670970505.887307][5742:5744] CHIP:DMG: 	[
+          [1670970505.887366][5742:5744] CHIP:DMG: 		InvokeResponseIB =
+          [1670970505.887444][5742:5744] CHIP:DMG: 		{
+          [1670970505.887507][5742:5744] CHIP:DMG: 			CommandDataIB =
+          [1670970505.887576][5742:5744] CHIP:DMG: 			{
+          [1670970505.887713][5742:5744] CHIP:DMG: 				CommandPathIB =
+          [1670970505.887804][5742:5744] CHIP:DMG: 				{
+          [1670970505.887940][5742:5744] CHIP:DMG: 					EndpointId = 0x1,
+          [1670970505.888093][5742:5744] CHIP:DMG: 					ClusterId = 0x5,
+          [1670970505.888242][5742:5744] CHIP:DMG: 					CommandId = 0x40,
+          [1670970505.888385][5742:5744] CHIP:DMG: 				},
+          [1670970505.888692][5742:5744] CHIP:DMG:
+          [1670970505.888769][5742:5744] CHIP:DMG: 				CommandFields =
+          [1670970505.888852][5742:5744] CHIP:DMG: 				{
+          [1670970505.889030][5742:5744] CHIP:DMG: 					0x0 = 0,
+          [1670970505.889183][5742:5744] CHIP:DMG: 					0x1 = 1,
+          [1670970505.889406][5742:5744] CHIP:DMG: 					0x2 = 1,
+          [1670970505.889515][5742:5744] CHIP:DMG: 				},
+          [1670970505.889603][5742:5744] CHIP:DMG: 			},
+          [1670970505.889684][5742:5744] CHIP:DMG:
+          [1670970505.889745][5742:5744] CHIP:DMG: 		},
+          [1670970505.889821][5742:5744] CHIP:DMG:
+          [1670970505.889878][5742:5744] CHIP:DMG: 	],
+          [1670970505.889953][5742:5744] CHIP:DMG:
+          [1670970505.890009][5742:5744] CHIP:DMG: 	InteractionModelRevision = 1
+          [1670970505.890066][5742:5744] CHIP:DMG: },
+          [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0040
+          [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0040
+          [1670970505.890458][5742:5744] CHIP:TOO:   EnhancedAddSceneResponse: {
+          [1670970505.890551][5742:5744] CHIP:TOO:     status: 0
+          [1670970505.890608][5742:5744] CHIP:TOO:     groupId: 1
+          [1670970505.890717][5742:5744] CHIP:TOO:     sceneId: 1
+          [1670970505.890774][5742:5744] CHIP:TOO:    }
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: S.S.C40.Rsp && PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please execute the enhanced add scene command with
+                    extensionfieldsets in accordance with AC1 on DUT and enter
+                    'y' if the command is successful"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH sends a AddScene command to DUT with the GroupID field set to G1,
+          the SceneID field set to 0x01, the TransitionTime field set to 0x0001
+          and a set of extension fields appropriate to AC1."
+      verification: |
+          Execute the following command in TH to generate the pre-condition to execute this test case:
+
+          ./chip-tool scenes add-scene 0x0001 1 1 "Test Name" '[{"clusterId": value, "attributeValueList":[{"attributeId": value, "attributeValue": value}]}' nodeId endpointId
+
+          Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application
+
+          Verify the "status is success" on the TH(Chip-tool)  Log  and below is the sample log provided for the raspi platform:
+          [1670970505.887060][5742:5744] CHIP:DMG: InvokeResponseMessage =
+          [1670970505.887118][5742:5744] CHIP:DMG: {
+          [1670970505.887172][5742:5744] CHIP:DMG: 	suppressResponse = false,
+          [1670970505.887231][5742:5744] CHIP:DMG: 	InvokeResponseIBs =
+          [1670970505.887307][5742:5744] CHIP:DMG: 	[
+          [1670970505.887366][5742:5744] CHIP:DMG: 		InvokeResponseIB =
+          [1670970505.887444][5742:5744] CHIP:DMG: 		{
+          [1670970505.887507][5742:5744] CHIP:DMG: 			CommandDataIB =
+          [1670970505.887576][5742:5744] CHIP:DMG: 			{
+          [1670970505.887713][5742:5744] CHIP:DMG: 				CommandPathIB =
+          [1670970505.887804][5742:5744] CHIP:DMG: 				{
+          [1670970505.887940][5742:5744] CHIP:DMG: 					EndpointId = 0x1,
+          [1670970505.888093][5742:5744] CHIP:DMG: 					ClusterId = 0x5,
+          [1670970505.888242][5742:5744] CHIP:DMG: 					CommandId = 0x0,
+          [1670970505.888385][5742:5744] CHIP:DMG: 				},
+          [1670970505.888692][5742:5744] CHIP:DMG:
+          [1670970505.888769][5742:5744] CHIP:DMG: 				CommandFields =
+          [1670970505.888852][5742:5744] CHIP:DMG: 				{
+          [1670970505.889030][5742:5744] CHIP:DMG: 					0x0 = 0,
+          [1670970505.889183][5742:5744] CHIP:DMG: 					0x1 = 1,
+          [1670970505.889406][5742:5744] CHIP:DMG: 					0x2 = 1,
+          [1670970505.889515][5742:5744] CHIP:DMG: 				},
+          [1670970505.889603][5742:5744] CHIP:DMG: 			},
+          [1670970505.889684][5742:5744] CHIP:DMG:
+          [1670970505.889745][5742:5744] CHIP:DMG: 		},
+          [1670970505.889821][5742:5744] CHIP:DMG:
+          [1670970505.889878][5742:5744] CHIP:DMG: 	],
+          [1670970505.889953][5742:5744] CHIP:DMG:
+          [1670970505.890009][5742:5744] CHIP:DMG: 	InteractionModelRevision = 1
+          [1670970505.890066][5742:5744] CHIP:DMG: },
+          [1670970505.890212][5742:5744] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0005 Command=0x0000_0000
+          [1670970505.890328][5742:5744] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0005 Command 0x0000_0000
+          [1670970505.890458][5742:5744] CHIP:TOO:   AddSceneResponse: {
+          [1670970505.890551][5742:5744] CHIP:TOO:     status: 0
+          [1670970505.890608][5742:5744] CHIP:TOO:     groupId: 1
+          [1670970505.890717][5742:5744] CHIP:TOO:     sceneId: 1
+          [1670970505.890774][5742:5744] CHIP:TOO:    }
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: (!S.S.C40.Rsp) && PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please execute the add scene command with
+                    extensionfieldsets in accordance with AC1 on DUT and enter
+                    'y' if the command is successful"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a EnhancedViewScene command to DUT with the GroupID field
           set to G1 and the SceneID field set to 0x01."
-      PICS: S.S.C41.Rsp
-      verification: |
-          DUT sends a EnhancedViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to 0x000a (1s) and a set of extension fields appropriate to AC1.
-      disabled: true
+      PICS: S.S.C41.Rsp && PICS_SDK_CI_ONLY
+      command: "EnhancedViewScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: 0x000a
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
 
     - label:
           "TH sends a ViewScene command to DUT with the GroupID field set to G1
           and the SceneID field set to 0x01."
-      PICS: "!S.S.C41.Rsp"
+      PICS: (!S.S.C41.Rsp) && PICS_SDK_CI_ONLY
+      command: "ViewScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: 0x0001
+              - name: "ExtensionFieldSets"
+                value:
+                    [
+                        {
+                            ClusterID: 0x0006,
+                            AttributeValueList:
+                                [{ AttributeID: 0x0000, AttributeValue: 0x01 }],
+                        },
+                        {
+                            ClusterID: 0x0008,
+                            AttributeValueList:
+                                [
+                                    {
+                                        AttributeID: 0x0000,
+                                        AttributeValue: 0x64,
+                                    },
+                                    {
+                                        AttributeID: 0x0001,
+                                        AttributeValue: 0x00,
+                                    },
+                                ],
+                        },
+                    ]
+
+    - label:
+          "TH sends a EnhancedViewScene command to DUT with the GroupID field
+          set to G1 and the SceneID field set to 0x01."
+      PICS: S.S.C41.Rsp && PICS_SKIP_SAMPLE_APP
       verification: |
-          DUT sends a ViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1 and the SceneID field set to 0x01, the TransitionTime field set to 0x0001 (1s) and a set of extension fields appropriate to AC1.
-      disabled: true
+          Execute the following command in TH to generate the pre-condition to execute this test case:
+
+          ./chip-tool scenes enhanced-view-scene GroupId SceneId Node-Id EndpointId
+
+          Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application
+
+          Verify that the extension fields in the log match the ones expected and that
+          Status = 0x00
+          GroupID = 0x0001
+          SceneID = 0x01
+          TransitionTime = 0x000a
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please execute the ehanced-view-scene command and verify
+                    that the extensionfieldsets, status, groupID and SceneID are
+                    in accordance with AC1 on DUT and enter 'y' if the command
+                    is successful"
+              - name: "expectedValue"
+                value: "y"
+    - label:
+          "TH sends a ViewScene command to DUT with the GroupID field set to G1
+          and the SceneID field set to 0x01."
+      PICS: (!S.S.C41.Rsp) && PICS_SKIP_SAMPLE_APP
+      verification: |
+          Execute the following command in TH to generate the pre-condition to execute this test case:
+
+          ./chip-tool scenes view-scene GroupId SceneId Node-Id EndpointId
+
+          Note: The number of ExtensionFieldSets, the value of clusterId of each ExtensionFieldSet, the number of attributes in attributeValueList and their values varies for each application
+
+          Verify that the extension fields in the log match the ones expected and that
+          Status = 0x00
+          GroupID = 0x0001
+          SceneID = 0x01
+          TransitionTime = 0x0001
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please execute the view-scene command and verify that the
+                    extensionfieldsets, status, groupID and SceneID are in
+                    accordance with AC1 on DUT and enter 'y' if the command is
+                    successful"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to G1."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 1), 0xfe or null, the GroupID field set to G1, the SceneCount field set to 0x01 and the SceneList field containing only the scene ID 0x01.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 1
+              - name: "GroupID"
+                value: G1
+              - name: "SceneList"
+                value: [0x01]
 
     - label:
           "TH configures AC2 on DUT for all implemented application clusters
           supporting scenes."
-      PICS: S.S.C04.Rsp
+      cluster: "Level Control"
+      PICS: PICS_SDK_CI_ONLY
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
       verification: |
-          DUT is configured with AC2 which is different from AC1.
-      disabled: true
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a RecallScene command to group G1 with the GroupID field set
           to G1 and the scene ID field set to 0x01."
       PICS: S.S.C05.Rsp
+      command: "RecallScene"
+      groupId: 0x0001
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+              - name: "SceneID"
+                value: 0x01
+
+    - label: "Wait 1s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "DelayCommands"
+      command: "WaitForMs"
+      arguments:
+          values:
+              - name: "ms"
+                value: 1000
+
+    - label:
+          "TH confirm the DUT reached AC1 (on level control cluster) after 1s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "readAttribute"
+      attribute: "CurrentLevel"
+      response:
+          value: 100
+
+    - label: "Verify DUT returns to AC1."
       verification: |
-          (There is no Status response since this was a groupcast) DUT returns to AC1.
-      disabled: true
+          Is DUT configured with AC1?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value: "Please confirm AC1 on DUT and enter 'y'."
+              - name: "expectedValue"
+                value: "y"
 
     - label:
           "TH sends a CopyScene command to DUT with the mode field set to 0x00,
@@ -122,12 +603,44 @@
       PICS: S.S.C42.Rsp
       verification: |
           DUT sends a CopySceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the group identifier from field set to G1 and the scene identifier from field set to 0x01.
-      disabled: true
+      command: "CopyScene"
+      arguments:
+          values:
+              - name: "Mode"
+                value: 0x00
+              - name: "GroupIdentifierFrom"
+                value: G1
+              - name: "SceneIdentifierFrom"
+                value: 0x01
+              - name: "GroupIdentifierTo"
+                value: G1
+              - name: "SceneIdentifierTo"
+                value: 0x02
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupIdentifierFrom"
+                value: G1
+              - name: "SceneIdentifierFrom"
+                value: 0x01
 
     - label:
           "TH sends a GetSceneMembership command to DUT with the GroupID field
           set to G1."
       PICS: S.S.C06.Rsp
-      verification: |
-          DUT sends a GetSceneMembershipResponse command to TH with the Status field set to 0x00 (SUCCESS), the Capacity field set to one of the values (SC0 - 2), 0xfe or null, the GroupID field set to G1, the SceneCount field set to 0x02 and the SceneList field containing the scene IDs 0x01 and 0x02.
-      disabled: true
+      command: "GetSceneMembership"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: G1
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "Capacity"
+                value: (maxScenes/2) - 2
+              - name: "GroupID"
+                value: G1
+              - name: "SceneList"
+                value: [0x01, 0x02]
diff --git a/src/app/tests/suites/certification/Test_TC_S_2_4.yaml b/src/app/tests/suites/certification/Test_TC_S_2_4.yaml
new file mode 100644
index 0000000..ad1c65b
--- /dev/null
+++ b/src/app/tests/suites/certification/Test_TC_S_2_4.yaml
@@ -0,0 +1,414 @@
+# 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.
+# Auto-generated scripts for harness use only, please review before automation. The endpoints and cluster names are currently set to default
+
+name: 123.2.4. [TC-S-2.4] Recall scene with transition time functionality
+
+PICS:
+    - S.S
+
+config:
+    nodeId: 0x12344321
+    cluster: "Scenes"
+    endpoint: 1
+
+tests:
+    - label: "Wait for the commissioned device to be retrieved"
+      cluster: "DelayCommands"
+      command: "WaitForCommissionee"
+      arguments:
+          values:
+              - name: "nodeId"
+                value: nodeId
+
+    - label: "TH sends a RemoveAllGroups command to DUT."
+      PICS: G.S.C04.Rsp
+      cluster: "Groups"
+      endpoint: "1"
+      command: "RemoveAllGroups"
+
+    - label:
+          "preparation step for using commands from Groups cluster: Add KeySet"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "KeySetWrite"
+      arguments:
+          values:
+              - name: "GroupKeySet"
+                value:
+                    {
+                        GroupKeySetID: 0x01a1,
+                        GroupKeySecurityPolicy: 0,
+                        EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
+                        EpochStartTime0: 0,
+                        EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
+                        EpochStartTime1: 0,
+                        EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
+                        EpochStartTime2: 0,
+                    }
+
+    - label:
+          "Preparation step for using commands from Groups cluster: Write Group
+          Keys"
+      cluster: "Group Key Management"
+      endpoint: 0
+      command: "writeAttribute"
+      attribute: "GroupKeyMap"
+      arguments:
+          value: [{ FabricIndex: 1, GroupId: 0x0001, GroupKeySetID: 0x01a1 }]
+
+    - label:
+          "TH sends a AddGroup command to DUT with the GroupID field set to
+          0x0001."
+      PICS: G.S.C00.Rsp
+      cluster: "Groups"
+      command: "AddGroup"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "GroupName"
+                value: "Group1"
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0001
+
+    - label:
+          "TH sends a RemoveAllScenes command to DUT with the GroupID field set
+          to 0x0001."
+      PICS: S.S.C03.Rsp
+      command: "RemoveAllScenes"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "GroupID"
+                value: 0x0001
+
+    - label:
+          "TH sends a AddScene command to DUT with the GroupID field set to
+          0x0001, the SceneID field set to 0x01, the TransitionTime field set to
+          0x0001 and a set of extension fields appropriate to AC1."
+      PICS: S.S.C00.Rsp
+      command: "AddScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x0001
+              - name: "TransitionTime"
+                value: 0x0014
+              - name: "SceneName"
+                value: "Scene1"
+              - name: "ExtensionFieldSets"
+                value: []
+
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH configures AC1 on DUT for all implemented application clusters
+          supporting scenes."
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 100
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label:
+          "TH configures AC1 on DUT for all implemented application clusters
+          supporting scenes."
+      verification: |
+          Is DUT configured with AC1?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC1 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH sends a StoreScene command to DUT with the GroupID field set to
+          0x0001 and the SceneID field set to 0x01."
+      PICS: S.S.C04.Rsp
+      command: "StoreScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+      response:
+          values:
+              - name: "Status"
+                value: 0x00
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label: "Wait 1s for level to change"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "DelayCommands"
+      command: "WaitForMs"
+      arguments:
+          values:
+              - name: "ms"
+                value: 1000
+
+    - label:
+          "TH confirm the DUT reached AC2 (on level control cluster) after 1s,
+          which is different from AC1"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "readAttribute"
+      attribute: "CurrentLevel"
+      response:
+          value: 200
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      verification: |
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH sends a RecallScene command to DUT with the GroupID field set to
+          0x0001 and the SceneID field set to 0x01 and the TransitionTime field
+          omitted."
+      PICS: S.S.C05.Rsp
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+
+    - label: "Wait 20s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "DelayCommands"
+      command: "WaitForMs"
+      arguments:
+          values:
+              - name: "ms"
+                value: 20000
+
+    - label:
+          "TH confirm the DUT reached AC1 (on level control cluster) after 20s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "readAttribute"
+      attribute: "CurrentLevel"
+      response:
+          value: 100
+
+    - label: "DUT transitions to AC1 over 20s."
+      verification: |
+          Is the transition done over 20s?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value: "Please confirm that transition to AC1 was made over 20s"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      verification: |
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH sends a RecallScene command to DUT with the GroupID field set to
+          0x0001, the SceneID field set to 0x01 and the TransitionTime field set
+          to 0x0032 (5s)."
+      PICS: S.S.C05.Rsp
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: 0x0032
+
+    - label: "Wait 5s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "DelayCommands"
+      command: "WaitForMs"
+      arguments:
+          values:
+              - name: "ms"
+                value: 5000
+
+    - label:
+          "TH confirm the DUT reached AC2 (on level control cluster) after 5s"
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "readAttribute"
+      attribute: "CurrentLevel"
+      response:
+          value: 100
+
+    - label: "DUT transitions to AC1 over 5."
+      verification: |
+          Is the transition done over 5s?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value: "Please confirm that transition to AC1 was made over 5s"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      PICS: PICS_SDK_CI_ONLY
+      cluster: "Level Control"
+      command: "MoveToLevelWithOnOff"
+      arguments:
+          values:
+              - name: "Level"
+                value: 200
+              - name: "TransitionTime"
+                value: 0
+              - name: "OptionsMask"
+                value: 0
+              - name: "OptionsOverride"
+                value: 0
+
+    - label:
+          "TH configures AC2 on DUT for all implemented application clusters
+          supporting scenes."
+      verification: |
+          Is DUT configured with AC2?
+      cluster: "LogCommands"
+      command: "UserPrompt"
+      PICS: PICS_SKIP_SAMPLE_APP
+      arguments:
+          values:
+              - name: "message"
+                value:
+                    "Please configure AC2 on DUT and enter 'y' after the
+                    configuration is complete"
+              - name: "expectedValue"
+                value: "y"
+
+    - label:
+          "TH sends a RecallScene command to DUT with the GroupID field set to
+          0x0001, the SceneID field set to 0x01 and the TransitionTime field set
+          to null (no transition time override)."
+      PICS: S.S.C05.Rsp
+      command: "RecallScene"
+      arguments:
+          values:
+              - name: "GroupID"
+                value: 0x0001
+              - name: "SceneID"
+                value: 0x01
+              - name: "TransitionTime"
+                value: null
+      response:
+          error: 0x00
diff --git a/src/app/tests/suites/certification/ci-pics-values b/src/app/tests/suites/certification/ci-pics-values
index 3cb6b99..a656442 100644
--- a/src/app/tests/suites/certification/ci-pics-values
+++ b/src/app/tests/suites/certification/ci-pics-values
@@ -619,6 +619,8 @@
 S.S.A0003=0
 S.S.A0004=0
 S.S.A0005=0
+S.S.A0006=0
+S.S.A0007=0
 S.S.C00.Rsp=0
 S.S.C01.Rsp=0
 S.S.C02.Rsp=0
diff --git a/src/app/tests/suites/manualTests.json b/src/app/tests/suites/manualTests.json
index b7e47c4..ad01f9f 100644
--- a/src/app/tests/suites/manualTests.json
+++ b/src/app/tests/suites/manualTests.json
@@ -284,6 +284,7 @@
         "Test_TC_S_2_1",
         "Test_TC_S_2_2",
         "Test_TC_S_2_3",
+        "Test_TC_S_2_4",
         "Test_TC_S_3_1"
     ],
     "PumpConfigurationControl": [],
diff --git a/src/app/zap-templates/zcl/data-model/chip/scene.xml b/src/app/zap-templates/zcl/data-model/chip/scene.xml
index d8efbe5..c05603a 100644
--- a/src/app/zap-templates/zcl/data-model/chip/scene.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/scene.xml
@@ -23,9 +23,7 @@
   <struct name="AttributeValuePair">
     <cluster code="0x0005"/>
     <item name="AttributeID" type="attrib_id" optional="true"/>
-    <!-- TODO Need a new type that can support variable attribute types and size  -->
-    <!-- One suggestion from Boris is a Type that maps to a TLVReader place in the riight elements -->
-    <item name="AttributeValue" type="INT8U" array="true"/>
+    <item name="AttributeValue" type="INT32U" optional="false"/>
   </struct>
 
   <struct name="ExtensionFieldSet">
@@ -51,7 +49,9 @@
     <attribute side="server" code="0x0003" define="SCENE_VALID" type="BOOLEAN" min="0x00" max="0x01" writable="false" default="0x00" optional="false">SceneValid</attribute>
     <attribute side="server" code="0x0004" define="SCENE_NAME_SUPPORT" type="BITMAP8" min="0x00" max="0x80" writable="false" default="0x00" optional="false">NameSupport</attribute>
     <attribute side="server" code="0x0005" define="LAST_CONFIGURED_BY" type="node_id" writable="false" isNullable="true" optional="true">LastConfiguredBy</attribute>
-   
+    <attribute side="server" code="0x0006" define="SCENE_TABLE_SIZE" type="INT16U" writable="false" optional="false">SceneTableSize</attribute>
+    <attribute side="server" code="0x0007" define="REMAINING_CAPACITY" type="INT8U" writable="false" optional="false">RemainingCapacity</attribute>
+
     <command source="client" code="0x00" name="AddScene" response="AddSceneResponse" isFabricScoped="true" optional="false" cli="chip scenes add">
       <description>
         Add a scene to the scene table. Extension field sets are supported, and are inputed as '{"ClusterID": VALUE, "AttributeValueList":[{"AttributeId": VALUE, "AttributeValue": VALUE}]}'
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index c05b40f..ea82d27 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -146,7 +146,7 @@
 
   struct AttributeValuePair {
     optional attrib_id attributeID = 0;
-    int8u attributeValue[] = 1;
+    int32u attributeValue = 1;
   }
 
   struct ExtensionFieldSet {
@@ -160,6 +160,8 @@
   readonly attribute boolean sceneValid = 3;
   readonly attribute bitmap8 nameSupport = 4;
   readonly attribute optional nullable node_id lastConfiguredBy = 5;
+  readonly attribute int16u sceneTableSize = 6;
+  readonly attribute int8u remainingCapacity = 7;
   readonly attribute command_id generatedCommandList[] = 65528;
   readonly attribute command_id acceptedCommandList[] = 65529;
   readonly attribute event_id eventList[] = 65530;
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
index e8210fe..44feb78 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterIDMapping.java
@@ -744,6 +744,8 @@
             SceneValid(3L),
             NameSupport(4L),
             LastConfiguredBy(5L),
+            SceneTableSize(6L),
+            RemainingCapacity(7L),
             GeneratedCommandList(65528L),
             AcceptedCommandList(65529L),
             EventList(65530L),
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
index 94b569b..09cf514 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java
@@ -265,6 +265,28 @@
           readScenesLastConfiguredByCommandParams
         );
         result.put("readLastConfiguredByAttribute", readScenesLastConfiguredByAttributeInteractionInfo);
+     Map<String, CommandParameterInfo> readScenesSceneTableSizeCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
+        InteractionInfo readScenesSceneTableSizeAttributeInteractionInfo = new InteractionInfo(
+          (cluster, callback, commandArguments) -> {
+            ((ChipClusters.ScenesCluster) cluster).readSceneTableSizeAttribute(
+              (ChipClusters.IntegerAttributeCallback) callback
+            );
+          },
+          () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
+          readScenesSceneTableSizeCommandParams
+        );
+        result.put("readSceneTableSizeAttribute", readScenesSceneTableSizeAttributeInteractionInfo);
+     Map<String, CommandParameterInfo> readScenesRemainingCapacityCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
+        InteractionInfo readScenesRemainingCapacityAttributeInteractionInfo = new InteractionInfo(
+          (cluster, callback, commandArguments) -> {
+            ((ChipClusters.ScenesCluster) cluster).readRemainingCapacityAttribute(
+              (ChipClusters.IntegerAttributeCallback) callback
+            );
+          },
+          () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
+          readScenesRemainingCapacityCommandParams
+        );
+        result.put("readRemainingCapacityAttribute", readScenesRemainingCapacityAttributeInteractionInfo);
      Map<String, CommandParameterInfo> readScenesGeneratedCommandListCommandParams = new LinkedHashMap<String, CommandParameterInfo>();
         InteractionInfo readScenesGeneratedCommandListAttributeInteractionInfo = new InteractionInfo(
           (cluster, callback, commandArguments) -> {
diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
index da4acdf..5652312 100644
--- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
@@ -455,6 +455,36 @@
             }
             return value;
         }
+        case Attributes::SceneTableSize::Id: {
+            using TypeInfo = Attributes::SceneTableSize::TypeInfo;
+            TypeInfo::DecodableType cppValue;
+            *aError = app::DataModel::Decode(aReader, cppValue);
+            if (*aError != CHIP_NO_ERROR)
+            {
+                return nullptr;
+            }
+            jobject value;
+            std::string valueClassName     = "java/lang/Integer";
+            std::string valueCtorSignature = "(I)V";
+            chip::JniReferences::GetInstance().CreateBoxedObject<uint16_t>(valueClassName.c_str(), valueCtorSignature.c_str(),
+                                                                           cppValue, value);
+            return value;
+        }
+        case Attributes::RemainingCapacity::Id: {
+            using TypeInfo = Attributes::RemainingCapacity::TypeInfo;
+            TypeInfo::DecodableType cppValue;
+            *aError = app::DataModel::Decode(aReader, cppValue);
+            if (*aError != CHIP_NO_ERROR)
+            {
+                return nullptr;
+            }
+            jobject value;
+            std::string valueClassName     = "java/lang/Integer";
+            std::string valueCtorSignature = "(I)V";
+            chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(valueClassName.c_str(), valueCtorSignature.c_str(),
+                                                                          cppValue, value);
+            return value;
+        }
         case Attributes::GeneratedCommandList::Id: {
             using TypeInfo = Attributes::GeneratedCommandList::TypeInfo;
             TypeInfo::DecodableType cppValue;
diff --git a/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp b/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp
index fed9314..8f2d6b7 100644
--- a/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp
+++ b/src/controller/java/zap-generated/CHIPInvokeCallbacks.cpp
@@ -521,19 +521,11 @@
                                                                       newElement_3_attributeID);
                 }
                 jobject newElement_3_attributeValue;
-                chip::JniReferences::GetInstance().CreateArrayList(newElement_3_attributeValue);
-
-                auto iter_newElement_3_attributeValue_5 = entry_3.attributeValue.begin();
-                while (iter_newElement_3_attributeValue_5.Next())
-                {
-                    auto & entry_5 = iter_newElement_3_attributeValue_5.GetValue();
-                    jobject newElement_5;
-                    std::string newElement_5ClassName     = "java/lang/Integer";
-                    std::string newElement_5CtorSignature = "(I)V";
-                    chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(
-                        newElement_5ClassName.c_str(), newElement_5CtorSignature.c_str(), entry_5, newElement_5);
-                    chip::JniReferences::GetInstance().AddToList(newElement_3_attributeValue, newElement_5);
-                }
+                std::string newElement_3_attributeValueClassName     = "java/lang/Long";
+                std::string newElement_3_attributeValueCtorSignature = "(J)V";
+                chip::JniReferences::GetInstance().CreateBoxedObject<uint32_t>(newElement_3_attributeValueClassName.c_str(),
+                                                                               newElement_3_attributeValueCtorSignature.c_str(),
+                                                                               entry_3.attributeValue, newElement_3_attributeValue);
 
                 jclass attributeValuePairStructClass_4;
                 err = chip::JniReferences::GetInstance().GetClassRef(
@@ -544,7 +536,7 @@
                     return;
                 }
                 jmethodID attributeValuePairStructCtor_4 =
-                    env->GetMethodID(attributeValuePairStructClass_4, "<init>", "(Ljava/util/Optional;Ljava/util/ArrayList;)V");
+                    env->GetMethodID(attributeValuePairStructClass_4, "<init>", "(Ljava/util/Optional;Ljava/lang/Long;)V");
                 if (attributeValuePairStructCtor_4 == nullptr)
                 {
                     ChipLogError(Zcl, "Could not find ChipStructs$ScenesClusterAttributeValuePair constructor");
@@ -1103,19 +1095,11 @@
                                                                       newElement_3_attributeID);
                 }
                 jobject newElement_3_attributeValue;
-                chip::JniReferences::GetInstance().CreateArrayList(newElement_3_attributeValue);
-
-                auto iter_newElement_3_attributeValue_5 = entry_3.attributeValue.begin();
-                while (iter_newElement_3_attributeValue_5.Next())
-                {
-                    auto & entry_5 = iter_newElement_3_attributeValue_5.GetValue();
-                    jobject newElement_5;
-                    std::string newElement_5ClassName     = "java/lang/Integer";
-                    std::string newElement_5CtorSignature = "(I)V";
-                    chip::JniReferences::GetInstance().CreateBoxedObject<uint8_t>(
-                        newElement_5ClassName.c_str(), newElement_5CtorSignature.c_str(), entry_5, newElement_5);
-                    chip::JniReferences::GetInstance().AddToList(newElement_3_attributeValue, newElement_5);
-                }
+                std::string newElement_3_attributeValueClassName     = "java/lang/Long";
+                std::string newElement_3_attributeValueCtorSignature = "(J)V";
+                chip::JniReferences::GetInstance().CreateBoxedObject<uint32_t>(newElement_3_attributeValueClassName.c_str(),
+                                                                               newElement_3_attributeValueCtorSignature.c_str(),
+                                                                               entry_3.attributeValue, newElement_3_attributeValue);
 
                 jclass attributeValuePairStructClass_4;
                 err = chip::JniReferences::GetInstance().GetClassRef(
@@ -1126,7 +1110,7 @@
                     return;
                 }
                 jmethodID attributeValuePairStructCtor_4 =
-                    env->GetMethodID(attributeValuePairStructClass_4, "<init>", "(Ljava/util/Optional;Ljava/util/ArrayList;)V");
+                    env->GetMethodID(attributeValuePairStructClass_4, "<init>", "(Ljava/util/Optional;Ljava/lang/Long;)V");
                 if (attributeValuePairStructCtor_4 == nullptr)
                 {
                     ChipLogError(Zcl, "Could not find ChipStructs$ScenesClusterAttributeValuePair constructor");
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
index 91b5ea6..617763b 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java
@@ -945,6 +945,24 @@
       subscribeLastConfiguredByAttribute(chipClusterPtr, callback, minInterval, maxInterval);
     }
 
+    public void readSceneTableSizeAttribute(IntegerAttributeCallback callback) {
+      readSceneTableSizeAttribute(chipClusterPtr, callback);
+    }
+
+    public void subscribeSceneTableSizeAttribute(
+        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
+      subscribeSceneTableSizeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
+    }
+
+    public void readRemainingCapacityAttribute(IntegerAttributeCallback callback) {
+      readRemainingCapacityAttribute(chipClusterPtr, callback);
+    }
+
+    public void subscribeRemainingCapacityAttribute(
+        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
+      subscribeRemainingCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
+    }
+
     public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
       readGeneratedCommandListAttribute(chipClusterPtr, callback);
     }
@@ -1038,6 +1056,18 @@
         int minInterval,
         int maxInterval);
 
+    private native void readSceneTableSizeAttribute(
+        long chipClusterPtr, IntegerAttributeCallback callback);
+
+    private native void subscribeSceneTableSizeAttribute(
+        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
+
+    private native void readRemainingCapacityAttribute(
+        long chipClusterPtr, IntegerAttributeCallback callback);
+
+    private native void subscribeRemainingCapacityAttribute(
+        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
+
     private native void readGeneratedCommandListAttribute(
         long chipClusterPtr, GeneratedCommandListAttributeCallback callback);
 
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java
index 778858d..c9e41ac 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java
@@ -474,6 +474,12 @@
       if (attributeId == 5L) {
         return "LastConfiguredBy";
       }
+      if (attributeId == 6L) {
+        return "SceneTableSize";
+      }
+      if (attributeId == 7L) {
+        return "RemainingCapacity";
+      }
       if (attributeId == 65528L) {
         return "GeneratedCommandList";
       }
diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java
index a039df1..0fea380 100644
--- a/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java
+++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipStructs.java
@@ -26,10 +26,9 @@
 public class ChipStructs {
   public static class ScenesClusterAttributeValuePair {
     public Optional<Long> attributeID;
-    public ArrayList<Object> attributeValue;
+    public Long attributeValue;
 
-    public ScenesClusterAttributeValuePair(
-        Optional<Long> attributeID, ArrayList<Object> attributeValue) {
+    public ScenesClusterAttributeValuePair(Optional<Long> attributeID, Long attributeValue) {
       this.attributeID = attributeID;
       this.attributeValue = attributeValue;
     }
diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py
index 67fbf68..6f70b15 100644
--- a/src/controller/python/chip/clusters/CHIPClusters.py
+++ b/src/controller/python/chip/clusters/CHIPClusters.py
@@ -325,6 +325,18 @@
                 "type": "int",
                 "reportable": True,
             },
+            0x00000006: {
+                "attributeName": "SceneTableSize",
+                "attributeId": 0x00000006,
+                "type": "int",
+                "reportable": True,
+            },
+            0x00000007: {
+                "attributeName": "RemainingCapacity",
+                "attributeId": 0x00000007,
+                "type": "int",
+                "reportable": True,
+            },
             0x0000FFF8: {
                 "attributeName": "GeneratedCommandList",
                 "attributeId": 0x0000FFF8,
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index 4960641..48d94a7 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -596,6 +596,8 @@
                 ClusterObjectFieldDescriptor(Label="sceneValid", Tag=0x00000003, Type=bool),
                 ClusterObjectFieldDescriptor(Label="nameSupport", Tag=0x00000004, Type=uint),
                 ClusterObjectFieldDescriptor(Label="lastConfiguredBy", Tag=0x00000005, Type=typing.Union[None, Nullable, uint]),
+                ClusterObjectFieldDescriptor(Label="sceneTableSize", Tag=0x00000006, Type=uint),
+                ClusterObjectFieldDescriptor(Label="remainingCapacity", Tag=0x00000007, Type=uint),
                 ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
                 ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
                 ClusterObjectFieldDescriptor(Label="eventList", Tag=0x0000FFFA, Type=typing.List[uint]),
@@ -610,6 +612,8 @@
     sceneValid: 'bool' = None
     nameSupport: 'uint' = None
     lastConfiguredBy: 'typing.Union[None, Nullable, uint]' = None
+    sceneTableSize: 'uint' = None
+    remainingCapacity: 'uint' = None
     generatedCommandList: 'typing.List[uint]' = None
     acceptedCommandList: 'typing.List[uint]' = None
     eventList: 'typing.List[uint]' = None
@@ -632,11 +636,11 @@
                 return ClusterObjectDescriptor(
                     Fields=[
                         ClusterObjectFieldDescriptor(Label="attributeID", Tag=0, Type=typing.Optional[uint]),
-                        ClusterObjectFieldDescriptor(Label="attributeValue", Tag=1, Type=typing.List[uint]),
+                        ClusterObjectFieldDescriptor(Label="attributeValue", Tag=1, Type=uint),
                     ])
 
             attributeID: 'typing.Optional[uint]' = None
-            attributeValue: 'typing.List[uint]' = field(default_factory=lambda: [])
+            attributeValue: 'uint' = 0
 
         @dataclass
         class ExtensionFieldSet(ClusterObject):
@@ -1138,6 +1142,38 @@
             value: 'typing.Union[None, Nullable, uint]' = None
 
         @dataclass
+        class SceneTableSize(ClusterAttributeDescriptor):
+            @ChipUtility.classproperty
+            def cluster_id(cls) -> int:
+                return 0x0005
+
+            @ChipUtility.classproperty
+            def attribute_id(cls) -> int:
+                return 0x00000006
+
+            @ChipUtility.classproperty
+            def attribute_type(cls) -> ClusterObjectFieldDescriptor:
+                return ClusterObjectFieldDescriptor(Type=uint)
+
+            value: 'uint' = 0
+
+        @dataclass
+        class RemainingCapacity(ClusterAttributeDescriptor):
+            @ChipUtility.classproperty
+            def cluster_id(cls) -> int:
+                return 0x0005
+
+            @ChipUtility.classproperty
+            def attribute_id(cls) -> int:
+                return 0x00000007
+
+            @ChipUtility.classproperty
+            def attribute_type(cls) -> ClusterObjectFieldDescriptor:
+                return ClusterObjectFieldDescriptor(Type=uint)
+
+            value: 'uint' = 0
+
+        @dataclass
         class GeneratedCommandList(ClusterAttributeDescriptor):
             @ChipUtility.classproperty
             def cluster_id(cls) -> int:
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
index 39d62ce..214ec3e 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeSpecifiedCheck.mm
@@ -108,6 +108,12 @@
     case Attributes::LastConfiguredBy::Id: {
         return YES;
     }
+    case Attributes::SceneTableSize::Id: {
+        return YES;
+    }
+    case Attributes::RemainingCapacity::Id: {
+        return YES;
+    }
     case Attributes::GeneratedCommandList::Id: {
         return YES;
     }
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index e8c4853..2b0f479 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -412,6 +412,28 @@
         }
         return value;
     }
+    case Attributes::SceneTableSize::Id: {
+        using TypeInfo = Attributes::SceneTableSize::TypeInfo;
+        TypeInfo::DecodableType cppValue;
+        *aError = DataModel::Decode(aReader, cppValue);
+        if (*aError != CHIP_NO_ERROR) {
+            return nil;
+        }
+        NSNumber * _Nonnull value;
+        value = [NSNumber numberWithUnsignedShort:cppValue];
+        return value;
+    }
+    case Attributes::RemainingCapacity::Id: {
+        using TypeInfo = Attributes::RemainingCapacity::TypeInfo;
+        TypeInfo::DecodableType cppValue;
+        *aError = DataModel::Decode(aReader, cppValue);
+        if (*aError != CHIP_NO_ERROR) {
+            return nil;
+        }
+        NSNumber * _Nonnull value;
+        value = [NSNumber numberWithUnsignedChar:cppValue];
+        return value;
+    }
     case Attributes::GeneratedCommandList::Id: {
         using TypeInfo = Attributes::GeneratedCommandList::TypeInfo;
         TypeInfo::DecodableType cppValue;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index d03181e..30c553c 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -501,6 +501,30 @@
                                                     (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
     API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
 
+- (void)readAttributeSceneTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+    MTR_NEWLY_AVAILABLE;
+- (void)subscribeAttributeSceneTableSizeWithParams:(MTRSubscribeParams *)params
+                           subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+                                     reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
+    MTR_NEWLY_AVAILABLE;
++ (void)readAttributeSceneTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+                                                endpoint:(NSNumber *)endpoint
+                                                   queue:(dispatch_queue_t)queue
+                                              completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+    MTR_NEWLY_AVAILABLE;
+
+- (void)readAttributeRemainingCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+    MTR_NEWLY_AVAILABLE;
+- (void)subscribeAttributeRemainingCapacityWithParams:(MTRSubscribeParams *)params
+                              subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+                                        reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
+    MTR_NEWLY_AVAILABLE;
++ (void)readAttributeRemainingCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+                                                   endpoint:(NSNumber *)endpoint
+                                                      queue:(dispatch_queue_t)queue
+                                                 completion:(void (^)(NSNumber * _Nullable value,
+                                                                NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
+
 - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
     API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
 - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index 4664c58..86ab427 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -1821,30 +1821,7 @@
                                         auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                         definedValue_4 = element_2.attributeID.unsignedIntValue;
                                     }
-                                    {
-                                        using ListType_4
-                                            = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
-                                        using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
-                                        if (element_2.attributeValue.count != 0) {
-                                            auto * listHolder_4 = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
-                                            if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
-                                                return CHIP_ERROR_INVALID_ARGUMENT;
-                                            }
-                                            listFreer.add(listHolder_4);
-                                            for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
-                                                if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
-                                                    // Wrong kind of value.
-                                                    return CHIP_ERROR_INVALID_ARGUMENT;
-                                                }
-                                                auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
-                                                listHolder_4->mList[i_4] = element_4.unsignedCharValue;
-                                            }
-                                            listHolder_2->mList[i_2].attributeValue
-                                                = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
-                                        } else {
-                                            listHolder_2->mList[i_2].attributeValue = ListType_4();
-                                        }
-                                    }
+                                    listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue;
                                 }
                                 listHolder_0->mList[i_0].attributeValueList
                                     = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
@@ -2153,30 +2130,7 @@
                                         auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                         definedValue_4 = element_2.attributeID.unsignedIntValue;
                                     }
-                                    {
-                                        using ListType_4
-                                            = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
-                                        using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
-                                        if (element_2.attributeValue.count != 0) {
-                                            auto * listHolder_4 = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
-                                            if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
-                                                return CHIP_ERROR_INVALID_ARGUMENT;
-                                            }
-                                            listFreer.add(listHolder_4);
-                                            for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
-                                                if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
-                                                    // Wrong kind of value.
-                                                    return CHIP_ERROR_INVALID_ARGUMENT;
-                                                }
-                                                auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
-                                                listHolder_4->mList[i_4] = element_4.unsignedCharValue;
-                                            }
-                                            listHolder_2->mList[i_2].attributeValue
-                                                = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
-                                        } else {
-                                            listHolder_2->mList[i_2].attributeValue = ListType_4();
-                                        }
-                                    }
+                                    listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue;
                                 }
                                 listHolder_0->mList[i_0].attributeValueList
                                     = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
@@ -2530,6 +2484,93 @@
         });
 }
 
+- (void)readAttributeSceneTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+    MTRReadParams * params = [[MTRReadParams alloc] init];
+    using TypeInfo = Scenes::Attributes::SceneTableSize::TypeInfo;
+    return MTRReadAttribute<MTRInt16uAttributeCallbackBridge, NSNumber, TypeInfo::DecodableType>(
+        params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
+}
+
+- (void)subscribeAttributeSceneTableSizeWithParams:(MTRSubscribeParams * _Nonnull)params
+                           subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+                                     reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
+{
+    using TypeInfo = Scenes::Attributes::SceneTableSize::TypeInfo;
+    MTRSubscribeAttribute<MTRInt16uAttributeCallbackSubscriptionBridge, NSNumber, TypeInfo::DecodableType>(params,
+        subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
+        TypeInfo::GetAttributeId());
+}
+
++ (void)readAttributeSceneTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+                                                endpoint:(NSNumber *)endpoint
+                                                   queue:(dispatch_queue_t)queue
+                                              completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+    auto * bridge = new MTRInt16uAttributeCallbackBridge(queue, completion);
+    std::move(*bridge).DispatchLocalAction(
+        clusterStateCacheContainer.baseDevice, ^(Int16uAttributeCallback successCb, MTRErrorCallback failureCb) {
+            if (clusterStateCacheContainer.cppClusterStateCache) {
+                chip::app::ConcreteAttributePath path;
+                using TypeInfo = Scenes::Attributes::SceneTableSize::TypeInfo;
+                path.mEndpointId = static_cast<chip::EndpointId>([endpoint unsignedShortValue]);
+                path.mClusterId = TypeInfo::GetClusterId();
+                path.mAttributeId = TypeInfo::GetAttributeId();
+                TypeInfo::DecodableType value;
+                CHIP_ERROR err = clusterStateCacheContainer.cppClusterStateCache->Get<TypeInfo>(path, value);
+                if (err == CHIP_NO_ERROR) {
+                    successCb(bridge, value);
+                }
+                return err;
+            }
+            return CHIP_ERROR_NOT_FOUND;
+        });
+}
+
+- (void)readAttributeRemainingCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+    MTRReadParams * params = [[MTRReadParams alloc] init];
+    using TypeInfo = Scenes::Attributes::RemainingCapacity::TypeInfo;
+    return MTRReadAttribute<MTRInt8uAttributeCallbackBridge, NSNumber, TypeInfo::DecodableType>(
+        params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
+}
+
+- (void)subscribeAttributeRemainingCapacityWithParams:(MTRSubscribeParams * _Nonnull)params
+                              subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
+                                        reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
+{
+    using TypeInfo = Scenes::Attributes::RemainingCapacity::TypeInfo;
+    MTRSubscribeAttribute<MTRInt8uAttributeCallbackSubscriptionBridge, NSNumber, TypeInfo::DecodableType>(params,
+        subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
+        TypeInfo::GetAttributeId());
+}
+
++ (void)readAttributeRemainingCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
+                                                   endpoint:(NSNumber *)endpoint
+                                                      queue:(dispatch_queue_t)queue
+                                                 completion:
+                                                     (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
+{
+    auto * bridge = new MTRInt8uAttributeCallbackBridge(queue, completion);
+    std::move(*bridge).DispatchLocalAction(
+        clusterStateCacheContainer.baseDevice, ^(Int8uAttributeCallback successCb, MTRErrorCallback failureCb) {
+            if (clusterStateCacheContainer.cppClusterStateCache) {
+                chip::app::ConcreteAttributePath path;
+                using TypeInfo = Scenes::Attributes::RemainingCapacity::TypeInfo;
+                path.mEndpointId = static_cast<chip::EndpointId>([endpoint unsignedShortValue]);
+                path.mClusterId = TypeInfo::GetClusterId();
+                path.mAttributeId = TypeInfo::GetAttributeId();
+                TypeInfo::DecodableType value;
+                CHIP_ERROR err = clusterStateCacheContainer.cppClusterStateCache->Get<TypeInfo>(path, value);
+                if (err == CHIP_NO_ERROR) {
+                    successCb(bridge, value);
+                }
+                return err;
+            }
+            return CHIP_ERROR_NOT_FOUND;
+        });
+}
+
 - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
index a5faf03..6a111ed 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
@@ -527,6 +527,8 @@
     = 0x00000004,
     MTRAttributeIDTypeClusterScenesAttributeLastConfiguredByID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
     = 0x00000005,
+    MTRAttributeIDTypeClusterScenesAttributeSceneTableSizeID MTR_NEWLY_AVAILABLE = 0x00000006,
+    MTRAttributeIDTypeClusterScenesAttributeRemainingCapacityID MTR_NEWLY_AVAILABLE = 0x00000007,
     MTRAttributeIDTypeClusterScenesAttributeGeneratedCommandListID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
     = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
     MTRAttributeIDTypeClusterScenesAttributeAcceptedCommandListID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
index 3a9c6f1..2bcd2f9 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
@@ -241,6 +241,10 @@
 - (NSDictionary<NSString *, id> *)readAttributeLastConfiguredByWithParams:(MTRReadParams * _Nullable)params
     API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1));
 
+- (NSDictionary<NSString *, id> *)readAttributeSceneTableSizeWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE;
+
+- (NSDictionary<NSString *, id> *)readAttributeRemainingCapacityWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE;
+
 - (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
     API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1));
 
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 282b972..961d994 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -1043,31 +1043,7 @@
                                             auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                             definedValue_4 = element_2.attributeID.unsignedIntValue;
                                         }
-                                        {
-                                            using ListType_4
-                                                = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
-                                            using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
-                                            if (element_2.attributeValue.count != 0) {
-                                                auto * listHolder_4
-                                                    = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
-                                                if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
-                                                    return CHIP_ERROR_INVALID_ARGUMENT;
-                                                }
-                                                listFreer.add(listHolder_4);
-                                                for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
-                                                    if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
-                                                        // Wrong kind of value.
-                                                        return CHIP_ERROR_INVALID_ARGUMENT;
-                                                    }
-                                                    auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
-                                                    listHolder_4->mList[i_4] = element_4.unsignedCharValue;
-                                                }
-                                                listHolder_2->mList[i_2].attributeValue
-                                                    = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
-                                            } else {
-                                                listHolder_2->mList[i_2].attributeValue = ListType_4();
-                                            }
-                                        }
+                                        listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue;
                                     }
                                     listHolder_0->mList[i_0].attributeValueList
                                         = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
@@ -1619,31 +1595,7 @@
                                             auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                             definedValue_4 = element_2.attributeID.unsignedIntValue;
                                         }
-                                        {
-                                            using ListType_4
-                                                = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
-                                            using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
-                                            if (element_2.attributeValue.count != 0) {
-                                                auto * listHolder_4
-                                                    = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
-                                                if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
-                                                    return CHIP_ERROR_INVALID_ARGUMENT;
-                                                }
-                                                listFreer.add(listHolder_4);
-                                                for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
-                                                    if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
-                                                        // Wrong kind of value.
-                                                        return CHIP_ERROR_INVALID_ARGUMENT;
-                                                    }
-                                                    auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
-                                                    listHolder_4->mList[i_4] = element_4.unsignedCharValue;
-                                                }
-                                                listHolder_2->mList[i_2].attributeValue
-                                                    = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
-                                            } else {
-                                                listHolder_2->mList[i_2].attributeValue = ListType_4();
-                                            }
-                                        }
+                                        listHolder_2->mList[i_2].attributeValue = element_2.attributeValue.unsignedIntValue;
                                     }
                                     listHolder_0->mList[i_0].attributeValueList
                                         = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
@@ -1869,6 +1821,22 @@
                                              params:params];
 }
 
+- (NSDictionary<NSString *, id> *)readAttributeSceneTableSizeWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self.device readAttributeWithEndpointID:@(_endpoint)
+                                          clusterID:@(MTRClusterIDTypeScenesID)
+                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeSceneTableSizeID)
+                                             params:params];
+}
+
+- (NSDictionary<NSString *, id> *)readAttributeRemainingCapacityWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self.device readAttributeWithEndpointID:@(_endpoint)
+                                          clusterID:@(MTRClusterIDTypeScenesID)
+                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeRemainingCapacityID)
+                                             params:params];
+}
+
 - (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
index 5e9e298..71ab972 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
@@ -1119,21 +1119,7 @@
                             } else {
                                 newElement_3.attributeID = nil;
                             }
-                            { // Scope for our temporary variables
-                                auto * array_5 = [NSMutableArray new];
-                                auto iter_5 = entry_3.attributeValue.begin();
-                                while (iter_5.Next()) {
-                                    auto & entry_5 = iter_5.GetValue();
-                                    NSNumber * newElement_5;
-                                    newElement_5 = [NSNumber numberWithUnsignedChar:entry_5];
-                                    [array_5 addObject:newElement_5];
-                                }
-                                CHIP_ERROR err = iter_5.GetStatus();
-                                if (err != CHIP_NO_ERROR) {
-                                    return err;
-                                }
-                                newElement_3.attributeValue = array_5;
-                            }
+                            newElement_3.attributeValue = [NSNumber numberWithUnsignedInt:entry_3.attributeValue];
                             [array_3 addObject:newElement_3];
                         }
                         CHIP_ERROR err = iter_3.GetStatus();
@@ -2284,21 +2270,7 @@
                             } else {
                                 newElement_3.attributeID = nil;
                             }
-                            { // Scope for our temporary variables
-                                auto * array_5 = [NSMutableArray new];
-                                auto iter_5 = entry_3.attributeValue.begin();
-                                while (iter_5.Next()) {
-                                    auto & entry_5 = iter_5.GetValue();
-                                    NSNumber * newElement_5;
-                                    newElement_5 = [NSNumber numberWithUnsignedChar:entry_5];
-                                    [array_5 addObject:newElement_5];
-                                }
-                                CHIP_ERROR err = iter_5.GetStatus();
-                                if (err != CHIP_NO_ERROR) {
-                                    return err;
-                                }
-                                newElement_3.attributeValue = array_5;
-                            }
+                            newElement_3.attributeValue = [NSNumber numberWithUnsignedInt:entry_3.attributeValue];
                             [array_3 addObject:newElement_3];
                         }
                         CHIP_ERROR err = iter_3.GetStatus();
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
index e4be21e..a61ee5b 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
@@ -24,7 +24,7 @@
 @property (nonatomic, copy) NSNumber * _Nullable attributeID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
 @property (nonatomic, copy) NSNumber * _Nullable attributeId MTR_DEPRECATED(
     "Please use attributeID", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4));
-@property (nonatomic, copy) NSArray * _Nonnull attributeValue API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1));
+@property (nonatomic, copy) NSNumber * _Nonnull attributeValue API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1));
 @end
 
 API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1))
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
index a2f6fce..082e2ea 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
@@ -26,7 +26,7 @@
 
         _attributeID = nil;
 
-        _attributeValue = [NSArray array];
+        _attributeValue = @(0);
     }
     return self;
 }
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
index ac7008e..1b4e9e6 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp
@@ -475,6 +475,68 @@
 
 } // namespace LastConfiguredBy
 
+namespace SceneTableSize {
+
+EmberAfStatus Get(chip::EndpointId endpoint, uint16_t * value)
+{
+    using Traits = NumericAttributeTraits<uint16_t>;
+    Traits::StorageType temp;
+    uint8_t * readable   = Traits::ToAttributeStoreRepresentation(temp);
+    EmberAfStatus status = emberAfReadAttribute(endpoint, Clusters::Scenes::Id, Id, readable, sizeof(temp));
+    VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, status);
+    if (!Traits::CanRepresentValue(/* isNullable = */ false, temp))
+    {
+        return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+    }
+    *value = Traits::StorageToWorking(temp);
+    return status;
+}
+EmberAfStatus Set(chip::EndpointId endpoint, uint16_t value)
+{
+    using Traits = NumericAttributeTraits<uint16_t>;
+    if (!Traits::CanRepresentValue(/* isNullable = */ false, value))
+    {
+        return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+    }
+    Traits::StorageType storageValue;
+    Traits::WorkingToStorage(value, storageValue);
+    uint8_t * writable = Traits::ToAttributeStoreRepresentation(storageValue);
+    return emberAfWriteAttribute(endpoint, Clusters::Scenes::Id, Id, writable, ZCL_INT16U_ATTRIBUTE_TYPE);
+}
+
+} // namespace SceneTableSize
+
+namespace RemainingCapacity {
+
+EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value)
+{
+    using Traits = NumericAttributeTraits<uint8_t>;
+    Traits::StorageType temp;
+    uint8_t * readable   = Traits::ToAttributeStoreRepresentation(temp);
+    EmberAfStatus status = emberAfReadAttribute(endpoint, Clusters::Scenes::Id, Id, readable, sizeof(temp));
+    VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, status);
+    if (!Traits::CanRepresentValue(/* isNullable = */ false, temp))
+    {
+        return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+    }
+    *value = Traits::StorageToWorking(temp);
+    return status;
+}
+EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value)
+{
+    using Traits = NumericAttributeTraits<uint8_t>;
+    if (!Traits::CanRepresentValue(/* isNullable = */ false, value))
+    {
+        return EMBER_ZCL_STATUS_CONSTRAINT_ERROR;
+    }
+    Traits::StorageType storageValue;
+    Traits::WorkingToStorage(value, storageValue);
+    uint8_t * writable = Traits::ToAttributeStoreRepresentation(storageValue);
+    return emberAfWriteAttribute(endpoint, Clusters::Scenes::Id, Id, writable, ZCL_INT8U_ATTRIBUTE_TYPE);
+}
+
+} // namespace RemainingCapacity
+
 namespace FeatureMap {
 
 EmberAfStatus Get(chip::EndpointId endpoint, uint32_t * value)
diff --git a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
index 8885bdc..2ea2774 100644
--- a/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
+++ b/zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h
@@ -116,6 +116,16 @@
 EmberAfStatus Set(chip::EndpointId endpoint, const chip::app::DataModel::Nullable<chip::NodeId> & value);
 } // namespace LastConfiguredBy
 
+namespace SceneTableSize {
+EmberAfStatus Get(chip::EndpointId endpoint, uint16_t * value); // int16u
+EmberAfStatus Set(chip::EndpointId endpoint, uint16_t value);
+} // namespace SceneTableSize
+
+namespace RemainingCapacity {
+EmberAfStatus Get(chip::EndpointId endpoint, uint8_t * value); // int8u
+EmberAfStatus Set(chip::EndpointId endpoint, uint8_t value);
+} // namespace RemainingCapacity
+
 namespace FeatureMap {
 EmberAfStatus Get(chip::EndpointId endpoint, uint32_t * value); // bitmap32
 EmberAfStatus Set(chip::EndpointId endpoint, uint32_t value);
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
index 6bd48bb..2ae5a2a 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp
@@ -1665,6 +1665,12 @@
     case Attributes::LastConfiguredBy::TypeInfo::GetAttributeId():
         ReturnErrorOnFailure(DataModel::Decode(reader, lastConfiguredBy));
         break;
+    case Attributes::SceneTableSize::TypeInfo::GetAttributeId():
+        ReturnErrorOnFailure(DataModel::Decode(reader, sceneTableSize));
+        break;
+    case Attributes::RemainingCapacity::TypeInfo::GetAttributeId():
+        ReturnErrorOnFailure(DataModel::Decode(reader, remainingCapacity));
+        break;
     case Attributes::GeneratedCommandList::TypeInfo::GetAttributeId():
         ReturnErrorOnFailure(DataModel::Decode(reader, generatedCommandList));
         break;
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 9f54830..ba6e7da 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
@@ -821,23 +821,16 @@
 {
 public:
     Optional<chip::AttributeId> attributeID;
-    DataModel::List<const uint8_t> attributeValue;
+    uint32_t attributeValue = static_cast<uint32_t>(0);
+
+    CHIP_ERROR Decode(TLV::TLVReader & reader);
 
     static constexpr bool kIsFabricScoped = false;
 
     CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const;
 };
 
-struct DecodableType
-{
-public:
-    Optional<chip::AttributeId> attributeID;
-    DataModel::DecodableList<uint8_t> attributeValue;
-
-    CHIP_ERROR Decode(TLV::TLVReader & reader);
-
-    static constexpr bool kIsFabricScoped = false;
-};
+using DecodableType = Type;
 
 } // namespace AttributeValuePair
 namespace ExtensionFieldSet {
@@ -1783,6 +1776,30 @@
     static constexpr bool MustUseTimedWrite() { return false; }
 };
 } // namespace LastConfiguredBy
+namespace SceneTableSize {
+struct TypeInfo
+{
+    using Type             = uint16_t;
+    using DecodableType    = uint16_t;
+    using DecodableArgType = uint16_t;
+
+    static constexpr ClusterId GetClusterId() { return Clusters::Scenes::Id; }
+    static constexpr AttributeId GetAttributeId() { return Attributes::SceneTableSize::Id; }
+    static constexpr bool MustUseTimedWrite() { return false; }
+};
+} // namespace SceneTableSize
+namespace RemainingCapacity {
+struct TypeInfo
+{
+    using Type             = uint8_t;
+    using DecodableType    = uint8_t;
+    using DecodableArgType = uint8_t;
+
+    static constexpr ClusterId GetClusterId() { return Clusters::Scenes::Id; }
+    static constexpr AttributeId GetAttributeId() { return Attributes::RemainingCapacity::Id; }
+    static constexpr bool MustUseTimedWrite() { return false; }
+};
+} // namespace RemainingCapacity
 namespace GeneratedCommandList {
 struct TypeInfo : public Clusters::Globals::Attributes::GeneratedCommandList::TypeInfo
 {
@@ -1834,6 +1851,8 @@
         Attributes::SceneValid::TypeInfo::DecodableType sceneValid     = static_cast<bool>(0);
         Attributes::NameSupport::TypeInfo::DecodableType nameSupport   = static_cast<uint8_t>(0);
         Attributes::LastConfiguredBy::TypeInfo::DecodableType lastConfiguredBy;
+        Attributes::SceneTableSize::TypeInfo::DecodableType sceneTableSize       = static_cast<uint16_t>(0);
+        Attributes::RemainingCapacity::TypeInfo::DecodableType remainingCapacity = static_cast<uint8_t>(0);
         Attributes::GeneratedCommandList::TypeInfo::DecodableType generatedCommandList;
         Attributes::AcceptedCommandList::TypeInfo::DecodableType acceptedCommandList;
         Attributes::EventList::TypeInfo::DecodableType eventList;
diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
index b8dd75e..9bac487 100644
--- a/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
+++ b/zzz_generated/app-common/app-common/zap-generated/ids/Attributes.h
@@ -154,6 +154,14 @@
 static constexpr AttributeId Id = 0x00000005;
 } // namespace LastConfiguredBy
 
+namespace SceneTableSize {
+static constexpr AttributeId Id = 0x00000006;
+} // namespace SceneTableSize
+
+namespace RemainingCapacity {
+static constexpr AttributeId Id = 0x00000007;
+} // namespace RemainingCapacity
+
 namespace GeneratedCommandList {
 static constexpr AttributeId Id = Globals::Attributes::GeneratedCommandList::Id;
 } // namespace GeneratedCommandList
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index ab09691..d5b2dbb 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -468,6 +468,8 @@
 | * SceneValid                                                        | 0x0003 |
 | * NameSupport                                                       | 0x0004 |
 | * LastConfiguredBy                                                  | 0x0005 |
+| * SceneTableSize                                                    | 0x0006 |
+| * RemainingCapacity                                                 | 0x0007 |
 | * GeneratedCommandList                                              | 0xFFF8 |
 | * AcceptedCommandList                                               | 0xFFF9 |
 | * EventList                                                         | 0xFFFA |
@@ -10589,6 +10591,8 @@
         make_unique<ReadAttribute>(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig),                      //
         make_unique<ReadAttribute>(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig),                    //
         make_unique<ReadAttribute>(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig),         //
+        make_unique<ReadAttribute>(Id, "scene-table-size", Attributes::SceneTableSize::Id, credsIssuerConfig),             //
+        make_unique<ReadAttribute>(Id, "remaining-capacity", Attributes::RemainingCapacity::Id, credsIssuerConfig),        //
         make_unique<ReadAttribute>(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
         make_unique<ReadAttribute>(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig),   //
         make_unique<ReadAttribute>(Id, "event-list", Attributes::EventList::Id, credsIssuerConfig),                        //
@@ -10609,6 +10613,10 @@
         make_unique<WriteAttribute<chip::app::DataModel::Nullable<chip::NodeId>>>(
             Id, "last-configured-by", 0, UINT64_MAX, Attributes::LastConfiguredBy::Id, WriteCommandType::kForceWrite,
             credsIssuerConfig), //
+        make_unique<WriteAttribute<uint16_t>>(Id, "scene-table-size", 0, UINT16_MAX, Attributes::SceneTableSize::Id,
+                                              WriteCommandType::kForceWrite, credsIssuerConfig), //
+        make_unique<WriteAttribute<uint8_t>>(Id, "remaining-capacity", 0, UINT8_MAX, Attributes::RemainingCapacity::Id,
+                                             WriteCommandType::kForceWrite, credsIssuerConfig), //
         make_unique<WriteAttributeAsComplex<chip::app::DataModel::List<const chip::CommandId>>>(
             Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite,
             credsIssuerConfig), //
@@ -10629,6 +10637,8 @@
         make_unique<SubscribeAttribute>(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig),                      //
         make_unique<SubscribeAttribute>(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig),                    //
         make_unique<SubscribeAttribute>(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig),         //
+        make_unique<SubscribeAttribute>(Id, "scene-table-size", Attributes::SceneTableSize::Id, credsIssuerConfig),             //
+        make_unique<SubscribeAttribute>(Id, "remaining-capacity", Attributes::RemainingCapacity::Id, credsIssuerConfig),        //
         make_unique<SubscribeAttribute>(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), //
         make_unique<SubscribeAttribute>(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig),   //
         make_unique<SubscribeAttribute>(Id, "event-list", Attributes::EventList::Id, credsIssuerConfig),                        //
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
index 4ca14a7..81653db 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
+++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp
@@ -4835,6 +4835,16 @@
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
             return DataModelLogger::LogValue("LastConfiguredBy", 1, value);
         }
+        case Scenes::Attributes::SceneTableSize::Id: {
+            uint16_t value;
+            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
+            return DataModelLogger::LogValue("SceneTableSize", 1, value);
+        }
+        case Scenes::Attributes::RemainingCapacity::Id: {
+            uint8_t value;
+            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
+            return DataModelLogger::LogValue("RemainingCapacity", 1, value);
+        }
         case Scenes::Attributes::GeneratedCommandList::Id: {
             chip::app::DataModel::DecodableList<chip::CommandId> value;
             ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h
index 636d4b9..5abc3d5 100644
--- a/zzz_generated/chip-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h
@@ -538,6 +538,7 @@
         printf("Test_TC_S_2_1\n");
         printf("Test_TC_S_2_2\n");
         printf("Test_TC_S_2_3\n");
+        printf("Test_TC_S_2_4\n");
         printf("Test_TC_S_3_1\n");
         printf("Test_TC_ACL_2_5\n");
         printf("Test_TC_ACL_2_6\n");
@@ -118601,7 +118602,7 @@
 class Test_TC_S_2_1Suite : public TestCommand
 {
 public:
-    Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 0, credsIssuerConfig)
+    Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 10, credsIssuerConfig)
     {
         AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
         AddArgument("cluster", &mCluster);
@@ -118634,6 +118635,84 @@
 
         switch (mTestIndex - 1)
         {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 1:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
+            }
+            break;
+        case 2:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
+            }
+            break;
+        case 3:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::GroupId value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "group_id", "groupid"));
+            }
+            break;
+        case 4:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                bool value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "boolean", "uint8"));
+            }
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("nameSupport", value, 128U));
+                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "uint8"));
+            }
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("nameSupport", value, 0U));
+                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "uint8"));
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::Nullable<chip::NodeId> value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "node_id", "nodeId"));
+            }
+            break;
+        case 8:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint16_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "int16u", "uint16"));
+            }
+            break;
+        case 9:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckConstraintType("value", "int8u", "uint8"));
+            }
+            break;
         default:
             LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
         }
@@ -118648,7 +118727,69 @@
     {
         using namespace chip::app::Clusters;
         switch (testIndex)
-        {}
+        {
+        case 0: {
+            LogStep(0, "Wait for the commissioned device to be retrieved");
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+            return WaitForCommissionee(kIdentityAlpha, value);
+        }
+        case 1: {
+            LogStep(1, "TH reads from the DUT the (0x0000) SceneCount attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneCount::Id, true,
+                                 chip::NullOptional);
+        }
+        case 2: {
+            LogStep(2, "TH reads from the DUT the (0x0001) CurrentScene attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentScene::Id, true,
+                                 chip::NullOptional);
+        }
+        case 3: {
+            LogStep(3, "TH reads from the DUT the (0x0002) CurrentGroup attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentGroup::Id, true,
+                                 chip::NullOptional);
+        }
+        case 4: {
+            LogStep(4, "TH reads from the DUT the (0x0003) SceneValid attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneValid::Id, true,
+                                 chip::NullOptional);
+        }
+        case 5: {
+            LogStep(5, "TH reads from the DUT the (0x0004) NameSupport attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0003 && S.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::NameSupport::Id, true,
+                                 chip::NullOptional);
+        }
+        case 6: {
+            LogStep(6, "TH reads from the DUT the (0x0004) NameSupport attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0004 && (!S.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::NameSupport::Id, true,
+                                 chip::NullOptional);
+        }
+        case 7: {
+            LogStep(7, "TH reads from the DUT the (0x0005) LastConfiguredBy attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::LastConfiguredBy::Id, true,
+                                 chip::NullOptional);
+        }
+        case 8: {
+            LogStep(8, "TH reads from the DUT the (0x0006) SceneTableSize attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true,
+                                 chip::NullOptional);
+        }
+        case 9: {
+            LogStep(9, "TH reads from the DUT the (0x0007) RemainingCapacity attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::RemainingCapacity::Id, true,
+                                 chip::NullOptional);
+        }
+        }
         return CHIP_NO_ERROR;
     }
 };
@@ -118656,7 +118797,7 @@
 class Test_TC_S_2_2Suite : public TestCommand
 {
 public:
-    Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 0, credsIssuerConfig)
+    Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 50, credsIssuerConfig)
     {
         AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
         AddArgument("cluster", &mCluster);
@@ -118677,6 +118818,8 @@
     chip::Optional<chip::EndpointId> mEndpoint;
     chip::Optional<uint16_t> mTimeout;
 
+    uint16_t maxScenes;
+
     chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
 
     //
@@ -118689,6 +118832,426 @@
 
         switch (mTestIndex - 1)
         {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 1:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 2:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint16_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                maxScenes = value;
+            }
+            break;
+        case 3:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 4:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 8:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 9:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 10:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 11:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 12:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 13:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 14:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("sceneCount", value, 1U));
+                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
+            }
+            break;
+        case 15:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint8_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("currentScene", value, 1U));
+                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
+            }
+            break;
+        case 16:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::GroupId value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("currentGroup", value, 1U));
+                VerifyOrReturn(CheckConstraintType("value", "group_id", "groupid"));
+            }
+            break;
+        case 17:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                bool value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("sceneValid", value, true));
+                VerifyOrReturn(CheckConstraintType("value", "boolean", "uint8"));
+            }
+            break;
+        case 18:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 19:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 20:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 21:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 22:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 23:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+                VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime));
+                VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 0U));
+                VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets));
+                {
+                    auto iter_1 = value.extensionFieldSets.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 1UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1));
+                    }
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 1));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 100UL));
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 1UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 0UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2));
+                    }
+                    VerifyOrReturn(
+                        CheckNoMoreListItems<decltype(value.extensionFieldSets.Value())>("extensionFieldSets.Value()", iter_1, 2));
+                }
+            }
+            break;
+        case 24:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+                VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime));
+                VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 0U));
+            }
+            break;
+        case 25:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 1)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                }
+            }
+            break;
+        case 26:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 27:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 28:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 29:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 30:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 1)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                }
+            }
+            break;
+        case 31:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 32:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 33:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 34:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 35:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
+            break;
+        case 36:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 37:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 38:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 39:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 40:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 41:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 2U));
+            }
+            break;
+        case 42:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U));
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[1]", iter_1.GetValue(), 2U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 2));
+                }
+            }
+            break;
+        case 43:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 2U));
+            }
+            break;
+        case 44:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 2U));
+            }
+            break;
+        case 45:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 2U));
+            }
+            break;
+        case 46:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 47:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 48:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 2U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 3U));
+            }
+            break;
+        case 49:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 3)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 2U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 3U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                }
+            }
+            break;
         default:
             LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
         }
@@ -118703,7 +119266,674 @@
     {
         using namespace chip::app::Clusters;
         switch (testIndex)
-        {}
+        {
+        case 0: {
+            LogStep(0, "Wait for the commissioned device to be retrieved");
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+            return WaitForCommissionee(kIdentityAlpha, value);
+        }
+        case 1: {
+            LogStep(1, "TH sends a RemoveAllGroups command to DUT.");
+            VerifyOrDo(!ShouldSkip("G.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 2: {
+            LogStep(2, "TH reads from the DUT the (0x0006) SceneTableSize attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true,
+                                 chip::NullOptional);
+        }
+        case 3: {
+            LogStep(3, "preparation step for using commands from Groups cluster: Add KeySet");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 417U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 0ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 0ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 0ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 4: {
+            LogStep(4, "Preparation step for using commands from Groups cluster: Write Group Keys");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].groupId       = 1U;
+                listHolder_0->mList[0].groupKeySetID = 417U;
+                listHolder_0->mList[0].fabricIndex   = 1U;
+
+                listHolder_0->mList[1].groupId       = 2U;
+                listHolder_0->mList[1].groupKeySetID = 417U;
+                listHolder_0->mList[1].fabricIndex   = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
+                    listHolder_0->mList, 2);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
+        }
+        case 5: {
+            LogStep(5, "TH sends a AddGroup command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = 1U;
+            value.groupName = chip::Span<const char>("Group1garbage: not in length on purpose", 6);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 6: {
+            LogStep(6, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 7: {
+            LogStep(7, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 8: {
+            LogStep(8, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 9: {
+            LogStep(9, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 10: {
+            LogStep(10,
+                    "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::StoreScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 11: {
+            LogStep(11, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 12: {
+            LogStep(12, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 13: {
+            LogStep(
+                13,
+                "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 14: {
+            LogStep(14, "TH reads the SceneCount attribute from DUT.");
+            VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"),
+                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneCount::Id, true,
+                                 chip::NullOptional);
+        }
+        case 15: {
+            LogStep(15, "TH reads the CurrentScene attribute from DUT.");
+            VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"),
+                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentScene::Id, true,
+                                 chip::NullOptional);
+        }
+        case 16: {
+            LogStep(16, "TH reads the CurrentGroup attribute from DUT.");
+            VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"),
+                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::CurrentGroup::Id, true,
+                                 chip::NullOptional);
+        }
+        case 17: {
+            LogStep(17, "TH reads the SceneValid attribute from DUT.");
+            VerifyOrDo(!ShouldSkip("S.S.A0000 && S.S.A0001 && S.S.A0002 && S.S.A0003"),
+                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneValid::Id, true,
+                                 chip::NullOptional);
+        }
+        case 18: {
+            LogStep(18, "Reboot target device");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
+            return Reboot(kIdentityAlpha, value);
+        }
+        case 19: {
+            LogStep(19, "Reboot target device(DUT)");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message =
+                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 20: {
+            LogStep(20, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 21: {
+            LogStep(21, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 22: {
+            LogStep(
+                22,
+                "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 23: {
+            LogStep(23,
+                    "TH sends a ViewScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C01.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::ViewScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 24: {
+            LogStep(24,
+                    "TH sends a ViewScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C01.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::ViewScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 25: {
+            LogStep(25, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 26: {
+            LogStep(26, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 27: {
+            LogStep(27, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 28: {
+            LogStep(28,
+                    "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the "
+                    "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("S.S.C00.Rsp && && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::AddScene::Type value;
+            value.groupID        = 1U;
+            value.sceneID        = 1U;
+            value.transitionTime = 1U;
+            value.sceneName      = chip::Span<const char>("Scene1garbage: not in length on purpose", 6);
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].clusterID = 6UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(1);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 1UL;
+
+                    listHolder_0->mList[0].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 1);
+                }
+
+                listHolder_0->mList[1].clusterID = 8UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(2);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 100UL;
+
+                    listHolder_2->mList[1].attributeID.Emplace();
+                    listHolder_2->mList[1].attributeID.Value() = 1UL;
+                    listHolder_2->mList[1].attributeValue      = 0UL;
+
+                    listHolder_0->mList[1].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 2);
+                }
+
+                value.extensionFieldSets =
+                    chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(listHolder_0->mList,
+                                                                                                              2);
+            }
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional
+
+            );
+        }
+        case 29: {
+            LogStep(29,
+                    "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the "
+                    "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message =
+                chip::Span<const char>("Please execute the add scene command with extensionfieldsets in accordance with AC1 on DUT "
+                                       "and enter 'y' if the command is successfulgarbage: not in length on purpose",
+                                       133);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 30: {
+            LogStep(30, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 31: {
+            LogStep(
+                31,
+                "TH sends a RemoveScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 32: {
+            LogStep(32, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 33: {
+            LogStep(33, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 34: {
+            LogStep(34, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 35: {
+            LogStep(
+                35,
+                "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 36: {
+            LogStep(36, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 37: {
+            LogStep(37, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 38: {
+            LogStep(38,
+                    "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::StoreScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 39: {
+            LogStep(39, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 40: {
+            LogStep(40, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 41: {
+            LogStep(41,
+                    "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x02.");
+            VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::StoreScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 2U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 42: {
+            LogStep(42, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 43: {
+            LogStep(43, "If capacity allows, TH sends a AddGroup command to DUT with the GroupID field set to 0x0002.");
+            VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = 2U;
+            value.groupName = chip::Span<const char>("Group2garbage: not in length on purpose", 6);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 44: {
+            LogStep(44, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0002.");
+            VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value;
+            value.groupID = 2U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 45: {
+            LogStep(45, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 2U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 46: {
+            LogStep(46, "TH configures AC3 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 1U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 47: {
+            LogStep(47, "TH configures AC3 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC3 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 48: {
+            LogStep(48,
+                    "TH sends a StoreScene command to DUT with the GroupID field set to 0x0002 and the SceneID field set to 0x03.");
+            VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::StoreScene::Type value;
+            value.groupID = 2U;
+            value.sceneID = 3U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 49: {
+            LogStep(49, "TH sends a GetSceneMembership command to DUT with the GroupID field set to 0x0002.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = 2U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        }
         return CHIP_NO_ERROR;
     }
 };
@@ -118711,7 +119941,749 @@
 class Test_TC_S_2_3Suite : public TestCommand
 {
 public:
-    Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 0, credsIssuerConfig)
+    Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 24, credsIssuerConfig)
+    {
+        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+        AddArgument("cluster", &mCluster);
+        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+        AddArgument("G1", 0, UINT16_MAX, &mG1);
+        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+    }
+
+    ~Test_TC_S_2_3Suite() {}
+
+    chip::System::Clock::Timeout GetWaitDuration() const override
+    {
+        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
+    }
+
+private:
+    chip::Optional<chip::NodeId> mNodeId;
+    chip::Optional<chip::CharSpan> mCluster;
+    chip::Optional<chip::EndpointId> mEndpoint;
+    chip::Optional<uint16_t> mG1;
+    chip::Optional<uint16_t> mTimeout;
+
+    uint16_t maxScenes;
+
+    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
+
+    //
+    // Tests methods
+    //
+
+    void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
+    {
+        bool shouldContinue = false;
+
+        switch (mTestIndex - 1)
+        {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 1:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                uint16_t value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                maxScenes = value;
+            }
+            break;
+        case 2:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 3:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 4:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+            }
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+            }
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), (maxScenes / 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                }
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::EnhancedAddSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 8:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 9:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 10:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 11:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+                VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime));
+                VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 10U));
+                VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets));
+                {
+                    auto iter_1 = value.extensionFieldSets.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 1UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1));
+                    }
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 1));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 100UL));
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 1UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 0UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2));
+                    }
+                    VerifyOrReturn(
+                        CheckNoMoreListItems<decltype(value.extensionFieldSets.Value())>("extensionFieldSets.Value()", iter_1, 2));
+                }
+            }
+            break;
+        case 12:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+                VerifyOrReturn(CheckValuePresent("transitionTime", value.transitionTime));
+                VerifyOrReturn(CheckValue("transitionTime.Value()", value.transitionTime.Value(), 1U));
+                VerifyOrReturn(CheckValuePresent("extensionFieldSets", value.extensionFieldSets));
+                {
+                    auto iter_1 = value.extensionFieldSets.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].clusterID", iter_1.GetValue().clusterID, 6UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[0].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[0].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 1UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[0].attributeValueList", iter_3, 1));
+                    }
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.extensionFieldSets.Value())>(
+                        "extensionFieldSets.Value()", iter_1, 1));
+                    VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].clusterID", iter_1.GetValue().clusterID, 8UL));
+                    {
+                        auto iter_3 = iter_1.GetValue().attributeValueList.begin();
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 0));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[0].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 0UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[0].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 100UL));
+                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 1));
+                        VerifyOrReturn(CheckValuePresent("extensionFieldSets.Value()[1].attributeValueList[1].attributeID",
+                                                         iter_3.GetValue().attributeID));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeID.Value()",
+                                                  iter_3.GetValue().attributeID.Value(), 1UL));
+                        VerifyOrReturn(CheckValue("extensionFieldSets.Value()[1].attributeValueList[1].attributeValue",
+                                                  iter_3.GetValue().attributeValue, 0UL));
+                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_1.GetValue().attributeValueList)>(
+                            "extensionFieldSets.Value()[1].attributeValueList", iter_3, 2));
+                    }
+                    VerifyOrReturn(
+                        CheckNoMoreListItems<decltype(value.extensionFieldSets.Value())>("extensionFieldSets.Value()", iter_1, 2));
+                }
+            }
+            break;
+        case 13:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 14:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 15:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 1)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                }
+            }
+            break;
+        case 16:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 17:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 18:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 19:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 20:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::Nullable<uint8_t> value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
+            }
+            break;
+        case 21:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 22:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupIdentifierFrom", value.groupIdentifierFrom, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValue("sceneIdentifierFrom", value.sceneIdentifierFrom, 1U));
+            }
+            break;
+        case 23:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValueNonNull("capacity", value.capacity));
+                VerifyOrReturn(CheckValue("capacity.Value()", value.capacity.Value(), static_cast<uint8_t>((maxScenes / 2) - 2)));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, mG1.HasValue() ? mG1.Value() : 1U));
+                VerifyOrReturn(CheckValuePresent("sceneList", value.sceneList));
+                {
+                    auto iter_1 = value.sceneList.Value().begin();
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 0));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[0]", iter_1.GetValue(), 1U));
+                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 1));
+                    VerifyOrReturn(CheckValue("sceneList.Value()[1]", iter_1.GetValue(), 2U));
+                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.sceneList.Value())>("sceneList.Value()", iter_1, 2));
+                }
+            }
+            break;
+        default:
+            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
+        }
+
+        if (shouldContinue)
+        {
+            ContinueOnChipMainThread(CHIP_NO_ERROR);
+        }
+    }
+
+    CHIP_ERROR DoTestStep(uint16_t testIndex) override
+    {
+        using namespace chip::app::Clusters;
+        switch (testIndex)
+        {
+        case 0: {
+            LogStep(0, "Wait for the commissioned device to be retrieved");
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+            return WaitForCommissionee(kIdentityAlpha, value);
+        }
+        case 1: {
+            LogStep(1, "TH reads from the DUT the (0x0006) SceneTableSize attribute");
+            VerifyOrDo(!ShouldSkip("S.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::SceneTableSize::Id, true,
+                                 chip::NullOptional);
+        }
+        case 2: {
+            LogStep(2, "preparation step for using commands from Groups cluster: Add KeySet");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 417U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 0ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 0ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 0ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 3: {
+            LogStep(3, "Preparation step for using commands from Groups cluster: Write Group Keys");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].groupId       = mG1.HasValue() ? mG1.Value() : 1U;
+                listHolder_0->mList[0].groupKeySetID = 417U;
+                listHolder_0->mList[0].fabricIndex   = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
+                    listHolder_0->mList, 1);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
+        }
+        case 4: {
+            LogStep(4, "TH sends a AddGroup command to DUT with the GroupID field set to G1.");
+            VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = mG1.HasValue() ? mG1.Value() : 1U;
+            value.groupName = chip::Span<const char>("Group1garbage: not in length on purpose", 6);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 5: {
+            LogStep(5, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to G1.");
+            VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 6: {
+            LogStep(6, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 7: {
+            LogStep(7,
+                    "TH sends a EnhancedAddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, "
+                    "the TransitionTime field set to 0x000a (1s) and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("S.S.C40.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::EnhancedAddScene::Type value;
+            value.groupID        = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneID        = 1U;
+            value.transitionTime = 10U;
+            value.sceneName      = chip::Span<const char>("Scene1garbage: not in length on purpose", 6);
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].clusterID = 6UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(1);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 1UL;
+
+                    listHolder_0->mList[0].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 1);
+                }
+
+                listHolder_0->mList[1].clusterID = 8UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(2);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 100UL;
+
+                    listHolder_2->mList[1].attributeID.Emplace();
+                    listHolder_2->mList[1].attributeID.Value() = 1UL;
+                    listHolder_2->mList[1].attributeValue      = 0UL;
+
+                    listHolder_0->mList[1].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 2);
+                }
+
+                value.extensionFieldSets =
+                    chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(listHolder_0->mList,
+                                                                                                              2);
+            }
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::EnhancedAddScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 8: {
+            LogStep(8,
+                    "TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the "
+                    "TransitionTime field set to 0x0001 (1s) and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("(!S.S.C40.Rsp) && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::AddScene::Type value;
+            value.groupID        = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneID        = 1U;
+            value.transitionTime = 1U;
+            value.sceneName      = chip::Span<const char>("Scene1garbage: not in length on purpose", 6);
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(2);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].clusterID = 6UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(1);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 1UL;
+
+                    listHolder_0->mList[0].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 1);
+                }
+
+                listHolder_0->mList[1].clusterID = 8UL;
+
+                {
+                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(2);
+                    listFreer.add(listHolder_2);
+
+                    listHolder_2->mList[0].attributeID.Emplace();
+                    listHolder_2->mList[0].attributeID.Value() = 0UL;
+                    listHolder_2->mList[0].attributeValue      = 100UL;
+
+                    listHolder_2->mList[1].attributeID.Emplace();
+                    listHolder_2->mList[1].attributeID.Value() = 1UL;
+                    listHolder_2->mList[1].attributeValue      = 0UL;
+
+                    listHolder_0->mList[1].attributeValueList =
+                        chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::AttributeValuePair::Type>(
+                            listHolder_2->mList, 2);
+                }
+
+                value.extensionFieldSets =
+                    chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>(listHolder_0->mList,
+                                                                                                              2);
+            }
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional
+
+            );
+        }
+        case 9: {
+            LogStep(9,
+                    "TH sends a EnhancedAddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, "
+                    "the TransitionTime field set to 0x000a and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("S.S.C40.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message =
+                chip::Span<const char>("Please execute the enhanced add scene command with extensionfieldsets in accordance with "
+                                       "AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose",
+                                       142);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 10: {
+            LogStep(10,
+                    "TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the "
+                    "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("(!S.S.C40.Rsp) && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message =
+                chip::Span<const char>("Please execute the add scene command with extensionfieldsets in accordance with AC1 on DUT "
+                                       "and enter 'y' if the command is successfulgarbage: not in length on purpose",
+                                       133);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 11: {
+            LogStep(
+                11,
+                "TH sends a EnhancedViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C41.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::EnhancedViewScene::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::EnhancedViewScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 12: {
+            LogStep(12, "TH sends a ViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("(!S.S.C41.Rsp) && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::ViewScene::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::ViewScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 13: {
+            LogStep(
+                13,
+                "TH sends a EnhancedViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C41.Rsp && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please execute the ehanced-view-scene command and verify that the extensionfieldsets, status, groupID and SceneID "
+                "are in accordance with AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose",
+                190);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 14: {
+            LogStep(14, "TH sends a ViewScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("(!S.S.C41.Rsp) && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please execute the view-scene command and verify that the extensionfieldsets, status, groupID and SceneID are in "
+                "accordance with AC1 on DUT and enter 'y' if the command is successfulgarbage: not in length on purpose",
+                182);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 15: {
+            LogStep(15, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 16: {
+            LogStep(16, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 17: {
+            LogStep(17, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 18: {
+            LogStep(
+                18,
+                "TH sends a RecallScene command to group G1 with the GroupID field set to G1 and the scene ID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneID = 1U;
+            return SendGroupCommand(kIdentityAlpha, 1, Scenes::Id, Scenes::Commands::RecallScene::Id, value);
+        }
+        case 19: {
+            LogStep(19, "Wait 1s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
+            value.ms = 1000UL;
+            return WaitForMs(kIdentityAlpha, value);
+        }
+        case 20: {
+            LogStep(20, "TH confirm the DUT reached AC1 (on level control cluster) after 1s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
+                                 chip::NullOptional);
+        }
+        case 21: {
+            LogStep(21, "Verify DUT returns to AC1.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>("Please confirm AC1 on DUT and enter 'y'.garbage: not in length on purpose", 40);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 22: {
+            LogStep(22,
+                    "TH sends a CopyScene command to DUT with the mode field set to 0x00, the group identifier from field set to "
+                    "G1, the scene identifier from field set to 0x01, the group identifier to field set to G1 and the scene "
+                    "identifier to field set to 0x02.");
+            VerifyOrDo(!ShouldSkip("S.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::CopyScene::Type value;
+            value.mode                = static_cast<chip::BitMask<chip::app::Clusters::Scenes::ScenesCopyMode>>(0U);
+            value.groupIdentifierFrom = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneIdentifierFrom = 1U;
+            value.groupIdentifierTo   = mG1.HasValue() ? mG1.Value() : 1U;
+            value.sceneIdentifierTo   = 2U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::CopyScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 23: {
+            LogStep(23, "TH sends a GetSceneMembership command to DUT with the GroupID field set to G1.");
+            VerifyOrDo(!ShouldSkip("S.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::GetSceneMembership::Type value;
+            value.groupID = mG1.HasValue() ? mG1.Value() : 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::GetSceneMembership::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        }
+        return CHIP_NO_ERROR;
+    }
+};
+
+class Test_TC_S_2_4Suite : public TestCommand
+{
+public:
+    Test_TC_S_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_4", 27, credsIssuerConfig)
     {
         AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
         AddArgument("cluster", &mCluster);
@@ -118719,7 +120691,7 @@
         AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
     }
 
-    ~Test_TC_S_2_3Suite() {}
+    ~Test_TC_S_2_4Suite() {}
 
     chip::System::Clock::Timeout GetWaitDuration() const override
     {
@@ -118744,6 +120716,141 @@
 
         switch (mTestIndex - 1)
         {
+        case 0:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 1:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 2:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 3:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 4:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 5:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+            }
+            break;
+        case 6:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 7:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 8:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 9:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValue("status", value.status, 0U));
+                VerifyOrReturn(CheckValue("groupID", value.groupID, 1U));
+                VerifyOrReturn(CheckValue("sceneID", value.sceneID, 1U));
+            }
+            break;
+        case 10:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 11:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 12:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::Nullable<uint8_t> value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
+            }
+            break;
+        case 13:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 14:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 15:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 16:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::Nullable<uint8_t> value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
+            }
+            break;
+        case 17:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 18:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 19:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 20:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 21:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 22:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            {
+                chip::app::DataModel::Nullable<uint8_t> value;
+                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
+                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
+            }
+            break;
+        case 23:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 24:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
+        case 25:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            shouldContinue = true;
+            break;
+        case 26:
+            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+            break;
         default:
             LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
         }
@@ -118758,7 +120865,350 @@
     {
         using namespace chip::app::Clusters;
         switch (testIndex)
-        {}
+        {
+        case 0: {
+            LogStep(0, "Wait for the commissioned device to be retrieved");
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+            return WaitForCommissionee(kIdentityAlpha, value);
+        }
+        case 1: {
+            LogStep(1, "TH sends a RemoveAllGroups command to DUT.");
+            VerifyOrDo(!ShouldSkip("G.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 2: {
+            LogStep(2, "preparation step for using commands from Groups cluster: Add KeySet");
+            ListFreer listFreer;
+            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;
+
+            value.groupKeySet.groupKeySetID = 417U;
+            value.groupKeySet.groupKeySecurityPolicy =
+                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
+            value.groupKeySet.epochKey0.SetNonNull();
+            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime0.SetNonNull();
+            value.groupKeySet.epochStartTime0.Value() = 0ULL;
+            value.groupKeySet.epochKey1.SetNonNull();
+            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime1.SetNonNull();
+            value.groupKeySet.epochStartTime1.Value() = 0ULL;
+            value.groupKeySet.epochKey2.SetNonNull();
+            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
+                chip::Uint8::from_const_char(
+                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
+                16);
+            value.groupKeySet.epochStartTime2.SetNonNull();
+            value.groupKeySet.epochStartTime2.Value() = 0ULL;
+
+            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional
+
+            );
+        }
+        case 3: {
+            LogStep(3, "Preparation step for using commands from Groups cluster: Write Group Keys");
+            ListFreer listFreer;
+            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;
+
+            {
+                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
+                listFreer.add(listHolder_0);
+
+                listHolder_0->mList[0].groupId       = 1U;
+                listHolder_0->mList[0].groupKeySetID = 417U;
+                listHolder_0->mList[0].fabricIndex   = 1U;
+
+                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
+                    listHolder_0->mList, 1);
+            }
+            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
+                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
+        }
+        case 4: {
+            LogStep(4, "TH sends a AddGroup command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("G.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
+            value.groupID   = 1U;
+            value.groupName = chip::Span<const char>("Group1garbage: not in length on purpose", 6);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional
+
+            );
+        }
+        case 5: {
+            LogStep(5, "TH sends a RemoveAllScenes command to DUT with the GroupID field set to 0x0001.");
+            VerifyOrDo(!ShouldSkip("S.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RemoveAllScenes::Type value;
+            value.groupID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RemoveAllScenes::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 6: {
+            LogStep(6,
+                    "TH sends a AddScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01, the "
+                    "TransitionTime field set to 0x0001 and a set of extension fields appropriate to AC1.");
+            VerifyOrDo(!ShouldSkip("S.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::AddScene::Type value;
+            value.groupID        = 1U;
+            value.sceneID        = 1U;
+            value.transitionTime = 20U;
+            value.sceneName      = chip::Span<const char>("Scene1garbage: not in length on purpose", 6);
+
+            value.extensionFieldSets = chip::app::DataModel::List<chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::Type>();
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::AddScene::Id, value, chip::NullOptional
+
+            );
+        }
+        case 7: {
+            LogStep(7, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 100U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 8: {
+            LogStep(8, "TH configures AC1 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC1 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 9: {
+            LogStep(9,
+                    "TH sends a StoreScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01.");
+            VerifyOrDo(!ShouldSkip("S.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::StoreScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::StoreScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 10: {
+            LogStep(10, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 11: {
+            LogStep(11, "Wait 1s for level to change");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
+            value.ms = 1000UL;
+            return WaitForMs(kIdentityAlpha, value);
+        }
+        case 12: {
+            LogStep(12, "TH confirm the DUT reached AC2 (on level control cluster) after 1s, which is different from AC1");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
+                                 chip::NullOptional);
+        }
+        case 13: {
+            LogStep(13, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 14: {
+            LogStep(14,
+                    "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001 and the SceneID field set to 0x01 "
+                    "and the TransitionTime field omitted.");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 15: {
+            LogStep(15, "Wait 20s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
+            value.ms = 20000UL;
+            return WaitForMs(kIdentityAlpha, value);
+        }
+        case 16: {
+            LogStep(16, "TH confirm the DUT reached AC1 (on level control cluster) after 20s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
+                                 chip::NullOptional);
+        }
+        case 17: {
+            LogStep(17, "DUT transitions to AC1 over 20s.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please confirm that transition to AC1 was made over 20sgarbage: not in length on purpose", 55);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 18: {
+            LogStep(18, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 19: {
+            LogStep(19, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 20: {
+            LogStep(20,
+                    "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01 and "
+                    "the TransitionTime field set to 0x0032 (5s).");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            value.transitionTime.Emplace();
+            value.transitionTime.Value().SetNonNull();
+            value.transitionTime.Value().Value() = 50U;
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        case 21: {
+            LogStep(21, "Wait 5s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
+            value.ms = 5000UL;
+            return WaitForMs(kIdentityAlpha, value);
+        }
+        case 22: {
+            LogStep(22, "TH confirm the DUT reached AC2 (on level control cluster) after 5s");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
+                                 chip::NullOptional);
+        }
+        case 23: {
+            LogStep(23, "DUT transitions to AC1 over 5.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please confirm that transition to AC1 was made over 5sgarbage: not in length on purpose", 54);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 24: {
+            LogStep(24, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
+            value.level = 200U;
+            value.transitionTime.SetNonNull();
+            value.transitionTime.Value() = 0U;
+            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
+                               value, chip::NullOptional
+
+            );
+        }
+        case 25: {
+            LogStep(25, "TH configures AC2 on DUT for all implemented application clusters supporting scenes.");
+            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
+            value.message = chip::Span<const char>(
+                "Please configure AC2 on DUT and enter 'y' after the configuration is completegarbage: not in length on purpose",
+                77);
+            value.expectedValue.Emplace();
+            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
+            return UserPrompt(kIdentityAlpha, value);
+        }
+        case 26: {
+            LogStep(26,
+                    "TH sends a RecallScene command to DUT with the GroupID field set to 0x0001, the SceneID field set to 0x01 and "
+                    "the TransitionTime field set to null (no transition time override).");
+            VerifyOrDo(!ShouldSkip("S.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+            ListFreer listFreer;
+            chip::app::Clusters::Scenes::Commands::RecallScene::Type value;
+            value.groupID = 1U;
+            value.sceneID = 1U;
+            value.transitionTime.Emplace();
+            value.transitionTime.Value().SetNull();
+            return SendCommand(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Commands::RecallScene::Id, value,
+                               chip::NullOptional
+
+            );
+        }
+        }
         return CHIP_NO_ERROR;
     }
 };
@@ -119652,6 +122102,7 @@
         make_unique<Test_TC_S_2_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_S_2_2Suite>(credsIssuerConfig),
         make_unique<Test_TC_S_2_3Suite>(credsIssuerConfig),
+        make_unique<Test_TC_S_2_4Suite>(credsIssuerConfig),
         make_unique<Test_TC_S_3_1Suite>(credsIssuerConfig),
         make_unique<Test_TC_ACL_2_5Suite>(credsIssuerConfig),
         make_unique<Test_TC_ACL_2_6Suite>(credsIssuerConfig),
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 5222462..be76b9e 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -1629,6 +1629,8 @@
 | * SceneValid                                                        | 0x0003 |
 | * NameSupport                                                       | 0x0004 |
 | * LastConfiguredBy                                                  | 0x0005 |
+| * SceneTableSize                                                    | 0x0006 |
+| * RemainingCapacity                                                 | 0x0007 |
 | * GeneratedCommandList                                              | 0xFFF8 |
 | * AcceptedCommandList                                               | 0xFFF9 |
 | * EventList                                                         | 0xFFFA |
@@ -1687,15 +1689,7 @@
                         } else {
                             newElement_2.attributeID = nil;
                         }
-                        { // Scope for our temporary variables
-                            auto * array_4 = [NSMutableArray new];
-                            for (auto & entry_4 : entry_2.attributeValue) {
-                                NSNumber * newElement_4;
-                                newElement_4 = [NSNumber numberWithUnsignedChar:entry_4];
-                                [array_4 addObject:newElement_4];
-                            }
-                            newElement_2.attributeValue = array_4;
-                        }
+                        newElement_2.attributeValue = [NSNumber numberWithUnsignedInt:entry_2.attributeValue];
                         [array_2 addObject:newElement_2];
                     }
                     newElement_0.attributeValueList = array_2;
@@ -2068,15 +2062,7 @@
                         } else {
                             newElement_2.attributeID = nil;
                         }
-                        { // Scope for our temporary variables
-                            auto * array_4 = [NSMutableArray new];
-                            for (auto & entry_4 : entry_2.attributeValue) {
-                                NSNumber * newElement_4;
-                                newElement_4 = [NSNumber numberWithUnsignedChar:entry_4];
-                                [array_4 addObject:newElement_4];
-                            }
-                            newElement_2.attributeValue = array_4;
-                        }
+                        newElement_2.attributeValue = [NSNumber numberWithUnsignedInt:entry_2.attributeValue];
                         [array_2 addObject:newElement_2];
                     }
                     newElement_0.attributeValueList = array_2;
@@ -2609,6 +2595,138 @@
 };
 
 /*
+ * Attribute SceneTableSize
+ */
+class ReadScenesSceneTableSize : public ReadAttribute {
+public:
+    ReadScenesSceneTableSize()
+        : ReadAttribute("scene-table-size")
+    {
+    }
+
+    ~ReadScenesSceneTableSize() {}
+
+    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+    {
+        ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000006) on endpoint %u", endpointId);
+
+        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        [cluster readAttributeSceneTableSizeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+            NSLog(@"Scenes.SceneTableSize response %@", [value description]);
+            if (error != nil) {
+                LogNSError("Scenes SceneTableSize read Error", error);
+            }
+            SetCommandExitStatus(error);
+        }];
+        return CHIP_NO_ERROR;
+    }
+};
+
+class SubscribeAttributeScenesSceneTableSize : public SubscribeAttribute {
+public:
+    SubscribeAttributeScenesSceneTableSize()
+        : SubscribeAttribute("scene-table-size")
+    {
+    }
+
+    ~SubscribeAttributeScenesSceneTableSize() {}
+
+    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+    {
+        ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000006) on endpoint %u", endpointId);
+        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        if (mKeepSubscriptions.HasValue()) {
+            params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
+        }
+        if (mFabricFiltered.HasValue()) {
+            params.filterByFabric = mFabricFiltered.Value();
+        }
+        if (mAutoResubscribe.HasValue()) {
+            params.resubscribeAutomatically = mAutoResubscribe.Value();
+        }
+        [cluster subscribeAttributeSceneTableSizeWithParams:params
+            subscriptionEstablished:^() {
+                mSubscriptionEstablished = YES;
+            }
+            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+                NSLog(@"Scenes.SceneTableSize response %@", [value description]);
+                SetCommandExitStatus(error);
+            }];
+
+        return CHIP_NO_ERROR;
+    }
+};
+
+/*
+ * Attribute RemainingCapacity
+ */
+class ReadScenesRemainingCapacity : public ReadAttribute {
+public:
+    ReadScenesRemainingCapacity()
+        : ReadAttribute("remaining-capacity")
+    {
+    }
+
+    ~ReadScenesRemainingCapacity() {}
+
+    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+    {
+        ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000007) on endpoint %u", endpointId);
+
+        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        [cluster readAttributeRemainingCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+            NSLog(@"Scenes.RemainingCapacity response %@", [value description]);
+            if (error != nil) {
+                LogNSError("Scenes RemainingCapacity read Error", error);
+            }
+            SetCommandExitStatus(error);
+        }];
+        return CHIP_NO_ERROR;
+    }
+};
+
+class SubscribeAttributeScenesRemainingCapacity : public SubscribeAttribute {
+public:
+    SubscribeAttributeScenesRemainingCapacity()
+        : SubscribeAttribute("remaining-capacity")
+    {
+    }
+
+    ~SubscribeAttributeScenesRemainingCapacity() {}
+
+    CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override
+    {
+        ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000007) on endpoint %u", endpointId);
+        dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        if (mKeepSubscriptions.HasValue()) {
+            params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
+        }
+        if (mFabricFiltered.HasValue()) {
+            params.filterByFabric = mFabricFiltered.Value();
+        }
+        if (mAutoResubscribe.HasValue()) {
+            params.resubscribeAutomatically = mAutoResubscribe.Value();
+        }
+        [cluster subscribeAttributeRemainingCapacityWithParams:params
+            subscriptionEstablished:^() {
+                mSubscriptionEstablished = YES;
+            }
+            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+                NSLog(@"Scenes.RemainingCapacity response %@", [value description]);
+                SetCommandExitStatus(error);
+            }];
+
+        return CHIP_NO_ERROR;
+    }
+};
+
+/*
  * Attribute GeneratedCommandList
  */
 class ReadScenesGeneratedCommandList : public ReadAttribute {
@@ -158958,6 +159076,10 @@
         make_unique<SubscribeAttributeScenesNameSupport>(), //
         make_unique<ReadScenesLastConfiguredBy>(), //
         make_unique<SubscribeAttributeScenesLastConfiguredBy>(), //
+        make_unique<ReadScenesSceneTableSize>(), //
+        make_unique<SubscribeAttributeScenesSceneTableSize>(), //
+        make_unique<ReadScenesRemainingCapacity>(), //
+        make_unique<SubscribeAttributeScenesRemainingCapacity>(), //
         make_unique<ReadScenesGeneratedCommandList>(), //
         make_unique<SubscribeAttributeScenesGeneratedCommandList>(), //
         make_unique<ReadScenesAcceptedCommandList>(), //