Update rvc mode cluters with new mode restrictions (#31560)

* Updated step 3 in TC 1.1 for RvcRunMode and RvcCleanMode

* Updated TC 1.2 for RvcRunMode and RvcCleanMode cluters.

* Added TC 2.2 for the RvcCleanMode cluster.

* Restyled by autopep8

* Added TC 2.2 for the RvcRunMode cluster.

* Removed unused imports.

* Regenerated zap files.

* Added the PICS provider methods to the new python tests.

* Changed the features supported by the RVC mode cluters in the all-clusters-app to match recent changes in the spec and tests.

* Added the mapping mode tag to the all-clusters-app example

* Changed the response returned by the RVC clean mode's handler of the ChanedToMode command to match the new spec.

* Updated TC_RVCCLEAN_2_2 to remove incorrect type checks.

* Apply suggestions from code review

Co-authored-by: C Freeman <cecille@google.com>
Co-authored-by: Petru Lauric <81822411+plauric@users.noreply.github.com>

* Updated the RVC run ChangeToMode handler in the all-clusters-app to match the new spec behaviour.

* Updated the cl-pics-values for the RVC Run and Clean clusters.

* Future proofed the enum to text function and change to using the --endpoint flag.

* Fixed retrival of the endpoint setting.

* Simplified some of the test code following review.

* Removed test steps to match the test plan.

* Changed the capture of the endpoint for the RVC run and RVC clean test 2.1.

* Restyled by clang-format

* Restyled by autopep8

* Regenerated zap files.

* Removed duplicate RVCRUNM PICS from the ci-pics-values.

* Updated PICS.yaml to reflect the new PICS requirements for the RvcRunMode and RvcCleanMode clusters.

* Made all RVC python tests consistent regarding the capture of the endpoint and their documentation.

* Apply typo suggestions from code review

Co-authored-by: Petru Lauric <81822411+plauric@users.noreply.github.com>

* Fixed the RVC clean handle change to mode in the all-clusters-app.

* Restyled by clang-format

---------

Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: C Freeman <cecille@google.com>
Co-authored-by: Petru Lauric <81822411+plauric@users.noreply.github.com>
diff --git a/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h b/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h
index af8313f..8af4aa5 100644
--- a/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h
+++ b/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h
@@ -41,6 +41,7 @@
     using ModeTagStructType               = detail::Structs::ModeTagStruct::Type;
     ModeTagStructType ModeTagsIdle[1]     = { { .value = to_underlying(ModeTag::kIdle) } };
     ModeTagStructType ModeTagsCleaning[1] = { { .value = to_underlying(ModeTag::kCleaning) } };
+    ModeTagStructType ModeTagsMapping[1]  = { { .value = to_underlying(ModeTag::kMapping) } };
 
     const detail::Structs::ModeOptionStruct::Type kModeOptions[3] = {
         detail::Structs::ModeOptionStruct::Type{ .label    = CharSpan::fromCharString("Idle"),
@@ -49,10 +50,9 @@
         detail::Structs::ModeOptionStruct::Type{ .label    = CharSpan::fromCharString("Cleaning"),
                                                  .mode     = ModeCleaning,
                                                  .modeTags = DataModel::List<const ModeTagStructType>(ModeTagsCleaning) },
-        detail::Structs::ModeOptionStruct::Type{
-            .label    = CharSpan::fromCharString("Mapping"),
-            .mode     = ModeMapping,
-            .modeTags = DataModel::List<const ModeTagStructType>(ModeTagsIdle) }, // todo set to no mode tags
+        detail::Structs::ModeOptionStruct::Type{ .label    = CharSpan::fromCharString("Mapping"),
+                                                 .mode     = ModeMapping,
+                                                 .modeTags = DataModel::List<const ModeTagStructType>(ModeTagsMapping) },
     };
 
     CHIP_ERROR Init() override;
diff --git a/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp b/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp
index 480c8f7..999d62a 100644
--- a/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp
+++ b/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp
@@ -43,7 +43,7 @@
     // Our business logic states that we can only switch into the mapping state from the idle state.
     if (NewMode == RvcRunMode::ModeMapping && currentMode != RvcRunMode::ModeIdle)
     {
-        response.status = to_underlying(ModeBase::StatusCode::kGenericFailure);
+        response.status = to_underlying(ModeBase::StatusCode::kInvalidInMode);
         response.statusText.SetValue(chip::CharSpan::fromCharString("Change to the mapping mode is only allowed from idle"));
         return;
     }
@@ -112,8 +112,7 @@
     VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
     VerifyOrDie(gRvcRunModeDelegate == nullptr && gRvcRunModeInstance == nullptr);
     gRvcRunModeDelegate = new RvcRunMode::RvcRunModeDelegate;
-    gRvcRunModeInstance =
-        new ModeBase::Instance(gRvcRunModeDelegate, 0x1, RvcRunMode::Id, chip::to_underlying(RvcRunMode::Feature::kOnOff));
+    gRvcRunModeInstance = new ModeBase::Instance(gRvcRunModeDelegate, 0x1, RvcRunMode::Id, 0);
     gRvcRunModeInstance->Init();
 }
 
@@ -130,10 +129,11 @@
 {
     uint8_t rvcRunCurrentMode = gRvcRunModeInstance->GetCurrentMode();
 
-    if (rvcRunCurrentMode == RvcRunMode::ModeCleaning)
+    if (rvcRunCurrentMode != RvcRunMode::ModeIdle)
     {
-        response.status = to_underlying(RvcCleanMode::StatusCode::kCleaningInProgress);
-        response.statusText.SetValue(chip::CharSpan::fromCharString("Cannot change the cleaning mode during a clean"));
+        response.status = to_underlying(ModeBase::StatusCode::kInvalidInMode);
+        response.statusText.SetValue(
+            chip::CharSpan::fromCharString("Cannot change the cleaning mode when the device is not in idle"));
         return;
     }
 
@@ -201,7 +201,6 @@
     VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
     VerifyOrDie(gRvcCleanModeDelegate == nullptr && gRvcCleanModeInstance == nullptr);
     gRvcCleanModeDelegate = new RvcCleanMode::RvcCleanModeDelegate;
-    gRvcCleanModeInstance =
-        new ModeBase::Instance(gRvcCleanModeDelegate, 0x1, RvcCleanMode::Id, chip::to_underlying(RvcCleanMode::Feature::kOnOff));
+    gRvcCleanModeInstance = new ModeBase::Instance(gRvcCleanModeDelegate, 0x1, RvcCleanMode::Id, 0);
     gRvcCleanModeInstance->Init();
 }
diff --git a/src/app/tests/suites/certification/PICS.yaml b/src/app/tests/suites/certification/PICS.yaml
index af29b4d..93cfe96 100644
--- a/src/app/tests/suites/certification/PICS.yaml
+++ b/src/app/tests/suites/certification/PICS.yaml
@@ -9116,12 +9116,6 @@
     - label: "Does the device implement the CurrentMode attribute?"
       id: RVCCLEANM.S.A0001
 
-    - label: "Does the device implement the StartUpMode attribute?"
-      id: RVCCLEANM.S.A0002
-
-    - label: "Does the device implement the OnMode attribute?"
-      id: RVCCLEANM.S.A0003
-
     #
     # server / Commands received
     #
@@ -9334,11 +9328,8 @@
     - label: "Does the device implement the CurrentMode attribute?"
       id: RVCRUNM.S.A0001
 
-    - label: "Does the device implement the StartUpMode attribute?"
-      id: RVCRUNM.S.A0002
-
-    - label: "Does the device implement the OnMode attribute?"
-      id: RVCRUNM.S.A0003
+    - label: "Can the mode change be manually controlled?"
+      id: RVCRUNM.S.M.CAN_MANUALLY_CONTROLLED
 
     #Commands received
     - label: "Does the device implement receiving the ChangeToMode command?"
diff --git a/src/app/tests/suites/certification/Test_TC_RVCCLEANM_1_1.yaml b/src/app/tests/suites/certification/Test_TC_RVCCLEANM_1_1.yaml
index f953862..1a4dbae 100644
--- a/src/app/tests/suites/certification/Test_TC_RVCCLEANM_1_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_RVCCLEANM_1_1.yaml
@@ -42,7 +42,6 @@
               type: int16u
 
     - label: "Step 3: TH reads from the DUT the FeatureMap attribute."
-      PICS: " !RVCCLEANM.S.F00 "
       command: "readAttribute"
       attribute: "FeatureMap"
       response:
@@ -50,17 +49,6 @@
           constraints:
               type: bitmap32
 
-    - label:
-          "Step 3: Given RVCCLEANM.S.F00(DEPONOFF) ensure featuremap has the
-          correct bit set"
-      PICS: RVCCLEANM.S.F00
-      command: "readAttribute"
-      attribute: "FeatureMap"
-      response:
-          constraints:
-              type: bitmap32
-              hasMasksSet: [0x1]
-
     - label: "Step 4a: TH reads from the DUT the AttributeList attribute."
       PICS: PICS_EVENT_LIST_ENABLED
       command: "readAttribute"
@@ -79,28 +67,6 @@
               type: list
               contains: [0, 1, 65528, 65529, 65531, 65532, 65533]
 
-    - label:
-          "Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF)
-          and optional attribute(OnMode) is in AttributeList from the DUT"
-      PICS: RVCCLEANM.S.F00
-      command: "readAttribute"
-      attribute: "AttributeList"
-      response:
-          constraints:
-              type: list
-              contains: [3]
-
-    - label:
-          "Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF)
-          and optional attribute(OnMode) is not in AttributeList from the DUT"
-      PICS: " !RVCCLEANM.S.F00 "
-      command: "readAttribute"
-      attribute: "AttributeList"
-      response:
-          constraints:
-              type: list
-              excludes: [3]
-
     - label: "Step 5: TH reads from the DUT the EventList attribute."
       PICS: PICS_EVENT_LIST_ENABLED
       command: "readAttribute"
diff --git a/src/app/tests/suites/certification/Test_TC_RVCRUNM_1_1.yaml b/src/app/tests/suites/certification/Test_TC_RVCRUNM_1_1.yaml
index cb97b72..f9b4aed 100644
--- a/src/app/tests/suites/certification/Test_TC_RVCRUNM_1_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_RVCRUNM_1_1.yaml
@@ -41,8 +41,7 @@
           constraints:
               type: int16u
 
-    - label: "Step 3a: TH reads from the DUT the FeatureMap attribute."
-      PICS: " !RVCRUNM.S.F00 "
+    - label: "Step 3: TH reads from the DUT the FeatureMap attribute."
       command: "readAttribute"
       attribute: "FeatureMap"
       response:
@@ -50,17 +49,6 @@
           constraints:
               type: bitmap32
 
-    - label:
-          "Step 3b: Given RVCRUNM.S.F00(DEPONOFF) ensure featuremap has the
-          correct bit set"
-      PICS: RVCRUNM.S.F00
-      command: "readAttribute"
-      attribute: "FeatureMap"
-      response:
-          constraints:
-              type: bitmap32
-              hasMasksSet: [0x1]
-
     - label: "Step 4a: TH reads from the DUT the AttributeList attribute."
       PICS: PICS_EVENT_LIST_ENABLED
       command: "readAttribute"
@@ -79,28 +67,6 @@
               type: list
               contains: [0, 1, 65528, 65529, 65531, 65532, 65533]
 
-    - label:
-          "Step 4c: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and
-          optional attribute(OnMode) is in AttributeList from the DUT"
-      PICS: RVCRUNM.S.F00
-      command: "readAttribute"
-      attribute: "AttributeList"
-      response:
-          constraints:
-              type: list
-              contains: [3]
-
-    - label:
-          "Step 4d: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and
-          optional attribute(OnMode) is not in AttributeList from the DUT"
-      PICS: " !RVCRUNM.S.F00 "
-      command: "readAttribute"
-      attribute: "AttributeList"
-      response:
-          constraints:
-              type: list
-              excludes: [3]
-
     - label: "Step 5: TH reads from the DUT the EventList attribute."
       PICS: PICS_EVENT_LIST_ENABLED
       command: "readAttribute"
diff --git a/src/app/tests/suites/certification/ci-pics-values b/src/app/tests/suites/certification/ci-pics-values
index 4201b96..4c4df4c 100644
--- a/src/app/tests/suites/certification/ci-pics-values
+++ b/src/app/tests/suites/certification/ci-pics-values
@@ -2438,11 +2438,9 @@
 #Server
 RVCCLEANM.S.A0000=1
 RVCCLEANM.S.A0001=1
-RVCCLEANM.S.A0002=0
-RVCCLEANM.S.A0003=1
 
 #Feature
-RVCCLEANM.S.F00=1
+RVCCLEANM.S.F00=0
 
 #commands
 RVCCLEANM.S.C00.Rsp=1
@@ -2506,19 +2504,18 @@
 
 # RVC RUN MODE CLUSTER
 RVCRUNM.S=1
-RVCRUNM.S.F00=1
+RVCRUNM.S.F00=0
 
 #Server
 RVCRUNM.S.A0000=1
 RVCRUNM.S.A0001=1
-RVCRUNM.S.A0002=0
-RVCRUNM.S.A0003=1
 
 #Commands
 RVCRUNM.S.C00.Rsp=1
 RVCRUNM.S.C01.Tx=1
 
 RVCRUNM.S.M.CAN_TEST_MODE_FAILURE=1
+RVCRUNM.S.M.CAN_MANUALLY_CONTROLLED=1
 
 #PIXIT
 PIXIT.RVCRUNM.MODE_CHANGE_FAIL=1
@@ -2691,16 +2688,6 @@
 WASHERCTRL.S.M.ManuallyControlledRinse=1
 WASHERCTRL.S.M.ManuallyControlled=0
 
-#RVC Run Mode
-RVCRUNM.S=1
-RVCRUNM.S.F00=1
-RVCRUNM.S.A0000=1
-RVCRUNM.S.A0001=1
-RVCRUNM.S.A0002=0
-RVCRUNM.S.A0003=1
-RVCRUNM.S.C00.Rsp=1
-RVCRUNM.S.C01.Tx=1
-
 #Refrigerator Alarm
 REFALM.S=1
 REFALM.C=1
diff --git a/src/python_testing/TC_RVCCLEANM_1_2.py b/src/python_testing/TC_RVCCLEANM_1_2.py
index a3a7648..2f3c6f9 100644
--- a/src/python_testing/TC_RVCCLEANM_1_2.py
+++ b/src/python_testing/TC_RVCCLEANM_1_2.py
@@ -18,16 +18,26 @@
 import logging
 
 import chip.clusters as Clusters
-from chip.clusters.Types import NullValue
 from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main
 from mobly import asserts
 
-# This test requires several additional command line arguments
-# run with
-# --int-arg PIXIT_ENDPOINT:<endpoint>
-
 
 class TC_RVCCLEANM_1_2(MatterBaseTest):
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.commonTags = {0x0: 'Auto',
+                           0x1: 'Quick',
+                           0x2: 'Quiet',
+                           0x3: 'LowNoise',
+                           0x4: 'LowEnergy',
+                           0x5: 'Vacation',
+                           0x6: 'Min',
+                           0x7: 'Max',
+                           0x8: 'Night',
+                           0x9: 'Day'}
+        self.cleanTags = [tag.value for tag in Clusters.RvcCleanMode.Enums.ModeTag]
+        self.supported_modes_dut = []
 
     async def read_mod_attribute_expect_success(self, endpoint, attribute):
         cluster = Clusters.Objects.RvcCleanMode
@@ -38,12 +48,7 @@
 
     @async_test_body
     async def test_TC_RVCCLEANM_1_2(self):
-
-        asserts.assert_true('PIXIT_ENDPOINT' in self.matter_test_config.global_test_params,
-                            "PIXIT_ENDPOINT must be included on the command line in "
-                            "the --int-arg flag as PIXIT_ENDPOINT:<endpoint>")
-
-        self.endpoint = self.matter_test_config.global_test_params['PIXIT_ENDPOINT']
+        self.endpoint = self.matter_test_config.endpoint
 
         attributes = Clusters.RvcCleanMode.Attributes
 
@@ -55,16 +60,18 @@
 
             logging.info("SupportedModes: %s" % (supported_modes))
 
+            # Verify that the list has at least 2 and at most 255 entries
             asserts.assert_greater_equal(len(supported_modes), 2, "SupportedModes must have at least 2 entries!")
             asserts.assert_less_equal(len(supported_modes), 255, "SupportedModes must have at most 255 entries!")
 
-            modes = []
+            # Verify that each ModeOptionsStruct entry has a unique Mode field value
             for m in supported_modes:
-                if m.mode in modes:
+                if m.mode in self.supported_modes_dut:
                     asserts.fail("SupportedModes must have unique mode values!")
                 else:
-                    modes.append(m.mode)
+                    self.supported_modes_dut.append(m.mode)
 
+            # Verify that each ModeOptionsStruct entry has a unique Label field value
             labels = []
             for m in supported_modes:
                 if m.label in labels:
@@ -72,47 +79,50 @@
                 else:
                     labels.append(m.label)
 
-            # common mode tags
-            commonTags = {0x0: 'Auto',
-                          0x1: 'Quick',
-                          0x2: 'Quiet',
-                          0x3: 'LowNoise',
-                          0x4: 'LowEnergy',
-                          0x5: 'Vacation',
-                          0x6: 'Min',
-                          0x7: 'Max',
-                          0x8: 'Night',
-                          0x9: 'Day'}
-
-            cleanTags = [tag.value for tag in Clusters.RvcCleanMode.Enums.ModeTag
-                         if tag is not Clusters.RvcCleanMode.Enums.ModeTag.kUnknownEnumValue]
-
+            # Verify that each ModeOptionsStruct entry's ModeTags field has:
             for m in supported_modes:
+                # * at least one entry
+                if len(m.modeTags) == 0:
+                    asserts.fail("SupportedModes must have at least one mode tag!")
+
+                at_least_one_common_or_clean_tag = False
                 for t in m.modeTags:
-                    is_mfg = (0x8000 <= t.value and t.value <= 0xBFFF)
-                    asserts.assert_true(t.value in commonTags.keys() or t.value in cleanTags or is_mfg,
-                                        "Found a SupportedModes entry with invalid mode tag value!")
+                    # * the values of the Value fields that are not larger than 16 bits
+                    if t.value > 0xFFFF or t.value < 0:
+                        asserts.fail("Mode tag values must not be larger than 16 bits!")
+
+                    # * for each Value field: {isCommonOrDerivedOrMfgTagsVal}
+                    is_mfg = (0x8000 <= t.value <= 0xBFFF)
+                    if (t.value not in self.commonTags and
+                            t.value not in self.cleanTags and
+                            not is_mfg):
+                        asserts.fail("Mode tag value is not a common tag, clean tag or vendor tag!")
+
+                    # * for at least one Value field: {isCommonOrDerivedTagsVal}
+                    if not is_mfg:
+                        at_least_one_common_or_clean_tag = True
+
+                if not at_least_one_common_or_clean_tag:
+                    asserts.fail("At least one mode tag must be a common tag or clean tag!")
+
+            # Verify that at least one ModeOptionsStruct entry includes either the
+            # Vacuum(0x4001) mode tag or the Mop(0x4002)mode tag in the ModeTags field
+            vacuum_mop_tags = [Clusters.RvcCleanMode.Enums.ModeTag.kVacuum, Clusters.RvcCleanMode.Enums.ModeTag.kMop]
+            has_vacuum_or_mop_mode_tag = False
+            for m in supported_modes:
+                has_vacuum_or_mop_mode_tag = any(t.value in vacuum_mop_tags for t in m.modeTags)
+                if has_vacuum_or_mop_mode_tag:
+                    break
+
+            asserts.assert_true(has_vacuum_or_mop_mode_tag,
+                                "At least one ModeOptionsStruct entry must include either the Vacuum or Mop mode tag")
 
         if self.check_pics("RVCCLEANM.S.A0001"):
             self.print_step(3, "Read CurrentMode attribute")
             current_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.CurrentMode)
 
             logging.info("CurrentMode: %s" % (current_mode))
-            asserts.assert_true(current_mode in modes, "CurrentMode is not a supported mode!")
-
-        if self.check_pics("RVCCLEANM.S.A0003"):
-            self.print_step(4, "Read OnMode attribute")
-            on_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.OnMode)
-
-            logging.info("OnMode: %s" % (on_mode))
-            asserts.assert_true(on_mode in modes or on_mode == NullValue, "OnMode is not a supported mode!")
-
-        if self.check_pics("RVCCLEANM.S.A0002"):
-            self.print_step(5, "Read StartUpMode attribute")
-            startup_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.StartUpMode)
-
-            logging.info("StartUpMode: %s" % (startup_mode))
-            asserts.assert_true(startup_mode in modes or startup_mode == NullValue, "StartUpMode is not a supported mode!")
+            asserts.assert_true(current_mode in self.supported_modes_dut, "CurrentMode is not a supported mode!")
 
 
 if __name__ == "__main__":
diff --git a/src/python_testing/TC_RVCCLEANM_2_1.py b/src/python_testing/TC_RVCCLEANM_2_1.py
index 56743b6..4f55320 100644
--- a/src/python_testing/TC_RVCCLEANM_2_1.py
+++ b/src/python_testing/TC_RVCCLEANM_2_1.py
@@ -23,11 +23,17 @@
 
 # This test requires several additional command line arguments
 # run with
-# --int-arg PIXIT_ENDPOINT:<endpoint> PIXIT.RVCCLEANM.MODE_CHANGE_OK:<mode id> PIXIT.RVCCLEANM.MODE_CHANGE_FAIL:<mode id>
+# --int-arg PIXIT.RVCCLEANM.MODE_CHANGE_OK:<mode id> PIXIT.RVCCLEANM.MODE_CHANGE_FAIL:<mode id>
 
 
 class TC_RVCCLEANM_2_1(MatterBaseTest):
 
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.mode_ok = 0
+        self.mode_fail = 0
+
     async def read_mod_attribute_expect_success(self, endpoint, attribute):
         cluster = Clusters.Objects.RvcCleanMode
         return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute)
@@ -44,9 +50,6 @@
     @async_test_body
     async def test_TC_RVCCLEANM_2_1(self):
 
-        asserts.assert_true('PIXIT_ENDPOINT' in self.matter_test_config.global_test_params,
-                            "PIXIT_ENDPOINT must be included on the command line in "
-                            "the --int-arg flag as PIXIT_ENDPOINT:<endpoint>")
         asserts.assert_true('PIXIT.RVCCLEANM.MODE_CHANGE_OK' in self.matter_test_config.global_test_params,
                             "PIXIT.RVCCLEANM.MODE_CHANGE_OK must be included on the command line in "
                             "the --int-arg flag as PIXIT.RVCCLEANM.MODE_CHANGE_OK:<mode id>")
@@ -54,9 +57,9 @@
                             "PIXIT.RVCCLEANM.MODE_CHANGE_FAIL must be included on the command line in "
                             "the --int-arg flag as PIXIT.RVCCLEANM.MODE_CHANGE_FAIL:<mode id>")
 
-        self.endpoint = self.matter_test_config.global_test_params['PIXIT_ENDPOINT']
-        self.modeok = self.matter_test_config.global_test_params['PIXIT.RVCCLEANM.MODE_CHANGE_OK']
-        self.modefail = self.matter_test_config.global_test_params['PIXIT.RVCCLEANM.MODE_CHANGE_FAIL']
+        self.endpoint = self.matter_test_config.endpoint
+        self.mode_ok = self.matter_test_config.global_test_params['PIXIT.RVCCLEANM.MODE_CHANGE_OK']
+        self.mode_fail = self.matter_test_config.global_test_params['PIXIT.RVCCLEANM.MODE_CHANGE_FAIL']
 
         asserts.assert_true(self.check_pics("RVCCLEANM.S.A0000"), "RVCCLEANM.S.A0000 must be supported")
         asserts.assert_true(self.check_pics("RVCCLEANM.S.A0001"), "RVCCLEANM.S.A0001 must be supported")
@@ -93,8 +96,7 @@
             GENERIC_FAILURE = 0x02
             INVALID_IN_MODE = 0x03
 
-        rvcCleanCodes = [code.value for code in Clusters.RvcCleanMode.Enums.StatusCode
-                         if code is not Clusters.RvcCleanMode.Enums.StatusCode.kUnknownEnumValue]
+        rvcCleanCodes = [code.value for code in Clusters.RvcCleanMode.Enums.StatusCode]
 
         self.print_step(4, "Send ChangeToMode command with NewMode set to %d" % (old_current_mode))
 
@@ -102,9 +104,9 @@
         asserts.assert_true(ret.status == CommonCodes.SUCCESS.value, "Changing the mode to the current mode should be a no-op")
 
         if self.check_pics("RVCCLEANM.S.M.CAN_TEST_MODE_FAILURE"):
-            asserts.assert_true(self.modefail in modes,
-                                "The MODE_CHANGE_FAIL PIXIT value (%d) is not a supported mode" % (self.modefail))
-            self.print_step(5, "Manually put the device in a state from which it will FAIL to transition to mode %d" % (self.modefail))
+            asserts.assert_true(self.mode_fail in modes,
+                                "The MODE_CHANGE_FAIL PIXIT value (%d) is not a supported mode" % (self.mode_fail))
+            self.print_step(5, "Manually put the device in a state from which it will FAIL to transition to mode %d" % (self.mode_fail))
             input("Press Enter when done.\n")
 
             self.print_step(6, "Read CurrentMode attribute")
@@ -112,15 +114,15 @@
 
             logging.info("CurrentMode: %s" % (old_current_mode))
 
-            self.print_step(7, "Send ChangeToMode command with NewMode set to %d" % (self.modefail))
+            self.print_step(7, "Send ChangeToMode command with NewMode set to %d" % (self.mode_fail))
 
-            ret = await self.send_change_to_mode_cmd(newMode=self.modefail)
+            ret = await self.send_change_to_mode_cmd(newMode=self.mode_fail)
             st = ret.status
             is_mfg_code = st in range(0x80, 0xC0)
             is_err_code = (st == CommonCodes.GENERIC_FAILURE.value) or (
                 st == CommonCodes.INVALID_IN_MODE.value) or (st in rvcCleanCodes) or is_mfg_code
             asserts.assert_true(
-                is_err_code, "Changing to mode %d must fail due to the current state of the device" % (self.modefail))
+                is_err_code, "Changing to mode %d must fail due to the current state of the device" % (self.mode_fail))
             st_text_len = len(ret.statusText)
             asserts.assert_true(st_text_len in range(1, 65), "StatusText length (%d) must be between 1 and 64" % (st_text_len))
 
@@ -131,7 +133,7 @@
 
             asserts.assert_true(current_mode == old_current_mode, "CurrentMode changed after failed ChangeToMode command!")
 
-        self.print_step(9, "Manually put the device in a state from which it will SUCCESSFULLY transition to mode %d" % (self.modeok))
+        self.print_step(9, "Manually put the device in a state from which it will SUCCESSFULLY transition to mode %d" % (self.mode_ok))
         input("Press Enter when done.\n")
 
         self.print_step(10, "Read CurrentMode attribute")
@@ -139,18 +141,18 @@
 
         logging.info("CurrentMode: %s" % (old_current_mode))
 
-        self.print_step(11, "Send ChangeToMode command with NewMode set to %d" % (self.modeok))
+        self.print_step(11, "Send ChangeToMode command with NewMode set to %d" % (self.mode_ok))
 
-        ret = await self.send_change_to_mode_cmd(newMode=self.modeok)
+        ret = await self.send_change_to_mode_cmd(newMode=self.mode_ok)
         asserts.assert_true(ret.status == CommonCodes.SUCCESS.value,
-                            "Changing to mode %d must succeed due to the current state of the device" % (self.modeok))
+                            "Changing to mode %d must succeed due to the current state of the device" % (self.mode_ok))
 
         self.print_step(12, "Read CurrentMode attribute")
         current_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.CurrentMode)
 
         logging.info("CurrentMode: %s" % (current_mode))
 
-        asserts.assert_true(current_mode == self.modeok,
+        asserts.assert_true(current_mode == self.mode_ok,
                             "CurrentMode doesn't match the argument of the successful ChangeToMode command!")
 
         self.print_step(13, "Send ChangeToMode command with NewMode set to %d" % (invalid_mode))
@@ -164,7 +166,7 @@
 
         logging.info("CurrentMode: %s" % (current_mode))
 
-        asserts.assert_true(current_mode == self.modeok, "CurrentMode changed after failed ChangeToMode command!")
+        asserts.assert_true(current_mode == self.mode_ok, "CurrentMode changed after failed ChangeToMode command!")
 
 
 if __name__ == "__main__":
diff --git a/src/python_testing/TC_RVCCLEANM_2_2.py b/src/python_testing/TC_RVCCLEANM_2_2.py
new file mode 100644
index 0000000..a4107e1
--- /dev/null
+++ b/src/python_testing/TC_RVCCLEANM_2_2.py
@@ -0,0 +1,125 @@
+#
+#    Copyright (c) 2024 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+import chip.clusters as Clusters
+from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main
+from mobly import asserts
+
+
+class TC_RVCCLEANM_2_2(MatterBaseTest):
+
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.supported_run_modes = {}  # these are the ModeOptionStructs
+        self.supported_run_modes_dut = []
+        self.supported_clean_modes_dut = []
+        self.run_mode_dut = 0
+        self.old_clean_mode_dut = 0
+        self.new_clean_mode_th = 0
+
+    async def read_mod_attribute_expect_success(self, cluster, attribute):
+        return await self.read_single_attribute_check_success(
+            endpoint=self.endpoint, cluster=cluster, attribute=attribute)
+
+    async def read_run_supported_modes(self) -> Clusters.Objects.RvcRunMode.Attributes.SupportedModes:
+        ret = await self.read_mod_attribute_expect_success(
+            Clusters.RvcRunMode,
+            Clusters.RvcRunMode.Attributes.SupportedModes)
+        return ret
+
+    async def read_clean_supported_modes(self) -> Clusters.Objects.RvcCleanMode.Attributes.SupportedModes:
+        ret = await self.read_mod_attribute_expect_success(
+            Clusters.RvcCleanMode,
+            Clusters.RvcCleanMode.Attributes.SupportedModes)
+        return ret
+
+    async def send_change_to_mode_cmd(self, newMode) -> Clusters.Objects.RvcCleanMode.Commands.ChangeToModeResponse:
+        ret = await self.send_single_cmd(cmd=Clusters.Objects.RvcCleanMode.Commands.ChangeToMode(newMode=newMode), endpoint=self.endpoint)
+        return ret
+
+    # Prints the instruction and waits for a user input to continue
+    def print_instruction(self, step_number, instruction):
+        self.print_step(step_number, instruction)
+        input("Press Enter when done.\n")
+
+    def pics_TC_RVCCLEANM_2_2(self) -> list[str]:
+        return ["RVCCLEANM.S"]
+
+    @async_test_body
+    async def test_TC_RVCCLEANM_2_2(self):
+        self.endpoint = self.matter_test_config.endpoint
+
+        asserts.assert_true(self.check_pics("RVCCLEANM.S"), "RVCCLEANM.S must be supported")
+        asserts.assert_true(self.check_pics("RVCRUNM.S.A0000"), "RVCRUNM.S.A0000 must be supported")
+        asserts.assert_true(self.check_pics("RVCRUNM.S.A0001"), "RVCRUNM.S.A0001 must be supported")
+
+        self.print_step(1, "Commissioning, already done")
+
+        self.print_instruction(2, "Manually put the device in a state in which the RVC Run Mode "
+                                  "cluster’s CurrentMode attribute is set to a mode without the Idle mode tag.")
+
+        self.print_step(3, "Read the RvcRunMode SupportedModes attribute")
+        supported_run_modes = await self.read_run_supported_modes()
+        for mode in supported_run_modes:
+            self.supported_run_modes[mode.mode] = mode
+            # Save the Mode field values as supported_run_modes_dut
+            self.supported_run_modes_dut.append(mode.mode)
+
+        self.print_step(4, "Read the RvcRunMode CurrentMode attribute")
+        current_run_mode = await self.read_mod_attribute_expect_success(
+            Clusters.RvcRunMode,
+            Clusters.RvcRunMode.Attributes.CurrentMode)
+
+        # Save the value as run_mode_dut
+        self.run_mode_dut = current_run_mode
+
+        # Verify that the supported_run_modes_dut entry matching run_mode_dut does not have the Idle (0x4000) mode tag.
+        for t in self.supported_run_modes[current_run_mode].modeTags:
+            asserts.assert_true(t.value != Clusters.RvcRunMode.Enums.ModeTag.kIdle,
+                                "The device must be in a mode without the Idle (0x4000) mode tag.")
+
+        self.print_step(5, "Read the RvcCleanMode SupportedModes attribute")
+        supported_clean_modes = await self.read_clean_supported_modes()
+        for mode in supported_clean_modes:
+            # Save the Mode field values as supported_run_modes_dut
+            self.supported_clean_modes_dut.append(mode.mode)
+
+        self.print_step(6, "Read the RvcCleanMode CurrentMode attribute")
+        current_clean_mode = await self.read_mod_attribute_expect_success(
+            Clusters.RvcCleanMode,
+            Clusters.RvcCleanMode.Attributes.CurrentMode)
+
+        # Save the value as old_clean_mode_dut
+        self.old_clean_mode_dut = current_clean_mode
+
+        # Select from supported_clean_modes_dut a value which is different from old_clean_mode_dut,
+        # and save it as new_clean_mode_th
+        for mode in self.supported_clean_modes_dut:
+            if mode != self.old_clean_mode_dut:
+                self.new_clean_mode_th = mode
+                break
+
+        self.print_step(7, "Send ChangeToMode command")
+        response = await self.send_change_to_mode_cmd(self.new_clean_mode_th)
+        asserts.assert_equal(response.status, 3,
+                             "The response should contain a ChangeToModeResponse command "
+                             "with the Status set to InvalidInMode(0x03).")
+
+
+if __name__ == "__main__":
+    default_matter_test_main()
diff --git a/src/python_testing/TC_RVCRUNM_1_2.py b/src/python_testing/TC_RVCRUNM_1_2.py
index 68684e4..4fc9a1f 100644
--- a/src/python_testing/TC_RVCRUNM_1_2.py
+++ b/src/python_testing/TC_RVCRUNM_1_2.py
@@ -18,16 +18,26 @@
 import logging
 
 import chip.clusters as Clusters
-from chip.clusters.Types import NullValue
 from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main
 from mobly import asserts
 
-# This test requires several additional command line arguments
-# run with
-# --int-arg PIXIT_ENDPOINT:<endpoint>
-
 
 class TC_RVCRUNM_1_2(MatterBaseTest):
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.commonTags = {0x0: 'Auto',
+                           0x1: 'Quick',
+                           0x2: 'Quiet',
+                           0x3: 'LowNoise',
+                           0x4: 'LowEnergy',
+                           0x5: 'Vacation',
+                           0x6: 'Min',
+                           0x7: 'Max',
+                           0x8: 'Night',
+                           0x9: 'Day'}
+        self.runTags = [tag.value for tag in Clusters.RvcRunMode.Enums.ModeTag]
+        self.supported_modes_dut = []
 
     async def read_mod_attribute_expect_success(self, endpoint, attribute):
         cluster = Clusters.Objects.RvcRunMode
@@ -38,12 +48,7 @@
 
     @async_test_body
     async def test_TC_RVCRUNM_1_2(self):
-
-        asserts.assert_true('PIXIT_ENDPOINT' in self.matter_test_config.global_test_params,
-                            "PIXIT_ENDPOINT must be included on the command line in "
-                            "the --int-arg flag as PIXIT_ENDPOINT:<endpoint>")
-
-        self.endpoint = self.matter_test_config.global_test_params['PIXIT_ENDPOINT']
+        self.endpoint = self.matter_test_config.endpoint
 
         attributes = Clusters.RvcRunMode.Attributes
 
@@ -55,16 +60,18 @@
 
             logging.info("SupportedModes: %s" % (supported_modes))
 
+            # Verify that the list has at least 2 and at most 255 entries
             asserts.assert_greater_equal(len(supported_modes), 2, "SupportedModes must have at least 2 entries!")
             asserts.assert_less_equal(len(supported_modes), 255, "SupportedModes must have at most 255 entries!")
 
-            modes = []
+            # Verify that each ModeOptionsStruct entry has a unique Mode field value
             for m in supported_modes:
-                if m.mode in modes:
+                if m.mode in self.supported_modes_dut:
                     asserts.fail("SupportedModes must have unique mode values!")
                 else:
-                    modes.append(m.mode)
+                    self.supported_modes_dut.append(m.mode)
 
+            # Verify that each ModeOptionsStruct entry has a unique Label field value
             labels = []
             for m in supported_modes:
                 if m.label in labels:
@@ -72,53 +79,69 @@
                 else:
                     labels.append(m.label)
 
-            # common mode tags
-            commonTags = {0x0: 'Auto',
-                          0x1: 'Quick',
-                          0x2: 'Quiet',
-                          0x3: 'LowNoise',
-                          0x4: 'LowEnergy',
-                          0x5: 'Vacation',
-                          0x6: 'Min',
-                          0x7: 'Max',
-                          0x8: 'Night',
-                          0x9: 'Day'}
-
-            runTags = [tag.value for tag in Clusters.RvcRunMode.Enums.ModeTag
-                       if tag is not Clusters.RvcRunMode.Enums.ModeTag.kUnknownEnumValue]
-
+            # Verify that each ModeOptionsStruct entry's ModeTags field has:
             for m in supported_modes:
+                # * at least one entry
+                if len(m.modeTags) == 0:
+                    asserts.fail("SupportedModes must have at least one mode tag!")
+
+                at_least_one_common_or_run_tag = False
                 for t in m.modeTags:
-                    is_mfg = (0x8000 <= t.value and t.value <= 0xBFFF)
-                    asserts.assert_true(t.value in commonTags.keys() or t.value in runTags or is_mfg,
-                                        "Found a SupportedModes entry with invalid mode tag value!")
+                    # * the values of the Value fields that are not larger than 16 bits
+                    if t.value > 0xFFFF or t.value < 0:
+                        asserts.fail("Mode tag values must not be larger than 16 bits!")
+
+                    # * for each Value field: {isCommonOrDerivedOrMfgTagsVal}
+                    is_mfg = (0x8000 <= t.value <= 0xBFFF)
+                    if (t.value not in self.commonTags and
+                            t.value not in self.runTags and
+                            not is_mfg):
+                        asserts.fail("Mode tag value is not a common tag, run tag or vendor tag!")
+
+                    # * for at least one Value field: {isCommonOrDerivedTagsVal}
+                    if not is_mfg:
+                        at_least_one_common_or_run_tag = True
+
+                if not at_least_one_common_or_run_tag:
+                    asserts.fail("At least one mode tag must be a common tag or run tag!")
+
+            # Verify that at least one ModeOptionsStruct entry includes the Idle(0x4000)
+            # mode tag in the ModeTags field
+            at_least_one_idle_mode_tag = False
+            # Verify that at least one ModeOptionsStruct entry includes the Cleaning(0x4001)
+            # mode tag in the ModeTags field
+            at_least_one_cleaning_mode_tag = False
+            for m in supported_modes:
+                # Verify that each ModeOptionsStruct entry includes at most one of the following
+                # mode tags: Idle(0x4000), Cleaning(0x4001), _Mapping(0x4002)
+                count_of_idle_cleaning_or_mapping_mode_tags = 0
+                for t in m.modeTags:
                     if t.value == Clusters.RvcRunMode.Enums.ModeTag.kIdle:
-                        idle_present = True
+                        at_least_one_idle_mode_tag = True
+                        count_of_idle_cleaning_or_mapping_mode_tags += 1
+
                     if t.value == Clusters.RvcRunMode.Enums.ModeTag.kCleaning:
-                        cleaning_present = True
-            asserts.assert_true(idle_present, "The Supported Modes does not have an entry of Idle(0x4000)")
-            asserts.assert_true(cleaning_present, "The Supported Modes does not have an entry of Cleaning(0x4001)")
+                        at_least_one_cleaning_mode_tag = True
+                        count_of_idle_cleaning_or_mapping_mode_tags += 1
+
+                    if t.value == Clusters.RvcRunMode.Enums.ModeTag.kMapping:
+                        count_of_idle_cleaning_or_mapping_mode_tags += 1
+
+                if count_of_idle_cleaning_or_mapping_mode_tags > 1:
+                    asserts.fail("A ModeOptionsStruct entry includes more than one of the following "
+                                 "mode tags: Idle(0x4000), Cleaning(0x4001), Mapping(0x4002)!")
+
+            asserts.assert_true(at_least_one_idle_mode_tag,
+                                "The Supported Modes does not have an entry of Idle(0x4000)")
+            asserts.assert_true(at_least_one_cleaning_mode_tag,
+                                "The Supported Modes does not have an entry of Cleaning(0x4001)")
 
         if self.check_pics("RVCRUNM.S.A0001"):
             self.print_step(3, "Read CurrentMode attribute")
             current_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.CurrentMode)
 
             logging.info("CurrentMode: %s" % (current_mode))
-            asserts.assert_true(current_mode in modes, "CurrentMode is not a supported mode!")
-
-        if self.check_pics("RVCRUNM.S.A0003"):
-            self.print_step(4, "Read OnMode attribute")
-            on_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.OnMode)
-
-            logging.info("OnMode: %s" % (on_mode))
-            asserts.assert_true(on_mode in modes or on_mode == NullValue, "OnMode is not a supported mode!")
-
-        if self.check_pics("RVCRUNM.S.A0002"):
-            self.print_step(5, "Read StartUpMode attribute")
-            startup_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.StartUpMode)
-
-            logging.info("StartUpMode: %s" % (startup_mode))
-            asserts.assert_true(startup_mode in modes or startup_mode == NullValue, "StartUpMode is not a supported mode!")
+            asserts.assert_true(current_mode in self.supported_modes_dut, "CurrentMode is not a supported mode!")
 
 
 if __name__ == "__main__":
diff --git a/src/python_testing/TC_RVCRUNM_2_1.py b/src/python_testing/TC_RVCRUNM_2_1.py
index 20229d1..60afbef 100644
--- a/src/python_testing/TC_RVCRUNM_2_1.py
+++ b/src/python_testing/TC_RVCRUNM_2_1.py
@@ -23,11 +23,17 @@
 
 # This test requires several additional command line arguments
 # run with
-# --int-arg PIXIT_ENDPOINT:<endpoint> PIXIT.RVCRUNM.MODE_CHANGE_OK:<mode id> PIXIT.RVCRUNM.MODE_CHANGE_FAIL:<mode id>
+# --int-arg PIXIT.RVCRUNM.MODE_CHANGE_OK:<mode id> PIXIT.RVCRUNM.MODE_CHANGE_FAIL:<mode id>
 
 
 class TC_RVCRUNM_2_1(MatterBaseTest):
 
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.mode_ok = 0
+        self.mode_fail = 0
+
     async def read_mod_attribute_expect_success(self, endpoint, attribute):
         cluster = Clusters.Objects.RvcRunMode
         return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute)
@@ -44,9 +50,6 @@
     @async_test_body
     async def test_TC_RVCRUNM_2_1(self):
 
-        asserts.assert_true('PIXIT_ENDPOINT' in self.matter_test_config.global_test_params,
-                            "PIXIT_ENDPOINT must be included on the command line in "
-                            "the --int-arg flag as PIXIT_ENDPOINT:<endpoint>")
         asserts.assert_true('PIXIT.RVCRUNM.MODE_CHANGE_OK' in self.matter_test_config.global_test_params,
                             "PIXIT.RVCRUNM.MODE_CHANGE_OK must be included on the command line in "
                             "the --int-arg flag as PIXIT.RVCRUNM.MODE_CHANGE_OK:<mode id>")
@@ -54,9 +57,9 @@
                             "PIXIT.RVCRUNM.MODE_CHANGE_FAIL must be included on the command line in "
                             "the --int-arg flag as PIXIT.RVCRUNM.MODE_CHANGE_FAIL:<mode id>")
 
-        self.endpoint = self.matter_test_config.global_test_params['PIXIT_ENDPOINT']
-        self.modeok = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_CHANGE_OK']
-        self.modefail = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_CHANGE_FAIL']
+        self.endpoint = self.matter_test_config.endpoint
+        self.mode_ok = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_CHANGE_OK']
+        self.mode_fail = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_CHANGE_FAIL']
 
         asserts.assert_true(self.check_pics("RVCRUNM.S.A0000"), "RVCRUNM.S.A0000 must be supported")
         asserts.assert_true(self.check_pics("RVCRUNM.S.A0001"), "RVCRUNM.S.A0001 must be supported")
@@ -93,8 +96,7 @@
             GENERIC_FAILURE = 0x02
             INVALID_IN_MODE = 0x03
 
-        rvcRunCodes = [code.value for code in Clusters.RvcRunMode.Enums.StatusCode
-                       if code is not Clusters.RvcRunMode.Enums.StatusCode.kUnknownEnumValue]
+        rvcRunCodes = [code.value for code in Clusters.RvcRunMode.Enums.StatusCode]
 
         self.print_step(4, "Send ChangeToMode command with NewMode set to %d" % (old_current_mode))
 
@@ -102,9 +104,9 @@
         asserts.assert_true(ret.status == CommonCodes.SUCCESS.value, "Changing the mode to the current mode should be a no-op")
 
         if self.check_pics("RVCRUNM.S.M.CAN_TEST_MODE_FAILURE"):
-            asserts.assert_true(self.modefail in modes,
-                                "The MODE_CHANGE_FAIL PIXIT value (%d) is not a supported mode" % (self.modefail))
-            self.print_step(5, "Manually put the device in a state from which it will FAIL to transition to mode %d" % (self.modefail))
+            asserts.assert_true(self.mode_fail in modes,
+                                "The MODE_CHANGE_FAIL PIXIT value (%d) is not a supported mode" % (self.mode_fail))
+            self.print_step(5, "Manually put the device in a state from which it will FAIL to transition to mode %d" % (self.mode_fail))
             input("Press Enter when done.\n")
 
             self.print_step(6, "Read CurrentMode attribute")
@@ -112,15 +114,15 @@
 
             logging.info("CurrentMode: %s" % (old_current_mode))
 
-            self.print_step(7, "Send ChangeToMode command with NewMode set to %d" % (self.modefail))
+            self.print_step(7, "Send ChangeToMode command with NewMode set to %d" % (self.mode_fail))
 
-            ret = await self.send_change_to_mode_cmd(newMode=self.modefail)
+            ret = await self.send_change_to_mode_cmd(newMode=self.mode_fail)
             st = ret.status
             is_mfg_code = st in range(0x80, 0xC0)
             is_err_code = (st == CommonCodes.GENERIC_FAILURE.value) or (
                 st == CommonCodes.INVALID_IN_MODE.value) or (st in rvcRunCodes) or is_mfg_code
             asserts.assert_true(
-                is_err_code, "Changing to mode %d must fail due to the current state of the device" % (self.modefail))
+                is_err_code, "Changing to mode %d must fail due to the current state of the device" % (self.mode_fail))
             st_text_len = len(ret.statusText)
             asserts.assert_true(st_text_len in range(1, 65), "StatusText length (%d) must be between 1 and 64" % (st_text_len))
 
@@ -131,7 +133,7 @@
 
             asserts.assert_true(current_mode == old_current_mode, "CurrentMode changed after failed ChangeToMode command!")
 
-        self.print_step(9, "Manually put the device in a state from which it will SUCCESSFULLY transition to mode %d" % (self.modeok))
+        self.print_step(9, "Manually put the device in a state from which it will SUCCESSFULLY transition to mode %d" % (self.mode_ok))
         input("Press Enter when done.\n")
 
         self.print_step(10, "Read CurrentMode attribute")
@@ -139,18 +141,18 @@
 
         logging.info("CurrentMode: %s" % (old_current_mode))
 
-        self.print_step(11, "Send ChangeToMode command with NewMode set to %d" % (self.modeok))
+        self.print_step(11, "Send ChangeToMode command with NewMode set to %d" % (self.mode_ok))
 
-        ret = await self.send_change_to_mode_cmd(newMode=self.modeok)
+        ret = await self.send_change_to_mode_cmd(newMode=self.mode_ok)
         asserts.assert_true(ret.status == CommonCodes.SUCCESS.value,
-                            "Changing to mode %d must succeed due to the current state of the device" % (self.modeok))
+                            "Changing to mode %d must succeed due to the current state of the device" % (self.mode_ok))
 
         self.print_step(12, "Read CurrentMode attribute")
         current_mode = await self.read_mod_attribute_expect_success(endpoint=self.endpoint, attribute=attributes.CurrentMode)
 
         logging.info("CurrentMode: %s" % (current_mode))
 
-        asserts.assert_true(current_mode == self.modeok,
+        asserts.assert_true(current_mode == self.mode_ok,
                             "CurrentMode doesn't match the argument of the successful ChangeToMode command!")
 
         self.print_step(13, "Send ChangeToMode command with NewMode set to %d" % (invalid_mode))
@@ -164,7 +166,7 @@
 
         logging.info("CurrentMode: %s" % (current_mode))
 
-        asserts.assert_true(current_mode == self.modeok, "CurrentMode changed after failed ChangeToMode command!")
+        asserts.assert_true(current_mode == self.mode_ok, "CurrentMode changed after failed ChangeToMode command!")
 
 
 if __name__ == "__main__":
diff --git a/src/python_testing/TC_RVCRUNM_2_2.py b/src/python_testing/TC_RVCRUNM_2_2.py
new file mode 100644
index 0000000..d6d0ac8
--- /dev/null
+++ b/src/python_testing/TC_RVCRUNM_2_2.py
@@ -0,0 +1,182 @@
+#
+#    Copyright (c) 2024 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+import chip.clusters as Clusters
+from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main
+from mobly import asserts
+
+# This test requires several additional command line arguments.
+# Run the test with
+# --int-arg PIXIT.RVCRUNM.MODE_A:<mode id> PIXIT.RVCRUNM.MODE_B:<mode id>
+
+
+def error_enum_to_text(error_enum):
+    try:
+        return f'{Clusters.RvcRunMode.Enums.ModeTag(error_enum).name} 0x{error_enum:02x}'
+    except AttributeError:
+        if error_enum == 0:
+            return "Success(0x00)"
+        elif error_enum == 0x1:
+            return "UnsupportedMode(0x01)"
+        elif error_enum == 0x2:
+            return "GenericFailure(0x02)"
+        elif error_enum == 0x3:
+            return "InvalidInMode(0x03)"
+
+    raise AttributeError("Unknown Enum value")
+
+
+class TC_RVCRUNM_2_2(MatterBaseTest):
+
+    def __init__(self, *args):
+        super().__init__(*args)
+        self.endpoint = 0
+        self.mode_a = 0
+        self.mode_b = 0
+        self.supported_run_modes = {}  # these are the ModeOptionStructs
+        self.supported_run_modes_dut = []
+        self.idle_mode_dut = 0
+
+    async def read_mod_attribute_expect_success(self, cluster, attribute):
+        return await self.read_single_attribute_check_success(
+            endpoint=self.endpoint, cluster=cluster, attribute=attribute)
+
+    async def read_run_supported_modes(self) -> Clusters.Objects.RvcRunMode.Attributes.SupportedModes:
+        ret = await self.read_mod_attribute_expect_success(
+            Clusters.RvcRunMode,
+            Clusters.RvcRunMode.Attributes.SupportedModes)
+        return ret
+
+    async def read_current_mode_with_check(self, expected_mode):
+        run_mode = await self.read_mod_attribute_expect_success(
+            Clusters.RvcRunMode,
+            Clusters.RvcRunMode.Attributes.CurrentMode)
+        asserts.assert_true(run_mode == expected_mode,
+                            "Expected the current mode to be %i, got %i" % (expected_mode, run_mode))
+
+    async def send_change_to_mode_cmd(self, new_mode) -> Clusters.Objects.RvcRunMode.Commands.ChangeToModeResponse:
+        ret = await self.send_single_cmd(cmd=Clusters.Objects.RvcRunMode.Commands.ChangeToMode(newMode=new_mode),
+                                         endpoint=self.endpoint)
+        return ret
+
+    async def send_change_to_mode_with_check(self, new_mode, expected_error):
+        response = await self.send_change_to_mode_cmd(new_mode)
+        asserts.assert_true(response.status == expected_error,
+                            "Expected a ChangeToMode response status of %s, got %s" %
+                            (error_enum_to_text(expected_error), error_enum_to_text(response.status)))
+
+    # Prints the instruction and waits for a user input to continue
+    def print_instruction(self, step_number, instruction):
+        self.print_step(step_number, instruction)
+        input("Press Enter when done.\n")
+
+    def pics_TC_RVCRUNM_2_2(self) -> list[str]:
+        return ["RVCRUNM.S"]
+
+    @async_test_body
+    async def test_TC_RVCRUNM_2_2(self):
+
+        if 'PIXIT.RVCRUNM.MODE_A' not in self.matter_test_config.global_test_params or \
+                'PIXIT.RVCRUNM.MODE_B' not in self.matter_test_config.global_test_params:
+            asserts.fail("There are missing arguments to the `--int-arg` flag! "
+                         "Make sure that all of these arguments are given to this flag: \n"
+                         "PIXIT.RVCRUNM.MODE_A:<mode id> \n"
+                         "PIXIT.RVCRUNM.MODE_B:<mode id>")
+
+        self.endpoint = self.matter_test_config.endpoint
+        self.mode_a = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_A']
+        self.mode_b = self.matter_test_config.global_test_params['PIXIT.RVCRUNM.MODE_B']
+
+        asserts.assert_true(self.check_pics("RVCRUNM.S"), "RVCRUNM.S must be supported")
+        # I think that the following PICS should be listed in the preconditions section in the test plan as if either
+        # of these PICS is not supported, this test would not be useful.
+        asserts.assert_true(self.check_pics("RVCRUNM.S.A0000"), "RVCRUNM.S.A0000 must be supported")
+        asserts.assert_true(self.check_pics("RVCRUNM.S.A0001"), "RVCRUNM.S.A0001 must be supported")
+        asserts.assert_true(self.check_pics("RVCRUNM.S.C00.Rsp"), "RVCRUNM.S.C00.Rsp must be supported")
+        asserts.assert_true(self.check_pics("RVCRUNM.S.M.CAN_MANUALLY_CONTROLLED"),
+                            "RVCRUNM.S.M.CAN_MANUALLY_CONTROLLED must be supported")
+
+        # Starting the test steps
+        self.print_step(1, "Commissioning, already done")
+
+        self.print_instruction(2, "Manually put the device in a RVC Run Mode cluster mode with "
+                                  "the Idle(0x4000) mode tag and in a device state that allows changing to either "
+                                  "of these modes: %i, %i" % (self.mode_a, self.mode_b))
+
+        self.print_step(3, "Read the RvcRunMode SupportedModes attribute")
+        supported_run_modes = await self.read_run_supported_modes()
+        for mode in supported_run_modes:
+            self.supported_run_modes[mode.mode] = mode
+            # Save the Mode field values as supported_run_modes_dut
+            self.supported_run_modes_dut.append(mode.mode)
+
+        asserts.assert_false(self.mode_a == self.mode_b,
+                             "PIXIT.RVCRUNM.MODE_A must be different from PIXIT.RVCRUNM.MODE_B")
+
+        if self.mode_a not in self.supported_run_modes_dut or \
+                self.mode_b not in self.supported_run_modes_dut:
+            asserts.fail("PIXIT.RVCRUNM.MODE_A and PIXIT.RVCRUNM.MODE_B must be valid supported modes.")
+
+        for tag in self.supported_run_modes[self.mode_a].modeTags:
+            if tag.value == Clusters.RvcRunMode.Enums.ModeTag.kIdle:
+                asserts.fail("The mode chosen for PIXIT.RVCRUNM.MODE_A must not have the Idle(0x4000) mode tag.")
+
+        for tag in self.supported_run_modes[self.mode_b].modeTags:
+            if tag.value == Clusters.RvcRunMode.Enums.ModeTag.kIdle:
+                asserts.fail("The mode chosen for PIXIT.RVCRUNM.MODE_B must not have the Idle(0x4000) mode tag.")
+
+        self.print_step(4, "Read the RvcRunMode CurrentMode attribute")
+        current_run_mode = await self.read_mod_attribute_expect_success(
+            Clusters.RvcRunMode,
+            Clusters.RvcRunMode.Attributes.CurrentMode)
+
+        # Save the value as idle_mode_dut
+        self.idle_mode_dut = current_run_mode
+
+        # Verify that the supported_run_modes_dut entry matching idle_mode_dut has the Idle (0x4000) mode tag.
+        idle_tag_present = False
+        for t in self.supported_run_modes[current_run_mode].modeTags:
+            if t.value == Clusters.RvcRunMode.Enums.ModeTag.kIdle:
+                idle_tag_present = True
+        asserts.assert_true(idle_tag_present, "The device must be in a mode with the Idle (0x4000) mode tag.")
+
+        self.print_step(5, "Send ChangeToMode MODE_A command")
+        await self.send_change_to_mode_with_check(self.mode_a, 0)
+        # This step is not described in the test plan, but it ought to be
+        await self.read_current_mode_with_check(self.mode_a)
+
+        self.print_step(6, "Send ChangeToMode MODE_B command")
+        await self.send_change_to_mode_with_check(self.mode_b, 3)
+
+        self.print_step(7, "Send ChangeToMode idle command")
+        await self.send_change_to_mode_with_check(self.idle_mode_dut, 0)
+        # This step is not described in the test plan, but it ought to be
+        await self.read_current_mode_with_check(self.idle_mode_dut)
+
+        self.print_step(8, "Send ChangeToMode MODE_B command")
+        await self.send_change_to_mode_with_check(self.mode_b, 0)
+        # This step is not described in the test plan, but it ought to be
+        await self.read_current_mode_with_check(self.mode_b)
+
+        self.print_step(9, "Send ChangeToMode idle command")
+        await self.send_change_to_mode_with_check(self.idle_mode_dut, 0)
+        # This step is not described in the test plan, but it ought to be
+        await self.read_current_mode_with_check(self.idle_mode_dut)
+
+
+if __name__ == "__main__":
+    default_matter_test_main()
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
index 3ad4ef3..c1b428d 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
@@ -98155,75 +98155,47 @@
             break;
         case 2:
             ChipLogProgress(chipTool, " ***** Test Step 2 : Step 3: TH reads from the DUT the FeatureMap attribute.\n");
-            if (ShouldSkip(" !RVCCLEANM.S.F00 ")) {
-                NextTest();
-                return;
-            }
             err = TestStep3ThReadsFromTheDutTheFeatureMapAttribute_2();
             break;
         case 3:
-            ChipLogProgress(chipTool, " ***** Test Step 3 : Step 3: Given RVCCLEANM.S.F00(DEPONOFF) ensure featuremap has the correct bit set\n");
-            if (ShouldSkip("RVCCLEANM.S.F00")) {
+            ChipLogProgress(chipTool, " ***** Test Step 3 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
+            if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
-            err = TestStep3GivenRvccleanmsf00deponoffEnsureFeaturemapHasTheCorrectBitSet_3();
+            err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_3();
             break;
         case 4:
             ChipLogProgress(chipTool, " ***** Test Step 4 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
-            if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
+            if (ShouldSkip("!PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
             err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_4();
             break;
         case 5:
-            ChipLogProgress(chipTool, " ***** Test Step 5 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
-            if (ShouldSkip("!PICS_EVENT_LIST_ENABLED")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_5();
-            break;
-        case 6:
-            ChipLogProgress(chipTool, " ***** Test Step 6 : Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT\n");
-            if (ShouldSkip("RVCCLEANM.S.F00")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4cThReadsTheFeatureDependentRVCCLEANMSF00DeponoffAndOptionalAttributeOnModeIsInAttributeListFromTheDut_6();
-            break;
-        case 7:
-            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT\n");
-            if (ShouldSkip(" !RVCCLEANM.S.F00 ")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4cThReadsTheFeatureDependentRVCCLEANMSF00DeponoffAndOptionalAttributeOnModeIsNotInAttributeListFromTheDut_7();
-            break;
-        case 8:
-            ChipLogProgress(chipTool, " ***** Test Step 8 : Step 5: TH reads from the DUT the EventList attribute.\n");
+            ChipLogProgress(chipTool, " ***** Test Step 5 : Step 5: TH reads from the DUT the EventList attribute.\n");
             if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
             NextTest();
             return;
-        case 9:
-            ChipLogProgress(chipTool, " ***** Test Step 9 : Step 6: TH reads from the DUT the AcceptedCommandList attribute. Check if it contains id 0x0 (ChangeToMode)\n");
+        case 6:
+            ChipLogProgress(chipTool, " ***** Test Step 6 : Step 6: TH reads from the DUT the AcceptedCommandList attribute. Check if it contains id 0x0 (ChangeToMode)\n");
             if (ShouldSkip("RVCCLEANM.S.C00.Rsp")) {
                 NextTest();
                 return;
             }
-            err = TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_9();
+            err = TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_6();
             break;
-        case 10:
-            ChipLogProgress(chipTool, " ***** Test Step 10 : Step 7: TH reads from the DUT the GeneratedCommandList attribute. Check if it contains id 0x1 (ChangeToModeResponse)\n");
+        case 7:
+            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 7: TH reads from the DUT the GeneratedCommandList attribute. Check if it contains id 0x1 (ChangeToModeResponse)\n");
             if (ShouldSkip("RVCCLEANM.S.C01.Tx")) {
                 NextTest();
                 return;
             }
-            err = TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_10();
+            err = TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_7();
             break;
         }
 
@@ -98260,15 +98232,6 @@
         case 7:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             break;
-        case 8:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
-        case 9:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
-        case 10:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
         }
 
         // Go on to the next test.
@@ -98279,7 +98242,7 @@
 
 private:
     std::atomic_uint16_t mTestIndex;
-    const uint16_t mTestCount = 11;
+    const uint16_t mTestCount = 8;
 
     chip::Optional<chip::NodeId> mNodeId;
     chip::Optional<chip::CharSpan> mCluster;
@@ -98350,30 +98313,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep3GivenRvccleanmsf00deponoffEnsureFeaturemapHasTheCorrectBitSet_3()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCCleanMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 3: Given RVCCLEANM.S.F00(DEPONOFF) ensure featuremap has the correct bit set: Error: %@", err);
-            } else {
-                NSLog(@"Step 3: Given RVCCLEANM.S.F00(DEPONOFF) ensure featuremap has the correct bit set: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_4()
+    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_3()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98405,7 +98345,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_5()
+    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_4()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98436,57 +98376,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep4cThReadsTheFeatureDependentRVCCLEANMSF00DeponoffAndOptionalAttributeOnModeIsInAttributeListFromTheDut_6()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCCleanMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT: Error: %@", err);
-            } else {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
-            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
-
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep4cThReadsTheFeatureDependentRVCCLEANMSF00DeponoffAndOptionalAttributeOnModeIsNotInAttributeListFromTheDut_7()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCCleanMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT: Error: %@", err);
-            } else {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCCLEANM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
-            VerifyOrReturn(CheckConstraintExcludes("attributeList", value, 3UL));
-
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_9()
+    CHIP_ERROR TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_6()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98515,7 +98405,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_10()
+    CHIP_ERROR TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_7()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98594,76 +98484,48 @@
             err = TestStep2ThReadsFromTheDutTheClusterRevisionAttribute_1();
             break;
         case 2:
-            ChipLogProgress(chipTool, " ***** Test Step 2 : Step 3a: TH reads from the DUT the FeatureMap attribute.\n");
-            if (ShouldSkip(" !RVCRUNM.S.F00 ")) {
-                NextTest();
-                return;
-            }
-            err = TestStep3aThReadsFromTheDutTheFeatureMapAttribute_2();
+            ChipLogProgress(chipTool, " ***** Test Step 2 : Step 3: TH reads from the DUT the FeatureMap attribute.\n");
+            err = TestStep3ThReadsFromTheDutTheFeatureMapAttribute_2();
             break;
         case 3:
-            ChipLogProgress(chipTool, " ***** Test Step 3 : Step 3b: Given RVCRUNM.S.F00(DEPONOFF) ensure featuremap has the correct bit set\n");
-            if (ShouldSkip("RVCRUNM.S.F00")) {
+            ChipLogProgress(chipTool, " ***** Test Step 3 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
+            if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
-            err = TestStep3bGivenRvcrunmsf00deponoffEnsureFeaturemapHasTheCorrectBitSet_3();
+            err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_3();
             break;
         case 4:
             ChipLogProgress(chipTool, " ***** Test Step 4 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
-            if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
+            if (ShouldSkip("!PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
             err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_4();
             break;
         case 5:
-            ChipLogProgress(chipTool, " ***** Test Step 5 : Step 4a: TH reads from the DUT the AttributeList attribute.\n");
-            if (ShouldSkip("!PICS_EVENT_LIST_ENABLED")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4aThReadsFromTheDutTheAttributeListAttribute_5();
-            break;
-        case 6:
-            ChipLogProgress(chipTool, " ***** Test Step 6 : Step 4c: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT\n");
-            if (ShouldSkip("RVCRUNM.S.F00")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4cThReadsTheFeatureDependentRVCRUNMSF00DeponoffAndOptionalAttributeOnModeIsInAttributeListFromTheDut_6();
-            break;
-        case 7:
-            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 4d: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT\n");
-            if (ShouldSkip(" !RVCRUNM.S.F00 ")) {
-                NextTest();
-                return;
-            }
-            err = TestStep4dThReadsTheFeatureDependentRVCRUNMSF00DeponoffAndOptionalAttributeOnModeIsNotInAttributeListFromTheDut_7();
-            break;
-        case 8:
-            ChipLogProgress(chipTool, " ***** Test Step 8 : Step 5: TH reads from the DUT the EventList attribute.\n");
+            ChipLogProgress(chipTool, " ***** Test Step 5 : Step 5: TH reads from the DUT the EventList attribute.\n");
             if (ShouldSkip("PICS_EVENT_LIST_ENABLED")) {
                 NextTest();
                 return;
             }
             NextTest();
             return;
-        case 9:
-            ChipLogProgress(chipTool, " ***** Test Step 9 : Step 6: TH reads from the DUT the AcceptedCommandList attribute. Check if it contains id 0x0 (ChangeToMode)\n");
+        case 6:
+            ChipLogProgress(chipTool, " ***** Test Step 6 : Step 6: TH reads from the DUT the AcceptedCommandList attribute. Check if it contains id 0x0 (ChangeToMode)\n");
             if (ShouldSkip("RVCRUNM.S.C00.Rsp")) {
                 NextTest();
                 return;
             }
-            err = TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_9();
+            err = TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_6();
             break;
-        case 10:
-            ChipLogProgress(chipTool, " ***** Test Step 10 : Step 7: TH reads from the DUT the GeneratedCommandList attribute. Check if it contains id 0x1 (ChangeToModeResponse)\n");
+        case 7:
+            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 7: TH reads from the DUT the GeneratedCommandList attribute. Check if it contains id 0x1 (ChangeToModeResponse)\n");
             if (ShouldSkip("RVCRUNM.S.C01.Tx")) {
                 NextTest();
                 return;
             }
-            err = TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_10();
+            err = TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_7();
             break;
         }
 
@@ -98700,15 +98562,6 @@
         case 7:
             VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
             break;
-        case 8:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
-        case 9:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
-        case 10:
-            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
-            break;
         }
 
         // Go on to the next test.
@@ -98719,7 +98572,7 @@
 
 private:
     std::atomic_uint16_t mTestIndex;
-    const uint16_t mTestCount = 11;
+    const uint16_t mTestCount = 8;
 
     chip::Optional<chip::NodeId> mNodeId;
     chip::Optional<chip::CharSpan> mCluster;
@@ -98762,7 +98615,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep3aThReadsFromTheDutTheFeatureMapAttribute_2()
+    CHIP_ERROR TestStep3ThReadsFromTheDutTheFeatureMapAttribute_2()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98771,9 +98624,9 @@
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
             if (err != nil) {
-                NSLog(@"Step 3a: TH reads from the DUT the FeatureMap attribute.: Error: %@", err);
+                NSLog(@"Step 3: TH reads from the DUT the FeatureMap attribute.: Error: %@", err);
             } else {
-                NSLog(@"Step 3a: TH reads from the DUT the FeatureMap attribute.: Success");
+                NSLog(@"Step 3: TH reads from the DUT the FeatureMap attribute.: Success");
             }
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
@@ -98790,30 +98643,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep3bGivenRvcrunmsf00deponoffEnsureFeaturemapHasTheCorrectBitSet_3()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCRunMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 3b: Given RVCRUNM.S.F00(DEPONOFF) ensure featuremap has the correct bit set: Error: %@", err);
-            } else {
-                NSLog(@"Step 3b: Given RVCRUNM.S.F00(DEPONOFF) ensure featuremap has the correct bit set: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_4()
+    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_3()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98845,7 +98675,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_5()
+    CHIP_ERROR TestStep4aThReadsFromTheDutTheAttributeListAttribute_4()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98876,57 +98706,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep4cThReadsTheFeatureDependentRVCRUNMSF00DeponoffAndOptionalAttributeOnModeIsInAttributeListFromTheDut_6()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCRunMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT: Error: %@", err);
-            } else {
-                NSLog(@"Step 4c: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is in AttributeList from the DUT: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
-            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
-
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep4dThReadsTheFeatureDependentRVCRUNMSF00DeponoffAndOptionalAttributeOnModeIsNotInAttributeListFromTheDut_7()
-    {
-
-        MTRBaseDevice * device = GetDevice("alpha");
-        __auto_type * cluster = [[MTRBaseClusterRVCRunMode alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
-        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
-
-        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
-            if (err != nil) {
-                NSLog(@"Step 4d: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT: Error: %@", err);
-            } else {
-                NSLog(@"Step 4d: TH reads the Feature dependent(RVCRUNM.S.F00 - DEPONOFF) and optional attribute(OnMode) is not in AttributeList from the DUT: Success");
-            }
-
-            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
-
-            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
-            VerifyOrReturn(CheckConstraintExcludes("attributeList", value, 3UL));
-
-            NextTest();
-        }];
-
-        return CHIP_NO_ERROR;
-    }
-
-    CHIP_ERROR TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_9()
+    CHIP_ERROR TestStep6ThReadsFromTheDutTheAcceptedCommandListAttributeCheckIfItContainsId0x0ChangeToMode_6()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");
@@ -98955,7 +98735,7 @@
         return CHIP_NO_ERROR;
     }
 
-    CHIP_ERROR TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_10()
+    CHIP_ERROR TestStep7ThReadsFromTheDutTheGeneratedCommandListAttributeCheckIfItContainsId0x1ChangeToModeResponse_7()
     {
 
         MTRBaseDevice * device = GetDevice("alpha");